Spring Boot - JPA

ayboori·2023년 7월 3일
0

Spring

목록 보기
9/24

JpaRepository 등록 - 인터페이스

public interface 엔티티클래스Repository extends JpaRepository<엔티티클래스, Long> {

}
  • 자동으로 Bean으로 등록됨
  • Map의 Key로 준 엔티티 클래스에 @Table(name = "테이블"), @Entity가 있으므로 DB와 연결되어 CRUD 하는 인터페이스가 되었다

제공되는 메소드들

  • 메소드명 만으로도 쿼리를 짤 수 있다

1) classRepository.save(class);

영속성 컨텍스트에 entity를 저장하는 메소드
@Transaction 적용되어 있음

    // DB 저장
    Memo saveMemo = memoRepository.save(memo);

2) findAll()

해당 테이블의 전체 데이터 조회. 값을 꺼내오려면 stream 사용하여 가능

// DB 조회
    return memoRepository.findAll().stream().map(MemoResponseDto::new).toList();

아래와 같이 정렬도 가능하다

    List<Post> findAllByOrderByModifiedAtDesc();

3) findById(id)

찾으려는 Entity의 id 값을 기준으로 해당 튜플을 리턴한다

private Memo findMemo(Long id) {
    return memoRepository.findById(id).orElseThrow(() ->
            new IllegalArgumentException("선택한 메모는 존재하지 않습니다.")
    );
}

이때 리턴값이 Optional (null값이 리턴되어도 에러 X) 이므로

  • 빈 값 체크
    - orElse() 메서드는 래핑된 값이 있으면 반환하고 그렇지 않으면 () 내의 인수를 반환
    - orElseThrow()는 반환 값이 null일 경우 예외를 던짐

이후 다른 메소드 내에선 findMemo (위에서 만든 것) 찾아서 메모를 리턴받는다

JPA Buddy

쿼리메소드를 GUI로 짜주는 플러그인

Service 내에서 find 사용
postRepository.find > 엔터 > 리턴 값, 정렬 기준, between 등의 복잡한 기능까지 모두 설정 가능

검색 기준 설정

title이 대소문자 구분 없아 매개변수 값일 때 리턴한다.
포함, 사이 등등의 기준도 가능하다.


JPA Auditiong

시간에 대해 자동으로 값을 넣어준다

1) Timestamped.java

@Getter
// 추상클래스 내의 멤버변수를 컬럼으로 인식
@MappedSuperclass 
// *** 클래스에 Auditing 기능을 포함
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {
	
    @CreatedDate // 생성 날짜가 저장된다
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP) // 날짜 타입 매핑 시 사용됨
    private LocalDateTime createdAt;

	
    @LastModifiedDate // 값 변경 시간이 저장된다
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}

2) @SpringBootApplication 이 있는 class (실질적 main)

클래스 위에 @EnableJpaAuditing 추가

3) 적용하고자 하는 Entity 클래스에서 Timestamped 상속 받기


Query Method

Spring Data JPA에서 제공하는, 메서드 이름으로 SQL을 생성할 수 있는 기능

위에서 선언한 JpaRepository를 상속받는 repository 내에서 사용 가능하다

package com.sparta.memo.repository;

import com.sparta.memo.entity.Memo;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MemoRepository extends JpaRepository<Memo, Long> {
    List<Memo> findAllByOrderByModifiedAtDesc(); //1
    List<Memo> findAllByUsername(String username);//2
}

1: Memo 테이블에서 ModifiedAt 즉, 수정 시간을 기준으로 전체 데이터를 내림차순으로 가져오는 SQL을 실행하는 메서드

2: ByUsername 에 값을 전달해줘야하기 때문에 파라미터에 해당 값의 타입과 변수명을 선언해야 함

즉, Query Methods 는 메서드의 파라미터를 통해 SQL에 필요한 값을 동적으로 받아 처리할 수 있습니다.

전체 데이터를 최신 데이터부터 보고 싶을 때

return memoRepository.findAllByOrderByModifiedAtDesc().stream().map(MemoResponseDto::new).toList();
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글