🔌 SPARTA/Courses

Spring MVC / Data JPA

eunjiom 2026. 1. 30. 21:00

Spring MVC

1.MVC 패턴 패턴 기초와 역할

 

1) 서블릿의 문제점

  • 낮은 응집도: 하나의 서블릿 클래스 냉 여러 로직이 혼재 / 많은 책임
  • 강한 결합도: HttpServletRequest, HttpServletResponse와 같은 서블릿 API에 직접적으로 의존 / 웹 환경 밖에서 테스트 어려움
  • 반복적인 상용구 코드: 반복적인 코드 필수 요구
  • 문제 해결: 관심사의 분리 원칙에 입각하여 스프링 MVC를 사용

2) MVC 패턴

  • 하나의 Servlet이 혼자 모든 것을 처리하던 문제를 해결하기 위해 애플리케이션의 코드를 세 가지 역할로 명확하게 나누는 설계 방식
  • Model, View, Controller

3) Controller

  • 사용자의 HTTP 요청을 받아서 처리
  • 어떤 요청이 들어왔을 때 어떤 메소드를 실행할지 결정,  비즈니스 로직을 호출, 데이터를 Model에 담아 View 이름을 반환
  • @Controller

4) View

  • 사용자에게 보여지는 화면
  • Model에 담긴 데이터를 사용 > HTML을 생성 > 클라이언트에게 응답
  • Controller가 반환한 View 이름을 ViewResolver가 실제 View 파일과 매핑시켜 렌더링
  • Thymeleaf

5) Model

  • Controller에서 View로 데이터를 전달할 때 사용하는 객체
  • Key-Value 형태로 데이터 저장
  • Controller에서 처리한 결과 데이터를 Model에 추가 >  View에서 해당 데이터를 참조
  • Model, ModelAndView 클래스

6) 타임리프

  • HTML을 동적으로 만들어주는 자바 기반의 도구 / 템플릿 엔진
  • 예시)  "${userName}님 환영합니다" >  "홍길동"으로 바꿔서 최종 페이지를 완성
  • SSR 방식

7) SSR

  • 서버가 웹 페이지에 필요한 모든 데이터를 채워 넣어 완벽하게 조립된 HTML 페이지를 브라우저에게 전달하는 방식
  • 거의 즉시 콘텐츠를 볼 수 있어 초기 로딩 속도가 빠름 / 모든 내용이 HTML에 포함되어 있어 검색 엔진 최적화(SEO)에 유리
  • 서버에서 완성된 HTML을 통째로 주는 것

8) CSR

  • 거의 텅 빈 HTML 뼈대와 자바스크립트 파일만 보내주는 방식
  • 클라이언트가 자바스크립트를 실행해 필요한 데이터를 서버에 다시 요청 > 브라우저가 직접 페이지를 조립하여 화면에 그림
  • 클라이언트에서 자바스크립트로 그 때 그 때 HTML을 그려내는 것
  • React나 Vue 같은 최신 프론트엔드 프레임워크
  • 초기 로딩 느림 / 앱처럼 부드럽고 빠른 화면 전환이 가능

2. 프론트 컨트롤러 패턴과 어댑터 패턴, DispatcherServlet

 

1) 프론트 컨트롤러 패턴

  • 모든 클라이언트 요청을 단일 진입점에서 처리하는 디자인 패턴
  • 모든 요청을 하나의 컨트롤러가 받아서 처리(공통 로직을 중앙화)
  • 개별 요청을 처리할 핸들러로 작업을 위임하는 역할
  • 장점
    • 공통 로직의 중앙화
    • 일관된 처리 흐름
    • 새로운 컨트롤러 추가 시에도 공통 로직 자동 적용
    • 유지보수성 향상

2) 어댑터 패턴

  • 서로 다른 인터페이스를 가진 클래스들을 연결해주는 패턴
  • 필요한 이유: 프론트 컨트롤러 패턴만으로는 다양한 종류의 컨트롤러를 처리하기 어려움
더보기
// 1. @Controller 어노테이션 방식
@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

// 2. Controller 인터페이스 방식  
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, 
                                    HttpServletResponse response) {
        return new ModelAndView("hello");
    }
}

// 3. HttpRequestHandler 인터페이스 방식
public class SimpleController implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, 
                            HttpServletResponse response) {
        // 처리 로직
    }
}
  • Controller를 모두 하나의 HandlerAdapter라는 타입으로 처리
// HandlerAdapter 인터페이스 (공통 인터페이스)
public interface HandlerAdapter {
    boolean supports(Object handler); // 처리 가능 여부 판단(boolean)
    
    ModelAndView handle( // 어떻게 처리할 것인지에 대한 로직
      HttpServletRequest request,
      HttpServletResponse response, 
      Object handler) throws Exception;
}

// Controller 구현 1 (HandlerAdapter를 implements)
public class RequestMappingHandlerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return handler instanceof HandlerMethod;  // @RequestMapping 메서드인지 확인
    }
    
    @Override
    public ModelAndView handle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) {
        // @Controller 방식으로 처리
        return invokeHandlerMethod((HandlerMethod) handler, request, response);
    }
}

// Controller 구현 2 (HandlerAdapter를 implements)
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return handler instanceof Controller;
    }
    
    @Override
    public ModelAndView handle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) {
        // Controller 인터페이스 방식으로 처리
        return ((Controller) handler).handleRequest(request, response);
    }
}
  • 장점
    • 다양한 컨트롤러 타입을 통일된 방식으로 처리(다형성)
    • 새로운 컨트롤러 타입 추가 시 새 어댑터만 만들면 됨
    • 기존 코드 수정 없이 확장 가능

3) DispatcherServlet

  • 프론트 컨트롤러 패턴을 구현한 스프링 MVC의 핵심적인 프론트 컨트롤러
  • 스프링 MVC와 DispatcherServlet

  • ① 요청: 클라이언트가 웹 애플리케이션에 요청을 보내고, 이 요청은 가장 먼저 DispatcherServlet에 도달
  • ② 핸들러 조회: DispatcherServlet은 HandlerMapping에게 요청을 처리할 Handler(=Controller)를 찾아달라고 요청
  • ③ 핸들러 실행: DispatcherServlet은 HandlerMapping으로부터 받은 정보를 이용해 해당 Controller에게 요청 처리를 위
  • ④ ModelAndView 반환: Controller는 비즈니스 로직을 수행한 후, 결과 데이터(Model)와 뷰의 논리적 이름(View Name)을 담은 ModelAndView 객체를 DispatcherServlet에 반환
  • ⑤ 뷰 해석: DispatcherServlet은 ModelAndView에서 뷰 이름을 추출하여 ViewResolver에게 전달하고, 해당하는 실제 View 객체를 찾아달라고 요청
  • ⑥ 뷰 렌더링: DispatcherServlet은 ViewResolver로부터 받은 View 객체에게 모델 데이터를 전달하여 뷰를 렌더링하도록 요청
  • ⑦ 응답: 렌더링된 View의 결과물이 DispatcherServlet을 통해 클라이언트에게 최종적으로 응답(Response)으로 전달

'🔌 SPARTA > Courses' 카테고리의 다른 글

스탠다드반 2회차: 데이터 베이스 모델링  (0) 2026.02.05
스탠다드반 1회차: MVC & REST API  (0) 2026.02.02
Spring 시작하기  (1) 2026.01.29
배열과 컬렉션  (1) 2026.01.28
완전 탐색과 그리디 알고리즘  (1) 2026.01.27