스파르타 코딩클럽 미니 프로젝트 - 5 JPA를 활용한 게시글 CRUD 구현 6/12~6/15
개인 미니 프로젝트가 시작됐다.
월요일부터 강의가 오픈되어 JPA를 활용한 게시글 구현을 해보기로 한다.
3계층구조, DI, IoC, 디버깅, MVC 패턴, 엔티티 , JPA, 영속성 컨텍스트, 스프링 데이터 JPA 등...
정말 많은 내용을 학습했다. 프로젝트 제출 후 다시한번 복습하면서 블로그에 정리를 해볼 생각이다.
우선 처음에는 메모리(Map)에 적재하는 방식으로 CRUD를 구현하였다.
컨트롤러 계층이다. 컨트롤러가 생성될 때 postService가 생성자로 주입된다.
그림에는 코드 중 일부인 전체 게시글 조회, 게시글 한개조회, 게시글 작성 메서드가 보인다.
ResponseDto와 RequestDto 클래스를 만들어 요청과 응답을 구별하도록 하였다..
서비스 계층이다
리포지토리계층이다. 현재는 데이터베이스가 아닌 메모리(Map)에만 적재하는 형태로 구현을 하였다.
그리고 서비스 계층을 기준으로 테스트 코드를 작성했다.
CRUD 모두 에러가 발생하지 않고 잘 작동된다.
그런데 postman을 이용한실제 웹 url 요청시 어떤 요청으로 주던 간에 404에러가 발생했다.
데이터가 null이 들어있을 경우 404에러를 낸다고도 들었기에 만약 null인경우 Collections.emptyList()를 리턴하게끔 시도했는데도 여전한 에러가 발생했다.
에러는 단순한 문제였다. main메서드가 있는 Application클래스에 컴포넌트 스캔 어노테이션이 붙어있는데.
컴포넌트 스캔의 범위는 같은경로 + 하위경로에 해당한다.
내가 작성한 패키지들이 상위경로에 위치해있었다.. 같은경로로 수정을 하니 오류가 해결이 되었다.
이제 JPA로 코드를 변환해보았다.
우선 repository를 JpaRepository를 상속받는 인터페이스로 재구성하였다.
여기서 3 Layer Structure 의 이점을 이해하게 되었다.
만약 내가 서비스계층에서 JPA에서 제공하는 메서드 명과 똑같이 레포지토리의 메서드들을 구성을 했다면,
컨트롤러계층, 서비스계층은 코드를 손댈 필요없이 레포지토리계층만 바로 교체를 할 수 있겠구나를 느꼈다.
하지만 메서드명을 다르게 했었기에 서비스계층의 일부를 수정했다.
수정된 서비스계층
JPA에서 제공하는 메서드명과 리턴타입이 내가 작성한 메서드와 조금 달랐기에 그 부분을 수정해주었다.
Entity 수정
JPA는 update문이 없다. 이유는 변경감지 기능이 있기 때문인데. 영속성 컨텍스트 안에 엔티티가 있고 기존의 데이터에서 변경이 일어나면 이를 감지한다. 그리고 commit을 하게되면 변경된값이 데이터베이스에 입력된다 이렇게 수정을 할 수가 있다. (JPA에 대해선 따로 글을 게시할 것이다.)
변경감지를 위한 update문을 새로 작성해주었다.
JPA로의 변경이 완료되었고 postman으로 테스트결과 이상없이 잘 작동되는 것을 확인하였다.