본문 바로가기
Spring

Spring 기초 9 (Spring DATA JPA + 기능들)

by sehunbang 2024. 1. 21.

Spring DATA JPA  란?

 

JPA  를 쉽게 사용할수 있게 만들어 놓은 모듈.

 

 

JPA를 추상화시킨 Repository 인터페이스를 제공합니다

Repository 인터페이스 Hibernate와 같은 JPA구현체를 사용해서 구현한 클래스를 통해 사용됩니다.

 

개발자들은 Repository 인터페이스를 통해 JPA를 간편하게 사용할 수 있게 되었습니다.

 

우리는 raw JPA 를 사용 했습니다, (.persist(). find() 같은거)..

 

 

Spring Data JPA  사용 방법:

 

JpaRepository 등록 <"@Entity 클래스", "@Id 의 데이터 타입">

 

( Spring Data JPA에 의해 자동으로 Bean 등록이 되었습니다. )

제네릭스의 @Entity 클래스 위치에 Memo Entity(객체) 를 추가했기 때문에 해당 MemoRepository는 DB의 memo 테이블과 연결되어 CRUD 작업을 처리하는 인터페이스가 되었습니다.

 

예시: 메모장 프로젝트 Spring Data JPA 적용

 

1. 새로운 인터페이스 MemoRepository_Spring_Data_JPA :

public interface MemoRepository_Spring_Data_JPA extends JpaRepository<Memo, Long> {

}

 

( JpaRepository<> 안에 이미 @Repository 가 선언 되어 있음. )

 

 

2.새로운 서비스 객체

 

memoService_SPRING_DATA_JPA.java

MemoRepository_Spring_Data_JPA 를 받아옴.

@Component
public class memoService_SPRING_DATA_JPA {
    private final MemoRepository_Spring_Data_JPA repo; // repository
    public memoService_SPRING_DATA_JPA(ApplicationContext applicationContext) {
        MemoRepository_Spring_Data_JPA repo = applicationContext.getBean(MemoRepository_Spring_Data_JPA.class);
        this.repo = repo; // repository
    }

 

Spring_Data_JPA 가 지원 하는 함수들 :

 

저장하기 .save(entity);

public MemoResponseDto createMemo(MemoRequestDto requestDto) { // create memo service
    Memo memo = new Memo(requestDto);
    // DB 저장
    memo = repo.save(memo);
    // Entity -> ResponseDto
    MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
    return memoResponseDto;
}

 

 

전부다 가져오기 .findAll()

(MemoResponseDto 여서 스트름 사용).

public List<MemoResponseDto> getMemos() {
    return repo.findAll().stream().map(MemoResponseDto::new).toList();
}

 

 

업데이트 하기   .update(requestDto)

( @Transactional 걸어 줘야함. )

public Long UpdateMemo(long id, MemoRequestDto requestDto) {
    // 해당 메모가 DB에 존재하는지 확인
    Memo memo = findMemo(id);
    // memo 내용 수정
    // 객체에 병경하면 자동 Dirty Check 함,
    memo.update(requestDto);
    return id;
}

 

삭제 하기   .delete(Entity)

public Long deleteMemo(long id) {
    // 해당 메모가 DB에 존재하는지 확인
    Memo memo = findMemo(id);
    repo.delete(memo);
    return id;
}

 

업데이트   .update(requestDto)  에 @Transactional 걸어 줘야함.

@Transactional
public Long UpdateMemo(long id, MemoRequestDto requestDto) {
    // 해당 메모가 DB에 존재하는지 확인
    Memo memo = findMemo(id);
    // memo 내용 수정
    // 객체에 병경하면 자동 Dirty Check 함,
    memo.update(requestDto);
    return id;
}

p.s..

/////////// 참고로 findMemo(id) 함수는 어떻게 코드 했냐며

private  Memo findMemo(Long id){
    Memo memo =  repo.findById(id).orElseThrow(()->
            new IllegalArgumentException("선택하신 메모는 존재하지 않아요")
    );
    return memo;
}

 

그리고