확장 기능

slee2·2022년 3월 31일
0

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

인터페이스를 직접 구현한 뒤에 끼워넣고 싶다면, 어떻게 해야할까

MemberRepositoryCustom

MemberRepositoryImpl

MemberRepository

Test

MemberRepository 인터페이스는 MemberRepositoryCustom 인터페이스를 상속받고 이 메서드는 MemberRepositoryImpl이 구현해준다.

이는 자바가 해주는 것이 아니고, 스프링 JPA가 지원하는 기능이다.
이 기능을 사용하기 위해서 지켜야 할 룰이 있는데,
MemberRepository에서 사용할 것이라면 인터페이스 구현체를
MemberRepository + Impl 이 방식처럼, 이름 + Impl를 추가해줘야 인식할 수 있다.

Impl 대신 다른 이름으로 변경하고 싶으면?

XML

<repository base-package="study.datajpa.repository"
            repository-impl-postfix="Impl" />

JavaConfig

@EnableJpaRepositories(basePackages = "study.datajpa.repository",
	repositoryImplementationPostfix = "Impl")

근데 뭐 관례를 따르는게 좋다.

참고: 실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능 자주 사용

Auditing

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

JpaBaseEntity

MappedSuperclass : Member에서 상속받을때, createDate, updaeDateMember 컬럼으로 넣어준다.

Jpa 주요 이벤트 어노테이션
@PrePersist, @PostPersist, @PreUpdate, @PostUpdate

save를 하게 되면 @PrePersist가 있는 메서드가 실행된다.
DB에 insert가 된 후에는 @PostPersist가 있는 메서드가 실행된다.

Test

스프링 데이터 JPA 사용

이전건 순수 JPA에서 한거였고,
데이터 JPA는 더 좋은 걸 제공하는거 같다.

설정
@EnableJpaAuditing -> main에 추가해야됨.
@EntityListeners(AuditingEntityListener.class) -> 엔티티에 적용

사용 어노테이션
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy

BaseEntity

@LastModifiedBy@CreatedBy의 경우, AuditorAware에서 값을 가져온다.

실무에서는 실제 세션에서 값을 가져온다고들 한다.

Test

현재 BaseEntity에 4개가 전부 다 들어가있는데,
보통 강사님의 경우,
BaseTimeEntity를 만들어두고 그 안에 생성시간, 수정시간을 설정한 다음,
BaseEntity에서 BaseTimeEntityextend를 통해 상속받은 다음, 여기서 생성자, 수정자 2개를 추가하여 4개를 사용한다고 한다.

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

MemberController

여기서 id값을 받을때, 바로 Member로 파라미터를 받게 되면,
자동으로 JPA가 엔티티를 찾아서 값을 넣어주게 된다.

근데 자주 사용하지는 않을 것 같다.
Dto로 받고 반환해야하는 것도 있고,
예외 상황을 많이 고민해야 하기 때문에

단순 조회용으로만 사용하는 것이 좋다.

Web 확장 - 페이징과 정렬

스프링 데이터는 페이징과 정렬을 편리하게 사용할 수 있다.

옵션:
아무것도 넣지 않으면: 처음부터 20개의 데이터를 가져옴(default - 20)
(기본값에 대한 세팅은 구글링하면 나옴)
page - 몇 페이지
size - 크기
sort - 정렬 기준

이렇게 기본값을 정할수도 있다.

접두사
페이징 정보가 둘 이상이면 접두사로 구분
@Qualifier에 접두사명 추가
예) /members?member_page=0*order_page=1

요런식으로 하라는 소리인듯

Page 내용을 DTO로

이전에 나왔듯이 이런식으로 DTO 변환이 가능함.

참고로 DTO에 이와같이 Member를 받은 생성자를 미리 만들어둔다면,

이렇게 바로 생성자에 넣어서 만들어줄 수 있다.
그리고

이렇게 래퍼런스로 변환도 가능하다.

페이징을 1부터 시작하기

  1. Page, Pageable을 사용하지 말고 새로 만들어서 사용하면 된다.
  2. spring.data.web.pageable.one-indexed-parameterstrue로 설정하면 된다. 그런데, 이 방법은 web에서 Page 파라미터를 -1처리하는 것 뿐이다. 그래서, 우리는 페이지를 1부터 시작하는데, 반환한 페이징 값들을 살펴보면 pageable은 0부터 시작하는걸로 생각한다.

그러니까 그냥 0부터 하는걸로 사용하자.

0개의 댓글