반응형
그렇다면 스프링은 왜 필요한걸까?
이미 톰캣이 url에 따라서 어떤 메서드를 연결하고 실행시키고 응답을 줄지 다 정하고있는데?
스프링의 근본부터 공부하자
스프링
- 2000년대 초, EJB(Enterprise Java Bean)가 주류였는데, 너무 복잡하고 어려웠음
- 로드 존슨이 복잡한 EJB 대신, 가벼운 *POJO 기반의 개발 방법 제안
- 오픈소스 프로젝트로 스프링을 공식적으로 출시
- IoC(제어역전): 객체의 생명 주기를 개발자가 아니라 컨테이너가 관리하게끔 함
- AOP(관점 지향 프로그래밍): 여러 서비스 또는 함수에 걸처 있는 관심사(로깅, 트랜잭션)을 비즈니스 로직에서 분리하여 관리
IoC란
매번 제어 역전이라는 말로 혼란스럽게 하는데,
결국 앱에서 사용하는 객체(클래스의 인스턴스) 를 만들어서 저장해두고,
필요할 때 가져다 쓸 수 있도록 해놓는 것이다.
@Component
public class MyBean {
@Autowired
private DependencyBean dependency;
@PostConstruct
public void init() {
System.out.println("Bean is initialized");
}
}
- 위 코드에서 @Component가 있고, 해당 클래스가 파싱 디렉토리 범위 내에 존재한다면, 그 클래스는 객체화되어, 컨테이너에 올라가게 된다.
- 나중에 다른 클래스 또는 함수에서 객체를 사용할 때 컨테이너에서 뽑아서 사용하는 식으로 가게됨. 이게 바로 DI
DI?
그럼 DI는 뭘까? 의존성 주입이라는데
결국 위에서 IoC를 구체화시킨 것 중에 하나다.
빈을 컨테이너가 관리하고, 컨테이너는 스프링 앱 내에서 그 빈의 타입이 요구된다면, 컨테이너 내의 객체를 전달한다.
위 코드에서 DependencyBean을 컨테이너가 가지고 있다면, MyBean을 생성할 때, 스프링이 직접 리플렉션이라는 것으로 넣어주게 된다.
그런데 만약, MyBean에서 참조하고 있는 DependencyBean이 아직 초기화 되지 않았다면 어떻게 될까?
스프링의 객체 초기화
스프링은 객체를 초기화 할 때 먼저 빈 정의라는 것을 생성하게 된다.
빈 정의에는 빈의 이름, 클래스 타입, 의존성 정보, 초기화 및 소멸 메서드 정보가 포함된다.
리플렉션을 통해 생성자, 필드, Setter 메서드에 @Autowired 애노테이션을 검색한다.
이를 통해 의존성이 필요한 빈을 파악한다.
이렇게 파악한 의존성을 가지고 의존성 그래프를 생성하고, 의존성이 없는 독립적인 빈부터 초기화시키고, 의존성을 가진 빈은 의존 대상을 먼저 초기화 한 후에 초기화시킨다.
이렇게 해서, 스프링은 객체를 초기화 시키고 필요할 때마다 컨테이너에서 가져다 쓸 수 있게끔 해주는 역할을 맡는다.
반응형
'JAVA > 웹 프로그래밍 딥하게 파보기' 카테고리의 다른 글
stmt와 pstmt의 차이 (2) | 2024.12.18 |
---|---|
왜 무상태여야하는가? (1) | 2024.12.09 |
스프링 대규모 요청이 왔을 때 (0) | 2024.12.09 |
자바로 HTTP 네트워크 요청이 전송되는 원리를 알아보자 (1) | 2024.12.04 |
웹 프로그래밍 딥하게 파보기 (2) | 2024.11.28 |