우와한 개발자

[Spring] Bean 등록과 의존성 주입(DI) 설정 - Java Config 방식

by 우와한개발자

1. Bean 등록

  • @Configuration 어노테이션을 붙인 자바 클래스에서 @Bean으로 직접 Bean을 등록하는 방식.
  • 타입 안정성이 높고 복잡한 설정에 유리함.
  • 일반적으로 Java Config 파일은 .config 패키지에 넣는게 좋음
  • 스프링 부트 기반 프로젝트에서 Java Config 방식과 어노테이션 방식이 많이 사용됨
어노테이션 용도 패키지
@Configuration Bean 설정 클래스 선언 org.springframework.context.annotation.Configuration
@Bean 메서드 반환 객체를 Bean으로 등록 org.springframework.context.annotation.Bean
@ComponentScan 지정 패키지에서 Bean 자동 스캔 org.springframework.context.annotation.ComponentScan
@ImportResource XML 설정파일을 Java Config에서 import org.springframework.context.annotation.ImportResource

 

1) @Configuration과 @Bean

  • @Bean 어노테이션이 붙은 메서드의 이름이 Bean의 이름(XML에서 <bean>태그의 id값)이 됨
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() { /
        return new MemberService();
    }
}

 

2) @ImportResource

  • XML 설정파일 함께 사용
  • Java Config를 메인으로 쓰면서 기존 XML 설정파일도 함께 사용해야 할 때 씀
  • 레거시 프로젝트를 Java Config로 점진적으로 전환할 때 유용함
@Configuration
@ImportResource("classpath:applicationContext.xml") // XML 설정파일 import
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService();
    }
}
<!-- applicationContext.xml -->
<beans ...>
    <bean id="orderService" class="com.example.OrderService"/>
</beans>
  • XML에 등록된 orderService와 Java Config에 등록된 memberService를 스프링 컨테이너가 함께 관리함

 

3) @ComponentScan

  • 지정한 패키지를 스캔해서 @Component, @Service, @Repository, @Controller가 붙은 클래스를 자동으로 Bean으로 등록
  • @Bean 메서드 없이 스캔 설정만 해도 됨
@Configuration
@ComponentScan("com.example.myapp")
public class AppConfig {
    // 비워도 됨 — @ComponentScan이 해당 패키지를 스캔해서 Bean 자동 등록
}
// com.example.myapp 패키지 안에 있는 클래스들이 자동으로 Bean 등록됨
@Service
public class MemberService { }

@Repository
public class MemberRepository { }

 

  • @Bean과 @ComponentScan을 함께 쓰면 직접 등록한 Bean과 자동 스캔 Bean을 같이 관리할 수 있음.
@Configuration
@ComponentScan("com.example.myapp")
public class AppConfig {

    // 외부 라이브러리처럼 @Service 등을 붙일 수 없는 경우 직접 @Bean으로 등록
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

 

2. 의존성 주입 DI 설정

1) 생성자 주입 방식

  • @Bean 메서드에서 직접 생성자를 호출해 주입.
  • 되도록 new를 사용하지 말라고 했지만 @Bean은 사용해야함. (단, 한번만 생성함)
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService();
    }

    @Bean
    public OrderService orderService() {
        return new OrderService(memberService()); // 생성자 주입
    }
}

 

2) setter 주입 방식

  • @Bean 메서드에서 직접 setter를 호출해 주입.
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService();
    }

    @Bean
    public OrderService orderService() {
        OrderService orderService = new OrderService();
        orderService.setMemberService(memberService()); // setter 주입
        return orderService;
    }
}

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기