TIL

[250416] 스프링 심화 과제 회고

도원좀비 2025. 4. 16. 19:51

✅ LV.1 코드 개선

기본 적인 코드 순서 코드 최적화 문제라 어렵지 않게 해결했다.


✅ LV.2 N+1 문제 해결

원래 기존에는 N+1 문제가 생길것 같은곳은 DTO+QueryDSL로 해결했는데 이번에는 조건에 따라 @EntityGraph를 사용해 보았다. 간단한 조인 상황에서는 @EntityGraph를 사용하는게 훨씬 간편하고 좋았다.


✅ LV.3 테스트 코드 리팩토링

아직 익숙하지 않아서 실수를 몇개 하면서 잠시 헷갈린 경우가 있었지만 저번 팀프로잭트 때 테스트 코드를 작성하면서 공부한 경험이 있어서 어렵지 않게 해결했다.


✅ LV.4 API 로깅

처음 접해보는 Interceptor와 AOP여서 걱정을 많이 했는데 공부를 해보니 필터 처음 배울 때랑 비슷한 느낌이었다. 간단하게 어떻게 사용했는지 정리해보겠다.

1️⃣ Interceptor

  • AdminAccessInterceptor에서 어드민 요청 URL, 시간, 사용자 ID 로그 출력

2️⃣ AOP

  • AdminApiAspect에서 어드민 API 전후로 요청/응답 JSON 로그
  • RequestContextHolder를 통해 HttpServletRequest 접근
  • ObjectMapper로 직렬화된 로그 기록

✅ Lv.5 내가 정의한 문제 해결

ManagerService를 대표로 예시를 들겠다.

1️⃣ [문제 인식 및 정의]

  • 서비스 레이어에 검증 로직이 몰려 있었다.
  • 검증 책임이 Todo, User, Manager, Repository에 적절히 나뉘어있지 않고 섞여 있었다.
  • 특히 "이미 등록된 담당자인지"를 판단하는 책임이 서비스에 직접 존재하고 있어 추상화 계층이 어긋나 있었다.

이로 인해 도메인 책임이 불명확했고, 가독성과 테스트성 모두 저하되는 문제가 있었다.

2️⃣ [해결 방안]

[의사 결정 과정]

 

  • 객체가 스스로 판단할 수 있는 것은 도메인에 위임한다.
  • 서비스는 흐름만 담당하고, 도메인은 규칙을 판단하게 한다.
  • 중복 등록 검증은 단일 Manager가 할 수 없고, 여러 개 중 비교해야 하므로 새로운 도메인 서비스 또는 유효성 검증 로직이
    필요하다 판단함

[해결 과정]

 

  • Todo.validateOwner(User)로 작성자 검증 위임
  • User.validateNotSelf(User)로 자기 자신 등록 방지 위임
  • Manager.validateBelongsTo(Todo)로 삭제 시 소속 검증 위임
  • ManagerDomainService.validateDuplicateManager(Todo, User)를 새로 정의하여 중복 담당자 등록 검증 책임을 분리

3️⃣ [해결 완료]

[회고]

  • 처음엔 다른 사람이 작성한 코드다 보니 코드를 한눈에 이해하기 힘들었지만 계속 검토하다보니
    한 메서드 안에 너무 많은 책임이 모여있는 걸 보면서 추상화 수준이 어긋났음을 인지했다.
  • 도메인에 책임을 넘기면서 서비스 흐름이 매우 간결해졌고,
    도메인 객체의 책임도 명확해졌다.
  • 특히 "중복 등록 검증"은 단일 엔티티로는 할 수 없다는 점에서 검증 로직과 도메인 설계가 완전히 연결되어 있다는 것을 체감했다.

3-2. [전후 코드 비교]

구분 리팩토링 전 리팩토링 후
작성자 검증 서비스에서 todo.getUser().getId() == user.getId() todo.validateOwner(user)
본인 등록 방지 if (user == managerUser) user.validateNotSelf(managerUser)
소속 검증 if (todo.id != manager.todo.id) manager.validateBelongsTo(todo)
중복 등록 검증 existsBy...를 서비스에서 직접 managerDomainService.validateDuplicateManager(...)

✅ Lv.6 테스트 커버리지

처음에 테스트 커버리지를 접했을 때 새로운 커버리지인가 싶어서 또 공부를 해야겠구나 했는데 기존 단위 테스트 단계로 프로젝트에서 어느 정도나 테스트 코드가 구현되었는지를 숫자로 알 수있는 좋은 기능이었다.
인텔리제이 내부 기능을 사용하다가 자코코 라는 좋은 기능을 발견해서 사용해 보았다.
서비스와 레포지토리를 위주로 테스트 하였다.