[ 2022.10.28 TIL-스프링 프레임워크 ]

Coosla·2022년 10월 28일
0

TIL

목록 보기
4/29
post-thumbnail

스프링 프레임워크

✏️ 스프링 프레임워크 역사

  • 스프링 프레임워크가 나오기 전 많은 기업들은 Enterprise Java Bean(EJB)을 사용
  • EJB는 트랜잭션, 분산 기술, ORM 등 많은 기술을 지원해주지만 단점으로 가격이 비싸고, 사용이 어렵고, 느렸다.
  • 2002년 로드 존슨이 EJB의 문제점을 지적한 책을 출간하며 EJB없이 고품질의 애플리케이션을 개발할 수 있다는 내용과 예제 코드를 선보임
  • 이것이 스프링의 핵심이 되는 개념(BeanFactory, ApplicationContext, POJO, DI, IOC)이됨
  • 유겐 휠러와 얀 카로프가 로드 존슨에게 오픈소스 프로젝트를 제안하며 Spring 프레임워크가 탄생

✏️ 스프링 프레임워크 특징

  • 경량 컨테이너로서 자바 객체를 직접 관리

    • 각각의 객체 생성,소멸과 같은 라이프 사이클을 관리
    • 의존성 주입을 통해 필요한 객체를 얻을수 있다.
  • 제어 역행(IoC, Inversion of Control)

    • 애플리케이션의 느슨한 결합을 유지하기 위해 사용
    • 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출
  • 의존성 주입(DI, Dependency Injection)

    • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결해줌
  • 관점기향 프로그래밍(AOP, Aspect-Oriented Programming)

    • 트랜젝션이나 로깅, 보안 등 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리
  • 트랜잭션 관리 프레임워크

    • 추상화된 트랜잭션 관리를 지원하며 설정파일을 이용한 선언적인 방식 및 프로그래밍을 통한 방식 모두 지원
  • 모델-뷰-컨트롤러 패턴

    • 웹 프로그래밍 개발 시 거의 표준적인 방식인 MVC 패턴 사용
    • FrontController 패턴이 핵심!
  • 배치 프레임워크

    • 특정 시간대에 실행하거나 대용량 자료를 처리하는데 쓰이는 일괄 처리를 지원하는 배치 프레임워크 제공
    • 기본적으로 스프링 배치는 Quartz 기반으로 동작

✏️ 스프링 모듈들

  • Spring Core
  • Spring Context
  • Spring DAO
  • Spring ORM
  • Spring AOP
  • Spring Web
  • Spring Web MVC
  • 등 여러가지 모듈이 있음

✏️ 스프링 프레임워크 동작과정

  • 톰캣을 시작했을 때
    1. 톰캣 설정 파일인 Web.xml에 context-param 태그에 스프링 설정 파일 경로 설정
    2. listener 태그에 ContextLoaderListener 설정
      // 스프링 설정 파일
      <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/root-context.xml</param-value>
      </context-param>
      
      // dispatcherServlet이 2개 이상 존재할 때 전역 Context를 생성
      // 이 전역 Context를 통해 두 서블릿에 접근할 수 있게 해줌.
      <listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      </context-param>
    3. ContextLoaderListener를 통해 root-context.xml을 읽어와 ApplicationContext에 빈 객체 생성
  • 사용자 요청이 들어왔을 때
    • 사용자의 요청이 DispatcherServlet으로 들어옴
      • 이때 모든 요청을 DisPatcherServlet으로 들어오는게 아니라 web.xml에 등록된 내용만 처리함
        // web.xml
        // DispatcherServlet 설정
        <servlet>
        	<servlet-name>appServlet</servlet-name>
        	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>/WEB-INF/servlet-context.xml</param-value>
           </init-param>
        </servlet>
        
        <servlet-mapping>
           <servlet-name>appServlet</servlet-name>
           <url-pattern>/</url-pattern>
        </servlet-mapping>
      • DispatcherServlet으로 들어온 요청은 init-param 태그에 있는 servlet-context.xml로 전달하여 해당 파일을 읽음
        <context:component-scan base-package="org.zerock.springex2.controller"/>
      • context:component-scan 태그를 통해 해당 클래스의 Java 파일에 컴포넌트로 등록된 빈 객체를 찾아 ApplicationContext에 생성 및 관리
    • DispatcherServlet으로 들어온 요청을 mapping을 통해 해당 요청을 처리하는 컨트롤러를 찾음
    • 비즈니스 로직 처리
    • 비즈니스 로직 수행 후 ViewResolver를 통해 view화면을 찾음
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/views/"></property>
         <property name="suffix" value=".jsp"></property>
      </bean>
    • 응답을 DispatcherServlet으로 전달하여 사용자에게 전송

✏️ 스프링 프레임워크 동작과정 이미지


참고

스프링

profile
프로그래밍 언어 공부 정리

0개의 댓글