1. 문제상황
사이드 프로젝트를 진행하다가 순환참조 문제가 발생했습니다!
상황은 이러합니다,
MinioService : 미니오 서버에 이미지를 업로드, 다운로드 가능
MultipartUtil : 파일 이름 결정, 확장자 추출 등 파일 관련 서비스가 포함되어 있음
MinioService와 MultipartUtil이 서로의 함수를 사용하기 위해서
서로 참조를 하고 있는 상황이었습니다.
그렇기 때문에 아래와 같이 순환참조가 발생하였습니다.
springboot는 친절하게도 컴파일 시, 순환참조를 감지해서 에러를 띄워줍니다.
2. 해결
그래서 이 순환참조 문제를 어떻게 해결할까 고민을 해봤습니다.
여러가지 방법을 찾아보다가... 아래와 같은 방법들도 있다는 것을 알게되었습니다.
1. MinioService와 MultipartUtil을 다시 설계한다 (best)
2. 생성자 주입이 아닌 필드주입, 세터주입으로 해결한다
3. MinioService와 MultipartUtil을 두개 다 주입 받은 새로운 확장서비스를 생성한다
4. Lazy Loading으로 처리한다 (worst, 스프링에서도 권장안함)
처음에는 3번째 방법을 사용해서 문제를 해결했었는데
그러다가 내가 해결한 방법이 과연 옳을까 싶어서 개발 멘토님께 질문을 드렸습니다
멘토님은 3번과 같은 방법으로 해결해도 좋지만,
인터페이스를 생성해서 DIP를 통해 해결하면 좋은 구조를 가져갈 수 있을 거라고 하셨습니다
DIP(의존 역전 원칙)에 대한 개념은 다른 블로그를 참고해보시면 됩니다!
DIP 방식을 사용해서,
MinioService가 사용하는 MultipartUtil 함수를 인터페이스로 만들고 MultipartUtil을 구현체로 두는 방식을 선택하였습니다.
그렇게 해서 MinioService와 MultipartUtil이 FileExtensionable을 참조하도록 개발하였습니다.
왼쪽 그림은 헥사고널 아키텍쳐로, 나중에 이걸 배우게되면
DIP를 통해서 비지니스 로직을 보호할 수 있는 아키텍처를 구성할 수 있다는 것도 알려주셨다.
하지만,
이게 뭔가..? 또 순환참조 발생?

그래서 이건 또 왜 이런가 살펴보니,
MinioService가 인터페이스를 참조하게 되면, 결국 구현체 MultipartUtil의 함수들을 참조하게 되는데,
MultipartUtil은 MinioService를 참조하도록 구현되어 있기 때문에 인터페이스로 함수를 따로 빼더라도
순환참조 문제는 계속 이어지는 것이다 ...!!
그래서 아래와 같은 구조로 구현체를 따로 만들어 주었고
MinioService와 MultipartUtil이 인터페이스를 참조하도록 하여
순환참조를 해결할 수 있었습니다!!
'Back-End > JavaSpring' 카테고리의 다른 글
MSA에서 API gateway를 통한 인증/인가를 처리하는 방식 (0) | 2025.03.14 |
---|---|
DDD 기반 프로젝트 패키지 구조 설계 (SpringBoot) (0) | 2025.03.12 |
요즘은 클라이언트에게 정적 페이지/동적 페이지가 아닌, 데이터를 반환해준다고? (Spring Boot) (0) | 2025.02.27 |
Jackson이란? (spring boot) (0) | 2025.02.25 |
Spring MVC 패턴은 무엇이고 왜 사용하지? (1) | 2025.02.24 |