본문 바로가기

강의 내용 정리/Spring5 기초 정리

5-5강 Spring Data JPA 실습(3)

JPA를 적용해보자!!

ClubRepository 인터페이스를 만든 후 JpaRepository 인터페이스를 extends 한다. (인터페이스끼리는 extends)

 

 

JpaRepository에는 여러 메서드 들이 있고 인터페이스를 상속하고 있구나~

정리 : (ClubRepository) -> JpaRepository -> PagingAndSortingRepository -> CrudRepository

 

 

 

 

완전 온몸에 소름돋는 코드.

우리는 인터페이스인 ClubRepository를 주입 받아서 부모 인터페이스인 JpaRepository인터페이스의 메서드들을 쓰고있다. ( ClubRepository에서 구현하지도 않았는데!!! -> 주입 받을 인스턴스객체를 Spring Data JPA에서 만들어줌. )

 

 

Spring Data JPA가 ClubRepository '''''클래스'''''를 자동으로 만들어줌.

 

ClubRepository인터페이스를 구현한 구현체를 Spring Data JPA가 제공해줌( 우리는 인터페이스만 만들었는데!!! )

상속받은 많은 메서드들을 구현해줌 ( ex. save, findById, findAll )

 

순수 JPA에 대한 구현 코드를 직접 작성하지 않고 Spring Data JPA가 제공해주는 인터페이스를 상속하고 있는 인터페이스를 정의 함으로 써 CRUD를 하는 기본적인 코드들을 작성해줌(구현 클래스를 만들어줌)

 

 

엔티티 타입은 TravelClubJpo 이고 식별자 타입은 엔티티클래스의 식별자를 말한다. -> 여기선 @Id private String id; 이므로 결국 JpaRepository<TravelJpo, String> 을 implements 하면 된다.

 

 

 

 

 

이 때 애플리케이션을 실행시키면

테이블이 생성되어있는 것을 알 수 있다.

값도 잘 들어간다.

 

 

 

# retrieve 메서드를 만들어보자 ( clubId로 TravelClub 찾기 )

 

findById 는 저~~위 CrudRepository 인터페이스로부터 내려온건데 리턴타입이 Optional<T> 이다.

 

그래서 Optional<TravelClubJpo> clubJpo 변수로 받아주고 만약 값이 없으면 NoSuchClubException을 던진다.

그리고 clubJpo.get().toDomain(); 을 리턴 해준다. 이 때 get()은 Optional을 벗기는 메서드이다.

 

 

 

 

*****************************

데이터를 DB에 넣을 때: 도메인객체 -> 엔티티객체(Jpo) -> DB

DB에서 데이터를 꺼내올 떄 : DB -> 엔티티객체(Jpo) -> 도메인객체

*****************************

 

 

 

# 모든 club 가져오는 메서드 retrieveAll()

findAll() 의 리턴타입이 List<T> 이다. 이는 Jpo객체, 즉 엔티티객체이므로 이것들을 하나하나 도메인객체로 바꾸고 다시 List로 만들어서 리턴해야한다. -> clubJpos.stream().map(clubJpo -> clubJpo.toDomain()).collect(Collectors.toList());

메서드 레퍼런스를 사용하여 이렇게도 리턴이 가능하다.

 

 

 

RUN탭

이제 다시 애플리케이션을 실행하면 JPA가 쿼리문을 만들어줌

 

localhost:8090/club/all 로 모든 클럽 가져올 수 있음. controller 참고. controller -> service -> clubjpastore

 

 

이건 fintAll 할 때의 쿼리 : 진짜 이렇게 자동으로 JPA가 써주는구나~ 신기하다~

 

Recent Posts
Popular Posts
Recent Comments