티스토리 뷰

앞선 포스팅에서 언급한 애플리케이션 컨텍스트에 대해서 공부한 내용입니다.

 

스프링의 주요 기술 [1]. DI

스프링 주요 기술에서 언급한 DI에 대해서 공부한 내용입니다. 스프링의 주요 기술 스프링의 주요 기술은 크게 세 가지입니다. DI(Dependency Injection) AOP(Aspect Oriented Programming) PSA(Portable Service Abstracti

kkoon9.tistory.com

미리 언급하자면 개발자가 애플리케이션 컨텍스트를 직접 구현할 일은 없을 것입니다!
단지, 어떻게 동작하는지 알기 위한 포스팅입니다.

 

스프링에서 오브젝트의 생성과 관계설정, 사용, 제거 등의 작업을 독립된 컨테이너가 담당합니다.

코드가 아닌 컨테이너가 오브젝트에 대한 제어를 담당한다고 해서 IoC라고 부르고, 스프링 컨테이너를 IoC 컨테이너라고 합니다.

애플리케이션 컨텍스트는 DI를 위한 빈 팩토리에 여러 가지 컨테이너 기능을 추가한 것입니다.

일반적으로 스프링의 IoC 컨테이너를 애플리케이션 컨텍스트라고 부릅니다.

빈 팩토리와 애플리케이션 컨텍스트는 굉장히 객관적인 이름의 인터페이스로 정의됩니다.

  • 빈 팩토리 : BeanFactory
  • 애플리케이션 컨텍스트 : ApplicationContext

 

ApplicaionContext 인터페이스를 들어가보면 BeanFactory를 상속한 서브인터페이스임을 알 수 있습니다.

참고로, ListableBeanFactory와 HierarchicalBeanFactory 모두 BeanFactory의 서브인터페이스입니다.

IoC 컨테이너를 사용하는 애플리케이션에서 필요한 것들

  • POJO 클래스
  • 설정 메타정보

 

POJO가 무엇인지는 이 포스팅에서 다뤘으니, 참고 부탁드립니다.

 

스프링의 주요 기술

스프링의 주요 기술은 크게 세 가지입니다. DI(Dependency Injection) AOP(Aspect Oriented Programming) PSA(Portable Service Abstraction) 위 세가지는 애플리케이션을 POJO로 개발할 수 있게 해주는 기술입니다. POJO와 스

kkoon9.tistory.com

필요한 설정 메타정보

사용할 POJO 클래스만 선정하여 IoC 컨테이너가 제어할 수 있도록 적절한 메타정보를 만들어 제공합니다.

IoC 컨테이너의 가장 기초적인 역할은 오브젝트를 생성하고 이를 관리하는 것입니다.

스프링 컨테이너가 관리하는 이런 오브젝트는 Bean이라고 부릅니다.

IoC 컨테이너가 필요로 하는 설정 메타정보는 이 Bean을 어떻게 만들고 어떻게 동작하게 할 것인가에 대한 정보입니다.

스프링의 메타정보는 BeanDefinition 인터페이스로 표현되는 추상 정보입니다.

애플리케이션 컨텍스트는 바로 이 BeanDefinition으로 만들어진 메타정보를 담은 오브젝트를 사용해 IoC와 DI 작업을 수행합니다.

BeanDefinition 인터페이스로 정의되는 Bean 메타정보는 다음과 같습니다.

  • Bean 아이디, 이름, 별칭 : Bean 오브젝트를 구분할 수 있는 식별자
  • 클래스 또는 클래스 이름 : Bean으로 만들 POJO 클래스 또는 서비스 클래스 정보
  • 스코프 : 싱글톤, 프로토타입과 같은 Bean의 생성 방식과 존재 범위
  • 프로퍼티 값 또는 참조 : DI에 사용할 프로퍼티 이름과 값 또는 참조하는 Bean의 이름
  • 생성자 파라미터 값 또는 참조 : DI에 사용할 생성자 파라미터 이름과 값 또는 참조할 Bean의 이름
  • 지연된 로딩 여부, 우선 Bean 여부, Autowiring 여부, 부모 Bean 정보, BeanFactory 이름 등

스프링 IoC 컨테이너는 각 Bean에 대한 정보를 담은 설정 메타정보를 읽어들인 뒤에, 이를 참고해서 Bean 오브젝트를 생성하고 프로퍼티나 생성자를 통해 의존 오브젝트를 주입해주는 DI 작업을 수행합니다.

결국 DI 작업으로 연결되는 오브젝트들이 모여서 하나의 애플리케이션을 구성하고 동작하게 됩니다.

정리하자면 스프링 애플리케이션이란, 결국 POJO 클래스와 설정 메타정보를 이용해 IoC 컨테이너가 만들어주는 오브젝트의 조합입니다.

Bean 메타정보의 항목들은 대부분 디폴트 값이 있습니다.

싱글톤으로 관리되는 Bean 오브젝트를 등록할 때 반드시 제공해줘야 하는 정보는 Bean 이름과 POJO 클래스뿐입니다.

참고로, Ioc 컨테이너가 관리하는 Bean은 오브젝트 단위입니다.

절대 클래스 단위가 아닙니다!

애플리케이션 컨텍스트의 종류

모든 종류를 다루진 않고, 제가 공부했을 때 솔깃했던 내용 위주로 정리했습니다.

GenericApplicationContext

스프링 테스트 컨텍스트 프레임워크를 활용하는 JUnit 테스트는 테스트용 애플리케이션 컨텍스트를 자동으로 만들어줍니다.

WebApplicationContext

스프링 애플리케이션에서 가장 많이 사용됩니다.

왜냐하면 스프링 애플리케이션은 대부분 서블릿 기반의 독립 웹 애플리케이션으로 만들어지기 때문이죠.

다음은 웹 환경에서 스프링 Bean으로 이루어진 애플리케이션의 동작하는 구조를 나타낸 그림입니다.

main() 메서드 안에서 ApplicationContext를 만들고 설정 메타정보를 읽어 초기화한 후, POJO Bean을 요청해서 메서드를 실행합니다.

서블릿 컨테이너는 클라이언트의 요청을 받아 서블릿을 동작시켜줍니다.

서블릿은 웹 애플리케이션이 시작될 때 미리 만들어둔 WebApplicationContext에게 Bean 오브젝트로 구성된 애플리케이션의 기동 역할을 해준 Bean을 요청해서 받아둡니다.

조금 더 자세한 내용은 다른 포스팅에서 다루겠습니다.

추가로, Spring Boot를 새로 만들 때 다음과 같은 코드로 main() 메서드가 만들어집니다.

package com.laboratorykkoon9.springjpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringJpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringJpaApplication.class, args);
    }

}

메서드를 들어가보면 ConfigurableApplicationContext를 볼 수 있습니다.

WebApplicationContext와 함께 같이 ConfigurableApplicationContext도 다뤄보겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함