작성
·
42
·
수정됨
0
강의를 듣고 간단한 게시판을 만들고 있습니다.
구현을 하다가 이런식으로 양방향 편의메서드를 작성했습니다.
Post(게시글)을 생성할 때 setBoard()를 사용해서 Board.posts 리스트에 생성된 Post 객체를 넣도록 하고 있습니다.
public void setBoard(Board board) {
this.board = board;
if (!board.getPosts().contains(this)) {
board.getPosts().add(this);
}
여기서 든 고민이 있습니다.
예를 들어 한 게시판에 게시글이 100만개 혹은 엄청난 양의 게시글이 쌓여있다고 가정을 한다면 contains()를 하는 과정이 O(N) 이 걸려 성능이 안좋아질거라고 생각했습니다.
근데 논리적으로 생각했을 때 Board(게시판)에 똑같은 객체(=PK가 같은) Post(게시글) 가 들어갈 일이 있을까? 라는 생각을 해서 굳이 중복 검사하는 로직이 필요하나라는 생각이 들었습니다.
이럴 경우는 어떻게 생각하시나요?
답변 2
0
안녕하세요. opix0306님, 공식 서포터즈 코즈위버입니다.
게시글이 매우 많다 하더라도 그 게시글을 한 번에 메모리로 불러온 상황이 아니라면 contains() 는 크게 느리지 않습니다.
contains() 가 실행 될때에는 현재 영속성에 존재하는 Post 객체 중 참조주소가 같은 객체가 있는지 찾게 됩니다. 그래서 메모리에 불러온 객체가 많지 않다면 속도는 크게 영향을 받지 않습니다.
만약 Post 객체를 대량으로 불러와서 처리해야 하는 상황이라면 엔티티의 연관관계 설정에서 List 대신 Map(HashMap)을 이용하여 조회순서를 줄이는 방법으로 테스트를 진행해봐도 괜찮을것 같습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
opix0306님의 질문에 대해, 비슷한 맥락의 질문과 답변을 찾았습니다. 관련된 답변 URL과 간단한 설명을 추가하여 안내해 드리겠습니다.
여기서 김영한님은 연관된 엔티티의 상태 변경 정도만 다룰 때는 리스트에서 제거하지 않아도 된다는 의견을 제시하며, 연관 관계의 주인이 아닌 이상 상태 변경이 유효하지 않을 수 있다고 하셨습니다.
김영한님은 게시글과 댓글을 분리하여 관리하는 것이 좋고, 데이터량이 많아지는 경우 별도의 카운트 데이터를 유지하는 것이 더 나은 방법이라고 언급하셨습니다. 이는 대용량 데이터 처리며 조회 성능을 높일 때 도움이 될 수 있는 방법론을 제시합니다.
이 두 가지 질문과 답변을 참고해 보시면, 대용량 데이터 처리 시 성능 최적화를 염두에 둔 코드 작성 방식과 연관 관계 편의 메서드 사용에 있어 성능과 유지보수 측면에서 고려할 점을 이해하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다. 추가적으로 논리적으로 Board 안에 중복되는 Post가 들어갈 일이 없다고 생각한다면, 비즈니스 로직에 중복검사 로직 수행 유무에 대해서는 어떻게 생각하시나요?