Welcome! Everything is fine.

[트러블슈팅] 순환 참조 오류(Circular Dependency) 본문

Spring

[트러블슈팅] 순환 참조 오류(Circular Dependency)

개발곰발 2025. 4. 16.
728x90

문제점

애플리케이션을 실행하자, 다음과 같은 에러가 발생했다.

원인

Bean 초기화 시에 순환 참조가 생기면서 앱이 실행되지 않았다.

  • EventService → EventJoinService를 @RequiredArgsConstructor로 주입
  • EventJoinService → EventService를 또 @RequiredArgsConstructor로 주입

서로 의존성을 주입하고 있어서 다음과 같은 순환 의존 구조가 된 것이다.

EventController
  → EventService
    → EventJoinService
      → EventService (다시 참조)

해결 과정

기존에 EventJoinService에서 사용하고 있던 EventService를 EventRepository로 바꿨다.

EventService의 getEvent() 메서드를 호출하는 구조였는데, 직접 eventRepository.findById() 를 사용하도록 수정했다.

  • Event와 User는 @ManyToOne → 즉, EventJoin이 소유자
  • 비즈니스적으로 EventJoin을 만들기 위해 Event가 필요함.
  • 그러니 eventRepository.findById() 혹은 findByIdForUpdate()를 호출하는 건 자연스러움.
  • EventJoinService 를 Event의 하위 개념이라는 것을 잊고 작업해서 실수를 한 것 같다.

구조를 생각해보면 User ↔ EventJoin ↔ Event 와 같은데,

EventJoin은 "누가 어떤 이벤트에 참여했는가"를 저장하는 이벤트 신청 테이블로, 유저와 이벤트 사이의 중간 테이블로 생각해야 한다. 또 단순 조회만을 하고 있기 때문에 굳이 EventService를 쓸 필요는 없다.