작성
·
166
·
수정됨
0
안녕하세요 강의 보면서 게시판 성격의 서비스를 만들던 중에 궁금증이 생겼습니다. 두 가지 방법이 있는데, 제가 취준생이라 실제 서비스 코드들을 본 적이 없어서 어떤 방법이 조금 더 현명한 방법인지 궁금합니다!
Jpa 사용법처럼 게시글과 댓글을 맵핑하는 방법입니다.
댓글에 게시글의 키만 가지는 방법입니다.
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 등등이 복잡하게 들어갈 수 있을 것 같습니다 )
네이버 카페와 같은 사이트들의 경우에서는 게시글과 댓글을 따로 관리하는 것 같기도 하고(작성 글 보기를 누르면 삭제된 게시글 이지만 댓글 내용은 볼 수 있는 경우입니다)
실제로는 어떤 방식으로 풀어 가는지 궁금합니다!
답변 1
0
안녕하세요. lee님, 공식 서포터즈 y2gcoder입니다.
연관관계 매핑을 할 것인지, 아니면 간접참조를 할 것인지 에 대해 고민하고 계신 것으로 보입니다.
프로젝트의 요구사항이나 개발 비용에 따라 달라지는 것이기 때문에 어느 것이 정답이라고 말씀드리기는 어렵습니다!
개인적으로 처음에는 연관관계 매핑을 이용해서 편의성을 도모하는 것 같습니다. 알고 계신 것처럼 JPA는 이미 지연로딩과 페치조인을 이용해서 필요할 때까지 연관 관계에 있는 엔티티에 대한 조회를 미룰 수 있기 때문에 생각하신 것보다 편하게 개발하실 수 있습니다. 초기 단계에서 모든 것을 고려하고 가면 좋으나 그렇게 하기에는 일정, 비용 등이 따라주지 않고, 결과물을 빨리 보여줘야 할 일이 많습니다. 그래서 최대한 단순하게 개발할 수 있는 형태로 시작하는 경우가 많습니다.
2번 예시 코드에서 보여주셨던 간접 참조도 좋다고 생각합니다. 말씀하신 것처럼 댓글에 게시글을 같이 가져오는 경우는 생각보다 많지 않습니다. 필요한 경우에만 같이 조회할 수 있도록 게시글 id를 댓글 객체에 포함해놓는 방법도 좋다고 생각합니다.
둘 다 서로 이점이 있는 개발 방식입니다. 또한 예시로 들어주셨던 네이버 카페의 게시글 - 댓글 관계는 실제로 어떻게 풀어나가는지는 모르겠으나, 1번 방법을 사용해도 충분히 가능(게시글을 Soft Delete로 삭제 처리)하다고 생각합니다. 고민이 들 때는 혼자 토이 프로젝트를 할 때 두 방법 모두 사용해보시고 직접 경험하는 것을 추천합니다! 저도 직접 사용하고 경험한 지식일수록 더 잘 사용하고, 확신을 가지고 사용했던 것 같습니다!
감사합니다.
두 가지 방법 모두 유용하니 섞어서 개발해 보겠습니다! 감사합니다!!