인터페이스를 직접 구현한 뒤에 끼워넣고 싶다면, 어떻게 해야할까
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부터 하는걸로 사용하자.