[내일배움캠프 Spring 심화] 2024.10.10 WIL - 트러블 슈팅

박상훈·2024년 10월 10일

[내일배움캠프] WIL

목록 보기
2/2

금주의 트러블 슈팅

  • 위는 현재 진행중인 멀티 모듈 프로젝트의 모듈 구조이다. 평소와 같이 개발을 진행하던 도중, 예외 처리 및 에러 핸들링을 하는 과정에서 다음의 문제가 발생했다.

  • 우선 api 모듈의 Controller단에서 domain 모듈의 Service단을 호출하고, Service단의 메소드에서 try-catch문으로 예외 발생을 감지하고, 해당 오류를 support-api 모듈에 정의된 Api Response 클래스로 감싸서 반환한다.

  • Service 단에서의 여러 분기(없는 Entity 조회, 권한 부족 등)에 따른 예외를 발생시키기 위해 직접 구현한 ErrorType 코드, Exception 클래스가 필요했다.

  • 그러나 ErrorType, Exception 클래스는 support-api 모듈에 정의되어 있어 Service 로직에서 참조가 불가하였다.
  • 그래서 고안한 방법들 아래와 같다.

Solution #1

  • 기본적으로 domain 모듈은 support-api 모듈을 참조하는 것이 불가하지만, api 모듈은 최상위 모듈이기에 다른 support 모듈들을 참조할 수 있도록 설계되어 있다.
  • 따라서 Custom Exception 관련 코드들을 support-domain 모듈로 옮기게 되면 api 모듈에서 참조할 수 있었다.

문제 발생

  • 그러나 support-api 모듈의 Api Response를 구현한 패키지에서 Custom Exception을 구현한 패키지 내의 코드를 재사용하고있었다.
  • support 모듈끼리는 서로 참조가 불가했기 때문에 이 부분에서 오류가 발생하는 것을 확인할 수 있었다.
  • 발생한 연쇄적인 오류를 해결하기 위해 support-api 모듈과 support-domain 모듈이 상호작용하도록 설계를 하게 되면 DDD를 구현한 의미가 퇴색된다고 판단되어 다른 방법을 모색하기로 하였다.

Solution #2

  • Custom Exception을 구현한 코드를 위와 같이 domain 모듈에도 두면 Service 단에서도 예외 처리를 구현할 수 있다.

문제 발생

  • 코드에 중복성이 생기게 되어 좋은 코드는 아니다.

  • Custom Exception 관련 코드 중 하나의 클래스인 ErrorType에 정의된 코드 중 DEFAULT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, ErrorCode.E500, "An unexpected error has occurred.", LogLevel.ERROR) 와 같이 HttpStatus enum을 사용하려면 'org.springframework.boot:spring-boot-starter-web' 의존성을 주입해야 한다.

  • support-domain 모듈은 기본적으로 spring boot 의존성을 모두 배제하고 순수 자바코드만 사용하기로 컨벤션이 정의가 되어있던 상태라, 의존성을 주입하기 애매한 상황이다.


Solution #3

  • 최종적으로 수정된 구조이다. 공통적으로 사용되는 error 모듈을 새로운 공통모듈로 생성하여 api 모듈, domain 모듈에 주입하여 사용할 수 있었다.
  • 추가로 Api Response를 구현한 클래스에도 Custom Exception을 구현한 클래스의 ErrorType이 필요하기에 순환 참조만 주의하여 support-api 모듈에 support-error 모듈을 주입하면 Solution #1의 문제도 해결할 수 있다.
profile
안녕하세요

0개의 댓글