코드의 개선 사항이 필요해보인다면 언제든 댓글로 지적해주세요 :)

 

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()를 호출