Spring

· Spring
ManyToMany를 사용하지 않는다면? 인터넷에서 글을 찾거나 강의를 듣다 보면, 직접적인 ManyToMany 사용을 지양하라고 많이 말합니다. 그러면 어떻게 사용해야 할까요? JPA에서는 다양한 연관관계가 존재하며, 상황에 따라 알맞게 연관관계를 맺어주게 됩니다. 사용자간의 팔로우를 예를 들어보겠습니다. 한 사람은 여러 팔로우를 신청할 수 있고 여러 사람도 한사람에게 팔로우를 신청할 수 있어 이러한 경우들을 다대다 관계로 맺을 수 있습니다. 이번 글에서는 이런 관계들을 어떻게 풀어야 적합한지 알아보도록 하겠습니다. ManyToMany의 기본 구조 다대다 관계는 어노테이션을 사용한다면, 간단하게 클래스의 별도 설정 없이 테이블 명, FK설정 등을 간편하게 설정할 수 있습니다.아래 코드는 사용자간의 팔로..
· Spring
JPA Pagination 처리 방법 실무에서 게시글 같은 화면 구성요소를 보았을떄, 페이지와 무한스크롤이 되는 경우로 나뉘어져 구현하게 됩니다. 소규모 프로젝트에서는 전체 게시글 수와 페이지의 각 번호가 있는 Page 많이 사용하게 되고, 데이터가 많거나 실시간 앱 화면 같은 경우는 무한 스크롤인 Slice를 통해 페이지를 구현하게 됩니다. JPA에서는 어떻게 일반적인 페이징을 처리하고, 무한 스크롤을 구현하는지 알아보겠습니다. Pageable이란? Pageable은 Spring에서 제공하는 Pagination을 위한 인터페이스 입니다. 이 Pageable을 활용하여 Page 또는 Slice의 요청, 응답에 대한 전달을 합니다. PageRequest 활용 PageRequest은 Pageable의 페이지..
· Spring
Batch Insert로 대량의 데이터 처리하기 실무에서 대량의 데이터를 넣게 될 때, 몇만건 이상이 된다면 데이터를 저장하는 과정이 매우 오래 걸리는걸 볼 수 있습니다. 이때는 JPA의 saveAll 메서드가 아닌, jdbcTemplate의 batch insert를 직접 구현하는 방법으로 데이터를 좀 더 빠르고 유연하게 넣을 수 있는 모습을 볼 수 있습니다. 이번 글에는 batch insert에 대해 알아보겠습니다. Batch Insert란? 여러 행을 연결해서 한 번에 입력하여 Insert 하는 것을 Batch Insert라고 합니다. 그러므로 한 트랜잭션에 처리되는 행 수를 지정하여 처리할 수 있습니다. JPA의 saveAll JPA에서 여러 개 단위의 Insert를 제공하는 메서드인 saveAll..
· Spring
JPQL개념과 사용법 패턴 정리 이번 글에는 실무에서 제가 자주 사용하는 JPQL에 대해 알아보겠습니다. 소모 비용이 많이 드는 쿼리들은 QueryDSL을 통해 최적화하지만, 확인하거나 간단하게 확인 할 수 있는 부분들은 JPQL을 사용하여 조회하고 있습니다. 그러면 자주 사용하는 JPQL에 대해 정리해 봅시다. JPQL이란? JPQL는 Java Persistence Query Language의 약자로, 데이터베이스에 저장된 엔티티를 조회하기 위한 객체지향 쿼리 언어입니다. SQL과 유사하지만 엔티티 객체와 필드를 대상으로 한다는 차이점이 있습니다. 또한 SQL과 유사하게 SELECT, DELETE, UPDATE 등의 기본적인 구문뿐만 아니라 다양한 쿼리 작성도 지원합니다. JPQL 조회 저는 보통 J..
· Spring
QueryDSL의 페이징 카테시안 곱 문제 해결 방법 복잡한 일대다 연관관계를 가진 데이터를 페이징 처리할 때 어떤 어려움을 겪은 적이 있으신가요? 저는 실무에서 페이징을 처리하다 보면 목록을 조회할 때 단순하게 하나의 연관관계가 아니라 일대다의 연관관계를 한두 개가 아닌 여러 개를 같이 조회할 경우가 생기게 됬었습니다. 이때 평소와 같이 페이징을 구현했더니 결과는 제대로 나오지 않았습니다. 이유는 바로 1:N 관계에서 발생하는 카테시안 곱 문제 때문입니다. JPA를 사용한다면 다들 한번쯤 겪어볼 문제이기 때문에 해결하기 위한 전략과 팁을 공유하기 위해 작성했습니다. 카테시안 곱(Cartesian Product)이란? JPA에서의 카테시안 곱은 데이터베이스 쿼리 수행시 여러 테이블 간의 조인을 잘못 사용..
· Spring
QueryDSL에서 JPA N+1 문제 해결하기 JPA를 배우며 N+1 문제에 대해 인지를 했지만, QueryDSL을 사용했을 때 어색하고, 잘 활용하지 못했던 경험이 있었습니다. 그래서 자주 사용하는 QueryDsl 기준으로 N+1문제를 해결하는 방법에 대해 알아보기 위해 글을 작성했습니다. JPA N+1 한 Entity를 조회했을 때 한 개의 쿼리가 생성되는 기댓값을 가지고 조회를 합니다. 하지만 어떤 상황의 경우에 한 개의 쿼리가 아닌 여러 개의 쿼리가 N개만큼 추가로 발생하는데 이것을 JPA의 N+1 문제라고 합니다. N+1문제가 발생하는 상황은 다음과 같습니다. 즉시 로딩 엔티티를 조회하는 경우 즉시 로딩의 경우 엔티티를 조회 할때마다 쿼리를 바로 날리기 때문에 N+1문제가 발생합니다. 지연 로..
· Spring
JPA의 연관관계 예제 정리 실무에서 JPA를 사용하게 될 때, 가장 중요한 건 도메인의 설계이며 JPA의 연관관계를 바탕으로 어떻게 풀어나갈 것인가를 먼저 생각하게 됩니다. 각 테이블의 특성에 대한 연관관계를 생각한다면 맞지만 비즈니스의 요구사항에 따라 성능 문제를 해결하기 위한 설계를 해야 하며, 그에 따라 연관관계를 많이 고민해 보고 풀어나가야 한다고 생각합니다. 이전 글의 영속성 컨텍스트와 프록시에 이해를 바탕으로 이번 글에는 JPA가 객체와 RDBMS 사이를 어떤 형식으로 매핑하고 연관관계를 설정하는 건지 알아보는 시간을 갖도록 하겠습니다. JPA의 연관관계 연관관계를 설정할떄는 다음과 같이 바라볼 수 있습니다. 연관 관계의 방향: 단방향, 양방향 연관 관계의 주인: 양방향에서의 관리 주체 연관..
· Spring
영속성 컨텍스트의 특징과 프록시 이해하기 이번 글에는 JPA의 필수 개념인 영속성 컨텍스트와 프록시에 대해 알아보겠습니다. JPA를 사용할 때 이 개념들을 모른다면 실무에서 JPA를 사용할 때 다양한 오류들을 만나게 되며 성능 부분에서 안 쓰는게 나을 정도로 심각한 문제를 야기할 수 있습니다. 그럼 개념에 대해 알아봅시다. 영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 뜻합니다. JPA는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트를 통해 애플리케이션 내에서 보관합니다. 엔티티를 저장하거나 조회하면 영속성 컨텍스트에 보관하고 관리하게 됩니다. 또한 아래와 같은 상태를 가집니다. 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속(managed..
97class
'Spring' 카테고리의 글 목록