코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :)
Ver.1
- 서비스 계층에서 생성자를 통해 인스턴스 생성
- 서비스 계층에서 비즈니스 로직 뿐만아니라 객체 생성 역할까지 수행
- 또한 여러 메서드에서 동일한 객체를 생성해야 하는 경우, 코드가 불필요하게 중복됨
- 객체 생성 로직이 변경되는 경우, 작성된 모든 코드를 찾아서 변경해야함
CartItemEntity cartItem = new CartItem(targetType, targetId, amount);
Ver.2
- 엔티티 내부에 정적 팩토리 메서드를 작성하여 객체 생성의 책임을 엔티티에 둠
- Entity가 Dto의 구조를 알고있어서 의존하게 됨(결합도 증가)
// Entity
public static CartItemEntity create(CartItemDto cartItemDto){
CartItemEntity cartItem = new CartItemEntity();
cartItem.setTargetType(cartItemDto.get(targetType));
cartItem.setTargetId(cartItemDto.get(targetId));
cartItem.setAmount(cartItemDto.get(amount));
return cartItem;
}
// Service
BucketListEntity bucketList = BucketListEntity.create(bucketListDto);
Ver.3 (현재 버전)
- Dto에 메서드를 작성하여 엔티티로의 변환 책임을 줌
- Entity - 객체 생성 / Dto - 객체 변환 / Service - 비즈니스 로직 ⇒ 책임 분배가 명확해짐
- Entity가 Dto에 의존하지 않음
// Entity
public static CartItemEntity from(String targetId, TargetType targetType, Integer amount) {
CartItemEntity cartItem = new CartItemEntity();
cartItem.targetId = targetId;
cartItem.targetType = targetType;
cartItem.amount = amount;
return cartItem;
}
// Dto
public CartItemEntity toCartEntity(){
return CartItemEntity.from(
this.targetId,
this.targetType,
this.amount);
}
// Service
CartItemEntity cartItem = cartItemRequestDto.toCartEntity();
빌더를 사용하지 않은 이유
- 매개변수를 명시적으로 지정할 수 있어서 훨씬 안정적이고 가독성이 좋지만 현재 우리가 제공하는 서비스에서는 그렇게 많은 필드를 다루는 데이터가 없기 때문에 굳이 도입을 고려하지 않았다.
객체 생성 | 객체 변환 | Entity 메서드 | RequestDto 메서드 | ResponseDto 메서드 | |
Lotto entity | 불필요 | 필요 | 불필요 | DTO 불필요 | fromLottoDoc() |
StatNum entity | 불필요 | 필요 | 불필요 | DTO 불필요 | fromStatNumDoc() |
CartItem entity | 필요 | 필요 | create() | toCartItemEntity() | fromCartItemEntity() |
BucketList entity | 필요 | 필요 | create() | DTO 불필요 | fromBucketListEntity() |
UserLotto entity | 필요 | 필요 | create() | toUserLottoEntity() | fromUserLottoEntity() |
- 사용자에게 입력 받은 값을 통해 생성되는 객체는 RequestDto의 toEntity() 메서드를 거쳐 create()를 호출
- 로직이 돌면서 필요한 값을 얻어 생성되는 객체는 바로 create()를 호출
'Dev Tool > Spring boot' 카테고리의 다른 글
[Spring] @Scheduled와 JavaMailSender를 이용한 자동 메일 발송 기능 (0) | 2025.01.31 |
---|---|
[Spring] 장바구니 기능 구현 (0) | 2025.01.25 |
[Spring] 로또 API 단위 테스트 코드 작성 (0) | 2025.01.23 |
[Spring] 테스트 코드 기본 개념 (0) | 2025.01.22 |
[Spring] 로또 API 구현(2) & 예외 처리(@validate) (0) | 2025.01.22 |