프로젝트를 마무리하면서 부족했던 부분을 정리하고자 한다 처음으로 스프링을 사용해서 처음 부터 끝까지 진행한 프로젝트이고 많은 어려움이 있었지만 완벽하다고는 하지 못하지만 완성을 해냈다
아쉬웠던 점
컨트롤러에서 Entity 노출
JPA를 사용하면서 몇몇 엔티티에 양방향 관계를 맺어 둔 것이 있다
개발을 첫 시작할때만 해도 우선 기능이 돌아가게끔 만들자라는 생각 뿐이었고 뷰에 반환 하는 값에 대해서는 전혀 생각을 하지 않고 있었다
이부분이 화두의 시작이었다 뷰에 반환하는 값에 양방향 관계를 맺은 값이 포함이 되었고 순환참조
의 문제가 생기게 되었다 경험해보지 못한 오류상황이었고 꽤 긴시간 골머리를 앓았던 기억이 있다
그 당시에는 DTO를 만들어서 보낼 생각은 하지 않은채 결국 문제만 해결하기 위해 @JsonIgnore
을 붙혀서 사용하게 되었다
@JsonIgnore
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "SMALL_SUBJECT_ID")
private SmallSubject smallSubject;
추후 모든 컨트롤러에서 Entity를 직접 노출하는 것에 있어서 전부다 DTO로 변환을 하는 작업을 추가적으로 거치게 되었고 많은 고생을 하게 되었다
이런 과정에서 DTO변환에 대해서도 많은 고민을 하였고 적어둔 글은 아래 링크에 있다
DTO 관련 고민
정확한 스펙없이 개발
진행한 프로젝트가 혼자하는 것이고 뷰도 타임리프를 사용해서 서버사이드 렌더링을 하는 과정이었기에 그나마 다행이었지만 팀 프로젝트이고 api를 통해서 값을 전달하는 과정이었으면 너무나도 큰 문제이라고 생각을 했다
개발을 시작할때 기능을 먼저 구현하면서 홀로 '뷰에선 이런 값이 필요할거야' '이런 값을 줄거야'와 같은 생각만으로 컨트롤러 서비스를 작성했었다
이로인해 필요한 데이터가 있을때마다 추가로 조회해서 model에 담아 넘겨줬고 하나의 기능에 대해서 수많은 수정 작업을 거치게 되었다
이제와서 다시 생각하는 거지만 정말 혼자 진행한 것이 너무나도 다행이라고 생각되는 부분이다
다른사람이랑 같이하는데 API 스펙이 시시때때로 변경된다?... 음
테스트 코드작성에 미흡한 점
테스트 코드를 몇몇개에만 작성을 하고 거의 90프로의 기능에 대해서는 작성을 하지 않고 진행을 해왔다
그래서 기능에 대해 검증이 필요하게 되면 postman이나 직접 서버를 실행해 보는 방법 말고는 확인을 할 수 있는 방법이 없게 되었고 기능개발에 충실해야 할 시간에 뷰 렌더링 작업에 몰두해 있는 내 모습을 발견하게 되었다
현재 진행 계획중인 프로젝트가 하나있는데 이번엔 모든 기능에 대해서 테스트 코드를 무조건적으로 작성을 할 예정이다
배운점
fetch join과 페이징
마지막으로 구현완료한 것이 페이징 기능인데 원래 구현해야하는 기능은 단순 아이디에 대해 필터링만 거치면 되는 것을 괜히 복잡하게 생각하여 fetch join과 페이징을 둘다 하여 구현을 하도록 했다
원래는 아래와 같이 해주면 되는 것이었는데..
참고사항
참고로 아래 countQuery에서 join을 하지 않은 이유는 UserMap을 기준으로 Map이 ManyToOne관계를 가지고 있어 row수의 증가가 없기 때문이다
@Param
을 사용하게 될때:userId
와 같이 지정을 해주게 될텐데 : <--이랑 변수(userId)사이는 절대로 공백이 있으면 안된다 적용이 되지 않는다
개인적인 생각인데 Spring boot가 변수명을userId
가 아니라공백+userId
으로 적용을 하는게 아닌가 싶다
@Query(value = "select um from UserMap um join fetch um.map where um.id.userId = :userId",
countQuery = "select count(um) from UserMap um where um.id.userId = :userId")
Page<UserMap> findByIdUserId(@Param("userId") String userId, Pageable pageable);
필요한 기능은 아니었지만 의도치 않게 OneToMany관계에서는 row수가 증가하게 되고 원하는 값을 정확하게 가져오기 어렵게 때문에 페이징이 안되고 메모리상에서 페이징처리가 된다는 것을 알게 되었다
(정말...ㅋㅋㅋㅋ 지금 생각해도 바보같은 짓이지만 뭔가 운이 좋았다?라는 생각이 든다)
그외
그 외에도 ControllerAdvice나 앞서 도메인 구성에서도 언급한것과 같이 Spring Data JPA에서 save를 할때의 문제점 그리고 배운것을 직접 적용하면서 Spring에 익숙해 진것이 많이 배운것 같다
프로젝트 소스코드 깃헙 링크
'프로젝트' 카테고리의 다른 글
첫 팀 프로젝트 후기 (0) | 2023.05.04 |
---|