Dto를 파라미터로 받았을 때,
데이터를 DB에 넣으려면
결국 Dto를 엔티티에 집어넣는 작업을 해야한다
그런데
얘를 서비스에서 엔티티화(?)시켜야하나?
리포지토리에서 엔티티로 변환시켜야하나?
의문이 들어서 찾아보게 되었당~
일단 컨트롤러를 용의선상에서 제외시킨 이유
1. 컨트롤러에 변환 코드까지 생기면 지저분해져서...
2. 굳이 엔티티를 변환을 컨트롤러에서 해야하나?
3. 컨트롤러는 요청을 응답해주기위한 로직만 짜는 곳 아닌가?
하는 생각이 들었음
그래서 구글 검색을 통해 알아보았담..
https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/
DTO의 사용 범위에 대하여
1. DTO란? DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체(Java Beans)입니다. 간략하게 DTO의 구체적인 용례 및 필요성을 MVC 패턴을 통해 알아볼까요? 🚀 1.1. MVC 패턴 MVC…
tecoble.techcourse.co.kr
이 분이 잘 설명해놓으셨기 때문에
자세하고 전문적인 지식은 이 링크를 통해서 해결하시길 추천!!
(내 블로그는 내가 이해하려는 저장용이라....도움이 안 될 수 있음)
리포지토리는?
Entity의 영속성을 관장하는 역할(만 수행하는 것이 옳다)
근데 컨트롤러에서 사용해야하는 Dto를 변환하는 작업을
리포지토리에서 책임지게 하는 것은 지양하자!!!라는 말이 많다고 한다
- DB를 관장하는 놈은 DB에서 넣고 빼는 역할만 하자...라는 뜻인 거 같음
(DB만지는 일만 하자)
서비스는?
애플리케이션의 경계, 비즈니스 로직 등을 "캡슐화"하는 작업을 하는 역할
도메인(엔티티 같은 직접적인 디비에 들어가는 정보)들을 보호하는 녀석이라고 보면 될듯
만약 컨트롤러에서(표현 계층 이라고 표현하던데) 변환 작업이 들어갈 경우
로직의 결합도가 증가해서 유지보수에 위험이 있다고 한다
그러니, 데이터 전달 목적으로만 엄격하게 나눈다면
Dto는 서비스 계층에서 정의되는 것이 맞다고(합니다)
만약 서비스가 도메인 모델(엔티티)를 그대로 반환하고
컨트롤러가 엔티티를 디티오로 변환한다면 생기는 문제점은?
-view에 반환할 필요 없는 데이터까지 컨트롤러(표현 객체)에 넘어옴
-컨트롤러가 얘를 변환해서 DTO로 만드려고 하면, 서비스 계층 로직이 컨트롤러에 포함되게 됨
-여러 도메인 객체를 의존해야해서 컨트롤러가 비대해짐
ㄴ 밑에 두개는 생각해봐야할듯....이해가 잘 안 됨
그리고 나는 리포지토리vs서비스 에서 어디에 넣을까 고민하며 글을 썼는데
사람들은 리포지토리는 아예 생각도 안 했다는 게 ...^^ 내가 얼마나 무지한지 알았드....
리포지토리는 DB만 만지는 역할이지, 뭔가 변환하고 뚝딱뚝딱 하는 역할이 아니라는 것을 다시금 깨달았다 ^^7
와.....리팩토링 하로 가야지 ^0^ ~~~~!(후....)
ㄴ 그래도 재밋음...먼가 정리하는 기분?ㅎㅎ
ㄴ 이런 거 말했더니 친구들은 내게 방정리나 하라고 한다...
- 의견 추가 ) 2023 년 5월 6일
직접 (토이)프로젝트를 하면서 느끼는 점...
Dto 는 컨트롤러에서 변환 후 서비스로 넘기는 것이 맞는(편한) 거 같다!!!ㅠㅠ
프로젝트에 여러 기능이 추가되고 데이터를 받기 위한 관련 Dto가 점점 늘어나는데
Dto는 달라도 같은 서비스를 이용하는 경우가 종종(많이) 있다
그런데 만약
FanLetterController에서 FanLetterService 에 read() 메서드에 FanLetterDto() 를 매개변수로 받기로 작성했는데
FanBoardController 에도 똑같은 로직을 사용하는 read() 메서드를 사용해야하는데, 여기서는 FanBoardDto()로 데이터를 받아온다면
둘은 같은 로직을 사용함에도 불구하고, 받는 Dto가 다르다는 이유로
서비스에 두 종류의 코드를 추가해야되는 것이다
- 이건 불필요하게 코드도 중복되고
- 확장성에도 좋지않다
그래서 그냥 서비스에서 엔티티를 직접 받고, 반환하여
서비스를 사용한 컨트롤러에서 엔티티를 필요한 Dto로 변환하는 것이 훨씬 더 편리하다고 느꼈다....
다만 Dto - > Entity 로 변환할 때는
그냥 엔티티 생성자에 디티오를 직접 받아서 대입하는 방식을 씀..
new FanBoard(fanLetterDto()) 이런 식으루..
필드가 한두개면 괜찮은데
여러개라면 필드 하나하나 작성해야하는 게 귀찮앙 ㅎㅎ
그래서 요즘 작성하는 코드에는
요로케 엔티티를 직접 받고, 반환하며
필요하다면 컨트롤러에서 엔티티를 Dto로 변환해 보여주고 이씀!
'개발공부 개발새발 > JAVA' 카테고리의 다른 글
Junit5 Test ) Service 를 테스트 해보자! (0) | 2023.07.01 |
---|---|
JpaRepository 를 사용하는 클래스를 테스트를 하고 싶어요! (0) | 2023.05.31 |
QueryDsl 의존성(Gradle) 세팅 (0) | 2023.03.11 |
뷰에서 컨트롤러에 데이터를 전송하는 방식은? (0) | 2022.12.29 |
JAVA) 바이트/문자 스트림에 대한 고찰 (0) | 2022.11.04 |