Post

TIL(20240702) [N+1문제와 트랜잭션]

TIL(20240702) [N+1문제와 트랜잭션]

N+1문제와 트랜잭션은 내가 깊이 공부해야 할 부분이다. 다른 개념들도 정말 중요하겠지만 지금 이 시점에서.. 내가 생각한건, 계속 내가 JPA를 다룰거라면 N+1문제와 트랜잭션은 확실히 알고 가야할 것 같았다.

자료를 찾아봐도 정말 복잡하다.. N+1문제는 확실한 해결방법이 없는 것 같아 상황에 따라 해결방법(여러가지 있다.)을 유연성있게 사용해라.. 이런느낌인데, 정해진 해결방법이 없어서 뭔가 아쉬운 감은 있지만 정확하게 알아야 상황에 따라 해결방법을 사용할 수 있을 거라 생각했다. 이건 나의 과제와 연결지어서 실습하며 풀어야 할 부분이었다.

📌 JPA에서 N+1 문제를 해결하기 위한 방법?

  • N+1문제가 발생하는 이유에 대해서 먼저 설명을 드리면 Post와 Comment는 1:N관계를 가지는 상황에서 Post를 전체 조회를 한다고 가정했을 때 postDTO에 CommentList까지 응답정보에 들어있다면 Post 전체조회를 하는 과정에서 Post를 조회하는 쿼리가 1개가 생성되고 각 post마다 댓글을 가져오기 위해 추가쿼리가 실행되는데 이때 N번이 발생하게 됩니다. (성능최적화 필요)
  • EAGER 설정, Join Fetch사용, EntityGraph, bathSize 등 해결방법이 있습니다.
  • 페치전략을 EAGER로 설정한다면 post를 불러오는 과정에서 댓글까지 한번에 불러오게되어 N+1문제를 발생시키지 않지만 POST를 조회할 때 댓글을 제외하고 불러오는 상황도 생길 수 있으니 EAGER은 적절하지 않다고 생각합니다.
  • 그 다음 해결방법으로는 Join Fetch사용입니다. 이 경우 Left join fetch를 사용하여 한번에 쿼리로 데이터를 가져오게 됩니다. 하지만 join fetch의 경우에도 단점이 있는데 둘이상의 컬렉션은 페치조인을 할 수 없고 페이징 쿼리를 사용할 수 없고 그외 entitygraph가 있고 batchSize를 사용하여 해결할 수 있지만 batchSize를 잘 지정해주지 않는다면 메모리사용이나 데이터베이스의 부하가 생길 수 있습니다.

📌 트랜잭션의 특징 및 프로세스?

  • 트랜잭션이란 데이터베이스의 상태를 변경시키기 위해 수행하는 작업단위입니다.(행동 SELECT,UPDATE,INSERT,DELETE등)
  • 트랜잭션은 원자성, 일관성, 독립성, 지속성 4가지의 특징을 가지고 있습니다. (ACID속성) 먼저 원자성에 대해서 말씀드리면 DB에 모두 반영된다, 전혀 반영되지 않는다를 의미하며 일관성은 작업처리의 결과가 항상 일관적이어야 한다는 것 그리고 독립성은 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적으로 수행해야 하며 마지막으로 지속성은 트랜잭션이 성공적으로 완료되면 영구적으로 결과가 반영되어야 함을 말합니다.
  • 독립성 isolation의 레벨은 동시성/데이터무결성과 연관이 있다. 트랜잭션의 격리수준이 높을 수록 데이터의 무결성이 보장되나 동시성은 낮아집니다. 그 반대로 격리수준의 낮을 수록 반대가 됩니다. 서비스의 맞게 잘 설정하여 사용해야 한다는 것을 알 수 있습니다.
This post is licensed under CC BY 4.0 by the author.