Bean Lifecycle
스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다.
// 컨테이너 초기화
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class) =
new AnnotationConfigApplicationContext(Appcontext.class);
// 컨테이너에서 빈 객체를 구해서 사용
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("스프링");
System.out.println(msg);
// 컨테이너 종료
ctx.close();
위 코드를 보면 AnnotationConfigApplicationContext의 생성자를 이용해서 컨텍스트 객체를 생성하는데 이 시점에 스프링 컨테이너를 초끼화한다. 스프링 컨테이너는 설정 클래스에서 정보를 읽어와 알맞은 빈 객체를 생성하고 각 빈을 연결하는 작업을 수행한다.
컨테이너를 사용 getBean()과 같은 메서드를 이용해서 컨테이너에 보관된 빈 객체를 구한다는 것을 뜻한다.
컨테이너를 종료할 때 사용하는 메서드가 close() 메서드이다. close() 메서드는 AbstractApplicationContext 클래스에 설정되어 있다.
스프링 빈 객체의 라이프사이클
스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다. 컨테이너가 관리하는 빈 객체의 라이프사이클은 다음과 같다.
객체 생성 -> 의존 설정 -> 초기화 -> 소멸
AOP
AOP는 Aspect Oriented Programming의 약자이다. DB와 데이터를 교환하는 Transaction에서 내부적으로 AOP를 이용한다. 또한 보안 설정에도 AOP가 사용된다.
핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체를 proxy라고 한다. 프록시의 특징은 핵심 기능은 구현하지 않는다는 점이다. 프록시는 핵심 기능을 구현하지 않는 대신 여러 객체에 공통으로 적용할 수 있는 기능을 구현한다. 이렇게 공통 기능 구현과 핵심 기능 구현을 분리하는 것이 AOP의 핵심이다.
AOP는 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법이다. AOP는 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있게 만들어 준다.
AOP의 기본 개념은 핵심 기능에 공통 기능을 삽입하는 것이다. 즉 핵심 기능의 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이 AOP이다.
핵심 기능에 공통 기능을 삽입하는 방식은 주로 런타임에 프록시 객체를 생성해서 공통 기능을 삽입하는 방법이다.(Spring)
용어 | 의미 |
Advice | 언제 공통 기능을 핵심 로직에 적용할 지를 정의하고 있다. |
Joinpoint | Advice를 적용 가능한 시점을 의미한다. Spring은 method호출에 대한 Joinpoint만 지원한다. |
Pointcut | 실제 Advice가 적용되는 Joinppoint를 나타낸다. |
Weaving | Advice를 핵심 로직 코드에 적용하는 것을 의미한다. |
Aspect | 여러 객체에 공통으 적용되는 기능이다. 트랜잭션이나 보안을 예로 들 수 있다. |
'Backend > spring' 카테고리의 다른 글
멀티쓰레드, HTTP API/CSR/SSR (0) | 2022.02.17 |
---|---|
WEB/WAS, Servlet (0) | 2022.02.17 |
의존 자동 주입과 컴포넌트 스캔 (0) | 2022.01.08 |
Spring DI (0) | 2022.01.08 |
Spring ApplicationContext, IoC, Singleton (0) | 2022.01.08 |