확장 기능
2023. 9. 29. 00:52ㆍLECTURES/실전! 스프링 데이터 JPA
사용자 정의 리포지토리 구현
- 스프링 데이터 JPA가 생성하는 메서드를 사용하지 않고 직접 구현하고 싶다면
- JPA 직접 사용
- 스프링 JDBC Template
- MyBatis
- 데이터 커넥션
- Querydsl
- 사용자 정의 인터페이스를 만들고 그 인터페이스의 구현 클래스를 만든 후 respository에 사용자 정의 인터페이스를 상속시킴
- 사용자 정의 구현 클래스는 리포지토리 인터페이스 이름 + Impl 으로 만들어야 함
- 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록해줌
- 다른 이름으로 변경하고 싶으면
@EnableJpaRepositories(basePackages = "study.datajpa.repository", repositoryImplementationPostfix = "Impl")
<repositories base-package="study.datajpa.repository" repository-impl-postfix="Impl" />
- 실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 자주 사용
Auditing
- 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때
- 등록일
- 수정일
- 등족자
- 수정자
- JPA 주요 이벤트 어노테이션
- @PrePersist, @PostPersist
- @PreUpdate, @PostUpdate
- 스프링 데이터 JPA
- 스프링 부트 설정 클래스에 @EnableJpaAuditing 추가
- 엔티티에 @EntityListeners(AuditingEntityListener.class)
- @CreatedDate
- @LastModifiedDate
- @CreatedBy
- @LastModifiedBy
- 실무에서는 등록자, 수정자에 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받음
- 실무에서는 등록시간, 수정시간은 거의 필요하지만 등록자, 수정자는 필요 없을 수도 있음 → Base 타입을 분리한 후 원하는 타입을 상속해서 사용
- 수정일과 수정자에 처음에는 등록일과 등록자가 똑같이 저장되는데 null로 저장하고 싶다면 @EnableJpaAuditing(modifyOnCreate = false) 사용
- @EntityListeners(AuditingEntityListener.class)를 매번 설정해주는 것이 싫다면
<?xml version=“1.0” encoding="UTF-8”?> <entity-mappings xmlns=“http://xmlns.jcp.org/xml/ns/persistence/orm” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd” version=“2.2"> <persistence-unit-metadata> <persistence-unit-defaults> <entity-listeners> <entity-listener class="org.springframework.data.jpa.domain.support.AuditingEntityListener”/> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings>
Web 확장 - 도메인 클래스 컨버터
- HTTP 요청은 회원 id를 받지만 도메인 클래스 컨버터가 중간에 동작해서 회원 엔티티 객체를 반환
- 도메인 클래스 컨버터도 리포지토리를 사용해서 엔티티를 찾음
- 도메인 클래스 컨버터로 엔티티를 파라미터로 받으면, 이 엔티티는 단순 조회용으로만 사용해야 함
- 트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않음
Web 확장 - 페이징과 정렬
- 파라미터로
Pageable
을 받을 수 있음PageRequest
객체 생성
- ex)
/members?page=0&size=3&sort=id,desc&sort=username,desc
- 기본값
- 글로벌 설정
spring.data.web.pageable.default-page-size=20 /# 기본 페이지 사이즈/ spring.data.web.pageable.max-page-size=2000 /# 최대 페이지 사이즈/
- 개별 설정
@PageableDefault
사용@RequestMapping(value = "/members_page", method = RequestMethod.GET) public String list(@PageableDefault(size = 12, sort = “username”, direction = Sort.Direction.DESC) Pageable pageable) { ... }
- 글로벌 설정보다 우선권을 가짐
- 글로벌 설정
- 접두사
- 페이징 정보가 둘 이상이면 접두사로 구분
@Qualifier("members")
- Page 내용을 DTO로 변환
- 엔티티를 APi로 노출하면 X → DTO로 변환
- Page는
map()
을 지원해서 내부 데이터를 다른 것으로 변경 가능
- Page 1부터 시작하기
- 스프링 데이터는 Page를 0부터 시작
- 직접 클래스를 만들어서 처리
spring.data.web.pageable.one-indexed-parameters : true
로 설정- page 파라미터를 -1 처리하는 것이기 때문에 0 인덱스를 사용함
실전! 스프링 데이터 JPA - 인프런 | 강의
스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.
www.inflearn.com
'LECTURES > 실전! 스프링 데이터 JPA' 카테고리의 다른 글
나머지 기능들 (0) | 2023.09.29 |
---|---|
스프링 데이터 JPA 분석 (0) | 2023.09.29 |
쿼리 메소드 기능 (0) | 2023.09.29 |
공통 인터페이스 기능 (0) | 2023.09.29 |
프로젝트 환경 설정 / 예제 도메인 모델 (0) | 2023.09.29 |