[실전! 스프링 데이터 JPA] 6. 확장 기능

jada·2024년 9월 26일
0

Spring 스터디

목록 보기
34/35

사용자 정의 리포지토리 구현

  • 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성
  • 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음
  • 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면?
    • JPA 직접 사용( EntityManager )
    • 스프링 JDBC Template 사용
    • MyBatis 사용
    • 데이터베이스 커넥션 직접 사용 등등...
    • Querydsl 사용

사용자 정의 인터페이스

public interface MemberRepositoryCustom {
     List<Member> findMemberCustom();
}

사용자 정의 인터페이스 구현 클래스

@RequiredArgsConstructor
 public class MemberRepositoryImpl implements MemberRepositoryCustom {
     private final EntityManager em;
     @Override
     public List<Member> findMemberCustom() {
         return em.createQuery("select m from Member m")
                 .getResultList();
} }

사용자 정의 인터페이스 상속

public interface MemberRepository
          extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}

사용자 정의 메서드 호출 코드

List<Member> result = memberRepository.findMemberCustom(); 

사용자 정의 구현 클래스

  • 규칙: 리포지토리 인터페이스 이름 + Impl
  • 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록

Auditing

  • 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면?
    • 등록일
    • 수정일
    • 등록자
    • 수정자

순수 JPA 사용

package study.datajpa.entity;
 @MappedSuperclass
 @Getter
 public class JpaBaseEntity {
     @Column(updatable = false)
     private LocalDateTime createdDate;
     private LocalDateTime updatedDate;
     @PrePersist
     public void prePersist() {
         LocalDateTime now = LocalDateTime.now();
         createdDate = now;
         updatedDate = now;
}
     @PreUpdate
     public void preUpdate() {
         updatedDate = LocalDateTime.now();
     }
}

스프링 데이터 JPA 사용

설정
@EnableJpaAuditing 스프링 부트 설정 클래스에 적용해야함 @EntityListeners(AuditingEntityListener.class) ➡️ 엔티티에 적용
사용 어노테이션

  • @CreatedDate
  • @LastModifiedDate
  • @CreatedBy
  • @LastModifiedBy


Web 확장 - 도메인 클래스 컨버터

HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩


@RestController
 @RequiredArgsConstructor
 public class MemberController {
     private final MemberRepository memberRepository;
     @GetMapping("/members/{id}")
     public String findMember(@PathVariable("id") Member member) {
         return member.getUsername();
     }
}
  • HTTP 요청은 회원 id 를 받지만 도메인 클래스 컨버터가 중간에 동작해서 회원 엔티티 객체를 반환

  • 도메인 클래스 컨버터도 리파지토리를 사용해서 엔티티를 찾음

주의:** 도메인 클래스 컨버터로 엔티티를 파라미터로 받으면, 이 엔티티는 단순 조회용으로만 사용해야 한다. (트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않는다.)



Web 확장 - 페이징과 정렬

스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다.

@GetMapping("/members")
 public Page<Member> list(Pageable pageable) {
     Page<Member> page = memberRepository.findAll(pageable);
     return page;
 }
profile
꾸준히 발전하는 개발자가 되자 !

0개의 댓글