반응형
안녕하세요 백엔드 개발자 제임스입니다. 😎
서론
지난 시간 순환 참조에 대해서 설명한 적이 있습니다. 그리고 이번에 구현을 하면서 실제로 순한 참조 문제를 겪게 되었는데요.
이에 어떻게 해결했는지 간단하게 공유하려고 합니다. 설명을 보기 전에 순환 참조에 대해서 잘 모르겠다면, 아래 링크를 참고해주세요.
https://not-error-064.tistory.com/6?category=1049614
문제
보다시피 순환참조 문제가 발생했다는 에러 메시지입니다. 정확하게는 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를 의존하게 됩니다.
반응형
'개발 > Programming' 카테고리의 다른 글
[IDE] MacOS 터미널(CLI)에서 IntelliJ 바로 실행하기 (2) | 2023.02.27 |
---|---|
[프로젝트] 중복 데이터를 어떻게 효율적으로 처리할까? (feat.채식이들-핵심기능) (2) | 2022.11.21 |
[빌드] ./gradlew: /bin/sh^m: bad interpreter: no such file or directory 오류 발생 그리고 해결 (7) | 2022.09.02 |
[배포] AWS를 통한 배포 방법 알아보기(EC2 서버 실행) (6) | 2022.08.09 |
[배포] AWS를 통한 배포 방법 알아보기(인스턴스 생성과 연결) (4) | 2022.08.09 |