Bean
- 스프링 IoC (Inversion of Control) 컨테이너에 의해 관리되는 객체
- 특징
- 싱글톤
- 애플리케이션 내에서 하나의 인스턴스만 생성되어 사용
- 필요에 따라 프로토타입 스코프 등을 사용하여 여러 인스턴스를 생성 가능
- 의존성 주입
- 스프링 빈 간의 의존성은 컨테이너가 자동으로 주입
- 라이프 사이클 관리
- 스프링 컨테이너가 빈의 생성, 초기화, 소멸 등 라이프 사이클 관리
Bean Scope
- 스프링 빈이 생성될 때 생성되는 인스턴스의 범위를 의미
Bean Scope | Description |
---|
Singleton | 하나의 인스턴스만을 생성하고, 모든 빈이 해당 인스턴스를 공유하여 사용한다. |
Prototype | 매번 새로운 인스턴스를 생성한다. |
Request | HTTP 요청을 처리할 때마다 새로운 인스턴스를 생성하고, 요청 처리가 끝나면 인스턴스를 폐기한다. 웹 애플리케이션 컨텍스트에만 해당된다. |
Session | HTTP 세션 당 하나의 인스턴스를 생성하고, 세션이 종료되면 인스턴스를 폐기한다. 웹 애플리케이션 컨텍스트에만 해당된다. |
빈 정의 방법
- XML 설정
- 스프링 설정 파일(applicationContext.xml)에 빈을 정의
- 자바 설정 클래스
- @Configuration과 @Bean 어노테이션을 사용하여 자바 클래스에서 빈을 정의
- 컴포넌트 스캔과 어노테이션
- @Component, @Service, @Repository, @Controller 어노테이션을 사용하여 클래스에서 직접 빈을 정의하고, @Autowired 등을 사용하여 의존성을 주입받음
빈의 라이프 사이클
- 빈 생성: 컨테이너가 빈의 인스턴스를 생성합니다.
- 의존성 주입: 필요한 의존성을 주입받습니다.
- 초기화 메서드 호출: 초기화 작업을 위해 정의된 메서드를 호출합니다.
- 빈 사용: 애플리케이션에서 빈을 사용합니다.
- 소멸 전 메서드 호출: 컨테이너 종료 시 소멸 작업을 위해 정의된 메서드를 호출합니다.
- 빈 소멸: 빈의 인스턴스를 제거합니다.
- 빈 라이프사이클 메서드는 @PostConstruct와 @PreDestroy 어노테이션을 사용하거나, XML 및 자바 설정에서 명시 가능
@Component
public class MyBean {
@PostConstruct
public void init() {
}
@PreDestroy
public void destroy() {
}
}
AOP(Aspect Oriented Programming)
- 관점 지향 프로그래밍
- 중복되는 공통 코드를 분리하고 코드 실행 전이나 후의 시점에 해당 코드를 삽입
- 소스 코드의 중복 감소
- 필요할 때마다 가져다 쓸 수 있게 객체화 -> 유지보수 용이
-> 부가 기능을 따로 관리하는 것
- 핵심적인 비즈니스 로직으로부터 횡단 관심사를 분리하는 것에 목적
횡단 관심사(Cross-Cutting Concern)
애플리케이션의 여러 부분에서 공통적으로 사용되는 기능이나 관심사
ex) 로깅, 트랜잭션 관리, 보안 등
- 장점
- 모듈화 : 횡단관심사를 별도의 모듈로 분리해 코드 중복 줄이고 유지보수 쉬워짐
- 유연성 : 특정 기능을 여러 객체에 쉽게 적용 가능
- 가독성
- 재사용성
핵심 용어
용어 | 설명 |
---|
Aspect | 공통 기능을 모듈화한 단위로, 여러 애플리케이션 객체에 적용될 수 있는 부가 기능을 정의 |
Advice | 특정 조인포인트에서 수행되는 작업 |
Join point | Advice가 적용될 수 있는 위치를 말한다. |
Pointcut | Join point 중에서 Advice가 적용될 가능성이 있는 부분을 선별한 것을 말한다. |
Weaving | Advice를 핵심 비즈니스 로직에 적용하는 것을 말한다. -> Aspect를 실제 객체에 적용하는 과정 |
어드바이스 유형
종류 | 설명 |
---|
Before | 대상 메소드가 실행되기 이전에 실행되는 어드바이스 |
After-returning | 대상 메소드가 정상적으로 실행된 이후에 실행되는 어드바이스 |
After-throwing | 예외가 발생했을 때 실행되는 어드바이스 |
After | 대상 메소드가 실행된 이후에(정상, 예외 관계없이) 실행되는 어드바이스 |
Around | 대상 메소드 실행 전/후에 적용되는 어드바이스 |
AOP 동작 방식
- 프록시 패턴을 사용하여 AOP를 구현
- 기본적으로 런타임에 프록시 객체를 생성하여 Aspect를 적용
- 클라이언트 호출: 클라이언트가 메서드를 호출.
- 프록시 객체 호출: 실제 객체가 아닌 프록시 객체를 통해 메서드가 호출됨.
- 어드바이스 적용: 프록시 객체는 해당 메서드 호출 전, 후, 또는 예외 시 어드바이스를 적용.
- 실제 메서드 호출: 어드바이스 적용 후 실제 메서드를 호출.
- 결과 반환: 실제 메서드 호출 결과를 클라이언트에게 반환.
프록시(Proxy)
- 기존의 객체를 감싸서 그 객체의 기능을 확장하거나 변경할 수 있게 해줌
- 다른 객체에 대한 접근을 제어하거나 추가 기능을 제공하는 중간 객체
- 특징
- 접근 제어 : 원래 객체에 대한 접근 제어 가능
- 지연 초기화
리플렉션(Reflection)
- 자바의 런타임에 클래스, 메서드, 필드 등을 동적으로 조작할 수 있는 기능을 제공
- 런타임에 객체의 메서드를 호출하거나 필드 값을 변경하는 등의 작업 가능
- 특징
동작 원리
-
Class 로딩: JVM은 클래스가 필요할 때 해당 클래스를 로딩하고, 클래스의 정보를 메모리에 올립니다. 이 때, Class 객체가 생성됩니다.
-
Class 객체 획득: 로딩된 클래스의 메타데이터에 접근하기 위해 Class 객체를 얻습니다. 이 객체는 클래스의 필드, 메서드, 생성자 등의 정보를 제공합니다.
-
메타데이터 접근: Class 객체를 사용하여 필드, 메서드, 생성자 등의 세부 정보에 접근할 수 있습니다. 이 정보를 통해 프로그램은 실행 중에 클래스의 구조를 분석하고, 필요한 메서드를 호출하거나 필드를 수정할 수 있습니다.