본문 바로가기

JPA5

JPA - save() & saveAll() 성능 비교 분석 JPA를 사용하면 데이터를 저장할 때 save와 saveAll 함수를 사용하여 데이터를 저장할 수 있다. 두가지 함수의 차이는 데이터를 한번에 한 개를 저장하느냐 N개를 저장하느냐의 차이다. 만약 10개를 데이터를 저장해야 될 때 save()를 통해 데이터를 10번 저장하는 것과 saveAll()을 통해 한번에 데이터를 저장하는 것이 성능적으로 어떻게 차이가 있을지에 대한 궁금점을 해결하기 위한 글이다. save() vs saveAll() 성능 비교 분석 save() vs saveAll() 성능 테스트 거두절미하고 바로 N개의 데이터에 대하여 save()와 saveAll()에 두가지 함수에 대해서 성능을 측정해본다. 성능 테스트 코드는 아래 코드를 참고하자. @Test @Transactional fun .. 2023. 5. 27.
JPA - N+1 문제와 해결방법 정리 들어가며 JPA를 사용하다 보면 N+1 문제를 한번씩은 겪어봤을것이다. 하지만 콘솔창을 자세히 보지 않았다면 그냥 지나쳤을 수도 있다. N+1의 문제가 발생한다고 해서 결과에 문제가 생기는 것은 아니지만 성능에는 문제가 생길 수 있기 때문에 확실히 인지해서 문제를 해결하는 것이 좋다. N+1 문제란 무엇인가? 연관관계가 설정된 엔티티를 조회할 때 조회 된 데이터의 갯수만큼 조회 쿼리가 추가로 발생하는 경우는 말한다. 이해를 돕기 위해 예를 들면 팀과 회원의 연관관계에서 팀을 조회했을때 팀에 속한 회원이 10명 있다고 가정할때 팀을 조회할때 연관관계를 가지고 있는 회원을 조회하는 쿼리가 10번(n번) 발생하는 것을 의미한다. N+1 == 10번(회원) + 1번(팀) Fetch 모드에 따른 결과 (즉시 로딩.. 2022. 8. 9.
JPA - findById() & existById() & getById() 메서드 관련 내용 정리 (쿼리, 성능 등등) 들어가며 JPA를 통해 개발을 하다보면 해당 객체가 존재하는지 안하는지에 대한 여부를 판단해야 될 때가 있다. 그때 보통 findById 또는 existById를 통해서 존재 여부를 알 수 있다. 둘의 차이점에 따라서 맞는 상황에 해당되는 메서드를 쓰면 되지만 이때 '둘 중의 어느것이 성능이 좀 더 좋을까?' 라는 의문을 시작으로 해서 이 글을 정리하게 되었다. 이 과정에서 알게 된 getById에 대해서도 같이 정리한다. findById & existById 차이점들 리턴값 findById와 existById의 차이점은 메서드명에서도 알 수 있듯이 반환 타입이 다르다. findById는 Entity를 반환하며 existById는 존재 여부에 대한 Boolean 타입을 반환하게 된다. 그러니 존재 여부를.. 2022. 3. 25.
JPA - Spring-data-jpa 사용시 @Repository 어노테이션 사용 여부 들어가며 jpa를 사용하지 않은 프로젝트를 진행시 repository에는 @Repository 어노테이션을 활용하여 의존성 주입을 위한 빈 등록을 해준다. 그렇다면 spring-data-jpa를 사용시에는 @Repository 어노테이션이 필요할까? 라는 생각에 찾아보았다. spring-data-jpa를 사용하지 않는 경우 spring-data-jpa를 사용하지 않는 경우에는 @Repository 어노테이션을 이용하여 리포지토리에 선언을 해주고 스프링 어플리케이션 동작시에 @ComponentScan 어노테이션을 통해 코드의 컴포넌트를 읽어 싱글톤 패턴으로 빈을 컨테이너에 등록하게 된다. 기본적으로 @Component 어노테이션을 명시한 클래스들이 Bean으로 등록이 되는데, @Controller, @Se.. 2022. 1. 28.
JPA - JPQL @Query 기록 JPA - JPQL 기록 해당 글은 jpql을 사용할때 쉽게 찾기 못했던 쿼리들을 정리하고 기록하는 용도이다. 정리하기 앞서 jpql은 Java Persistence Query Language에 약자로 관계형 데이터베이스의 엔티티에 대한 쿼리를 만드는데 사용한다. SQL 문법과 유사하지만 데이터베이스에 직접적으로 사용되는 것이 아닌 JPA 엔티티에 대한 동작이므로 JPQL의 쿼리문이 SQL 문법과 차이가 있으므로 정리해둔다. (지속적인 업데이트 예정...) LIKE 사용 시 @Query(value = "select c from Contact c where c.address like concat('%', :address, '%')") -> % 사용 Contact getContactByAddress(@Par.. 2021. 10. 12.