본문 바로가기

Spring

Spring Framework의 특징과 작동 과정

 

이번 포스트를 보기 앞서 이전 포스트를 보고 오시기 바랍니다.

 

https://jaystorage.tistory.com/6

 

POJO (Plain Old Java Object)

처음 POJO(Plain Old Java Object)라는 개념을 접했을 당시에는 ‘평이하고(아무것도 꾸며지지 않은) 오래된 자바 객체’ 라는 개념이 왜 존재해야 하는지 그 이유를 몰랐다. 하지만 시간이 지나고 스프

jaystorage.tistory.com

https://jaystorage.tistory.com/10

 

서블릿(Servlet)

초창기 웹(Web) 초창기 웹은 웹 서버에 미리 만든 웹 페이지(정적 페이지)를 가공 없이 단순히 보여주는 것이 목적이었다. 그러나 많은 웹 사용자들은 미리 저장된 정보를 보는 것뿐만 아니라, 유

jaystorage.tistory.com

https://jaystorage.tistory.com/11

 

JSP(Java Server Page)

이번 포스트를 보기 앞서 아래에 있는 이전 포스트를 보고 오시기 바랍니다. https://jaystorage.tistory.com/10 서블릿(Servlet) 초창기 웹(Web) 초창기 웹은 웹 서버에 미리 만든 웹 페이지(정적 페이지)를

jaystorage.tistory.com

 


 

Spring Framework란

 

자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로서 엔터프라이즈급 어플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션을 의미한다.

 

엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 뜻이다. 일반적인 프레임워크의 경우 과도한 엔지니어링 기술을 탑재하여 무겁고 고가의 WAS를 갖추어야만 동작했지만 스프링 프레임워크는 엔터프라이즈 개발에서 필요로 하는 기술을 포함하고 있지만 가볍고 단순히 환경에서 사용할 수 있다.

 


 

Spring Framework의 특징

 

 

스프링 프레임워크는 다음과 같은 특징을 가지고 있다.

 

  1. IoC (Inversion of Control) : 제어의 역전
    개발자가 객체를 제어하는 것이 아닌 프레임워크가 객체를 제어하는 것을 의미한다. 일반적인 프로그램은 객체의 생성과 소멸과 같은 생명주기를 개발자가 제어하지만 스프링에서는 객체의 생명주기와 같은 제어권을 스프링이 가지고 있다.

  2. DI (Dependency Injection) : 의존성 주입
    의존성 객체를 특정 클래스에서 직접 생성하는 것이 아니라, 외부로부터 주입해주는 것을 의미한다. 의존성 객체를 개발자가 생성하지 않고 클래스를 Bean으로 등록하면 Bean으로 등록된 객체를 프레임워크가 찾아서 알아서 주입해준다. 이를 통해 모듈간의 결합도를 낮출 수 있다.

  3. AOP (Aspect Oriented Programming) : 관점 지향 프로그래밍
    각 코드마다 공통된 관심사를 분리하여 모듈화하는 프로그래밍 기법을 의미한다. OOP는 객체 단위로 모듈을 구성하는 반면 AOP는 관점(Aspect) 단위로 모듈을 구성한다.

  4. PSA (Portable Service Abstraction) : 서비스 추상화
    POJO 프로그래밍을 지원하기 위해 다양하게 구현되어있는 인터페이스를 같은 방식으로 사용하도록 중간에 인터페이스 어댑터 역할을 해주는 레이어를 추가하는 방법이다. 서비스 추상화의 대표적인 예로 JDBC를 들 수 있는데 어떠한 데이터 베이스를 사용하더라도 일관성 있는 방식으로 제어할 수 있도록 공통의 인터페이스를 제공한다.

  5. POJO : Plain Old Java Object (순수 자바 객체)
    스프링은 POJO(Plain Old Java Object), 즉 순수 Java만을 통해서 생성한 객체 사용 방식을 지향한다.


 

Front Controller 패턴

 

서블릿은 각 요청마다 하나의 서블릿이 1:1로 매핑되는 구조를 가지고 있어서 10개의 요청이 있다면 10개의 서블릿이 존재하게 되는 문제가 있었다.

 

