회원가입과 로그인에서 주고받는 정보가 다른데,,, User라는 하나의 객체만 생성하는건 비효율적이야! 그럼 객체를 여러개 만들어야 할까..? 그럼 DB도 여러개를 만들어야 하나...?!? 🤯 어떡해야하지 ->DTO가 해결: 객체를 변환(아직 코드 완성은 못함..to be continued..)
어디서(클래스 위치)?
어떻게(방법)?
- 생성자
- 빌더의 장점=생성자의 단점: 파라미터에 뭘 넣어야 할 지 모름
+객체 분리 기준/각 역할
하나의 객체, 데이터가 repository까지 들어갔을 때 장점? 단점?
단점:
1️⃣ 예시1) req->dto안에 사용하는 필드만 넣어서 통채로 반환
서비스 코드를 바꾸지 않게 전달 가능
먼저, a 객체가 그대로 db로 들어감 처음 ui/ux에 맞춰져서 설계됨.
이후, 화면 단에 하나가 더 추가되었을 경우, 입력을 받았는데 db저장 용도가 아니 연산하려는 용도일 경우
(예를 들어, mbti, 저축, 자산, 대출, 부동산와 같은 정보) 종합적으로 평가 db에 "소비성향"으로 저장해두는 경우)
즉, 당장 db에 저장할 것은 아닌데 화면 단의 내용이 바뀌는 경우
2️⃣ 예시2) 스키마 이름 바꾸는 일
password-> pwd 컬럼명을 바꾸었을 때 프론트엔드까지 바꿔야하는 상황 발생.
중간에 끊어서 프론트엔드에서는 여전히 같은 컬럼명 사용 가능하고, 중간에 전환 로직을 추가하는 것이 좋음!
결론
아래의 예시에서 단일 책임의 원칙이 깨지지 않게 하기 위해 DTO가 필요하다!
단일 책임 원칙: 수정은 하나의 actor만 존재해야 함!
1) client 무슨 일 생겼을 때 -> DB까지
db에 그대로 저장될 데이터는 아님 필드를 추가해도 되니?
2) DB에 무슨 일 생겼을 때 -> client가 알아야 해?
(DB 컬럼 이름이 바뀌면, 클라이언트 호출도 바껴야 함?)
➡️ 데이터를 옮기는 객체가 하나일 경우 여러 계층에서 그 객체에 수정을 가하면 단일 책임 원칙이 바로 깨진다!
데이터 전송용 객체 = 엔티티(Entity)의 사본
setter: 되도록이면 사용하지 말자!
setter 사용시 언제든 누구나 값을 변경할 수 있어 DB의 사용이유인 '무결성'을 위반하기때문!
- DB -> (Object: setter 포함)->Client
+DB 쓰는 이유? 보안, 무결성
Q. setter를 DTO가 절대 가지면 안될까요?
NOPE! 절대는 NOPE!
그럼 언제써야할까? update할 때 사용가능!!
강형욱: DTO, 박완규: Entity - JPA > jdbc Entity..? 왜...?

🌟 미리보기
- A service->B Service ❌: 의존성 존재, 서로가 없으면 못 돌아간다는 것! 잘못된 설계!
- A controller-> B Service 🅾️
- A Service-> B repository 🅾️
- A controller -> B controller ❌
같은 계층끼리 사용하는 것: 서로 의존하는 것
다른 계층끼리 사용하는 것: 독립/모듈화가 잘 되어있는 것
근데요 왜 강형욱: DTO, 박완규: Entity 인가요?
저는 강형욱이 Entity 같은데요?