확장 기능

2023. 9. 29. 00:52LECTURES/실전! 스프링 데이터 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