본문 바로가기

Spring

Bean 과 DI

Bean


Bean은 스프링 IOC 컨테이너가 관리하는 객체다.

 

빈을 등록하는 방법에는 2가지가 있다.

1. Component Scanning

2. XML 이나 자바 설정 파일에 직접 등록

 

Component Scanning

@SpringBootApplication안에는 @SpringBootConfiguration, @ComponetScan, @EnableAutoConfiguration이 있다.

여기서 @ComponetScan은 대부분 모든 클래스들과 모든 패키지에 @Component가 붙어있는 클래스들을 찾아서 Bean으로 등록을 해준다.

@Component

  • @Repository
  • @Service
  • @Controller

주의할 점은 해당 최상위 패키지부터 스캔을 하기 때문에 다른 패키지를 스캔을 안한다.

 

직접 등록

@Bean
public String kimjye(){
	return "kimjye";
} 

@Bean을 붙인 Method를 정의한다. Method의 이름이 Bean의 이름이 된다.

단, @Bean은 @Configuration을 가지고있는 클래스안에서만 정의할 수 있다.

 

등록한 Bean을 어떻게 꺼내서 사용할까?

ApplicationContext에서 직접 꺼내서 쓰거나 @Autowired 또는 @Inject.

 

* Repository는 애노테이션이 없는데도 빈으로 등록되는 이유가 멀까?

Application Context에는 라이프사이클이라는 인터페이스가 있다. 이 인터페이스는 Application Context 작업 중간에 끼어들어서 다른 작업을 할 수 있다. 

Spring Data JPA에서는 이 라이프 사이클을 이용하여 Spring Data JPA 타입의 클래스들을 빈으로 만들어주어서 Application Context에 빈으로 등록한다.

 

DI


DI는 Depedency Injection의 약자이다.

의존성 주입 방식은 크게 3가지다. 

  • 생성자
  • 필드
  • setter

생성자

@Autowired를 사용하지 않고도 어떤 빈에 생성자가 하나만 있고 그 생성자의 파라비터로 받는 빈이 존재할 때, 파라미터로 받는 빈을 주입해준다.

어떤 클래스에 반드시 필요한 객체라면 생성자를 통한 의존성 주입하는 것이 좋다.

// 생성자 주입 방식
Class OwnerController {
	private OwnerRepository ownerRepository;

	public OwnerController(OwnerRepository ownerRepository) {
		this.ownerRepository = ownerRepository;
	}
}

 

필드

Class OwnerController {
	@Autowired
	private OwnerRepository ownerRepository;
}

클래스가 Setter를 가지고 있다면 Setter에 붙이고 Setter가 없다면 필드에 @Autowired를 붙이는 것이 좋다.

 

 

'Spring' 카테고리의 다른 글

Spring Boot  (0) 2020.01.14
AOP 와 PSA  (0) 2020.01.14
IOC  (0) 2020.01.14
@Setter  (0) 2019.04.18
토비의 스프링3.1 - 템플릿 메소드 패턴, 팩토리 메소드 패턴  (0) 2019.03.03