Spring

스프링

yoon9 2023. 3. 8. 21:20

스프링 프레임워크 3.1버전이긴 하지만 스프링의 기본적인 개념 및 매커니즘은 동일 시 하다고 느껴서 ... 이 책을 읽고 필요한 부분만 사용... 다 읽기에는 좀 더 너무 오래 걸릴꺼 같다..

 

 

bean : IOC가 생성,소멸 등으로 관리하는 오브젝트, 오브젝트라고 다 빈이라고 할 수 없다.

beanFactory: 스프링컨테이너라고 볼 수 있다. 하지만 직접 사용은 하지 않으며, (applicationContext를 사용하지만, 최상위 계층이다.) 빈을 등록하며, 생성하고, 조회하며 등등으로 관리를 한다.

applicationContext: beanFactory을 확장한 IOC 컨테이너이다.(beanFactory보다 더 추가된 기능) 

configuration Metadata: 스프링의 설정정보, IOC를 적용하기 위해 사용하는 메타정보이다. 

 


BeanDefinitionReader가 XML이든 자바코드이든 프로퍼티파일이든 BeanDefinitionType의 오브젝트로 변환만 할 수 있으면, 가능하다.

 

즉 ,XML이든 자바 파일이든 메타정보리소스를 BeanDefinitionReader가 읽어서  스프링이 빈을 등록과 생성 및 조회를 할 수 있는 BeanDefinitionType의 설정메타정보를 만들고 스프링이(IOC)가 설정메타정보와 POJO클래스를 보고 애플리케이션을 구성한다.

 

 

ApplicationContext(ac)의 형태도 다양하다.

 

staticAc

- 학습을 위한 컨테이너이다.

genericAc

- 가장 일반적인 ac이다.

- staticAc와의 차이는 외부설정파일인 XML파일을 설정메타정보로 전환해서 사용할 수 있다.

- 물론 기본적으로 리더기를 이용하여서 전환을 한다.(XmlBeanDefinitionReader를 이용하여서),

하지만 굳이 이렇게 보다는 전용 Ac를 사용하면된다. xmlGenericAppplicationContext를 사용하면, 굳이 리더기가 없이도 알아서 구성정보를 이용하여 구성한다.

webAc

- 스프링에서 가장 많이 사용되는 ac이다. 이름 그대로 웹 환경에서 필요한 기능이 더 추가된 ac이다.

- XmlWebAc,annotaionConfigWebAc가 있다.


IOC의 계층구조.

굳이 하나의IOC만 있으면 되지..왜 parents application Context? children application Context? 트리 계층 구조로 나눌까?

디스패쳐 서블릿으로 서블릿을 하나만 두어서 웹어플리케이션을 구성하지만, 디스패쳐 서블릿을 하나이상 둘 수도 있다.

그러면 서로 사용하는 db,logging등에 대해서는 여러 공통적으로 사용하는 거에 대해서 중복적으로 생성된다.

 

공통적으로 사용할 수 있는 빈들은 부모 Ac에 두고 각각의 서블릿에 대해 Ac를 따로 두면 된다.

근데 여러개의 디스패처 서블릿을 사용할 일이 있을까..? 여러개 써서 불편해서 프론트 컨트롤러 만든 거 아닌가..?

그리고 또 이렇게 계층을 나눈 이유가 또 있다.

스프링에서 제공해주는 웹기술을 사용하지 않을 경우 (항상 스프링이 제공해주는 웹기술을 사용할 필요는 없기 때문에)

ServletContext를 이용하여 부모Ac에게 접근을 할 수 있다.

 

 

스프링을 이용하여, applicationContext구조를 보면,

크게 3개

 

  • 서블릿 애플리케이션컨텍스트 - 루트 애플리케이션 컨텍스트
  • 루트 애플리케이션 컨텍스트
  • 서블릿 애플리케이션 컨텍스트

 


스프링프레임워크는 어떻게 동작할까?

(요즘은 스프링부트로 내장톰켓을 두어서 독립적인 애플리케이션을 만들 수 있다.)

 

외장톰캣을 사용을 한다.

실행을 톰캣에서 시작하기 때문에 ServletContextListener를 이용한다.

를 구현한 ContextLoaderListener를 사용한다. (웹 애플리케이션의 생명주기가 같다.)

listner를 등록을 하면, 기본적으로 xml파일 경로 defalut경로로 지정되고,  XmlWebAc를 만들어준다.

xml파일 경로 다른 것으로 초기화를 하고 싶으면, ContextConfigLocation를 지정해주면 된다.

추가로 Ac를 변경하고 싶으면 ContextClass를 지정해주면된다..

 

똑같이 약간의 파라미터명은 다르지만 서블릿 애플리케이션 컨텍스트도 이와 같은 방법으로 구성할 수 있다.

 

외장톰캣실행 -> 부모 컨텍스트 생성 -> 웹 요청 -> 서블릿 초기화 및 컨텍스트 생성 이라고 크게 보면 될 것 같다.

 

 


디스패쳐 서블릿

 

  • handlerMapping 
  • handlerAdapter
  • handlerExceptionResolver
  • viewResolver
  • localeResolver
  • themeResolver
  • RequestToViewNameTranslator

MultipartResolver

  • 파일 업로드 요청 처리에 필요한 인터페이스
  • HttpServletRequest를 MultipartHttpServletRequest로 변환해주어 요청이 담고 있는 File을 꺼낼 수 있는 API 제공.

LocaleResolver

  • 클라이언트의 위치(Locale) 정보를 파악하는 인터페이스
  • 기본 전략은 요청의 accept-language를 보고 판단.

ThemeResolver

  • 애플리케이션에 설정된 테마를 파악하고 변경할 수 있는 인터페이스이다

HandlerMapping

  • 요청을 처리할 핸들러(controller)를 찾는 인터페이스

HandlerAdapter

  • HandlerMapping이 찾아낸 “핸들러”를 처리하는 인터페이스

HandlerExceptionResolver

  • 요청 처리 중에 발생한 에러 처리하는 인터페이스
  • 3개의 exceptionResolver가 있음.

@ExceptionHandler를 사용해 정의

RequestToViewNameTranslator

  • 핸들러에서 뷰 이름을 명시적으로 리턴하지 않은 경우, 요청을 기반으로 뷰 이름을 판단하는 인터페이스