섹션 5. 책 요구사항 구현하기
책 생성, 대출, 반납 API를 온전히 개발하며 지금까지 다루었던 모든 개념을 실습해본다.
객체지향적으로 설계하기 위한 연관관계를 이해하고, 연관관계의 다양한 옵션에 대해 이해한다.
JPA에서 연관관계를 매핑하는 방법을 이해하고, 연관관계를 사용해 개발할 때와 사용하지 않고 개발할 때의 차이점을 이해한다.
책 생성 API
HTTP Method -> POST
HTTP Path -> /book
HTTP Body
{ "name" : String } // 책 이름
결과 반환은 하지 않는다.
기본적으로 DTO, 컨트롤러, Repository 등을 만들고 웹으로 들어가서 확인해보자.
대출 기능 API
사용자가 책을 빌릴 수 있다. 단, 다른 사람이 그 책을 빌렸다면 빌릴 수 없다.
POST, /book/loan, {"userName":String, "bookName":String}, 결과 반환은 따로 없다.
요구 사항을 보니 지금 테이블로는 요구 사항이 충분하지 않다. 왜냐하면 대출이 되었는지 여부에 대해서 알 수 없고 user 정보에 대해서도 이를 알 수 없다.
그렇기 위해 새로운 Table을 추가하자.
그 후 UserLoanHistory라는 객체를 만들어주었다. 또한, 똑같이 DTO, Controller, Service를 구현해주었다.
반납 기능 API
대출한 책을 반납하는 API를 만들어보자.
API 스펙과 HTTP Body가 대출과 완전히 동일한데 이럴 경우 어떻게 하는게 좋을까?
DTO를 새로 만드는 것이 좋을까 아니면 재활용 하는 것이 좋을까?
새로 만드는 것을 추천한다. 왜냐하면 그래야 두 기능 중 한 기능에 변화가 생겼을 때 유연하고 side-effect 없이 대처할 수 있기 때문이다.
또한 테이블에 대해서도 고민을 해보자.
User와 UserLoanHistory가 직접 협업하게 처리를 해보자.
대출기능을 다음과 같이 개선할 수 있다. 또한 반납 기능도 아래처럼 개선할 수 있다.
JPA 연관관계에 대한 추가적인 기능
상대 테이블을 가리키는 테이블이 연관관계의 주인이다. 연관관계의 주인이 아닌 객체는 mappedBy를 통해 주인에게 매여 있음을 표시해주자.
양쪽 모두 연관관계를 갖고 있을 때는 양쪽 모두 한 번에 맺어주는게 좋다.
cascade 옵션을 활용하면, 저장이나 삭제를 할 때 연관관계에 놓인 테이블까지 함께 저장 또는 삭제가 이루어진다.
orphanRemoval 옵션을 통해 연관관계가 끊어진 데이터를 자동으로 제거해준다.
이번주 회고
: JPA 부분이나 컨테이너 부분 쪽은 큰 지식이 없었어서 따라가기 살짝 벅찼다. 기존의 코드를 각자의 역할로 분리해서 만들어보고 이를 JPA나 트랜잭션을 통해 더욱 깔끔하게 만들었다. 어려운 부분이 많았다. 이러한 점을 실습을 통해서 어느정도 갈증을 해소할 수 있었지만 그럼에도 공부할 부분이 많다고 느꼈다. 미니 프로젝트까지 화이팅이다.
댓글을 작성해보세요.