본문 바로가기

Spring/JPA

(48)
[Querydsl] Initial setting 이번 장에서는 Querydsl을 위한 초기 설정에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 프로젝트를 생성하는 방법에 대해서는 다루지 않는다. 만약 Spring Boot 프로젝트 생성이 익숙치 않다면 필자가 이전에 작성한 글 (링크)을 참고한다. build.gradle Spring 2.6 이후, Gradle 5.0 이후 plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE&#39..
[Spring Data JPA] Native Query 이번 장에서는 네이티브 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Spring Data JPA는 DB에 직접 쿼리를 날리는 것 처럼 네이티브 쿼리를 지원한다. 네이티브 쿼리를 사용하게 되면 추후 DB의 종류가 변경되면 코드의 변경도 피할 수 없다. JPA의 큰 장점인 DB 추상화가 사라지는 것이다. 이러한 이유로 가급적 네이티브 쿼리는 사용하지 않는 것이 좋다. 기존에는 네이티브 쿼리의 반환 타입으로 Object[]와 Tuple만 가능했지만 최근에는 Projections까지 활용 가능해졌다. 네이티브 쿼리의 경우 페이징을 지원한다. 하지만 Sort를 통한 정렬이 정상 작동하지 않을..
[Spring Data JPA] Projections 이번 장에서는 Projections에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. SQL에서 Select를 할 때 Select 절에 원하는 값을 적는데 이것을 Projection이라 한다. JPA에서도 이렇게 Entity의 모든 값을 꺼내는 것이 아니라 원하는 값만 꺼낼 수 있도록 Projections를 지원한다. 인터페이스 기반 Closed Projections SoccerPlayer 클래스는 아래와 같다. 데이터를 조회할 때 id와 team을 제외한 필드만 조회하는 방법을 알아본다. @Entity @NamedQueries(value = { @NamedQuery( name = "Socce..
[Spring Data JPA] Query By Example 이번 장에서는 Query By Example에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 원하는 검색 조건을 가지고 있는 Probe라고 하는 도메인 객체를 생성하여 Example 객체를 생성하고 검색하는 기술이다. 참고한 강의에서 실무에서는 사용되지 않는 기능이라고 소개하고 있다. Query By Example 사용하여 개발을 진행하지는 않겠지만 언제 이러한 코드를 리팩토링하게 될지 모르고 아직 탄생한지 얼마 안된 기술이기 때문에 성장 가능성이 있으므로 간략하게 알아보도록 한다. 사용 방법 검색을 위한 examplePlayer와 exampleTeam을 생성하였다. 생성된 객체(Probe)..
[Spring Data JPA] Specification 이번 장에서는 명세(Specification)에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Domain Driven Design (DDD)에는 명세(Specification)라는 개념이 있다. Spring Data JPA에는 JPA Criteria를 활용하여 명세라는 개념을 사용할 수 있도록 지원한다. 참고한 강의에서 실무에서는 사용되지 않는 기능이라고 소개하고 있다. Specification을 사용하여 개발을 진행하지는 않겠지만 언제 이러한 코드를 리팩토링하게 될지 모르니 자세히 알아보도록 한다. JpaRepository가 JpaSpecificationExecutor를 상속받도록 한다...
[Spring Data JPA] isNew() 이번 장에서는 Entity가 새로운 Entity인지 존재하는 Entity인지 구분하는 방법에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. SimpleJpaRepository의 save() 메서드를 보면 EntityInformation의 isNew()를 호출하여 새로운 엔티티인지 확인하고 있다. isNew의 내용을 확인하기 위해 타고 들어가보면 EntityInformation은 인터페이스이며 이를 구현하는 5개의 클래스가 있는 것을 확인할 수 있다. 우리가 어떠한 구현체를 사용하는지 알아보기 위해 데이터를 저장하는 시점을 디버거로 걸어서 EntityInformation의 정체를 확인해본다. ..
[Spring Data JPA] Implementor 이번 장에서는 Spring Data JPA 구현체에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 테스트를 진행하기 위해서 Director라는 Entity 클래스를 생성하였다. @Entity @EntityListeners(AuditingEntityListener.class) public class Director { @Id @GeneratedValue private Long id; private String name; @CreatedDate private LocalDateTime createdAt; } Director Entity를 다루는 Repository를 생성한다. public inte..
[Spring Data JPA] Auditing 이번 장에서는 JPA의 Auditing에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 대부분의 테이블에는 생성일시, 수정일시, 생성자, 수정자의 정보가 들어간다. JPA를 사용하면 이러한 데이터를 개발자가 직접 수동으로 입력하지 않아도 입력되도록 할 수 있다. 순수 JPA의 Auditing 테이블과 엔티티의 공통되는 데이터인 생성일시와 수정일시를 필드로 가지는 클래스를 생성한다. 필자가 생성한 PureBaseEntity의 경우 추상 클래스로 만들지 않아도 상관없지만 추상 클래스로 만드는 경우 직관적으로 추상화된 클래스임을 알 수 있고 독립적으로 생성되는 것을 방지하기 위해 추상 클래스로 생..