* 스프링 ( DI, IOC, AOP ) *
* DI (Dependency Injection) 의존성 주입 결합도 감소
- 객체 지향 프로그래밍에서 소프트웨어 컴포넌트 간의 의존관계를 느슨하게 만들기 위한 디자인 패턴.
- 객체 간의 의존 관계를 코드 내에서 정의하는 것이 아니라 외부에서 주입하는 방식.
=> 코드를 유연성, 재사용성을 높여 유지보수성을 향상, 테스트 용이성 향상.
* IoC (Inversion of Control) 제어의 역전
- 프레임워크가 프로그램의 제어 흐름을 가짐.
- 스프링에서는 개발자 대신 스프링 IoC 컨테이너가 이러한 객체들의 생성/생명주기를 관리.
빈(Bean) 라이프사이클
* 빈(Bean) : 스프링 컨테이너에 의해 생성/관리되는 객체. (싱글톤 패턴)
@Component, @Service, @Repository, @Controller, @RestController 등의 어노테이션을 사용해 Bean 으로 등록.
* AOP (Aspect-Oriented Programming)
- 핵심 로직과 부가 로직을 분리하여 독립적으로 관리하고 유지보수하는 프로그래밍 방식.
코드에서 공통적으로 발생하는 부분
- 공통기능을 모듈화하여 중복성을 줄이고 재사용성을 높임.
* Spring Bean의 생명주기
스프링 컨테이너 생성 => 스프링 빈 생성 => 의존 관계 주입(DI) => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료
> 어플리케이션 실행 시, 스프링 컨테이너 생성 ( ApplicationContext )
> Bean 정의를 기반으로 Bean의 인스턴스 생성 (클래스의 생성자 호출, 객체를 메모리에 할당)
> 인스턴스화된 Bean에 대해 의존관계 주입(DI). 설정으로 명시된 의존 객체들이 Bean에 연결되는 과정.
(XML, 어노테이션, Java 설정)
> Bean 초기화 (Bean인스턴스 생성 & 의존성 주입 완료 후 컨테이너가 초기화 콜백 호출.)
* 각각의 단계에서 해당 인터페이스를 구현한 Bean이 있다면, 해당 메소드를 컨테이너가 자동으로 호출 *
- 초기화 전 (Pre-initialization)
' BeanPostProcessor ' 인터페이스의 'postProcessBeforeInitialization' 메소드 호출.
- 초기화 (Initialization) _ 순서대로 실행
@PostConstruct 어노테이션을 사용한 메소드 호출.
' InitializingBean ' 인터페이스의 ' afterPropertiesSet ' 메소드 호출.
XML 설정의 ' init-method ' 속성 / @Bean 어노테이션의 ' initMethod ' 속성에 지정된 메소드.
- 초기화 후 (Post-initialization)
' BeanPostProcessor ' 인터페이스의 ' postProcessAfterInitialization ' 메소드 호출.
> 사용준비가 완료된 Bean은 어플리케이션에서 필요한 작업들을 수행.
> 소멸전 콜백
- 소멸 전 ( Pre-destroy )
@PreDestroy 어노테이션을 사용한 메소드 호출.
' DisposableBean ' 인터페이스의 ' destroy-method ' 메소드 호출.
XML 설정의 ' destroy-method ' 속성 / @Bean 어노테이션의 ' destroyMethod ' 속성에 지정된 메소드.
> 소멸 (스프링 컨테이너 종료) _ 모든 싱글톤 Bean 인스턴스가 메모리에서 소멸.
*참고블로그*
[Spring] @PostConstruct와 @PreDestory 스프링 빈 생명주기 관리
Spring Bean의 생명 주기 Spring Bean은 다음과 같은 생명 주기를 갖습니다. 스프링 컨테이너 생성 => 스프링 빈 생성 => 의존 관계 주입(DI) => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료 위 생명
hstory0208.tistory.com
@PostConstruct
빈(bean)의 초기화 작업을 수행하기 위해 사용. (초기화 콜백)
이 어노테이션이 붙은 메소드는 Spring컨테이너에 의해 빈의 생성자 호출/의존성 주입 완료된 후에 자동으로 한 번 호출.
import javax.annotation.PostConstruct;
@Component
public class MyBean {
@Autowired
private AnotherBean anotherBean;
@PostConstruct
public void init() {
// 초기화 로직
System.out.println("MyBean이 생성되고, 의존성이 주입된 후에 실행됩니다.");
// 예를 들어, anotherBean을 사용하여 초기화 작업을 수행할 수 있습니다.
}
}
순서 : 생성자 호출 => 의존성 주입 (@Autowired / @RequiredArgsConstructor ) => init 메소드(@PostConstruct) 실행.
예) 데이터베이스 연결 / 외부 API 와의 연동 로직에 사용.
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class DatabaseInitializer {
// 데이터베이스 연결 정보 주입 예시
private String databaseUrl = "jdbc:exampleDatabaseUrl";
private String username = "exampleUser";
private String password = "examplePassword";
@PostConstruct
public void initializeDatabase() {
// 초기화 로직
System.out.println("데이터베이스 연결을 초기화합니다.");
connectToDatabase(databaseUrl, username, password);
System.out.println("데이터베이스 연결이 성공적으로 초기화되었습니다.");
}
// 실제 데이터베이스 연결 메소드
private void connectToDatabase(String url, String user, String pass) {
System.out.println("URL=" + url + ", User=" + user);
// 데이터베이스 연결 로직
.......
.......
}
}
https://dev-coco.tistory.com/170
[Spring] 빈 생명주기(Bean LifeCycle) 콜백 알아보기
스프링의 IoC 컨테이너는 Bean 객체들을 책임지고 의존성을 관리한다. 객체들을 관리한다는 것은 객체의 생성부터 소멸까지의 생명주기(LifeCycle) 관리를 개발자가 아닌 컨테이너가 대신 해준다는
dev-coco.tistory.com
'Spring > 공부공부' 카테고리의 다른 글
[Spring] Quartz 스케줄러 (0) | 2024.11.26 |
---|---|
[Spring] @Async 비동기 처리 ( SimpleAsyncTaskExecutor ) (0) | 2024.10.24 |
[Spring] 뷰 리졸버(View Resolver) 설정 (https 오류) (0) | 2024.09.25 |
[Spring / HTTP] ResponseEntity (0) | 2024.06.20 |
[Spring] 어노테이션 (@Component, @Configuration, @Bean, @Autowired) (0) | 2024.03.21 |