인프런 커뮤니티 질문&답변

돈우님의 프로필 이미지
돈우

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

도메인과 영속성 객체 구분하기

도메인 객체와 영속성 객체를 구분하게 되면

작성

·

1.4K

0

도메인 객체와 영속성 객체를 구분하게 되면 비즈니스 로직을 짤때 JPA에서 제공해주는 기능들을 사용하지 못할거 같은데 제가 이해한 방식들이 맞나요??

예를들어 User의 update 메소드를 확인해보면 기존 JPA에서 repository로 영속성 객체를 가져와서 값을 수정하는 방식이 아닌 완전히 새로운 User 객체를 생성하고 repository로 save 하는 방식으로 구현을 하시길래 그러면 JPA에서 영속성 객체들 끼리 단방향 매핑이나 양방향 매핑을 구현한 객체들은 도메인 객체로 어떻게 연결지어야할지 감이 안잡히네요..

답변 3

1

김우근님의 프로필 이미지
김우근
지식공유자

안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.

김남호 님이 좋은 답변해 주신 것 같네요. 감사합니다.

이야기하신 대로 도메인 객체와 영속성 객체를 구분하면 JPA에서 제공해 주는 기능들을 사용하지 못합니다. 그런데 이것이 헥사고날 아키텍처와 의존성 역전 원칙이 추구하는 방향입니다. 두 이론 모두 시스템이 특정 라이브러리에 종속되지 않으려면 어떻게 해야 하는지를 이야기하고 있습니다.

이와 관련해서는 이전에 비슷한 답변을 한 적이 있기에 링크로 대체하겠습니다.

더불어 양방향 매핑은 사실상 순환 패턴으로 안티 패턴입니다. 근본적으론 양방향 매핑을 안 만드는 것이 제일 좋습니다. 단방향 매핑으로만 객체 관계를 정의하면 생각보다 생성 수정이 쉽습니다.

1

도메인 객체와 영속성 객체를 구분하게 되면 비즈니스 로직을 짤때 JPA에서 제공해주는 기능들을 사용하지 못할 것 같다고 하셨습니다.

 

비즈니스 로직의 구체적인 예(유스케이스)를 말씀해주시면 답변하기에 용이할 것 같습니다.

 

예에서 update를 들으셨지만 업데이트라는 것은 영속화를 하는 개념인 것이고 비즈니스 로직과는 거리가 있어보였기 때문입니다.

 

0

안녕하세요, 인프런 AI 인턴입니다.

돈우님, 도메인 객체와 영속성 객체를 구분하는 것은 실제로 비즈니스 로직을 설계할 때 JPA에서 제공하는 기능들과의 연계에 대한 고민을 필요로 합니다. JPA를 사용할 경우, 엔티티의 생명주기를 관리하는 것은 JPA가 해주기 때문에, 변경 감지(dirty checking) 기능을 통해 트랜잭션 내에서 엔티티의 변경 사항을 데이터베이스에 반영할 수 있습니다. 반면 Spring Data JDBC를 사용하는 경우는 다릅니다.

예를 들어, Spring Data JDBC를 사용할 경우 특정 엔티티를 가져온 후 값을 변경하고 저장하는 작업은 더 직관적입니다. Spring Data JDBC는 영속성 컨텍스트와 같은 캐싱 또는 지연 로딩을 하지 않으며, 엔티티를 저장할 때는 해당 엔티티가 바로 데이터베이스에 반영됩니다. 이는 변화를 추적하는 dirty tracking이나 세션이 없다는 것과 연결됩니다.

단방향이나 양방향 매핑과 같이 객체 간의 연결을 구현하는 경우, JPA와 Spring Data JDBC는 다르게 접근해야 합니다. JPA는 매핑된 객체 간의 관계를 통해 연결이 이루어지지만, Spring Data JDBC는 매우 단순한 테이블 매핑 모델을 사용하며, 복잡할 경우 자체 매핑 전략을 구현하도록 권장합니다.

따라서 JPA를 사용할 때와는 다르게, Spring Data JDBC에서는 복잡한 관계 매핑보다는 각 엔티티를 명확하게 분리하여 로딩하고 저장하는 것이 권장되며, 필요한 연관관계는 레포지토리를 통해 직접 처리하는 것이 일반적입니다.

JPA와 Spring Data JDBC 중에서 어느 것을 사용할지는 프로젝트의 요구사항과 개발 팀의 선호에 따라 결정하는 것이 좋습니다. 각 기술이 갖는 장단점을 이해한 뒤, 프로젝트에 적합한 방법을 선택해야 할 것입니다.

참고하실 수 있도록 관련 문서 링크를 남겨드립니다:
- Spring Data JDBC 영속성 및 객체 매핑에 관한 설명: https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#mapping.fundamentals
- Spring Data JDBC 사용 이유에 대한 설명: https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#jdbc.why

도움이 되길 바라며, 추가 질문이 있으시면 언제든지 문의해 주세요.

돈우님의 프로필 이미지
돈우

작성한 질문수

질문하기