스프링 부트 2.6 이상은 아래 글을 참고해주세요. 2022.08.23 - [Querydsl] - 스프링부트 2.6 이상 버전에서 Querydsl 설정 방법 모든 소스 코드는 여기 있습니다. Querydsl을 사용하기 위해 프로젝트 설정부터 차근차근 달려봅시다! 먼저 자바 버전은 11, 스프링 버전은 2.5.2를 선택하였고 gradle 프로젝트로 생성하여 아래 네 가지 dependency를 설정하였습니다. spring-boot-starter-web spring-boot-starter-data-jpa lombok h2 build.gradle 위와 같이 설정하셨다면 build.gradle 파일이 아래 처럼 작성되었을텐데요, plugins { id 'org.springframework.boot' version..
) 모든 소스 코드는 여기에서 확인할 수 있습니다. 바로 이전 포스팅에서 JPA가 save()를 호출할 때 새로운 Entity인지 기존 Entity인지 판단해 persist() 또는 merge()를 호출한다는 내용을 다룬 바 있습니다. 그렇다면 JPA는 과연 어떻게 새로운 Entity인지 판단하는 것 일까요? 설명을 위해 간단한 소스 코드를 작성해보겠습니다. package io.lcalmsky.springdatajpa.domain.entity; import lombok.Getter; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @Getter public..
스프링 데이터 JPA가 제공하는 공통 구현체를 분석해봅시다. SimpleJpaRepository는 JpaRepository를 구현하는 구현체로 기본적인 CRUD가 어떻게 동작하는지 확인할 수 있습니다. 약 1000 라인에 가까운 소스 코드가 내부적으로 EntityManager를 주입받아 JPA를 직접 사용하는 방식으로 구현되어 있습니다. 몇 가지 구현된 기능들을 살펴보겠습니다. 조회 CRUD중 R에 해당하는 것으로 select 동작 중 PK로 한 row를 가져올 때 사용합니다. @Override public Optional findById(ID id) { Assert.notNull(id, ID_MUST_NOT_BE_NULL); Class domainType = getDomainClass(); // (1)..
모든 소스 코드는 여기에서 확인 가능합니다. API에서 페이징 활용 지난 번에 스프링 데이터 JPA가 페이징 및 정렬을 지원하는 부분을 살펴봤었는데요, API 형태로 제공될 때는 어떻게 활용될 수 있는지 Controller를 개발해 확인해보겠습니다. package io.lcalmsky.springdatajpa.controller; import io.lcalmsky.springdatajpa.domain.entity.Member; import io.lcalmsky.springdatajpa.domain.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; impo..
사용자 정의 Repository Best Practice 사용자 정의 Repository를 만들 때 가장 좋은 방법을 소개합니다. 일반적으로 사용자 정의 Repository라고 함은, JpaRepository를 상속해서 쿼리 메서드를 이용하는 것이 아니라 구현체에서 직접 JPA를 사용하거나 MyBatis, JdbcTemplate, QueryDSL 등을 이용해 구현한 것을 말합니다. 상대적으로(?) 나쁜 예시 Entity가 Member, Team이 존재하고 Member는 JpaRepository를 사용하고 Team은 사용자 정의 Repository를 사용한다고 가정하면 그냥 구현해도 상관없습니다. 하지만 MemberRepository가 존재하는데 CustomMemberRepository를 따로 만들어서 S..
모든 소스 코드는 여기에서 확인 가능합니다. Fetch Join과 @GraphEntity를 소개하기 전에 JPA를 사용하다보면 겪을 수 있는 사례 하나를 소개합니다. Member Entity와 Team Entity가 다대일 관계(@ManyToOne) 일 때 Entity 클래스에 서로의 관계를 표시해줍니다. Entity간 연관관계가 있고 JPA를 이용하여 조회해야 하는 상황에서는 되도록이면 FetchType.LAZY 사용을 권장합니다. 관계 파악을 위해 소스 코드를 살펴봅시다. (설명에 필요 없는 import문 등은 생략하였습니다.) @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString public class Member ..
모든 소스 코드는 여기에서 확인 가능합니다. JPA는 보통 데이터를 가져와서 변경하면 변경 감지(dirty checking)를 통해 DB에 업데이트 퀴리를 수행합니다. 이런 업데이트들은 건 별로 select 이후 update가 이루어지기 때문에 수천 건을 업데이트 해야하는 경우 비효율적일 수 있습니다. JPA를 사용해서도 수 천, 수 만 건의 데이터를 한 번에 업데이트 하는 벌크 업데이트(Bulk Update)쿼리를 사용할 수 있습니다. @Modifying 애너테이션 벌크 업데이트를 하기 위해선 @Query와 함께 @Modifying 애너테이션을 사용해야 합니다. 나이가 N살 이상인 전체 회원의 나이를 1씩 증가시켜야 한다는 요구사항이 존재한다고 가정하고 이를 구현한 소스 코드 입니다. package i..
모든 소스 코드는 여기에서 확인 가능합니다. 스프링 데이터 JPA를 사용하면 기본 인터페이스 외에도 메서드 추가 만으로 직접 구현체를 구현하지 않아도 기능을 사용할 수 있습니다. 쿼리 메서드 기능 메서드 이름으로 쿼리 생성 메서드 이름을 분석하여 JPQL 쿼리를 수행합니다. package io.lcalmsky.springdatajpa.domain.entity; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import javax.persistence.*; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTE..
- Total
- Today
- Yesterday
- spring boot application
- spring boot app
- Spring Data JPA
- 스프링 데이터 jpa
- r
- leetcode
- 알고리즘
- 헥사고날 아키텍처
- QueryDSL
- Spring Boot JPA
- @ManyToOne
- 스프링부트
- 스프링 부트
- Spring Boot
- 스프링 부트 애플리케이션
- Linux
- gRPC
- intellij
- Spring Boot Tutorial
- 클린 아키텍처
- Jackson
- 스프링 부트 튜토리얼
- proto3
- 함께 자라기 후기
- 함께 자라기
- JPA
- JSON
- 스프링 부트 회원 가입
- spring boot jwt
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |