본문 바로가기
IT/Java

순환 참조란?

by 성준하이 2023. 4. 17.
반응형

스프링을 사용하면서 서버를 띄우니 아래와 같은 에러가 발생 하였다.

 

The dependencies of some of the beans in the application context form a cycle:


┌─────┐
  |  autowiredTestA defined in file [/Users/eclipse-workspace/testProject/target/classes/com/test/autowired/AutowiredTestA.class]
↑     ↓
  |  autowiredTestB defined in file [/Users/eclipse-workspace/testProject/target/classes/com/test/autowired/AutowiredTestB.class]
└─────┘

순환 참조가 걸렸다는걸 알려주는 에러이다.

 

순환참조 문제란 A 클래스가 B 클래스의 Bean 을 주입받고, B 클래스가 A 클래스의 Bean 을 주입받는 상황처럼 서로 순환되어 참조할 경우 발생하는 문제를 의미하고 이러한 순환참조 문제는 어떠한 상황에서 발생하는지 살펴보면

 

ClassA
@Component
@RequiredArgsConstructor
public class AutowiredTestA {

private final AutowiredTestB autowired;


}
ClassB
@Component
@RequiredArgsConstructor
public class AutowiredTestB {

private final AutowiredTestA autowired;


}

이렇게 서로를 참조하고 있으면 다음 에러가 발생한다.

 

해결법

먼저 우선적으로 클래스를 구현하고 디자인을 할떄 서로 이런 상황이 만들어지지 않도록 구현을 하는게 가장 좋은 방법이다. 

 

하지만 순환을 끊을수는 없을때는 Lazy annotation을 사용하여 임시로 해결할수 있다.

하나의 클래스에 

@Component
public class AutowiredTestA {

    @Autowired
    public ServiceB(@Lazy ServiceA serviceA) {
    this.serviceA = serviceA;
    }

}

이렇게 해결할수 있다.

 

하지만 어디까지나 임시 해결이다보니 성능상에 문제를 일으킬수도 있다.

 

프록시를 만들어서 참조를 하거나 방법은 다양하니 고민을 많이 해보는걸 추천한다.

 

아래 글 참조해서 생성자 주입에 대한 내용을 확인하는것은 도움이 될것이다.

 


참고 포스팅

https://thenicesj.tistory.com/278

 

@Autowired 대신 @RequiredArgsConstructor

Spring 에서는 다양한 장점이 존재하는데 그중 하나는 의존성 주입(DI) 에 대한 개념이다. 이 개념이 어떤 의미인지 모른다면 아래 참고포스팅에서 확인하고 오면 도움이 될것이다. 여기서 나오는

thenicesj.tistory.com

 

반응형

'IT > Java' 카테고리의 다른 글

자바 String 내에서 따옴표 사용법  (14) 2023.04.20
자바 예외 만들기  (15) 2023.04.18
Map 추출하는 방법  (37) 2023.04.15
application.properties vs application.yml  (30) 2023.04.11
reflection 를 통해 MapToObject 만들기  (36) 2023.04.10

댓글