dto와 entity 분리에 대한 고찰

김지인·2023년 2월 17일
0

들어가기 앞서서...


최근에 사전과제가 계속 잡혀있어서 블로그에 소홀했었다.
사전과제를 경험하면서 내가 부족했던 것이 무엇인지 알 수 있었다.


나는 dto에서 entity로 변환할때 dto안에서 toEntity() 메서드를 명시하거나, entity에서 dto로 변환할때 toDto()를 entity 객체 내부에 선언하고는 했다.

DTO 클래스에서 toEntity() 메서드를 사용하여 Entity 클래스로 변환을 수행하는 방법은 코드의 가독성과 유지 보수성을 저해할 수 있고, 이 방법은 DTO 클래스가 Entity 클래스의 세부 사항을 알고 있어야 하므로 DTO 클래스와 Entity 클래스 간의 결합도가 높아지게 된다. 또한, 레이어 계층 간의 역할도 모호해진다.

따라서 객체간의 변환을 수행하는 클래스를 추가하는 것이 좋다고 생각했다. 이를 통해 각 레이어는 서로를 침범하지 않고 해당 객체에서 변경이 일어날 경우 해당 레이어에서 처리가 가능해진다.

해당 구조로 바꾸게 됨으로써, 각 레이어는 서로를 침범하지 않고 해당 객체에서 변경이 일어날 경우 해당 레이어에서 처리가 가능해졌다. 이를 코드로 봐보자.


// Service계층에 있는 Mapper 객체

public class EntityToServiceDtoMapper {

    private static EntityToServiceDtoMapper entityToServiceDtoMapper = new EntityToServiceDtoMapper();

    private EntityToServiceDtoMapper(){}

    public static EntityToServiceDtoMapper getInstance(){return entityToServiceDtoMapper;}

    public ServiceSaveBoardResponseDto toSaveDto(Board board){
        return ServiceSaveBoardResponseDto.builder()
                .boardId(board.getBoardId())
                .title(board.getTitle())
                .content(board.getContent())
                .nickname(board.getMemberNickname())
                .memberId(board.getMemberId())
                .createDate(board.getCreateDate())
                .build();
    }
}
// Respository 계층에 있는 Mapper 객체

public class ServiceDtoToEntityMapper {

    private static ServiceDtoToEntityMapper serviceDtoToEntityMapper = new ServiceDtoToEntityMapper();

    private ServiceDtoToEntityMapper(){}

    public static ServiceDtoToEntityMapper getInstance(){
        return serviceDtoToEntityMapper;
    }

    public Board toEntityWhenSave(ServiceSaveBoardRequestDto dto){
        return Board.builder()
                .title(dto.getTitle())
                .content(dto.getContent())
                .status(Status.Y)
                .build();
    }
}

Service 계층에서는 EntityToServiceDtoMapper 클래스를, Repository 계층에서는 ServiceDtoToEntityMapper 클래스를 만들어서 사용한다.

서비스 객체
.
.

	private final ServiceDtoToEntityMapper serviceDtoToEntityMapper = ServiceDtoToEntityMapper.getInstance();

    private final EntityToServiceDtoMapper entityToServiceDtoMapper = EntityToServiceDtoMapper.getInstance();

    // 글 저장
    public ServiceSaveBoardResponseDto saveBoard(ServiceSaveBoardRequestDto dto){
        Board board = serviceDtoToEntityMapper.toEntityWhenSave(dto);
     	return entityToServiceDtoMapper.toSaveDto(boardRepository.save(board));
    }

.
.

이러한 방법을 사용하면 Service 계층에서 수정이 일어나도 Repository 계층에는 영향을 주지 않으므로 코드의 유지 보수성과 가독성이 높아진다. 이를 통해 레이어 간의 역할이 분명해지므로, 레이어 계층 간의 결합도도 낮아졌다.

profile
에러가 세상에서 제일 좋아

0개의 댓글