[Spring JPA] JPA Transactional 좀 더 알기
·
Spring/JPA
현재 `SpringBoot`를 사용하시는 대부분의 개발자라면, 대부분 `Spring Data JPA`를 사용할 것이다.또한, `Spring`에서 제공해주는 `@Transactional`이라는 어노테이션을 많이 활용할 것이다. 그런데, 이것저것 공부를 하며 내가 몰랐던 `JPA Transactional`에 관한 많은 지식을 카카오페이의 테크 블로그를 통해 알게 되었다. 따라서, 이번 포스팅 내용은 해당 블로그에서 얻은 지식을 정리하는 것이다.추후, 진행중인 `StudyWithMe`에도 적용해 볼 예정이다. 그럼 시작해보자.@Transactional이란?`Spring Transactional annotation`, 이하 `@Transactional`은 `Spring`에서 메서드의 원자성을보장하기 위해 정의된..
[JPA] getReferenceById() 리마인드
·
Spring/JPA
`StudyWithMe` 프로젝트를 하면서 잊고 있었던 `getReferenceById()` JPA 메서드를 사용했다. findById()와 getReferenceById() findById()와 getReferenceById()가 데이터를 가져오는 방식에는 어떤 차이가 있을까?  findById()Optional findById(ID id)Optional: 조회된 엔티티를 Optional로 감싼 반환 타입이다.Optional은 엔티티가 존재하지 않을 수도 있는 경우에 사용된다.ID: 조회할 엔티티의 식별자(ID) 타입이다.조회된 엔티티 객체를 Optional로 감싸서 반환한다.`CrudRepository`와 `JpaRepository` 인터페이스에서 모두 제공되는 메소드이다. getReferenceBy..
[QueryDSL] QueryDSL이란?
·
Spring/JPA
QueryDSL이란? 우선, DSL은 Domain Specific Language의 줄임말이다. 뜻은 특정 영역에 특화된 언어이다. 그렇기 때문에 QueryDSL은 쿼리 생성에 특화된 프레임워크이다. 우리가 QueryDSL를 사용하면 좋은 점이 무엇이 있을까? 그것에 관한 설명을 하기 전에 JPA와 JPQL에 관한 문제점에 대해 잠깐 알아보자. JPA JPA는 객체지향 어플리케이션과 RDBMS 사이의 패러다임 불일치를 해결해주는 역할을 하는 프레임워크이다. JPA 덕분에 우리는 객체지향 관점으로 개발할 수 있게 되고 JPA 프레임워크는 자동으로 SQL 쿼리문을 생성해준다. SQL문이 JPA에 의해 자동으로 생성되기에 개발자는 SQL 관점에서 프로그래밍을 하지 않아도 된다. 하지만, 그렇다하더라도 완전한 ..
Spring Pagination 연습
·
Spring/JPA
이번 포스팅에는 Spring Pagination에 대해 다뤄 볼 것이다. 구글, 네이버 카페, 커뮤니티 등 어떤 웹에서도 페이징 처리가 된 웹 형태를 자주 찾아볼 수 있다. 그렇다면 이렇게 페이징 처리하는 이유가 뭘까? 수많은 데이터가 DB에 존재한다고 했을 때, 페이징 처리를 하지 않고 모든 데이터들을 한 번에 뿌려준다면 해당 데이터들을 DB로부터 가져오는데 엄청난 시간이 소요될 것이다. 또한, 해당 데이터 자체를 들고 있어야 하기에 메모리에도 부담이 클 것이다. 하물며 사용자들이 그 수많은 데이터들을 다 보게 하는 것도 용이하지 못하다. 그래서, 모든 데이터들의 개수에 대한 기준을 만들어 해당 개수만큼 가져오는 페이징 형태를 사용하는 것이다. 페이징 처리를 적절히 활용하여 정렬 기준과 정렬 방식(오름..
[SpringBoot] OSIV와 성능 최적화
·
Spring/JPA
OSIV는 Open Session In View의 약자이다. OSIV는 Spring에 spring.jpa.open-in-view: true 기본값으로 설정되어 있다. OSIV 전략은 최초 데이터베이스 커넥션 시작부터 API 응답(View에 전송 및 DTO 반환 등)이 끝날 때 까지, 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그렇기 때문에 View Template 또는 Controller에서 지연 로딩이 가능하다. 따라서, 개발자로 하여금 어느 곳에서도 데이터베이스 커넥션을 신경쓰지 않고 개발할 수 있게 해준다는 장점이 있다. 하지만, 해당 전략은 너무 오랜시간동안 데이터베이스 커넥션을 사용하기 때문에 실시간 트래픽이 중요하고 많은 애플리케이션에서는 커넥션 쓰레드 풀이 모자랄 수 있다. 이는 곧 ..
[SpringBoot] JPA Collection 페이징 처리
·
Spring/JPA
앞 JPA Collection 페치 조인 최적화 방법은 데이터가 뻥튀기 되기에 페이징 처리에 어려움이 있었다. 하지만, 다른 방법을 사용하면 Collection 페이징 처리가 가능한데 다음과 같은 방법을 따르면 된다. 방법 1. @XToOne(OneToOne, ManyToOne) 관계에 대해선 기존의 페치 조인을 활용한다. (컬렉션은 지연 로딩) @Override public List findAllWithMemberDelivery(Pageable pageable) { QOrder order = QOrder.order; QMember member = QMember.member; QDelivery delivery = QDelivery.delivery; return jpaQueryFactory .select(..