JPA 사용법 5 (CRUD 하기, JpaRepository 사용하기)

작성자 : 조회수 :

이번 게시 글에는 JpaRepository 인터페이스를 이용해서 CRUD 과정을 해보겠습니다.

 


프로젝트는 이 정도로 구성돼있습니다.




프로젝트의 큰 흐름 입니다.

 

컨트롤단을 지나 서비스가 JpaRepository를 통해 DB 값을 조회하거나 저장합니다.

 

 

실습 진행하겠습니다.



주의!

 

반드시 Entity 클래스들은

 

Getter, Setter 와 생성자를 가지고 있어야 합니다!





결과만 일단 보겠습니다.

 

사진을 보면 json으로 body에 담은 Post요청 시

 

객체의 필드 값과 json의 객체 요소 값들이 일치한다면 스프링 부트에서 알아서 매핑 시켜줍니다.

 

Success라는 반환 값과 함께

 

DB에 올바르게 담겨진 것을 확인 할 수있습니다.




JpaRepository 인터페이스




JpaRespsitory<사용하고싶은 모델 , 해당 모델의 Id 자료형>

 

인터페이스 형식으로 상속받게 됩니다. 상속받은 후부터는 스프링 부트에서 관리가 들어가며

 

기본적으로 Insert save나 그 외 delete, order by 등 다양한 기능을 가지고 있어서

개발자가 매번 번거롭게 SQL문을 작성하지 않아도 됩니다.



위 사진의 save는 제가 별도로 만든 것이 아닌 JpaRepsotory가 가지고 있는 기본 메소드 입니다!

 

하지만 잘 본다면 아직 어디 반에 소속됐는지 들어가지 않았으며

 

지금부터 반을 넣어보겠습니다.

 

병아리반을 넣어보겠습니다.






그림처럼 올바르게 들어갔습니다.

 

이제 반을 참조해서 값을 넣어보도록 하겠습니다.

 





그림처럼 반이 소속된 학생이 생겼습니다. 반 테이블을 참조한 아이디가 나오는 것을 확인할 수 있습니다.

 

 

그럼 학생 입력 때 반 테이블에 없는 값을 넣는다면?

 

현재 반 테이블의 현황입니다.




여기서 없는 classid 5등을 넣는다면 어떻게 되는지 보겠습니다.






당연하게도 서버 에러를 발생시킵니다.



참조하는 id 의 값이 문제라는 에러 문을 확인 할 수 있습니다.

 

이렇게 된다면 전 게시판에 작성할 때 만들었던 테이블들의 연관관계들이 현재

 

올바르게 작성 됐다는 것을 알 수 있습니다.



Insert문을 연습해봤습니다. 이제 update문을 연습하겠습니다.


아까 보았던 배정된 반이 없는 잉어라는 학생의 학년과 나이 그리고 반 배정을 수정해보도록 하겠습니다.

 

 

수정이라는 별다른 메소드가 없이 JpaRepository는 똑 같은 Save문을 사용해도 괜찮지만 저희는

 

영속화와 변경감지(더티체킹)을 사용해 save없이 수정에 들어가려 합니다.

 

 

영속화는 일단

 

Hibernate가 영속화 된 객체를 컨텍스트에 저장해 관리하는 것을 말합니다.

 

영속화는 추후에 다시 다루도록 하겠습니다. 간단하게 객체를 1차적인 캐시에서 다룬다는 뜻입니다.

 

그리고 변경감지(더티체킹 , dirty checking)은 사진으로 보는 것이 훨씬 빠를 겁니다.

 





서비스 단의 코드입니다.

 

잘 보면 save가 없습니다.

 

52번째 줄을 본다면 1차 캐시 영속화를 시켜

 

트랜잭션 안의 컨텍스트를 통해 관리합니다.






더티체킹의 핵심은 61번째부터 65번째 입니다.

 

영속화 된 52번째 줄 findStudent 객체에서 set으로 변경된 값들은

 

트랜잭션이 끝나는 부분에 flush를 통해 변경점을 감지 자동으로 수정해줍니다.




아래처럼 수정 요청을 진행하며

 

요청은 Put입니다.

 


결과를 확인해봅니다.






전에 없었던 잉어 반의 나이, 학년, 그리고 없던 반 배정까지 올바르게 수정된 것을

 

확인할 수 있습니다.