@Configuration이 왜 필요해?

띠용·2025년 5월 30일

우테코 7기 BE

목록 보기
6/15

@Configuration

  • 팩토리 메서드로 @Bean 을 수동으로 등록하기 위한 어노테이션
    @Configuration
    public class SomeConfig {
    	@Bean
    	public ShineResource shine() {
    		return new ShineResource();
    	}
    	
    }

Q. @Bean 으로 수동 빈 등록을 위해서는 @Configuration이 필수적일까?

그냥 아무 @Component에서 작업할 때 필요할 때 마다 @Bean 붙이면 해당 메서드는 빈으로 등록되는 거 아니야? 왜 굳이 @Configuration 안에서 해야 돼?

A. 이유가 있다.

  1. 나는 ‘설정 전용 파일임’을 명시하기 위해서
    • @Component가 있음에도 @Service를 사용하는 이유와 같다.
    • 협업 상황에서 어노테이션만 보고 이 클래스가 설정 역할임을 바로 알 수 있어, 구조 파악이 빨라진다.
  2. 내부 호출(self-invoke)에 대한 싱글톤 관리를 위해서
    1. @Bean메서드에만 붙일 수 있다.
    2. 메서드이기 때문에 호출이 가능하다.
    3. 해당 @Bean 이 선언되어 있는 클래스 내부에서도 호출이 가능하다(self-invoke)
    4. self-invoke시에는 스프링이 끼어들 틈이 없고, 스프링 컨테이너에 있는 싱글톤 캐시를 거치지 못하므로 싱글톤으로 관리가 안된다.
    5. 따라서 일반 함수처럼 동작한다. 계속 호출하면 계속 새로운 객체가 생성된다.
    6. @Configuration 은 적용받는 클래스를 프록시 객체(CGLIB)로 감싸고 내부적으로 @Bean 메서드들이 호출될 때 싱글톤 캐시를 활용하도록 오버라이딩한다.
    7. @Configuration 이 아니라 @Component 를 사용해도 @Bean 을 등록할 수 있지만 프록시를 통한 오버라이딩을 사용하지 않기 때문에 self-invoke시에는 싱글톤을 보장하지 않음. (이외의 경우에는 정상 동작함)
  3. 설정 시 유용한 부가 기능
    • @Import: 다른 @Configuration 클래스나 컴포넌트 클래스를 현재 설정에 추가로 등록한다..
    • @PropertySource: 외부 프로퍼티 파일을 읽어 Spring Environment에 로드한다..
    • @Profile: 지정한 프로파일이 활성화된 경우에만 빈이나 설정을 적용하도록 조건을 걸어준다.

참고

https://blogshine.tistory.com/551

https://dev-wnstjd.tistory.com/440

with GPT o4-mini-high

0개의 댓글