Spring/코드 개선 (Refactoring)

[코드 개선 과제] 공통 예외 로직 추출, 도메인 로직 분리

가지코딩 2025. 6. 12. 11:05

1. 문제 인식 및 정의

여러 서비스 클래스에서 동일한 형태의 예외 로직이 반복되고 있는 상황 확인

 

 

발생가능한 문제

  • 유지보수성 저하: 로직 변경 시 모든 중복 위치를 찾아 수정해야 한다.
  • 휴먼 에러 위험 증가: 일부 위치에서 변경을 놓치면 버그로 이어진다.
  • 가독성 저하: 핵심 로직보다 반복된 부수 코드가 많아져 흐름이 뚝뚝 끊긴다.

2. 해결 방안

중복 코드를 제거하고, 공통 로직은 한곳에서 관리할 수 있도록 리팩토링한다.

  • 서비스 계층에서는 각 도메인에 대한 책임을 명확히 분리 한다.
    • User 관련 공통 로직은 UserService 에 정의
    • Todo 관련 공통 로직은 TodoService 에 정의
  • 도메인 객체가 필요한 서비스들은 더 이상 각자의 Repository를 직접 사용하지 않고, 해당 도메인의 Service에서 제공하는 공통 메서드를 통해 조회 및 예외 처리를 일관되게 수행하도록 한다.

3. 해결 완료

UserService 메서드 추가
- getUserByIdOrThrow()
- getManagerByIdOrThrow()
- getUserByEmailOrThrow()
- ensureEmailIsUnique()
- saveUser()

TodoService 메서드 추가
- getTodoOrThrow()

 

 

 

 

[Commit History]

https://github.com/gajicoding/spring-advanced/commit/1d67c102c62c1f05eff2bd55fef32a2b6de19110

 

Lv 5. 공통 예외 로직 추출, 도메인 로직 분리 · gajicoding/spring-advanced@1d67c10

UserService 메서드 추가 - getUserByIdOrThrow() - getManagerByIdOrThrow() - getUserByEmailOrThrow() - ensureEmailIsUnique() - saveUser() TodoService 메서드 추가 - getTodoOrThrow() - 메서드 사용

github.com

 

+ 테스트 코드 수정

https://github.com/gajicoding/spring-advanced/commit/d813f543b20376e67062b114470be85778cc74cb

 

test: 서비스 리팩토링에 따라 테스트 코드 수정 · gajicoding/spring-advanced@d813f54

Todo todo = new Todo("title", "title", "contents", user);

github.com

 

 

리팩토링 효과

  • 유지보수성 향상: 사용자 조회 로직을 수정할 일이 생기더라도 UserService의 한 메소드만 수정하면 된다.
  • 중복 제거: 동일한 로직이 여러 곳에 퍼져있는 문제를 해결했다.
  • 가독성 개선: 주요 도메인 로직에만 집중할 수 있게 되었다.

 

리팩토링 단점

  • 서비스 간 호출 복잡도 증가
  • 초기 설계 난이도 증가