inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

상속관계 매핑

엔티티가 중첩되는 경우 질문있습니다!

248

lee

작성한 질문수 18

0

안녕하세요 강의 보면서 게시판 성격의 서비스를 만들던 중에 궁금증이 생겼습니다. 두 가지 방법이 있는데, 제가 취준생이라 실제 서비스 코드들을 본 적이 없어서 어떤 방법이 조금 더 현명한 방법인지 궁금합니다!

  1. Jpa 사용법처럼 게시글과 댓글을 맵핑하는 방법입니다.

  2. 댓글에 게시글의 키만 가지는 방법입니다.

 

1번 코드는 대략적으로 이런 형태일 것 같습니다.

 


@Entity
public class Article{

@Id
@GeneratedValue(strategy = Identity)
long id;

String content;


}

@Entity
public class Comment{

@Id
@GeneratedValue(strategy = Identity)
long id;

String comment;

@ManyToOne(fetch = FetchType.LAZY)
Article article;
 
}

 

1번 코드의 경우에는 배울 때는 맵핑도 깔끔하게 잘 되고 좋았는데, 실제 개발을 하다 보니 댓글만 사용하는 경우에 있어서 Article의 내용은 전혀 필요가 없는 경우도 많을 것 같습니다.

또한 게시글의 댓글들을 조회 할 때, 같은 Article 내용들이 반복해서 들어 있다는 점이 마음에 걸립니다.(Lazy 하게 가져와서 문제가 없을것 같기도 하고 이 부분은 확실하지 않습니다.)

 

2번 코드는 게시글의 키만 가지는 경우입니다.

 

@Entity
public class Article{

@Id
@GeneratedValue(strategy = Identity)
long id;

String content;


}

@Entity
public class Comment{

@Id
@GeneratedValue(strategy = Identity)
long id;

String comment;

long articleId;
 
}

 

2번의 경우에는 불필요한 정보를 담지 않고 필요한 경우에는 Id값으로 찾아서 가져올 수 있습니다.

하지만 article 과 Comment를 각각 따로 관리하는 형태가 됩니다.(사실 1번 코드도 따로 관리는 가능할 것 같습니다)

간단한 경우에는 1번이 좋은 것 같은데 컴포지션 되는 객체들이 많은 경우에는 그 자체로 정말 생각해야 되는 경우가 많아 지는 것 같습니다.(Comment 안에 Article, User, 첨부 파일 Entity 등등이 복잡하게 들어갈 수 있을 것 같습니다 )

네이버 카페와 같은 사이트들의 경우에서는 게시글과 댓글을 따로 관리하는 것 같기도 하고(작성 글 보기를 누르면 삭제된 게시글 이지만 댓글 내용은 볼 수 있는 경우입니다)

실제로는 어떤 방식으로 풀어 가는지 궁금합니다!

java jpa

답변 1

0

y2gcoder

안녕하세요. lee님, 공식 서포터즈 y2gcoder입니다.

연관관계 매핑을 할 것인지, 아니면 간접참조를 할 것인지 에 대해 고민하고 계신 것으로 보입니다.

프로젝트의 요구사항이나 개발 비용에 따라 달라지는 것이기 때문에 어느 것이 정답이라고 말씀드리기는 어렵습니다!

개인적으로 처음에는 연관관계 매핑을 이용해서 편의성을 도모하는 것 같습니다. 알고 계신 것처럼 JPA는 이미 지연로딩과 페치조인을 이용해서 필요할 때까지 연관 관계에 있는 엔티티에 대한 조회를 미룰 수 있기 때문에 생각하신 것보다 편하게 개발하실 수 있습니다. 초기 단계에서 모든 것을 고려하고 가면 좋으나 그렇게 하기에는 일정, 비용 등이 따라주지 않고, 결과물을 빨리 보여줘야 할 일이 많습니다. 그래서 최대한 단순하게 개발할 수 있는 형태로 시작하는 경우가 많습니다.

2번 예시 코드에서 보여주셨던 간접 참조도 좋다고 생각합니다. 말씀하신 것처럼 댓글에 게시글을 같이 가져오는 경우는 생각보다 많지 않습니다. 필요한 경우에만 같이 조회할 수 있도록 게시글 id를 댓글 객체에 포함해놓는 방법도 좋다고 생각합니다.

둘 다 서로 이점이 있는 개발 방식입니다. 또한 예시로 들어주셨던 네이버 카페의 게시글 - 댓글 관계는 실제로 어떻게 풀어나가는지는 모르겠으나, 1번 방법을 사용해도 충분히 가능(게시글을 Soft Delete로 삭제 처리)하다고 생각합니다. 고민이 들 때는 혼자 토이 프로젝트를 할 때 두 방법 모두 사용해보시고 직접 경험하는 것을 추천합니다! 저도 직접 사용하고 경험한 지식일수록 더 잘 사용하고, 확신을 가지고 사용했던 것 같습니다!

감사합니다.

1

lee

두 가지 방법 모두 유용하니 섞어서 개발해 보겠습니다! 감사합니다!!

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

39

2

inheritance startegy 선택시 고려사항

0

26

1

Entity 동등성 비교

0

27

1

실무 조언 관련 질문입니다.

0

52

1

H2데이터베이스 파일 생성

0

61

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

59

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

58

1

JPQL 메소드와 락

0

57

1

Delivery @OneToOne

0

64

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

98

2

UnsupportedOperationException 발생

0

89

3

H2 Database 연결이 안됩니다.

0

98

2

연관관계 매핑 질문드립니다.

0

88

2

h2데이터베이스 실행오류

0

110

2

persistence.xml

0

113

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

84

1

영속성 컨텍스트

0

70

1

JPA 프록시

0

100

1

Native Query와 MyBatis

0

74

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

94

1

임베디드 타입 예시 코드 관련 질문

0

121

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

97

3

인텔리제이 패키지 커서 단축키 질문

0

110

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

149

1