개발자 공부 - 인프런 온라인 강의/스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[섹션 6. 스프링 DB 접근 기술] 스프링 데이터 JPA / 인프런 김영한 스프링 입문

easpop 2023. 2. 4. 00:00
728x90
반응형

이번 시간에는 스프링 데이터 JPA에 관한 시간이었다.

스프링 데이터 JPA를 사용하면 인터페이스만으로도 개발을 할 수가 있다~~

CRUD 기능도 마찬가지로 스프링 데이터 JPA가 제공을 한다.

단순하고 반복적인 코드들이 스프링 데이터 JPA 프레임워크를 사용하면 확연하게 줄어들기 때문에,

개발자는 비즈니스 로직을 개발하는데 집중할 수 있다!

 

참고로, 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이기 때문에 JPA 학습이 선행되어야 함~~!

 

- 스프링 데이터 JPA 멤버 리포지터리 생성

SpringDataJpaMemberRepository 인터페이스를 생성해준다.

JpaRepository를 상속받는데, 인터페이스가 인터페이스를 상속받을때는 implements가 아닌 extends를 씀!!

또한, 인터페이스는 다중 상속이 가능하기 때문에, MemberRepository를 추가로 상속받는다.

 

JpaRepository를 상속받을 때는, 타입 파라미터 <T>는 Member,

ID는 식별자인 Long을 입력해준다.

 

SpringDataJpaMemberRepository가 JpaRepository를 상속 받고 있으면,

스프링 데이터 JPA가 구현체를 자동으로 만들어주고, 스프링 빈을 자동으로 등록해준다.

개발자는 만들어진 구현체를 가져다 쓰기만 하면 됨!

 

가져다가 쓰는 방법은~~

 

MemberRepository를 호출하고, 생성자를 만들어서 인젝션을 받아주면 됨.

그러면 스프링 데이터 JPA가 만들어 놓은 구현체가 등록이 된다.

 

그리고 MemberService 메소드에서,

리턴값의 파라미터를 memberRepository를 넣어줌으로써, 의존관계를 세팅해준다.

 

작동 방법은,

인터페이스(그림의 SpringDataJpaMemberRepository 클래스)를 만들고,

스프링 데이터 JPA가 제공하는 메소드인 JpaRepository 상속받으면,

스프링 데이터 JPA가 인터페이스에 대한 구현체를 만들어서, 스프링 빈에 등록해놓는다.

그래서 개발자는 인젝션을 받을수 있게 된다~~

반응형

회원가입 테스트 정상 작동~~

콘솔에 찍힌 로그를 확인해보면, 스프링 데이터 JPA가 JPA를 가져다가 쓴것이기 때문에,

Hibernate 부분이 똑같은 것을 확인할 수 있다.

 

작동 원리에 대한 설명은,

스프링 데이터 JPA가 SpringDataJpaMemberRepository를 보고 스프링 빈을 자동으로 생성해서,

스프링 컨테이너에 올린다.

그리고 extends한 JpaRepository를 들어가보면~~

이렇게 findAll, findAllById와 같은 기본적인 메소드들이 이렇게 구현되어서 제공되고 있는것을 확인할 수 있다!

그리고 상속받고 있는 PagingAndSortingRepository를 들어가보면,

페이징 처리 조회 기능을 제공하고 있음을 확인할 수 있다~~!

 

그리고 상속받고 있는 CrudRepository를 조회하면, save, findById와 같이

기본적인 CRUD 기능을 제공하고 있는 것을 확인할 수 있다~~

상속관계를 확인해보면

Repository <- CrudRepository <- PagingAndSortingRepository <- JpaRepository

이런 식으로 되어있고, 

JpaRepository만 스프링 데이터 JPA에서 제공하고, 이외에는 스프링 데이터에서 제공한다.

 

그렇지만 통용되지 않는, 예를 들면, name이나 username으로 찾거나, 이메일 주소로 찾거나,

이런것들은 비즈니스가 다 다르기 때문에 공통으로 만드는게 불가능하기 때문에 공통 클래스를 제공할 수 없음..ㅋㅋㅋ

주문서 번호로 조회하기, 상품 이름으로 조회하기 등.. 무궁무진하기 때문에 공통으로 만들 수 없다.

 

그렇기 때문에 findByName을 Override(재정의) 하는 이유이다ㅋㅋㅋ

 

저렇게만 입력하면, 내부적으로 아래와 같이 동작한다.

메소드 이름이 findByName 이기 때문에

select m from Member m where m.name = ?

위의 JPQL 코드가 작성되고 SQL로 번역이 되서 실행이 된다

ㅋㅋㅋㅋ신세계.. 이 과정이 내부적으로 진행된다니....

 

findByName이외에 다른 규칙도 적용이 가능한데,

예를 들면, findByNameAndId(String name, Long id)

이런식의 파라미터를 두가지 받는 규칙도 적용이 가능하다.

 

이렇게 인터페이스만으로도 개발이 끝나기 때문에, 스프링 데이터 JPA가 편리한 이유다~~

728x90
반응형