나를 기록하다
article thumbnail
Published 2024. 3. 13. 23:07
[TIL-43/240313] Spring MVC TIL
반응형

MVC 패턴

요청과 응답의 흐름 1

forward

  • 서버 내부에서 일어나는 호출
  • 클라이언트의 URL에 대한 요청이 들어오면 해당 URL이 다른 URL로 포워딩된 것이 확인되었을 경우 URL의 리소스를 확인하여 클라이언트에 응답
  • 포워딩이 일어나면 클라이언트 단에서는 아무런 동작 X, 모든 동작을 서버에서 처리
  • 클라이언트(웹브라우저)에서 요청한 URL은 물론 요청정보도 바뀌지 않음

redirect 

  • 서버가 클라이언트에서 요청한 URL에 대해 응답에서 다른 URL로 재접속하라고 명령을 보내는 것
  • URL을 다시 가리킨다라는 뜻
  • 클라이언트는 해당 URL로 다시 요청
  • URL 주소가 바뀌면서 다시 접속되는 것을 확인 가능, 클라이언트 또한 리다이렉션이 일어났음을 알 수 있음
  • 웹브라우저 서버에서 Redirect를 하라는 응답코드인 300번대 코드가 오게 되면 리다이렉트를 해야되는 URL로 다시 요청을 보내는 역할


쿠키 (Cookie)

  • 정의: 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일
  • 특징
    • 사용자 인증 유효 시간 명시 가능
    • 브라우저 종료 후에도 유지 가능
    • 클라이언트의 상태 정보를 로컬에 저장
    • 클라이언트에 300개까지 쿠키 저장 가능, 하나의 도메인당 20개의 값 제한, 각 쿠키값은 4KB까지 저장 가능
  • 구성 요소
    • 이름, 값, 유효시간, 도메인, 경로
  • 동작 방식
    • 클라이언트 요청 시 서버에서 쿠키 생성 후 응답
    • 브라우저 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관
    • 동일한 요청 시 쿠키를 함께 전송

 

세션 (Session)

  • 정의: 쿠키를 기반으로 하지만 서버 측에서 관리되는 사용자 정보 파일
  • 특징
    • 서버에서 세션 ID 부여하여 클라이언트 정보 관리
    • 브라우저 종료 전까지 인증 상태 유지
    • 사용자가 많을수록 서버 메모리 부담
  • 동작 방식
    • 클라이언트 접속 시 세션 ID 부여
    • 클라이언트는 세션 ID를 쿠키로 저장
    • 클라이언트 요청 시 세션 ID를 서버에 전달하여 정보 가져옴

 

쿠키와 세션의 차이

  • 저장 위치: 쿠키는 클라이언트 로컬에, 세션은 서버에 저장
  • 보안성: 세션이 쿠키보다 우수
  • 속도: 쿠키가 세션보다 빠르지만 서버 자원을 사용하지 않음

 

세션을 사용하면 좋은데 왜 쿠키를 사용할까?

  • 서버 자원 소모와 성능 저하를 피하기 위해 사용

 

쿠키/세션은 캐시와 엄연히 다르다

  • 캐시는 이미지나 파일 저장
  • 쿠키와 세션과의 차이는 라이프사이클에 있음

요청과 응답의 흐름 2

Spring MVC에서 가장 중요한 요청과 흐름은 아래 그림과 같다.

Bean을 등록하는 방법, DI를 활용하여 Spring의 3계층을 구현하는 방법, MVC Front Controller 관련 내용은 링크를 달아두었으니 읽어보길 바란다.

빈등록 하는 방법

 

Spring - Bean을 등록하는 여러가지 방법

Bean을 등록하는 여러가지 방법들 우선 Spring boot Project 만들고 BookService, BookRepository를 생성 BookRepository...

Seongmun-Hong.github.io

DI를 활용한 Controller, Service, Repository의 흐름

 

DI를 활용한 Controller, Service, Repository 흐름 구현

스프링의 3계층을 구현하고 의존성 주입과 흐름이 어떻게 진행되는지 알아본다.

velog.io

MVC Front Controller

 

[Spring] MVC 프론트 컨트롤러

