Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Min's dev-log

[Spring] 스프링 컨테이너 본문

Framework/Spring

[Spring] 스프링 컨테이너

minyy 2023. 6. 4. 20:01

스프링 컨테이너

자바 객체(Bean)의 생명 주기(생성, 관리, 제거 등)를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다.

스프링 컨테이너는 xml, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.

 

스프링 컨테이너의 종류

1) BeanFactory

스프링 컨테이너의 최상위 인터페이스로 bean객체를 관리하고 조회하며, getBean() 메서드를 통해 객체화 할 수 있다.

@Bean 어노테이션이 붙은 메서드의 이름을 스프링 bean의 이름으로 사용하여 등록한다.

 

2) ApplicationContext

일반적으로 스프링 컨테이너라고 하면 ApplicationContext를 의미한다.

BeanFactory 기능을 모두 상속받아서 제공하며 이외에 부가 기능을 제공한다.

- MessageSource : 메세지소스를 활용한 국제화 기능 인터페이스

- EnvironmentCapable : 환경변수,개발,운영 등을 구분해서 처리하고,

                                      애플리케이션 구동 시 필요한 정보들을 관리하는 인터페이스

- ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스

- ResourceLoader : 파일, 클래스패스, 외부 등 리소스를 편리하게 조회

 

스프링 컨테이너를 사용하는 이유

먼저, 객체를 생성하기 위해서는 new 생성자를 사용해야 한다. 그로 인해 애플리케이션에는 수많은 객체가 존재하고

서로를 참조하게 된다. 객체 간의 참조가 많으면 많을수록 의존성이 높아지게 된다. 즉 결합도가 높아진다.

객체 간의 의존성을 낮추어 결합도는 낮추고, 높은 캡슐화를 위해 스프링 컨테이너가 사용된다.

스프링 컨테이너에 객체, bean을 등록하고 스프링이 각 객체간 의존관계를 관리하도록 한다.

 

스프링 컨테이너가 POJO(일반 자바 객체)를 객체화하는 순서 

  1. 설정정보를 필요로 한다.
    xxx.xml : 환경설정에 대한 파일
    web.xml : 서블릿 컨테이너(톰캣, 웹 서버)에게 설정을 알려주는 파일
    pom.xml : Maven Dependencies 라이브러리, 패키지를 관리해주는 설정 파일
                    스프링컨테이너에게 설정을 알려주고 작업을 수행해야한다. (※ 주의 ※ 100% 완료될 때까지 대기)
    리스너: 톰캣 시작 감지
    필터: 톰캣 시작감지, *.do할때마다 doFilter()수행
  2. xxx.xml이 로딩된다. ( 메모리에 적재됨)
  3. 설정파일에 등록해둔 요청이 수행된다면,
  4. 설정해두었던대로 객체화를 진행한다.
  5. 해당 객체의 메서드도 호출된다.

★ new 없이 객체화를 어떻게 하나?

ex 1) FrontController

new FrontController(); --> 이렇게 한적 없다.

서블릿(.java, not POJO)은 만들어질 때부터 어노테이션이 달려있고, 클래스의 한 종류이다.

서블릿 객체를 관리해주는 "서블릿 컨테이너" == 아파치 톰캣 == 웹서버, 서버 >> 객체화를 담당한다.

서블릿들을 자동관리해주는 서블릿 컨테이너를 톰캣이 담당하고있었다.

 

ex 2) 필터 EncFilter

필터 클래스(서블릿을 상속받은 클래스, .java not POJO)

*.do 요청에 의해 자동으로 doFilter()가 수행되었었다.

서블릿 컨테이너는 객체화도 담당하지만, 메서드 호출도 관리해줄 수 있다.

 

[ 결론 ]

컨테이너는 객체 생성(객체화) 및 객체 사용(메서드 호출)을 관리할 수 있다.

소스코드에 new가 없어진다. -> 낮은 결합도 -> 유지보수 용이

언제 new를 해야 하는지에 대한 "설정 정보"가 필요하다. -> 의존관계(dependency)를 명시해야한다.

서블릿은 서블릿 컨테이너만 있으면 가능했고 POJO(일반자바객체)들도 객체화할 수 있는 것이 스프링 프레임워크이다. 

서블릿(not POJO)을 객체화 -> 서블릿 컨테이너(톰캣)

일반 자바 객체를 객체화 -> (Spring) 컨테이너

 

Comments