안녕하세요
고민이 있습니다.
JPA로 데이터 받아와서 Service에서 Entity로 받은 후에 이를 변환하는 로직을 어디에 작성할지 고민입니다.
Service 에서 Entity를 Dto로 변환하면 해당 Service와 Controller가 서로 강하게 결합 되어있는 것 같은 느낌이 듭니다.
반대로 Service에서 Entity를 그대로 반환하고 Controller 에서 Dto로 변환하게 되면 Controller에 도메인 데이터가 노출 되기도하고
현재 builder 패턴을 사용하고 있는데 필드가 많아지면 Controller가 생각보다 지저분해지는 느낌이 드네요.
하지만 서로 강하게 결합되어있다는 느낌이 없어서 여러 컨트롤러에서 재사용 할 수가 있을 것 같습니다.
님들은 주로 어디서 변환하시나요?
둘다 뭔가 찝찝해서 고민하다가 새로운 변환 레이어를 둬야하는건가 하는 생각도 했습니다.
예를들어 Controller -> Service로 가던 흐름을 Controller -> ConvertLayer -> Service 이런식으로 해보려하는데 어떤방법이 좋을까요?
1. Controller 에서 Dto로 변환
2. Service에서 Dto로 변환
3. 변환레이어를 추가로 두기
컨트롤러에 jpa entity가 노출되지 않게 서비스계층에서 변환하는게 좋을듯 entity <-> dto 간 변환은 dto에 변환 메서드 넣거나 아니면 mapstruct같은거 쓰거나 하면 좀 깔끔해짐
나 같은 경우엔 엔티티 클래스 내부에 toDto 메서드 만들어서 반환하게끔 해줬음
이건 개에바임
Dto 내부에 엔터티 -> dto 메소드를 만들어야지
엔터티 내부에 이렇게 하면 엔터티가 dto에 의존하게 됨
dto에 엔티티 사용하는 생성자나 메서드 만드는게 낫지. 안그러면 dto 추가 삭제할때마다 엔티티 건드려야됨
근데 이건 굳이 결합 안되도 필드 바뀌면 다 바꿔야 하는거 아님? 결합도가 생기긴 하는데 갑자기 궁금해서 물어봄
뭐 나도 찌끄래기 신입이긴 하다만... 2번 그리고 위에 댓글 처럼 entity -> Dto, dto -> entity 이거 귀찮잖아? mapstruct 써서 entity, dto 자동 매핑되게 했음
Map<String, Object> 썼다고?
맵스트럭트 라이브러리가 따로 있음..
조회면 그냥 service에서 stream 람다로 변환하고 비지니스 로직은 엔터티 내부에서 짜면됨. Domain model패턴이라 부름.