본문 바로가기

Spring

(183)
[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의 경우 추상 클래스로 만들지 않아도 상관없지만 추상 클래스로 만드는 경우 직관적으로 추상화된 클래스임을 알 수 있고 독립적으로 생성되는 것을 방지하기 위해 추상 클래스로 생..
[Spring Data JPA] Custom Repository 이번 장에서는 사용자 정의 리포지토리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Spring Data JPA 리포지토리는 인터페이스만 정의하고 구현체는 Spring이 생성해준다. 만약 우리가 인터페이스를 구현하려 한다면 구현해야 하는 기능이 많다. 예를 들어 findAll()과 같이 Data JPA에서 기본으로 제공하는 메소드 또한 직접 구현을 해주어야한다. 만약 여러가지 이유 때문에 인터페이스의 일부분만 직접 구현하고 싶은 경우에 어떻게 해야하는지 알아보도록 한다. 다양한 이유가 있겠지만 필자가 참고한 강의에서 예를 들은 것과 필자의 경험에 의하면 아래 정도의 예시가 있을 듯하다. E..
[Spring Data JPA] Hint & Lock 이번 장에서는 JPA의 Hint와 Lock에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Hint DB에 적용되는 Hint가 아닌 JPA 구현체에게 제공하는 힌트이다. ReadOnly 옵션을 true로 주어 JPA에게 읽기 전용으로 조회할 것이라는 힌트를 주는 방법에 대해서 알아본다. 아래는 일반적으로 이름으로 SoccerPlayer를 조회하는 메서드와 이를 검증하는 테스트 코드이다. SoccerPlayerDataRepository public interface SoccerPlayerDataRepository extends JpaRepository { SoccerPlayer findUpda..