MVC FrontController 패턴 단계별 도입

velog.io


모델과 뷰, 컨트롤러의 역할

Model

  • 동작을 수행하는 코드 → service, repository
  • 사용자 View에 어떻게 보일지에 대해서 신경 X
  • 데이터 질의에 대한 정보를 제공하는 기능 및 데이터에 대한 수정 담당

View

  • 사용자가 화면에 무엇을 어떻게 볼 것인지를 결정
  • 사용자 화면에 보이는 부분
  • 모델의 정보를 받아와 사용자에게 보여주는 역할
  • 자체적으로 모델의 정보를 보관 X
  • 예시
    • JSP는 보여주는 것에만 집중(HTML / CSS / Javascript) → 화면을 담당
    • EL / JSTL을 사용하여 자바코드를 드러내지 않고 사용 가능

Controller

  • 요청을 받아 검증하고 비즈니스 로직을 수행(서비스 툴)
  • 모델과 뷰를 연결하는 역할을 수행(연결자 역할)
  • 사용자에게 데이터를 가져오고 수정하고 제공

Spring Web MVC

  • Servlet API를 기반으로 구축된 Web Framework
  • 정식 명칭은 Spring Web MVC이지만, Spring MVC로 주로 알려져 있음
  • Spring Framework이 제공하는 DI, AOP 뿐만 아니라, WEB 개발을 위한 기능 제공
  • DispatcherServelt(Front-Controller)를 중심으로 디자인
  • View Resolver, Handler Mapping, Controller와 같은 객체와 함께 요청을 처리하도록 구성

 

Spring MVC 구성요소

  • DispatcherServlet: 클라이언트 요청 처리(요청 및 처리 결과 전달)
  • HandlerMapping: 요청을 어떤 Controller가 처리할 지 결정
  • Controller: 요청에 따라 수행할 메서드 선언, 요청처리를 위한 로직 수행(비즈니스 로직 호출)
  • ModelAndView: 요청처리를 하기 위해서 필요한 혹은 그 결과를 저장하기 위한 객체(바구니)
  • ViewResolver: Controller에 선언된 view이름을 기반으로 결과를 반환할 View를 결정
  • View: 응답화면 생성

 

Spring MVC - 요청 처리 흐름

 

  1. 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다
  2. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  3. 핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.
  4. 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행한다
  5. ModleAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  6. viewResolver 호출: 뷰 리졸버를 찾고 실행한다.
    • JSP의 경우: InternalResourceViewResolver 가 자동 등록되고, 사용된다.
  7. View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고,렌더링 역할을 담당하는 뷰 객체를 반환한다.
    • JSP의 경우 InternalResourceView(JstlView) 를 반환하는데, 내부에 forward() 로직이 있다.
  8. 뷰 렌더링: 뷰를 통해서 뷰를 렌더링한다.

 

Spring MVC(DispatcherServlet)

  • 컨테이너 구성

  • DispatcherServlet을 등록할 때는 Spring 설정파일이 2개가 필요함(servlet, root)
  • servlet-context.xml(web과 직접적으로 연관 O)
    • servlet에서 보듯이 요청과 관련된 객체를 정의
    • DispatcherServlet과 관련된 설정을 해야함
    • url과 관련된 controller, @(어노테이션), ViewResolver, Interceptor, MultipartResolver 등의 설정
  • root-context.xml(web과 직접적으로 연관 X)
    • servlet-context.xml 과는 반대로 view와 관련되지 않은 객체를 정의
    • Service, Repository(DAO), DB 등 비즈니스 로직과 관련된 설정

Spring MVC에서는 각 계층별 역할을 이해하는 것이 중요하고, 특히 DI, DispatcherServlet, Front Controller 등 실제 개발을 진행할 때도 꼭 필요하며 자주 사용되는 개념들이 많이 나오는 부분이어서 더욱 집중하여 공부를 하였다. xml 설정과 같은 부분은 암기하며 외우기보다, 이런 식으로 진행된다는 것만 알고 넘어가고(설정 파일은 검색해서 사용하면 된다) 구조와 개념, 동작 흐름에 대한 이해에 집중하여 공부하자.

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...