백엔드 개발자

[#2] 스프링 데이터 JPA 본문

스프링/스프링 데이터 JPA

[#2] 스프링 데이터 JPA

임잠탱 2023. 9. 10. 21:56

Auditing

  • 등록일, 수정일 같은 공통으로 필요한 속성들을 class 로 정의하여 추가할 수 있도록 해준다.

  • 보통 createdDate 이나 updateDate을 추가해 줄 때 많이 사용한다. (등록자, 수정자도 가능)

  • 기본 jpa에서는 @PrePersist 나 @PreUpdate를 사용해서 구현하는데 스프링 데이터 jpa는

    클래스에 @EntityListeners(AuditingEntityListenner.class) 를 추가해주고 각 필드에

    @CreateDate, @LastModifiedDate를 추가해 주면 된다.

@EntityListeners(AuditingEntityListenner.class)
@MappedSuperclass
@Getter
public class BaseEntity{
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}
  • 이 클래스를 상속받아서 사용할 수 있는데 정말 상속 개념이 아닌 이 속성들만 추가해 주려면

    @MappedSuperclass 를 사용하면 된다.

  • Auditing을 사용하려면 스프링부트 설정 클래스에 @EnableJpaAuditing을 추가해주어야 한다.

Web 도메인 클래스 컨버터

  • controller 에서 사용자의 아이디를 받아올 때 id를 바로 Member 엔티티로 받아올 수 있다
  • 도메인 클래스 컨버터가 레파지토리를 사용해 엔티티를 찾고 객체를 반환해 준다.
  • 트랜잭션이 없는 범위에서 사용되었으므로 엔티티를 변경해도 DB에 반영되지 않는다.
@GetMapping("/member/{id}")
public void findMember(@PathVariable("id") Long id){
}

@GetMapping("/member/{id}")
public void findMember(@PathVariable("id") Member member){
}

Web 페이징

  • controller에서 바로 Pageable 을 받을 수 있다.
@GetMapping("/members")
public void findMember(@Pageable pageable){
}
  • 이렇게 바로 받아서 사용할 수 있고 파라미터로 page, size, sort 값 등을 넘기면 Pageable 객체로 만들어 넘겨준다.

      /members?page=0&size=3&sort=id,desc&sort=username,desc
    • page 값 만 넘겨줄 경우 기본 사이즈는 20이다.
    • @PageableDefault(size=5) 를 지정할 수 있다. (page, sort 도 가능)
    • 페이징 할 대상이 2개 이상인 경우 페이징 할 대상의 이름과 함께 지정할 수 있다.
      • ex) member_page=2

엔티티 save 동작

  • 새로운 엔티티이면 persist, 아니면 merge한다.

    • 새로운 엔티티인지 판단하는 기준은 pk가 null 이면 새로운 엔티티라고 생각한다.
    • JPA 식별자 생성 전략이 @GenerateValue 이면 save() 호출 시점에 pk는 null이다.
  • 식별자 생성 전략이 직접 할당하는 방식이면 식별자 값이 있는 상태로 save()를 호출 하고, merge()를 호출하게 된다.

    • DB를 호출해서 값을 확인하는데 값이 없으므로 다시 persist() 요청을 하게 된다. ⇒ 비효율적
  • Persistable 인터페이스를 구현하여 새로운 엔티티인지 판단하는 로직을 직접 구현할 수 있다.

      @Entity
      @EntityListeners(AuditingEntityListener.class)
      @NoArgsConstructor(access = AccessLevel.PROTECTED)
      public class Item implements Persistable<String>{
              @Id
              private String itemId;
    
              @CreateDate
              private LocalDateTime createDate;
    
              @Override
              public String getId(){
                      return itemId;
              }
    
              @Override
              public boolean isNew() {
                      return createDate == null;
              }
    
      }
    • CreateDate 속성을 추가하여 이것이 null 인지 아닌지로 판단하도록 할 수 있다.

'스프링 > 스프링 데이터 JPA' 카테고리의 다른 글

[#1] 스프링 데이터 JPA  (0) 2023.09.10
Comments