스프링 빈은 스프링 컨테이너에 의해 관리되는 자바 객체로 빈 등록은 설정 xml, 어노테이션, 설정 클래스를 이용해 등록할 수 있다. 등록된 스프링 빈은 오토와이어링을 통해 공급된다.(DI)
스프링 부트의 경우 어노테이션을 통한 빈 등록을 기본으로 한다. @Component, @Service, @Controller, @Repository, @Bean 등으로 필요한 Bean을 등록하고, 필요한 위치에서 @Autowired를 통해 주입받아 사용하는 것이 일반적이다.

@Controller, @Service, @Repository는 @Component를 상속 받으며 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
- @Bean : 개발자가 컨트롤할 수 없는 외부 라이브러리를 Bean으로 등록할 때 사용한다(설정 클래스에서 사용).
- @Component : 개발자가 직접 만든 클래스를 Bean으로 등록할 때 사용한다(선언된 Class를 Bean으로 등록).
- @Controller, @Service, @Repository : @Component와 기본적으로 동일하며 역할에 따라 다른 이름을 사용한 것이다.
빈 등록
|
1
2
3
|
public interface Weapon {
void fire();
}
|
cs |
게임에서 사용될 Weapon 인터페이스 정의.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Component
public class ShotGun implements Weapon {
private String model = "Basic ShotGun";
public String getModel() {
return model;
}
public void setModel(String model){
this.model = model;
}
@Override
public void fire() {
System.out.println(model+" fire!!");
}
}
|
cs |
Weapon 인터페이스를 구현하는 ShotGun 클래스를 스프링 빈으로 등록하기 위해 @Component 어노테이션을 사용한다.
|
1
2
3
4
5
6
7
8
9
|
@Configuration
public class BasicConfiguration {
@Bean
public Weapon superShotGun() {
ShotGun sg = new ShotGun();
sg.setModel("Super ShotGun");
return sg;
}
}
|
cs |
설정 클래스를 사용하는 경우 별도의 클래스를 만들고 @Configuratiion으로 설정 클래스임을 알린다.
@Bean 어노테이션을 Weapon 객체를 등록하는 메서드에 붙여주면 해당 메서드의 리턴이 빈으로 등록된다.
오토와이어링
빈이 등록되었다면 컨트롤러, DAO 등의 구현 클래스에서 해당 객체가 필요할 때 @Autowired 어노테이션을 통해 객체를 참조할 수 있다. 필드 주입, 생성자 주입, setter 주입 3가지 방식이 존재한다.
|
1
2
3
4
5
6
7
8
|
class Game{
@Autowired
private Weapon w;
public gameRun() {
w.fire();
}
}
|
cs |
필드 주입
간편하게 클래스의 필드에 주입하는 방식이다. 편리하긴 하지만 순환 의존성 문제가 발생할 수 있으며, final로 지정할 수 없어 불변 객체를 만들 수 없다는 문제점이 있다. 또 무분별한 사용으로 인해 의존관계가 잘 보이지 않고 복잡해질 수 있어 주의해서 사용해야 한다.
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class Game{
private final Weapon w;
@Autowired
public Game(Weapon w){
this.w = w;
}
public gameRun() {
w.fire();
}
}
|
cs |
생성자 주입
생성자 주입은 객체가 생성될 때 호출되는 생성자에 참조할 클래스를 인자로 받아 필드에 매핑하는 방식이다.
생성자가 하나인 경우 @Autowired를 사용하지 않아도 된다. 다만 생성자에 참조할 객체가 늘어나게 되면 코드 개선(리팩토링)을 고려할 수 있다.
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class Game{
private final Weapon w;
@Autowired
public setWeapon(Weapon w){
this.w = w;
}
public gameRun() {
w.fire();
}
}
|
cs |
Setter 주입
Setter 주입은 setter 메서드를 통해 빈을 주입하는 방식이기 때문에 메서드 이름은 set 타입 이름 규칙을 따르는 것이 좋다.
생성자에 과도하게 의존성 주입이 되는 것을 보완하기 위해 사용하거나 의존성이 선택적인 경우에 권장되며 필드 주입과 마찬가지로 final을 사용할 수 없다.
'Spring' 카테고리의 다른 글
| [Error] - the annotation @value is disallowed for this location. the attribute value is undefined for the annotation. (0) | 2024.04.01 |
|---|---|
| [Error] - java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for (0) | 2024.03.29 |
| [Spring] - 직렬화를 하는 이유(implements Serializable) (0) | 2024.03.13 |
| [Spring] DI(Dependency Injection) (0) | 2024.02.21 |
| [Spring] 스프링 프레임워크 (0) | 2024.02.21 |