본문 바로가기

DEVELOPER/Programming

[아키텍처] 실제로 겪은 순환 참조 문제와 해결 방법

반응형

안녕하세요 백엔드 개발자 제임스입니다. 😎

 

서론


지난 시간 순환 참조에 대해서 설명한 적이 있습니다. 그리고 이번에 구현을 하면서 실제로 순한 참조 문제를 겪게 되었는데요.

이에 어떻게 해결했는지 간단하게 공유하려고 합니다. 설명을 보기 전에 순환 참조에 대해서 잘 모르겠다면, 아래 링크를 참고해주세요.

https://not-error-064.tistory.com/6?category=1049614 

 

[BE-기술] 백엔드 개발자의 필수 과제, '순환 참조(Circular Reference)' 문제 해결

안녕하세요 NOT-ERROR-064팀 백엔드 개발자 강시혁(제임스)입니다.😎 서론 어제 '백기선 개발자님'의 Youtube 라이브 방송을 보게 되었습니다. 방송은 신입 또는 취업을 준비하는 개발자들의 프로젝

not-error-064.tistory.com


문제


보다시피 순환참조 문제가 발생했다는 에러 메시지입니다. 정확하게는 MemberServiceImpl과 SecurityConfig가 서로 의존하면서 발생하는 문제입니다.

생성자 주입 방식 덕분에, Application 실행한 순간부터 Runtime 에러가 발생
이것이 생성자 주입에 중요성인 것 같네요,, 휴

문제 발생 원인


(1) SecurityConfig 파일에 빈 객체 생성

패스워드를 암호화하여 데이터베이스에 저장하기 위해 PasswordEncoder Bean을 생성했습니다. 이때 생성된 위치는 SecurityConfig라는 파일이었습니다. 

(2) MemberServiceImpl 에 PasswordEncoder를 주입

회원가입 기능에서 데이터베이스 객체를 저장할 시에 패스워드를 encode 하여 저장하려고 했습니다.
따라서 final과 RequiredArgsConstructor를 통해서 생성자 주입 방식으로 PasswordEncoder를 주입했습니다.

(3) SpringSeucrity에 MemberService가 주입되어있는 것이 문제의 원인

가장 핵심 문제는 보다시피 SecurityConfig에 MemberService가 주입되어 있다는 것입니다. MemberService와 SecurityConfig가 서로 의존하고 있기 때문에 문제가 발생한 것입니다.

 

해결


문제를 해결하기 위해서는 둘 중 하나에서 의존을 하지 않으면 됩니다. 하지만 SecurityConfig에서는 MemberService를 필요로 하고, MemberService 역시 PasswordEncoder를 필요로 합니다.

따라서..

저는 AppConfig 라는 이름에 또 다른 클래스를 생성하고, 해당 위치에 passwordEncoder Bean 객체를 생성했습니다.

즉, SecurityConfig 는 MemberService를 의존하는 것을 유지하되, MemberService는 AppConfig를 의존하게 됩니다.

반응형