DTO에 대하여

Spring boot 공부하면서 DTO의 개념과 깔끔하게 관리하는 방법등 생각하게 되는 데 다른사람들의 의견도 듣고싶고 방법을 기록하기 위해 글을 작성한다.


1. 변환 수행 계층

    1. Controller
    1. Service
    1. Repository

데이터의 전달을 수행하는 Controller단이 가장 일반적이고 적합하다고 생각이 들지만, 다른사람들의 글을 보면 Service나 Repository에서 수행하는 것을 보기도 했다.수정사항이 별로 없는 기능에 대해서는 Repository에서 바로 Dto를 이용한다면 별도의 Mapping이 필요없고 간단하다는 글을 어디서 봤는데 이는 계층의 영역을 침범하는 것 같고 수정사항이 생기면 수정이 힘들것 같다.


2. 변환 방법

1) ModelMapper와 같은 라이브러리 이용

백기선님의 Rest API강의를 보다가 처음 사용해본 라이브러리 인데 ModelMapper의 map()메서드를 통해 쉽게 맵핑할 수 있는 방법.

간단하지만 외부 모듈을 한개 더 의존하게 된다.


2) Entity의 Builder를 이용해 DTO값으로 생성

Entity의 파라미터를 갖는 생성자보다 더 명시적이라 괜찮은 방법이라 생각이 들지만, 코드가 길어질 수 있다.


3) static 팩토리 메서드 이용

필드들에 따라 의미있는 메서드명이 필요할때 사용하면 괜찮다고 생각이 든다. 오히려 Builder패턴보다 맵핑하는 계층에서는 깔끔하게 보일 수 있을 것 같다.


4) Entity 파라미터들을 갖는 생성자로 생성

기본적인 방법으로 재사용성이 좋아지고 로직이 정말 간단한 경우에는 이것이 제일 간단할 수도 있다.


5) DTO를 파라미터로 갖는 Entity생성자 생성

맵핑을 하는 계층에서는 편하긴 하겠지만 엔티티가 DTO를 의존하게 되기때문에 별로인 것 같다.



이외에도 복합해서 사용한다던지 방법은 많은 것 같고 정답은 없는 것 같다. 어떤 상황에서는 어떤 방법이 더 괜찮은가 계속 고민하고 나만의 철학(?), 방법을 정립해 일관되게 사용하는 것이 좋을 것 같다고 생각이 들었다.

중요한건 중복을 피하면서 가장 간단하고 편한 방법을 상황에맞게 사용하는 것 같다.

Tags :

Related Posts

Slice

Slice

컴파일타임에 데이터 크기가 고정되어 런타임에 변경이 되지 않는 일반 배열과 달리 변경이 가능한 동적 배열 타입을 slice라고 한다. 정확하게 얘기하면 go에서 제공하는 배열을 가리키는 포인터 타입이다. 1. 선언 방법 배열선언방식과 비슷하지만 [] 안에 배열크기를 지정하지 않으면 slice로 선언이 된다....

Read More
Stack Queue

Stack Queue

1. 스택 Last In First Out으로 최근에 추가한 항목이 가장 먼저 제거되는 데이터 방식 1) 함수 pop() : 스택에서 가장 위에 있는 항목을 제거 push() : item하나를 스택의 가장 윗 부분에 추가 peek() : 스택의 가장 위에있는 항목을 제거없이 값만 반환 isEmpty() : 스택이 비었는지 검사 2) 사용 예 재귀 알고리즘 웹 방문기록 실행 취소 연결 list를 이용한 코드 예(C 언어) 2. 큐 First In First Out으로 가장 먼저 추가한 데이터가 먼저 제거되는 데이터 방식...

Read More
5분 와인

5분 와인

  • Books
  • 2021년 4월 21일

제목에서 그대로 보이듯이 와인에 대해 깊고 많은 역사를 알려주는 책이 아닌 집에서 보관방법, 와인 구매장소, 마트에서 좋은 와인 고르기, 선물용 와인 등 과 같이 가벼운 내용위주의 책들이라 간단하게 보기 좋고 책에서 언급하는 대로 아는 체,있어보이는 척 하기에 괜찮은 책이다. 샴페인을 한번 먹어본 이후로 화이트와인과 스파클링 와인에 빠져서 화이트와인을 만드는 포도 품종이나 지역 등을 한번 공부하고자 읽었고 책의 내용도 가벼우면서 얻고자하는 필요한 내용들은 모두 들어있었고 저자도 뭔가 고상한척 있어보이려고 하지 않고 친근한 어투로 설명해서 간단하게 훑어보기 좋은 책이다....

Read More