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





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을 함께 사용할 때 사용자 정의 리포지토리 기능 자주 사용

MappedSuperclass : Member에서 상속받을때, createDate, updaeDate를 Member 컬럼으로 넣어준다.
Jpa 주요 이벤트 어노테이션
@PrePersist, @PostPersist, @PreUpdate, @PostUpdate
save를 하게 되면 @PrePersist가 있는 메서드가 실행된다.
DB에 insert가 된 후에는 @PostPersist가 있는 메서드가 실행된다.


이전건 순수 JPA에서 한거였고,
데이터 JPA는 더 좋은 걸 제공하는거 같다.
설정
@EnableJpaAuditing -> main에 추가해야됨.
@EntityListeners(AuditingEntityListener.class) -> 엔티티에 적용
사용 어노테이션
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy


@LastModifiedBy와 @CreatedBy의 경우, AuditorAware에서 값을 가져온다.
실무에서는 실제 세션에서 값을 가져온다고들 한다.



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

여기서 id값을 받을때, 바로 Member로 파라미터를 받게 되면,
자동으로 JPA가 엔티티를 찾아서 값을 넣어주게 된다.
근데 자주 사용하지는 않을 것 같다.
Dto로 받고 반환해야하는 것도 있고,
예외 상황을 많이 고민해야 하기 때문에
단순 조회용으로만 사용하는 것이 좋다.
스프링 데이터는 페이징과 정렬을 편리하게 사용할 수 있다.


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

이렇게 기본값을 정할수도 있다.
접두사
페이징 정보가 둘 이상이면 접두사로 구분
@Qualifier에 접두사명 추가
예) /members?member_page=0*order_page=1

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

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

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

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

이렇게 래퍼런스로 변환도 가능하다.
Page, Pageable을 사용하지 말고 새로 만들어서 사용하면 된다.spring.data.web.pageable.one-indexed-parameters를 true로 설정하면 된다. 그런데, 이 방법은 web에서 Page 파라미터를 -1처리하는 것 뿐이다. 그래서, 우리는 페이지를 1부터 시작하는데, 반환한 페이징 값들을 살펴보면 pageable은 0부터 시작하는걸로 생각한다.그러니까 그냥 0부터 하는걸로 사용하자.