[Spring] Spring 기본

in_ho_·2023년 10월 31일
0

Spring

목록 보기
3/4
post-thumbnail

1. 의존성 주입, DI

  • 스프링 트라이앵글 중 가장 핵심적인 개념은 의존성 주입입니다. 의존성 주입은 객체 간 결합을 낮추는 유용한 방법입니다.
  • 스프링 프레임워크는 스프링 빈을 선언하고, 스프링 빈 컨테이너를 사용하여 빈들 사이에 의존성을 주입합니다.

2. 빈, Bean

  • 애플리케이션에서 공통으로 사용할 경우 정의

  • 스프링 빈은 스프린 빈 컨테이너가 관리하는 순수 자바 객체를 의미합니다.

    스프링 빈 컨테이너는 스프링 빈 정의를 읽고, 스프링 빈 객체를 생성한 후, 서로 의존성이 있는 스프링 빈 객체들을 주입한 후 애플리케이션 실행 준비 상태가 됩니다.

    애플리케이션이 종료되기 전 스프링 빈 컨테이너는 관리하고 있던 스프링 빈들을 종료합니다.

    1. 스프링 빈 컨테이너 구현체에 따라 정해진 포맷의 설정 파일을 로딩합니다.

      설정 파일 포맷은 자바 클래스, XML, 그루비 등 종류가 다양합니다.
      스프링 부트의 기본 스프링 빈 컨테이너 구현체는 ConfigurableApplicationContext이며 설정 포맷은 자바 클래스입니다.

    2. 설정 파일에 정의된 스프링 빈 정의를 로드하고, 지정된 클래스패스에 위치한 클래스들을 스캔하고, 스프링 빈 정의가 있으면 로딩한다.
    3. 로딩을 마친 스프링 빈 컨테이너는 정의된 대로 스프링 빈을 생성하고 컨테이너에서 관리한다.
    4. 스프링 빈들 사이에 서로 의존성이 있는 객체들은 스프링 빈 컨테이너가 조립한다.
    5. 스프링 빈 컨테이너 구현 클래스에 따라 추가 작업을 한다.
    6. 작업이 완료되면 애플리케이션은 실행 준비를 완료한다.
  • 스프링 빈을 관리하는 스프링 빈 컨테이너는 스프링 애플리케이션을 실행하면 가장 먼저 실행됩니다.

  • 스프링 빈 객체들은 생성한 주체와 정의 방법에 따라 크게 세 가지로 분류할 수 있습니다.

    1. 스프링 프레임워크의 기능을 스프링 빈으로 정의한 것
      • Environment, ApplicationContext 등
    2. 스프링 빈 컨테이너가 로딩하는 설정 파일에 정의된 것
      • @Bean
    3. 클래스패스에 있는 스테레오 타입 어노테이션
      • @Component

2-1. Spring Boot에 Bean을 정의하는 방법

  1. 자바 설정 클래스에서 @Bean 어노테이션을 사용해 정의
  2. 스트레오 타입 어노테이션을 사용하여 정의
  3. BeanDefinition 인터페이스를 구현하여 정의
  4. XML 설정 방식을 사용하여 정의

2-2. @Configuration

  • 자바 설정 클래스
@Configuration
public class ThreadPollConfig {
	@Bean
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    
    }
}

2-3. @ComponentScan

  • 설정된 패키지 경로에 포함된 자바 설정 클래스들과 스테레오 타입 어노테이션을 스캔한다.

    스테레오 타입 어노테이션
    1. @Repository
    2. @Component
    3. @Controller
    4. @Service
    5. @RestController

@Configuration
@ComponentScan(
	basePackages = {
    	"com.springboot.config",
        "com.springboot.domain"
    },
    basePackageClasses = {
    	ThreadPoolConfig.class,
        ServerConfig.class
    }
)
  • basePackages을 설정한 패키지 하위의 클래스들을 모두 스캔합니다.
  • basePacakgeClasses로 특정 클래스를 스캔할 수 있습니다.
  • @SpringBootApplication이 선언된 클래스의 상위 패키지나 다른 경로의 클래스는 @ComponentScan의 대상이 되지 않습니다.

2-3. @Import

  • @Import는 명시된 여러 개의 자바 설정 클래스를 하나의 그룹으로 묶는 역할을 합니다.
  • @Import 어노테아션이 정이된 자바 설정 클래스가 다른 자바 설정 클래스들을 임포트하는 개념입니다.
@Configuration
@Import(value = {ThreadPoolConfig.class, MailConfig.class}
public class ServerConfig {
	...
}
  • value에 입력받는 값은 @Configuration이 선언된 자바 설정 클래스입니다.

    @ComponentScan과 동일한 기능입니다.

2-4. 스테레오 타입 빈

0개의 댓글