1. Inversion of Control
제어의 주체가 사용자에서 Framework로 바뀌는 것이다.
스프링에서는 빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트를 '빈 팩토리'
(Spring에 의하여 생성되고 관리되는 자바 객체를 Bean)
이를 좀 더 확장한 개념을 '애플리케이션 컨텍스트'라고 부른다.
빈팩토리 : 빈을 생성하고 관계를 설정하는 IoC의 기본 기능
애플리케이션 컨텍스트 : 애플리케이션 전반에 걸쳐 모든 제어 작업을 담당하는 IoC 엔진
아래 방법들을 이용해 IoC를 구현한다.
Service Locator Pattern
Dependency Injection
contextualized lookup
template method design pattern
strategy design pattern
2. Dependency Injection
Inversion of Control을 구현하기 위한 방법 중 하나.
필요한 Object를 스스로 생성하는 것이 아니라 주입받아 다른 Object와의 관계가 동적으로 맺어진다.
- Constructor Injection, Setter Injection, Interface Injection, Parameter injection, Method Injection
Dependency는 방향성이 있다.
예를 들어 A가 B에 의존하고 있을 떄는 A -> B 라고 할 수 있다.
이 때, A가 B의 Interface에 의존하고 있다면 이를 느슨한 Dependency가 있다고 한다.
이 관계에서는 A가 실제 어떠한 클래스에 의존하는지는 알 수 없지만 인터페이스를 통해 의존관계를 제한하였기에 그만큼 영향을 덜 받고, 의존관계에서 자유로워진다.
Dependency Injection은 구체적인 의존 오브젝트와 그것을 사용할 주체를 런타임 시에 연결해주는 작업이다.
주로 사용하는 @Autowired는 @Component가 붙은 Bean들을 byType Injection으로 주입시켜준다.
하지만 이 때 인젝션 가능한 클래스의 형이 2개 이상일 경우에는 오류가 발생한다,
이 경우 아래와 같이 @Qualifier를 이용하여 byName Injection을 이용하도록 한다.
@Component("age")
public class MyServiceImpl implements MyService {
public int findAge(int age) {
System.out.println("My Age : "+age);
return age;
}
}
public class OnmyojiVoteController {
@Autowired
@Qualifier("age")
private MyService myService;
myService.findAge(20);
}
참고) Component는 아래와 같이 3가지로 구분된다.
참고) @Autowired, @Resource, @Inject의 차이
1. 객체를 찾는 순서가 다르다.
@Autowired: type -> qualifier -> name
@Inject: type -> qualifier -> name
@Resource: name -> type -> qualifier
2. Autowired와 Inject의 차이는 Spring에서 지원하냐(Autowried) Java에서 지원하냐(Inject)이다.
'Backend & Spring (스프링)' 카테고리의 다른 글
Spring Data JPA와 Hibernate. 그리고 Persistence (0) | 2022.11.04 |
---|---|
Spring Framework (0) | 2022.10.14 |
Spring Boot이란? (0) | 2022.10.14 |
Spring 이란? (0) | 2022.10.14 |
API 게이트웨이와 Spring Cloud Zuul Filter (0) | 2022.10.13 |