Bean이란 ?

스프링 컨테이너에 등록한 객체들을 Bean 이라고 한다

 

자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져 있어

객체들이 서로 상호작용하며 동작하느데 이때, 상호작용하는 객체를 '객체의 의존성'이라고 표현한다

 

 

 

Bean의 특징

  • @Configuration 설정된 클래스의 메소드에서 사용 가능
  • 메소드의 리턴 객체가 스프링 빈 객체임을 선언
  • 빈의 이름은 기본적으로 메소드의 이름
  • @Bean(name = "name")으로 이름 변경 가능
  • @Scope를 통해 객체 생성 조정 가능
  • @Component 어노테이션을 통해 @Comfiguration 없이 빈 생성 가능
  • 빈 객체에 init(). destory() 등 라이프사이클 메소드를 추가한 다음 @Bean에서 지정 가능

 

Bean 등록 2 가지

 

첫번째. 컴포넌트 스캔과 자동 의존관계 설정

클래스 선언부 위에 @Component 어노페이션 사용

 

@Service, @controller, @Repository 모두 @Component를 상속받고 있으며,

해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈을 등록된다

 

두번째. 자바 코드로 직접 스프링 빈 등록

수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용

 

1.설정 클래스를 만들고

2.@Configuration 어노테이션을 클래스 선언부 위에 추가

3. 특정 타입을 리턴하는 메소드 만들고

4. @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체 생성됨

 

 

 

1번 방법이 간단하고 많이 사용되지만, 2번 방법도 사용에 따라 사용됨

 

- @Autowired

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌

이렇게 객체 의존관계를 외부에서 넣어주는 것을 '의존성 주입(DI)'이라고 한다

 

** Bean 등록시 주의 사항

스프링은 스프링 컨테이너에 스프링 빈 등록 시, 기본으로 싱글톤으로 등록

 

dependencies 추가시 필수로 reload 해줘야 적용됨 

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.springframework:spring-jdbc')
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

implementation 추가 후 reload 하지 않으면 적용되지 않음

 

@Condotional 어노테이션이란 ?

컴포넌트의 Bean 등록 여부에 조건을 달 수 있게 해주는 어노테이션

 

스프링은 IOC컨테이너에 객체를 Bean으로 등록하여 사용하는데,

@Component로 선언된 클래스는 모두 Bean으로 등록되는데 여기에 조건부를 달 수 있다

ex. A경우에 등록을 하되, B경우에는 등록하지 않도록 설정 가능

 

Spring에서 추가기능의 설정파일을 읽고 해당되는 POJO에서 bean을 IOC컨테이너에 등록한다

이때 설절파일을 조건부로 읽는다면 필요할 때만 IOC컨테이너에 Bean 등록 가능하다

@Condotional 사용해야하는데 Condition 인터페이스의 구현체를 만들어야 한다

 

ex.

@Conditional(TomcatWebServerConfig.TomcatCondition.class)
public class TomcatWebServerConfig {
    @Bean("tomcatWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    static class TomcatCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return true;
        }
    }
}
@MyAutoConfiguration
@Conditional(JettyWebServerConfig.JettyCondition.class)
public class JettyWebServerConfig {
    // 톰캣과 두 개 이름이 동일할 경우 충동한다고 스프링 컨테이너가 초기화할 때 에러 발생 할 수 있으므로
    // 이름 구분해주기
    @Bean("JettyWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new JettyServletWebServerFactory();
    }

    static public class JettyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return false;
        }
    }
}

@Condition은 엘리먼트를 꼭 하나 등록해줘야하는데

그 엘리먼트 타입은 무조건 condition이라는 인터페이스를 구현한 클래스여야한다.

 

@Condition(xxxCondition.class)는 xxxCondition의 matches 메소드의 return값을 받아 컴포넌트 스캔 여부 판단

Boolean으로 return 해주면 되는데 true면 bean으로 등록 false면 IOC컨테이너에 Bean으로 등록되지 않는다

 

예시를 보면 Tomcat은 true를 반납하고 Jetty는 false를 반납하고 있으므로 Tomcat 서버가 실행된다.

 

 

 

이 외.

@SpringBootApplication : Component Scan 기능을 가지고 있음

@ComponentScan : 하위 디렉토리에 위치한 @Component로 명시된 Bean으로 등록하는 기능

@Configration : 이것 또한 @Component. 하위디렉토리에 설정 클래스를 위치시킨다

 

 

 

 

 

 

 

 

 

 

의존성 확인하는 방법

 

1. Terminal에서 확인

 

Terminal에서 스프링부트 프로젝트가 있는 경로로 이동

아래 명령어를 입력하여 의존  확인

 

./gradlew dependencies

 

 

2. 인텔리제이 IDEA에서 확인

 

인텔리제이 맨 우쯕 코끼리모양 아이콘(Gradle) 클릭하면 확인이 가능합니다.

Terminal 보다는 IDEA가 보기 편해 IDEA로 확인하는걸 추천

+ Recent posts