본문 바로가기

분류 전체보기

(287)
JPA | @DataJpaTest @DataJpaTest JPA 애플리케이션을 테스트 할 때 사용하는 애노테이션 @ExtendWith(SpringExtension.class)를 포함하고 있기 때문에 스프링 구동 환경으로 실행 되지만, @Component 나@ConfigurationProperties 빈들은 스캔되지 않아 더 빠른 테스트가 가능함 @Transactional도 포함하고 있어 기본적으로 모든 테스트 후 롤백처리 됨 인메모리 임베디드 데이터베이스를 사용할 수도 있지만, 실제 데이터베이스를 사용하고자 한다면 @AutoConfigureTestDatabase애노테이션을 사용할 수 있음 @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace...
JPA | Querydsl 서브 쿼리 SELECT 절에서 사용하기 JPAExpressions를 이용해 서브쿼리를 작성할 수 있다. @Override public UserResponseDto getUserWithCount() { return queryFactory.select( Projections.constructor( UserResponseDto.class, user, JPAExpressions.select(count(user.id)) .from(user) ) ) .from(user) .fetch(); }서브쿼리에서도 WHERE절을 사용해 어떤 값을 검색하고자 할 때는 아래와 같이 한다. @Override public UserResponseDto getUserWithParentName() { QUser u = new QUser("u"); ..
JPA | TIMESTAMP 저장 시간이 일치하지 않을 때.. JPA를 사용해 DB에 저장할 때, 시간이 다르게 저장된다.. 1. TimeZone변경 JVM의 TimeZone을 변경하는 방법 @PostConstruct public void started() { TimeZone.setDefault(TimeZone.getTimeZone("UTC")); } @PostConstruct는 스프링 부트가 실행 되면서 Bean설정이 완료 된 직후 실행된다. 2. properties 수정* spring.jpa.hibernate.jdbc.time_zone= Asia/Seoul로 설정한다. spring: jpa: hibernate: jdbc: time_zone: Asia/Seoul
JPA | 복합 키 (Composite Key) 사용하기 (@IdClass) JPA에서 식별자(@Id)를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다. JPA는 복합 키를 지원하기 위해 @IdClass와 @EmbeddedId 두 가지 방법을 제공하는데 @IdClass는 관계형 데이터베이스에 가까운 방법이고 @EmbeddedId는 좀 더 객체지향에 가까운 방법이다. 출처: 김영한 저 자바 ORM 표준 JPA 프로그래밍 256p. @IdClass 엔티티 클래스에서 @IdClass애노테이션을 사용한다. USER라는 테이블의 기본키를 id와 regDate(가입일)을 조합하여 사용한다고 가정할 때, 엔티티 클래스를 아래와 같이 작성한다. @Id애노테이션을 가진 필드가 두 개 이상. 즉 복합키를 사용해야 하고, @IdClass()애노테이션에 복합 키를 매핑하기 위한 클래스를 지..
JPA | DynamicInsert, DynamicUpdate, 엔티티 리스너 DynamicInsert, DynamicUpdate 기본적으로 하이버네이트는 INSERT와 UPDATE시에 모든 컬럼을 사용한다. @DynamicInsert는 INSERT 구문 생성 시점에 null이 아닌 컬럼들만 포함하며, @DynamicUpdate는 UPDATE구문 생성 시점에 null이 아닌 컬럼만(변경된 값만) 포함한다. 해당 애노테이션들은 엔티티에 직접 적용하여 사용한다. @DynamicInsert @DynamicUpdate @Entity public class User { // 생략 }@DynamicInsert는 컬럼의 지정된 default 값을 적용시키며 INSERT할 때 사용할 수 있다. @Coulmun(columnDefinition = "")에 지정한 default 값은 DDL 생성기능이..
Spring Boot | Querydsl Projections Result handling Querydsl은 결과를 커스터마이징 하기 위한 두 가지 방법을 제공한다. FactoryExpressions: 열(row) 기반 변환 FactoryExpression 인터페이스는 빈 생성, 생성자 호출 그리고 더 복잡한 객체를 생성하기 위해 사용되며, Projections구현체를 이용한다. ResultTransformer: 집합(aggregation) ResultTransformer 인터페이스의 주요 구현체는 GroupBy클래스다. Projections 쿼리 결과를 DTO클래스로 받을 때 주로 사용한다. Bean population 쿼리 결과로부터 빈을 생성하고자 할 때 bean projection을 사용한다. Projections.bean() 메서드를 호출하여 사용하며, s..
Spring Boot | PageRequest Spring Data JPA를 사용해 페이징을 하려는데, 컨트롤러에서 바로 Pageable을 받고싶지는 않았다.. Pageable 사실 Pageable을 이용하면 정말 쉽게 바로 받아진다. import org.springframework.data.domain.Pageable; @RestController @RequestMapping("api/v1/orders") public class OrderController { @GetMapping() public Response getOrders(final Pageable pageable){ // ... } }api/v1/orders?page=0&size=20&sort=id,desc이렇게 요청하면, 쿼리 스트링이 바로 pageable에 매핑된다. PageReque..
Spring Boot | Querydsl 추가 (Gradle 7.x) 📌참고!!!! [gradle] 그레이들 Annotation processor 와 Querydsl Querydsl은 JPQL 빌더 오픈소스 프레임워크다. 일단 Querydsl을 사용하기 위해 라이브러리를 추가해야 한다. SpringDataJPA도 추가되어 있어야 한다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' // Querydsl 추가 시작 implementation 'com.querydsl:querydsl-jpa' } 이렇게만 하면 Q..