코딩/자바

[Spring] Spring Bean

yoney 2025. 2. 4. 17:47

[ 목차 ]


    [Spring container]

    객체(Bean)을 생성 및 관리하고 의존성을 주입하는 역할 담당


    [Spring Bean]

    Spring Container가 관리하는 객체. Bean을 new 키워드 대신 사용한다.


    Spring Bean의 특징

    1. Spring 컨테이너에 의해 생성되고 관리된다.
    2. 기본적으로 Singleton으로 설정된다.
    3. 의존성 주입(DI)을 통해 다른 객체들과 의존 관계를 맺을 수 있다.
    4. 생성, 초기화, 사용, 소멸의 생명주기를 가진다.

    Bean 등록 방법

    1. 자동 빈 등록

    • 어노테이션을 통해 Bean으로 등록
      • @Component: bean으로 등록하려는 클래스 위에 사용. 
      • @ComponentScan(basePackages = "com.example"): com.example 패키지를 스캔해서 component,  Controller,  Service, Repository 어노테이션이 붙은 클래스들을 bean으로 등록한다. 메인 메서드가 있는 클래스에서 사용

    2. 수동 빈 등록

    • @Configuration: 클래스를 Bean으로 등록하고 해당 클래스의 메서드에 @Bean을 붙여서 bean을 생성한다.
    // 수동으로 빈 등록
    @Configuration
    public class AppConfig {
        
        // TestService 타입의 Spring Bean 등록
        @Bean
        public TestService testService() {
            // TestServiceImpl을 Bean으로 등록
            return new TestServiceImpl();
        }
        
    }

    • 자동 Bean 등록을 사용하는 이유
      1. 다양한 Annotation으로 편리하게 등록할 수 있다.
      2. Spring Boot는 ComponentScan 방식을 기본으로 사용한다.
      3. 간단하지만 OCP, DIP를 준수하며 개발할 수 있다.
    • 수동 Bean 등록을 사용하는 경우
      1. 외부 라이브러리나 객체를 Spring Bean으로 등록할 때
        • 외부 라이브러리에서 제공하는 클래스는 자동 등록이 불가능하다.
      2. 데이터베이스 연결과 같이 비지니스 로직을 지원하는 기술들에 사용한다.
        • 비지니스 로직보다 그 수가 아주 적지만 Application에 광범위하게 적용된다.
        • 설정 정보에 명시되어 있어서 유지보수성이 증가한다.
      3. 같은 타입의 Bean 여러개 중 하나를 명시적으로 선택해야 할 때

     

    꼭 필요한 경우가 아니라면 자동 Bean 등록을 사용하면 된다.

     


     

    [같은 타입의 Bean이 중복된 경우 충돌 해결 방법]

    1. @Autowired+필드명 사용

    	// 필드명을 Bean 이름으로 설정
    	@Autowired
    	private MyService myServiceImplV2;
    	...

     

    2. @Qualifier 사용

    @Component
    @Qualifier("firstService")
    public class MyServiceImplV1 implements MyService { ... }
    
    @Component
    @Qualifier("secondService")
    public class MyServiceImplV2 implements MyService { ... }
    
    @Component
    public class ConflictApp {
    
    		private MyService myService;
    
    		// 생성자 주입에 구분자 추가
    		@Autowired
    		public ConflictApp(@Qualifier("firstService") MyService myService) {
    				this.myService = myService;
    		}
    	
    		// setter 주입에 구분자 추가
    		@Autowired
    		public void setMyService(@Qualifier("firstService") MyService myService) {
    				this.myService = myService;
    		}
    	...
    }

     

    3. @Primary 사용: primary 지정된 bean이 우선 순위를 가진다. 보통은 primary를 많이 사용(mysql)

    @Component
    @Primary
    public class MyServiceImplV2 implements MyService { ... }

     

    '코딩 > 자바' 카테고리의 다른 글

    [Spring] Validation  (1) 2025.02.05
    [Spring] IOC/DI, 싱글톤 패턴  (0) 2025.02.05
    [Spring] SOLID 원칙  (0) 2025.02.04
    [Spring] Spring 3 Layered, Spring MVC  (1) 2025.01.23
    [Spring] 기초 6주차  (0) 2025.01.23