이전 상황 정리 이전 글은 Data JPA를 사용해서 Delete를 진행했을 때, N+1이 발생해서, 성능 저하가 발생했었고, `delete where in ...` 쿼리를 직접 작성하는 것으로 엄청난 성능 향상을 가져왔었다. 이젠 이 쿼리를 프로젝트에 적용하고 성능을 체크해보자. 적용 프로젝트에 적용하기에 앞서, 다시 한번 관계를 확인하겠습니다. Feed를 삭제하면 다음과 같은 관계를 갖습니다. 삭제 성능을 확인하기 위해, 테스트 데이터를 집어넣고 삭제를 진행해보자. 테스트 코드가 상당히 길어서 대충 정리하면 Feed는 10개, Comment는 각 Feed당 100개, Reply는 각 Comment당 100개, ReplyLike는 각 Reply당 10개씩 있어서, ReplyLike가 총 100만개정도 ..
JPA
웹 백엔드 프로젝트를 진행하면, 많은 분들이 `Java`언어와 `Spring Boot` + `JPA` 혹은 `MyBatis` 조합을 사용해서 개발을 진행합니다. 저 역시 지금껏 Spring Boot를 활용해서 개발을 했었고, `JPA`와 `MyBatis` 모두 사용해 보았지만, 최근엔 `JPA`를 주로 사용하며 개발을 했습니다. `JPA`를 선택하면, 많은 편의성이 있지만, 가장 와닿는 점은 쿼리를 직접 작성하지 않아도 된다는 점이라고 생각합니다. 하지만 `JPA`가 직접 작성해 주는 쿼리는 저희의 생각과는 다르게 동작하는 경우도 존재합니다. 이 글은 `JPA`의 Delete 쿼리를 사용하면서 발견한 의아한 부분을 발견하고, 더 효율적인 방법을 찾아보려고 했던 내용에 대해서 다룹니다. 배경 최근 한 프로..
'JPA의 N+1 문제'라는 이야기는 JPA를 사용하는 사람이라면 반드시 들어봤을 문제이다. N+1 문제로 인해서 성능 문제도 발생한다고 하기 때문에, JPA를 사용하는데 성능이 떨어진다면, N+1 문제가 발생하지 않은지 항상 확인해야 한다고들 말한다. 면접에서도 자주 묻는다는 N+1 문제가 도대체 무엇인지, 왜 발생하는지, 어떤 영향을 주고, 어떻게 해결하는지에 대해서 알아보자. N+1 문제란? N+1 문제는 하나의 엔티티를 조회할 때, 해당 엔티티와 연관된 엔티티에 접근할 때, 지연 로딩 전략에 따라서 추가적인 쿼리가 N번(처음 조회된 엔티티의 개수)만큼 나가는 것을 의미한다. 예시 코드를 보며 이해를 해보자. public class Team { @Id @GeneratedValue private Lo..