빈 Bean
Bean 은 Spring framework 에서 앱을 구성하는 기본적인 객체입니다. 개발자는 Bean 을 정의하고 활용하고, Container 는 개발자가 정의한 Bean 을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공합니다. 따라서 개발자는 Bean 을 어떻게 정의하고 사용하는지 알고 있어야만 Spring framework 를 사용할 수 있습니다.
// Bean 은 Annotations 로 쉽게 정의할 수 있다.
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
Bean 은 기본 객체이기 때문에 무엇이든지 가능합니다. 다만 Bean 은 BeanDefinition 으로 정의되며, BeanDefinition 에 따라 활용하는 방법이 달라지게 됩니다. BeanDefinition 속성에 따라 Container 가 Bean 을 어떻게 생성하고 관리할지 그리고 Bean 간의 관계를 어떻게 풀어나갈지를 결정하게 됩니다. Bean 간의 관계를 풀어나간다는 말의 의미는 Bean 들 사이에 존재하는 종속성을 해결한다는 뜻입니다. 즉 Dependency Injection 이 동작하도록 Container 는 Bean 을 생성하고 관리합니다.
Bean 종속성
Container 는 개발자를 대신하여 각 Bean 이 생성될 때 필요한 객체를 전달합니다. 이를 Dependency Injection 이라 합니다. 문제는 종속 관계가 환형, Bean 간에 서로 종속되는 관계를 가질 때 발생합니다. 이 때 BeanCurrentlyInCreationException 라는 예외를 마주치게 됩니다.
이 예외를 근본적으로 해결하는 방법은 서로에게 종속되지 않도록 관계를 정리해주는 겁니다. 서로에게 종속되는 Bean 은 코드 간에 결합을 발생시키는, 클린하지 않은 코드입니다.
다른 해결 방법은 서로 의존하게 되는 타이밍을 다르게 설정하는 방법입니다. 객체가 생성될 때가 아닌 객체의 속성을 설정할 때 종속성을 해결하면 됩니다. 다만 근본적인 문제를 해결하는 방법이 아니기에 추천드리지 않습니다.
'Develop > Backend 가이드' 카테고리의 다른 글
[Spring] JPA Mapping (0) | 2020.05.20 |
---|---|
[Spring] @NotNull, @NotEmpty, @NotBlank 차이 (0) | 2020.05.19 |
[Spring] Spring Security 설계 구조 (0) | 2020.04.12 |
[Spring] VSCode에서 DevTools & LiveReload 사용하기 (2) | 2020.04.07 |
[Spring] 컨테이너 Container (0) | 2020.02.23 |
꾸준히 노력하는 개발자 "김예건" 입니다.