TIL 2021.04.21 [DTO/문제해결]

Kyu·2021년 4월 21일
0

TIL

목록 보기
101/322

문제 시발점

JSON 데이터를 Response 해줄 때 배열은 어떻게 해줘야할까?

예를 들어서, 특정 Request가 오면 다음과 같은 JSON 데이터를 Response 하고싶다고 생각해보자.

{
  "name": "Kyu",
  "age": 20,
  "region": "Korea",
  "favorite_food": [
    "Water",
    "Coffee"
    ]
}

첨에 생각 했던 건 그냥 Entity 객체 내에 String[] favorite_food 필드를 추가해서 반환해주는 것이었다.

그렇게 하면 Entity 클래스는 다음과 같을 것이다.

public class User {
     private String name;
     private int age;
     private String region;
     private String[] favoriteFood; 
     
     // ...Constructor, Getter
}

아무 문제 없어보였는데 문제는 DB에 컬럼 데이터 타입으로 배열을 넣을 수가 없었다.

찾아보니 MySQL 5.7.8 버전 이상부터는 JSON 데이터를 넣을 수 있도록 지원한다고 했는데, 생각보다 만만하게 배울 수 있는 그런게 아니었다..

그래서 어떻게 할지 고민하다가 코쿼 동료분들에게 여쭤보니 데이터는 그냥 String으로 저장하고 Response 할 때, 그 String을 배열로 다시 담아서 Response하는 방식을 권해주셨다.

설명해주시는 과정에서 여러 키워드가 나왔는데 그 중에 하나가 DTO 였다.
들을때는 DTO가 뭔 말인지 몰라서 나중에 동료분들과 이야기를 끝내고 검색하면서 학습해보았다.

학습한 것 내말로 풀어보기..

Entity 클래스는 레포지토리와 디비 연결할때만 쓰도록하고, DTO는 서비스-컨트롤러-클라이언트단 까지 Entity를 대신해서 사용하라고 한다.

DTO를 풀어보면 Data Transfer Object이다.
이름에서 그 역할을 유추해보면 데이터를 이동시킬때 사용하는 객체라고 생각해볼 수 있다.
그런느낌으로 DTO는 데이터를 통신할때 사용하는 객체라고 이해했다.

Entity 클래스를 사용하지 않고 굳이 DTO를 만들어서 서비스-컨트롤러-클라이언트에서 이렇게 사용하도록 하는 이유는 View Layer와 DB Layer을 철저히 나누어서 사용하도록 하기위함이라고 하고
두번째는, View와 통신하는 객체는 코드가 자주 변경될수밖에 없어서? 리고한다.
DTO 클래스를 따로 안만든상태로 Entity만 있다고 가정하고 코드가 자주 변경된다고 생각해보면 직접적으로 디비와 연결되어있는 Entity가 디비에 영향을 줄수밖에없고 그것은 디비의 구조를 바꿀수도 있는 상황까지 오게 만들 수도 있다는 생각이든다.

일단 이정도로 Entity와 DTO를 이해하고 문제해결을 했다.

코드 : https://github.com/kyu-kim-kr/sidedish/pull/26

참고: https://velog.io/@kyukim/DTO-Data-Transfer-Object

profile
TIL 남기는 공간입니다

0개의 댓글