이번 게시 글에는 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입니다.
결과를 확인해봅니다.
전에 없었던 잉어 반의 나이, 학년, 그리고 없던 반 배정까지 올바르게 수정된 것을
확인할 수 있습니다.