개발자
게시물이나, 댓글, 좋아요 등 여러 테이블에 memberId가 매핑이 될텐데 제가 일하기 시작한지 초반에, "memberId는 최대한 많이 매핑을 안해두는게 좋다" 라고 배웠습니다. 심지아 많은 테이블에 memberId가 들어가는데, 하나도 연관성 매핑을 안두고 설계를 한적도 있어요. 지금 새로운 프로젝트에서 게시물이나 댓글, 그리고 좋아요를 구현하고 있는데, 게시물을 목록으로 조회할때 각 게시물 작성자의 프로필 이미지와 닉네임, 댓글을 조회할때, 작성자의 프로필 이미지와 닉네임, 그리고 누가 좋아요를 눌렀는지 보려고 목록으로 좋아요 누른이의 프로필 이미지와 닉네임을 보여주고 싶은데, JPA 매핑 없이 구현하려니 너무 많은 query가 나가면서 수동으로 매핑 시켜줘야할것같은데.. 1. 이 경우 각 테이블과 멤버 테이블의 연관성을 설정해주는게 좋나요? 아니면 2. 많은 query가 나가도 어쩔 수 없고, paging으로 가져와 가져오는 댓글/좋아요/게시물 수를 줄이고, response dto에 수동으로 멤버 정보를 넣어주는게 좋을까요?? 아니면 3. 더 효율적인 방법이 있을까요? 미리 감사합니다!
답변 1
안녕하세요 ! 말씀해주신 글로 보았을 때, 질문의 핵심 의도는 테이블 간의 제약 조건(PK, FK 기반으로 1:N, M:N 관계 설정) 을 해주어야 하는가 인 것 같습니다. query로 주로 쓸 지, JPA와 같은 ORM 기반으로 주로 쓸 지는 사실 개인의 취향이나 소속 팀의 정책에 따른다라고 생각합니다. 제약 조건을 사용하는 이유는 관계의 표기도 있겠지만, 데이터의 정합성을 맞춰주기 위함도 있습니다. 쉽게 예시를 들자면, id가 1번인 게시글이 있고 그와 관련에 댓글이 있다고 가정해봅시다. 제약조건이 없이 게시글을 삭제해도 댓글들은 지워야 할 의무가 없는거죠. 디스크에는 쓰지 않는 데이터는 적재될 것이고 데이터를 보다보면 출처를 모를 데이터가 될 꺼에요 ! 제약조건을 사용하게 되면 CASCADE 같은 옵션으로 그런 걱정은 할 필요가 없게 되는거죠 그러나 현업에서는 생각보다 FK를 통해 관계 설정을 안한 케이스를 많이 보고 들었습니다. 이유는 결국 관리가 어렵다! 라는 거죠. 일은 바쁘고 급한데 ROW 한줄을 지우기 위해 테이블 간의 관계를 고려하여 순서대로 지우는 것이 번거롭기 떄문이라고 저는 생각해봤습니다. 답변이 도움되셨으면 좋겠네요~고생하세요
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 04월 27일
이 상황에서 가장 중요한 것은 여러분의 애플리케이션의 성능과 유지보수성입니다. 1. 연관관계 매핑을 사용하면 JPQL, Criteria 등에서 경로 표현식을 통해 쉽게 엔티티를 탐색할 수 있습니다. 또한, 회원 엔티티를 통해 게시물이나 댓글을 직접 참조할 수 있게 되므로 객체 지향적인 설계를 가능하게 합니다. 하지만 주의해야 할 점은 연관 관계의 주인 쪽에서만 외래키를 관리해야 한다는 것입니다. 2. 너무 많은 query가 나가는 것에 대한 걱정은 이해합니다. 성능상으로 문제가 될 수 있는 경우도 많습니다. 그럴 때 사용할 수 있는 방법 중 하나가 "join fetch" 또는 "EntityGraph"라는 기능입니다. 이 기능들은 한 번의 쿼리로 필요한 엔티티와 그 관련 엔티티들을 모두 가져오고 싶을 때 사용합니다. 3. 다른 방법으로는 QueryDSL이나 JPA Criteria가 있습니다. 특정한 조건에 따라 동적인 쿼리를 생성해야 하는 경우 QueryDSL이 유용하며, 모든 것을 Java 코드로 작성하기 때문에 컴파일 시점에서 오류를 잡아낼 수 있다는 장점이 있습니다. 각 방법에는 장단점이 있으므로 상황과 요구사항에 따라 적절한 방법을 선택하는 것이 중요합니다. 만약 성능 향상을 원하면서도 유지보수성을 포기할 수 없다면, QueryDSL 같은 도구를 고려해 볼 만 합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!