ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Framework의 구성요소와 동작 원리
    Spring 2020. 9. 17. 21:19

    POJO

    스프링의 특징을 살펴보면 POJO라는 단어가 등장한다.

    POJO란 Plain Old Java Object로 직역하자면 평범한 옛날 자바 객체이다

     

     

    Spring Framework의 장점

    기존 Servlet 클래스를 이용해서 자바 웹 어플리케이션을 구축하려면 반드시 Servlet 에서 요구하는

    규칙에 맞게 클래스를 실행해야 했지만 

    스프링을 통해서라면 일반적인 자바 객체로 웹 어플리케이션을 구축할 수 있으며 비즈니스 로직에 집

    중할 수 있게 되는것이다.

    스프링에서 Servlet은 모두 추상화 되어 라이브러리로 들어가 있으며

    개발자는 XML또는 다른 설정을 통해서 Servlet을 이용할 수 있게 된다.

     

     

     

    스프링 컨테이너의 종류

    (*컨테이너란?  컨테이너는 특정 객체의 생성과 관리를 담당하며 객체 운용에 필요한 다양한 기능 제공.

                            애플리케이션 운용에 필요한 객체를 생성하고 객체 간의 의존관계를 관리한다는 점에서

                            스프링도 일종의 컨테이너라고 할 수 있다.)

     

    : 스프링에서는 BeanFactory와 이를 상속한 ApplicationContext 두 가지 유형의 컨테이너를 제공한다.

     

    -BeanFactory: 스프링 설정 파일 (applicationContext.xml)에 등록된 <bean> 객체를 생성하고

                            관리하는 가장 기본적인 컨테이너 기능만 제공함.

                            그리고 컨테이너가 구동될 때 객체를 생성하는 것이 아니라 클라이언트로부터의

                            요청에 의해서만 객체를 생성한다. (lazy loading) 

     

     

    -ApplicationContext:   BeanFactory를 확장한 ApplicationContext 컨테이너는 이 기능에 더해

                                          트랜잭션 관리나 메시지 기반의 다국어 처리 등 다양한 기능을 지원한다.

                                          또한 컨테이너가 구동되는 시점에 <bean> 에 등록되어 있는 클래스들을 

                                          객체화 하는 즉시 로딩 방식으로 동작한다.

                                          대표적으로 이 ApplicationContext 를 구현한 클래스는 

                                          GenericXmlApplicationContext 클래스이다.

     

     

    IoC / DI (Inversion of Control / Dependency Injection) - 제어의 역전 / 의존성 주입

    비즈니스 컴포넌트를 개발할 때 항상 신경쓰는 것이 바로 낮은 결합도높은 응집도 인데 

    스프링은 제어의 역행을 통해 애플리케이션을 구성하는 객체 간의 느슨한 결합

    즉, 낮은 결합도를 유지한다.

    스프링의 IoC는 객체 생성을 자바 코드로 직접 처리하는것이 아니라 컨테이너가 대신 처리하게 한다.

    그리고 객체와 객체 사이의 의존관계 역시 컨테이너가 처리한다.

     

    의존성 주입(DI)은 무엇인가

    의존성 관계란 객체와 객체의 결합 관계 이다.

    하나의 객체에서 다른 객체의 변수나 메소드를 이용해야 한다면, 이용하려는 객체에 대한

    객체 생성과 생성된 객체의 레퍼런스 정보가 필요하다.

    즉, 쉽게 말해서 의존성은 new다.

    A 라는 객체 생성자에서 new B(); 를 했다면 A는 B에 의존하게 된다.

    주입이란 외부에서 라는 뜻을 내포하고 있다.

    즉 A 라는 객체에서 B를 생성하는것이 아니라 

    외부에서 생성된 B를 A에 주입함으로써 의존 관계를 없앨 수 있다.

    이것을 의존성 주입이라고 한다.

     

    의존성을 주입 하는 방법

     

    1) XML을 통한 의존성 주입

     

     

    -생성자를 통한 의존성 주입 

      : 생성자에 인자로 주입하고자 하는 객체를 넣어준다.

        스프링 설정 파일에서는 <constructor-arg>태그와 ref속성을 이용한다.

     

    -속성을 통한 의존성 주입

      :내부적으로 set method 를 사용한다.

       스프링 설정 파일에서는 <property>태그를 사용해야 하며 name 속성 값이 호출하고자 하는

       메소드의 이름이어야 한다.

       name에는 변수명을 적어주면 스프링에서 name의 첫 글자를 대문자로 바꾸고 앞에 set 키워드를

       붙여 set method를 실행한다.

     

     

    2) 어노테이션을 통한 의존성 주입

    스프링에서는 @Autowired 라는 어노테이션을 통해 의존성을 주입한다.

    @Autowired는 속성의 설정자 메서드에 해당하는 역할을 자동으로 수행한다.

    이와 비슷한 역할을 하는 자바 어노테이션으로는 @Resource 어노테이션이 있다.

    두 어노테이션의 차이는 bean을 탐색할때 우선순위로 하는 기준이 어떤 것이냐 이다.

     

     

    AOP (Aspect Oriented Programing)

    직역하자면 관점 지향 프로그래밍 이다.

    DI가 의존성에 대한 주입이라면 

    AOP는 로직 주입 이라고 할수 있다.

    코드를 작성하다보면 다수의 모듈에 공통적으로 나타나는 부분이 존재하는데 

    이것을 횡단 관심사 라고 한다.

    그리고 모듈 각각 고유한 로직을 핵심 관심사 라고 한다.

    즉  각 모듈을 구성하고 있는 코드는 핵심 관심사 + 횡단 관심사 이다.

     

    AOP는 횡단 관심사에 관심이 있다.

    모듈마다 중복되는 부분을 걷어내는 것이 주 목적이다.

    AOP를 이해하는 데에 가장 중요한 핵심 개념은 관심 분리(Separation of Concerns) 이다.

    관점지향 프로그래밍은 비즈니스 메소드를 개발 할 때,

    핵심 비즈니스 로직과 각 비즈니스 메소드마다 반복해서 등장하는 공통로직을

    분리함으로써 응집도가 높게 개발할수 있도록 지원한다,

     

    1) XML을 이용한 AOP

     

    2)어노테이션을 이용한 AOP

    @Aspect 어노테이션은 클래스를 aop에서 사용하겠다는 의미

    @Before 어노테이션은 대상 메서드 실행 전에 이 메서드를 실행하겠다는 의미이다.

     

     

     

    PSA(Portable Service Abstraction)

    직역하자면 일관성 있는 서비스 추상화 이다.

    JDBC처럼 어댑터 패턴을 적용하여 같은 일을 하는 다수의 기술을 공통의 인터페이스로 

    제어할 수 있게 한것을 서비스 추상화라고 한다.

    스프링 프레임워크에서는 서비스 추상화를 위해 다양한 어댑터를 제공한다.

    스프링은 OXM, PRM, 캐시, 트랜잭션 등 다양한 기술에 대한 PSA 즉 API를 제공한다.

     

     

     

                                                      

    Spring 실행순서 

    1.웹 어플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 Loading

     

    ServletContainer (ex: 톰캣 서버) -> URL 확인 -> 요청을 처리할 서블릿 찾아 실행 

    web.xml: 각종 설정을 위한 파일 

     

    2. web.xml에 등록되어 있는 ContextLoaderListener (Java Class) 생성

     

    서블릿 컨테이너가 파일을 읽어서 구동될 때,

    ContextLoaderListener가 자동으로 메모리에 생성된다.(Pre-Loading)

    ContextLoaderListener클래스는 ServletContextListener 인터페이스를 구현하고 있으며,

    ApplicationContext를 생성하는 역할을 수행한다.

    ContextLoaderListener클래스는 Servlet의 생명주기를 관리해준다.

    Servlet을 사용하는 시점에 서블릿 컨텍스트에 ApplicationContext 등록,

    Servlet이 종료되는 시점에 ApplicationContext 삭제

     

    3. 생성된 ContextLoaderListener는 root-context.xml을 Loading

     

    * ContextLoaderListener 객체는 src/main/resources 소스 폴더에 있는 applicationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동하는데 이를 Root 컨테이너 라고 한다.

    * 원래는 ContextLoaderListener가 WEB-INF 밑에 있는 파일을 먼저 로딩하도록 되어있으나 유지보수 상의 관계로 src/main/resources 에 파일을 넣어 놓는 경우가 많다. 때문에 src/main/resources 에 있는 파일을 가져다 로딩시키려면 web.xml에 -param으로 설정해서 사용한다.

     

    4. root-context.xml에 등록되어 있는 Spring Container가 구동

     

    root-context.xml에는 주로 view 지원을 제외한 공통 bean을 설정한다. (web과 관련된 bean들은 등록해주지 않음)

    예시로 spring properties 파일을 로컬과 서버용으로 구분지을 때 여기서 property value를 설정해준다.

    (검색해보니 databaseDataSource, repository 설정을 주로함)

     

    5. 클라이언트로부터 웹 어플리케이션 요청이 옴

     

    최초의 클라이언트 요청에 의해 DispatcherServlet 생성

     

    6. DispatcherServlet이 생성됨

     

    DispatcherServlet 객체는 WEB-INF/config 폴더에 있는 servelt-context.xml 파일을 로딩하여 두번째 스프링 컨테이너를 구동한다. 이 두 번째 스프링 컨테이너가 Controller 객체를 메모리에 생성한다.

    DispatcherServlet은 FrontController의 역할을 수행한다. 클라이언트로부터 요청 온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할지 결정한다.

     

     

    7. DispatcherServlet은 servlet-context.xml을 Loading

     

    8. 두번째 Spring Container가 구동되며 응답에 맞는 PageController들이 동작한다.

     

        이때 첫번째 Spring Container가 구동되면서 생성된 DAO, VO, Servicelmpl 클래스들과

        협업하여 알맞은 작업을 처리하게 된다.

     



    출처: https://javannspring.tistory.com/231 [JiGyeong's study room]

    728x90
    반응형

    'Spring' 카테고리의 다른 글

    Spring MVC 패턴  (1) 2020.10.25
    Spring에 커넥션풀(Connection Pool) 등록 - HikariCP  (1) 2020.10.24
    [Spring] 스프링 어노테이션 종류  (1) 2020.10.17
    MyBatis란?  (0) 2020.09.28
    의존성 주입 테스트  (0) 2020.09.18

    댓글

Designed by Tistory.