프론트 컨트롤러 도입 전

 

그럴 경우 서블릿마다 공통되어 실행되어야 하는 로직이 있다면 매번 반복되어서 실행되는 문제가 있었다.

 

프론트 컨트롤러 도입 후

 

이를 해결하고자 클라이언트 요청을 받는 서버의 가장 앞단에 모든 요청을 받아 공통된 로직을 처리할 수 있는 컨트롤러를 만들게 되었는데 이를 프론트 컨트롤러라고 한다. 이러한 프론트 컨트롤러를 사용하는 방식을 프론트 컨트롤러 패턴이라고 한다.  

 

프론트 컨트롤러 패턴을 사용하면 매 요청마다 각각의 서블릿을 사용하는 것이 아닌 하나의 서블릿을 통해 요청을 수행하는 것이 가능해진다. 이로 인해 요청의 진입점이 같게 되어 관리가 훨씬 수월하게 되는 장점을 갖게 된다. 또한 각 서블릿마다 가지고 있는 중복되는 요청을 프론트 컨트롤러 단 한곳에서만 사용하기 때문에 중복 로직을 제거하는 것이 가능하다.

 

스프링 프레임워크에도 이러한 프론트 컨트롤러 패턴이 적용되었는데 DispatcherServlet이 프론트 컨트롤러 역할을 한다.

 


 

Spring Framework의 작동 과정

 

 

  1. DispatcherServlet이 브라우저로부터 요청을 받는다.

  2. DispatcherServlet은 요청된 URL을 HandlerMapping 객체에 넘기고, 호출해야 할 Controller 메소드(핸들러) 정보를 얻는다.

  3. DispatcherServlet이 HandlerAdapter 객체를 가져온다.

  4. HandlerAdapter 객체의 메소드를 실행한다.
    * 보다 정확하게 표현한다면, HandlerMapping은 DispatcherServlet로부터 전달된 URL을 바탕으로 HandlerAdapter 객체를 포함하는 HandlerExecutionChain 객체를 생성하며, 이후 DispatcherServlet이 HandlerExecutionChain 객체로부터 HandlerAdapter 객체를 가져와서 해당 메소드를 실행하게 된다.

  5. Controller 객체는 비즈니스 로직을 처리하고, 그 결과를 바탕으로 뷰(ex. JSP)에 전달할 객체를 Model 객체에 저장한다. DispatcherServlet에게 view name을 리턴한다.

  6. DispatcherServlet은 view name을 View Resolver에게 전달하여 View 객체를 얻는다.

  7. DispatcherServlet은 View 객체에 화면 표시를 의뢰한다.

  8. View 객체는 해당하는 뷰(ex. JSP, Thymeleaf)를 호출하며, 뷰는 Model 객체에서 화면 표시에 필요한 객체를 가져와 화면 표시를 처리한다.

 

 

DispatcherServlet의 구조

 

DispatcherServlet은 크게 Servlet WebApplicationContext와 Root WebApplicationContext로 구분된다. Servlet WebApplicationContext에는 웹 요청을 담당하는 객체들이 관리되고 Root WebApplicationContext에는 Service 계층이나 Repository 등 웹 환경에 독립적인 Bean들이 관리된다.

 


출처 : 
https://www.youtube.com/watch?v=calGCwG_B4Y
https://www.youtube.com/watch?v=h0rX720VWCg
https://velog.io/@wnsdnjs70/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%9D%98-%EC%A0%95%EC%9D%98%ED%8A%B9%EC%A7%95%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC
https://mangkyu.tistory.com/156
https://jhyonhyon.tistory.com/29
https://velog.io/@suhongkim98/Front-Controller-%ED%8C%A8%ED%84%B4%EA%B3%BC-spring-MVC
https://yenbook.tistory.com/6

 

'Spring' 카테고리의 다른 글

SL4J와 Logback을 이용한 Logging  (0) 2024.03.03
Filter, Interceptor, AOP  (0) 2023.11.29
JSP(Java Server Page)  (0) 2023.11.12
서블릿(Servlet)  (0) 2023.11.06
POJO (Plain Old Java Object)  (1) 2023.10.03