개발자

데이터 join후 어디에 담으시나요?

2024년 02월 09일조회 261

안녕하세요 join한 결과를 repository를 통해 받아올때 다들 어떻게 하시나요?? 어떤 방법을 써야 하는지 모르겠어서 선배님들의 의견과 다른 회사에서는 어떻게 하는지 알고 싶어서 질문 드립니다~ 제가 알기로는 domain은 db테이블과 1대1관계를 가져야 한다?, dto는 request와 response시에만 사용하는것? 으로 알고 있습니다 Mybatis를 통해 두 테이블을 join할때 (예를 들어 게시판 상세페이지에 접속할때 게시판테이블의 정보와 업로드된 파일을 관리하는 테이블의 데이터를 함께 조회함) 그 데이터를 어디에 담아서 repository를 통해 리턴하면 될까요..? 게시판 domain에 파일 정보를 추가해서 조인한 데이터를 담자니 domain이 db와 1대 1관계를 깨는것 같고 dto에 바로 담자니 dto와 domain의 변환 시점이 있는데 규약(?)을 무시하는것 같고 브릿지 테이블을 만드는것도 아닌것 같고.. 회사에서도 여쭤볼 분이 마땅치 않아서 궁금증을 여쭤봅니다ㅜㅜㅜㅜ

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

다형님의 프로필 사진

프로젝트에서 DB 컬럼과 도메인 클래스의 필드를 1:1로 맞추자고 정한 것이 아니라면 mybatis의 resultType이 되는 클래스가 DB 스키마와 1:1 대응이 될 필요는 없습니다. 이 부분은 지금 질문자 분이 직면하신 join등의 문제로 완전히 1:1 대응으로 만드는 것이 불가능 해요. 이는 DB 엔티티(주로 테이블)의 연관관계를 처리하는 방식이 OOP와 차이가 있기 때문에 어쩔 수가 없습니다. 만약 DB에서 작성자 테이블과 작성글 테이블이 1:N 관계라면, 클래스 표현으로는 적성자 클래스안의 List<작성글> 형태의 필드를 가지는 형태로 표현이 되겠죠. DB에서는 연관관계를 인지하기 위해 키 값이 필요한데 비해, 클래스는 객체가 객체를 포함하는 방식으로 표현되는 차이가 있는 것입니다. 또한 엔티티 클래스와 도메인 클래스, 계층간 데이터 전달을 위한 DTO 클래스는 엄밀히 말해 동일한 것이 아닙니다. 도메인 클래스는 객체지향을 배울 때 나오는 예시 클래스들 처럼 특정 기술에 종속되지 않는 POJO 형태의 클래스 라고 이해하시면 더 쉽게 느낄 수도 있을 것 같네요. 굳이 따지면 엔티티 클래스가 DB 라는 외부 계층과의 매핑을 위한 클래스가 될 것 같습니다.(mybatis의 경우, resultType에 대응 / JPA의 경우 @Entity 클래스)이러한 클래스 구분을 두는 경우라 해도 DB의 질의 결과가 되는 엔티티 클래스를 도메인 클래스로 다시 변환하는 방식으로 만들기도 합니다. 뭐 이것저것 말씀드렸지만, 일단 그냥 도메인 클래스가 1:1이 이니여도 되니 join 해서 추가 되는 필드를 일단 추가 하세요. 이 후에 해당 추가로 인해서 로직이 정리되지 않거나, 도메인 클래스가 불필요하게 비대해지는 것 같다면 분리를 고민하시면 될 것 같아요!

삭제된 사용자님의 프로필 사진

삭제된 사용자

2024년 02월 10일

dto에 담아서 사용하면 됩니다 dto는 요청과 응답때만 쓰이는게 아니라 계층간에 데이터를 전달할 용도로 사용하는 객체입니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 09일

Join한 결과를 어디에 담을지는 주로 해당 데이터가 어떠한 목적으로 사용될 것인지, 그리고 프로젝트의 구조나 설계 방향에 따라 달라집니다. 일단 기본적으로 Domain Model은 비즈니스 로직을 수행하는 중심적인 역할을 합니다. 따라서 DB 테이블과 1:1 관계를 가지기도 하지만, 이는 강제되는 것은 아니며 도메인 모델이 원활하게 비즈니스 로직을 수행할 수 있게 지원해주는 공간이라고 보아야 합니다. DTO(Data Transfer Object)는 이름에서 알 수 있듯이 Data를 전송하는 객체 입니다. 클라이언트와 서버 사이에서 데이터를 효율적으로 전송하기 위하여 사용하며, Requset와 Response 시에 주로 활용되지만 꼭 그래야 하는건 아닙니다. 종종 여러 Entity의 값을 조합하여 사용해야 할 경우, DTO를 사용하기도 합니다. Mybatis 등 ORM(Object-relational mapping) 방식을 사용하여 두 테이블을 Join시킬 때, 그 결과값은 대체적으로 DTO 객체에 담아 반환합니다. 이유는, Join 연산 자체가 RDBMS(Relational Database Management System)의 연산이므로 결과 값은 도메인 모델이 아닌, 새로운 형태의 객체일 가능성이 높기 때문입니다. 따라서, Mybatis를 사용하여 게시판 테이블의 정보와 파일 테이블의 데이터를 함께 조회할 경우, 이를 담는 별도의 DTO 객체를 생성하는 것을 추천드립니다. 도메인 모델에 직접적으로 파일 정보를 추가할 수도 있겠지만, 이는 1:1 관계가 깨질뿐 아니라 도메인 모델의 SRP(Single Responsibility Principle) 원칙을 위배하게 됩니다. 따라서 필요한 데이터 조합에 맞춰 DTO 객체를 설계하여 사용하시는 것이 좋습니다. 그러나 프로젝트나 회사마다 변수가 있으니 자신이 작업하는 환경에 가장 적합한 방식을 선택하는게 중요합니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!