[Spring] 스프링 컨테이너(Spring Container)

·2022년 10월 17일
0

Spring

목록 보기
9/24
post-thumbnail

📝 스프링 컨테이너와 빈 에 추가적으로 학습한 내용

스프링 컨테이너

: 빈(bean)들의 생명주기(생성, 관리, 소멸)를 관리하는 것

  • IoC 컨테이너, DI 컨테이너, 외의 컨테이너들은 넓은 개념에서 다 같은 것을 의미한다.
  • 스프링 컨테이너를 통해 빈을 관리하기 위해 IoC(역제어)개념, DI를 사용한다.

ApplicationContext

💡IoC 컨테이너인 BeanFactory의 하위 인터페이스이며, 빈의 생명주기를 관리하는 기본적인 기능만 가진 BeanFactory에 추가적인 부가 기능을 가지고 있어 주로 사용되고 있는 스프링 컨테이너이다.

BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다.

  • ApplicationContext는 인터페이스이기 때문에 별도의 구현체가 필요하다.
    • AnnotationConfigApplicationContext - XML 방식
    • 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 등록한다.
    • new AnnotationConfigApplicationContext(구성정보.class)
  • DI를 위한 객체를 생성하고 의존성을 주입하는 역할을 한다.

💡 현재 ApplicationContext 구현하여 사용하는 XML방식 보다는 애너테이션 기반 설정을 주로 사용한다.

애너테이션 기반 설정(스프링에게 정보를 전달) : @Configuration, @Bean

빈(Bean)

Java Bean VS Spring Bean

: 두 가지는 엄연히 다른 의미를 가진다.

Java Bean

  • 단순하게 클래스에 메서드를 getter/setter만 가지고 있는 클래스를 칭한다.

Spring Bean

  • 스프링 컨테이너 관리 하에 있는 객체로 애플리케이션에서 사용된다.
  • 설정 정보와 함께 스프링 컨테이너에 등록된 객체

빈 디피니션(Bean Definition)

  • 빈 설정 메타정보 인터페이스
  • 스프링 컨테이너는 추상화 된 빈 디피니션을 바탕으로 메타정보를 설정한다.
    • Scope도 여기서 설정한다.
  • @Configuration 어노테이션을 통해 스프링 설정 클래스를 정의하고 빈들의 정보, 의존성 관계를 스프링에 등록한다.

@빈과 @컴포넌트(👊중요)

둘은 사용되는 레벨이 다르다.

@Bean

  • 생성자(메서드)에 단다.
  • 개발자가 관여할 수 없는 외부 라이브러리를 빈으로 등록하고 싶은 경우 사용

@Component

  • 개발자가 직접 관여할 수 있는 클래스인 경우
  • 외부 라이브러리는 개발자가 사용권한이 없기 때문에@Component를 사용할 수 없다.

스프링 컨테이너 설정

Java기반 컨테이너 설정

: 실행 파일과 같은 위치에 설정 파일(config.class)을 만드는 방법

@Configuration와 @Bean

  • @Configuration : 스프링 설정 클래스 정의 어노테이션
  • @Bean : 스프링에 해당 메서드를 등록한다.

Component Scan과 자동 의존 관계 설정

: 설정 정보 없이 자동으로 스프링 빈을 등록하는 방법

@ComponentScan

  • @ComponentScan 자동으로 스프링 빈에 등록해준다.
    • @Component 어노테이션이 포함되어 있지 않으면 스캔되지 않는다.

@Component

  • @Component는 다음 어노테이션을 포함한다.
    • @Controller
    • @Service
    • @Repository
    • @Configuration

💡 스프링 컨테이너는 실제로 동작할 때 의존되어야 하는 작은 객체부터 의존하는 큰 객체 순으로 생성한다. 그렇기 때문에 @Component를 전반적으로 사용하는 것 보다 스프링이 바로 인지할 수 있도록 @Controller, @Service, @Repository를 사용하는 것을 권장한다.

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글