2020. 11. 20. 18:56ㆍ공부 정리/Back end
1. Framework
복잡한 문제를 해결하거나 서술하는 데 사용되는 기본 개념 구조이다.
간단히 뼈대, 골조(骨組), 프레임워크(framework)라고도 한다.
Framework기반의 개발에서는 프레임워크 자신이 흐름을 제어하는 주체가 되어, 필요할 때마다 애플리케이션 코드를 호출하여 사용한다. 이때, 제어권을 가지는 것이 바로 Container이다. 이렇게 객체에 대한 제어권이 개발자로부터 Container에게 넘어가면서 일반적인 흐름이 바뀌었다고 하여 IoC라고 한다.
예를 들면,
- Servlet을 실행해주는 WAS는 Servlet Container를 가지고 있다.
- WAS는 웹 브라우저로부터 Servlet URL에 해당하는 요청을 받으면, Servlet을 메모리에 올린 후 실행한다.
- 개발자가 Servlet 클래스를 작성했지만, 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet Container이다.
- Servlet Container는 동일한 Servlet에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 Servlet을 실행하여 그 결과를 웹 브라우저에게 전달한다.
2. Container
컨테이너는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공한다.
bean factory나 application context를 가리킨다. 간단하게 컨테이너에 객체를 담아두고 필요할 때에 컨테이너로부터 객체를 가져와 사용할 수 있게 한다.
3. IoC(Inversion of Control)
컨테이너가 코드 대신 오브젝트의 제어권을 갖고 대신 실행해주는 것
예시 3번에서 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전이라고 한다.
a. DL(Dependency Lookup)
DL은 의존성 검색이라는 뜻을 가지고 있다.
저장소에 저장되어 있는 빈(Bean)에 접근하기 위하여,
개발자들이 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 빈(Bean)을 Lookup하는 것을 말한다.
b. DI(Dependency Injection)
DI는 의존성 주입이란 뜻을 가지고 있다.
클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다.
이런 DI에는 세가지세 가지 유형이 있다. (마틴 파울러의 저서 Inversion of Control Containers and the Dependency Injection pattern에 제시한 세 가지 DI패턴)
- 생성자를 이용한 의존성 삽입 (Constructor Injection)
- setter() 메소드를 이용한 의존성 삽입 (Setter Injection)
- 초기화 인터페이스를 이용한 의존성 삽입 (Interfate Injection)
- 필드 주입 (Field Injection)
1) 생성자를 이용한 의존성 삽입 (Constructor Injection)
필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입한다.
//class MovieLister...
public MovieLister(MovieFinder finder) {
this.finder = finder;
}
//class ColonMovieFinder...
public ColonMovieFinder(String filename) {
this.filename = filename;
}
private MutablePicoContainer configureContainer() {
MutablePicoContainer pico = new DefaultPicoContainer();
Parameter[] finderParams = {new ConstantParameter("movies1.txt")};
pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams);
pico.registerComponentImplementation(MovieLister.class);
return pico;
}
생성자에 파라미터를 만들어주고 이를 통해 DI Container가 의존할 오브젝트 래퍼런스를 넘겨주는 방식
2) setter() 메소드를 이용한 의존성 삽입 (Setter Injection)
의존성을 입력받는 setter 메소드를 만들고 이를 통해 의존성을 주입한다.
class MovieLister...
private MovieFinder finder;
public void setFinder(MovieFinder finder) {
this.finder = finder;
}
class ColonMovieFinder...
public void setFilename(String filename) {
this.filename = filename;
}
<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>
public void testWithSpring() throws Exception {
ApplicationContext ctx = new FileSystemXmlApplicationContext("spring.xml");
MovieLister lister = (MovieLister) ctx.getBean("MovieLister");
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West", movies[0].getTitle());
}
외부에서 오브젝트 내부의 attribute 값을 변경하려는 용도로 주로 사용된다. 파라미터로 전달된 값을 내부의 인스턴스 변수에 저장하는 것이다.
3) 초기화 인터페이스를 이용한 의존성 삽입 (Interfate Injection)
의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입하는데 Spring에선 지원하지 않는 방식이다.
4) 필드 주입 (Feild Injection)
@Autowired 어노테이션만 선언하면 사용하기 가장 쉬운 의존성을 주입하지만 권장하는 방식은 아니다.
@Component
public class Juice {
@Autowired
private Orange orange;
}
a. 용어 정리
- bean: 스프링에서 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
- bean factory: 스프링의 IoC를 담당하는 핵심 컨테이너
빈을 등록, 생성, 조회, 반환, 관리한다. - application context: bean factory를 확장한 IoC Container
빈의 등록, 생성, 조회, 반환, 관리의 기능은 bean factory와 같지만, Spring의 각종 부가 서비스를 추가로 제공한다.
출처 & 참고
- https://www.boostcourse.org/web316/lecture/20656/?isDesc=false
- https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC
- https://isstory83.tistory.com/91
- https://www.nextree.co.kr/p11247/
- https://martinfowler.com/articles/injection.html
- https://velog.io/@dahye4321/Constructor-%EC%A3%BC%EC%9E%85%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90
'공부 정리 > Back end' 카테고리의 다른 글
| VO, DTO, DAO (0) | 2021.02.27 |
|---|---|
| MVC (0) | 2020.12.07 |
| REST API -Web API (0) | 2020.11.12 |
| Maven (0) | 2020.11.11 |
| servlet, WAS (0) | 2020.11.06 |