Spring

[Spring] 스프링 MVC 1편 완강!!!!!!! - 전체 정리

dev-nadan 2025. 8. 18. 20:55

완강했다!!!!!!!!

 

스프링 MVC 1편 강의는 단순한 기술 학습을 넘어, 웹 애플리케이션이 동작하는 근본 원리를 이해하고 실제로 구현해보는 과정이었다.

이번 글에서는 지금까지 학습한 전체 내용을 하나의 흐름으로 정리한다.


1. 웹 애플리케이션의 기본 구조

  • 웹 서버 vs WAS
    • 웹 서버: 정적 리소스 제공 (HTML, CSS, JS)
    • WAS: 서블릿 기반으로 동적 처리
  • 서블릿과 JSP
    • 서블릿: HTTP 요청과 응답을 직접 다루는 저수준 API
    • JSP: HTML과 자바 코드를 결합해 뷰를 좀 더 쉽게 렌더링
  • MVC 패턴 등장
    • 역할 분리: Controller(요청 처리), Model(데이터), View(화면 렌더링)
    • 코드 중복과 유지보수 문제를 구조적으로 해결

2. MVC 프레임워크 직접 구현하기

Front Controller 패턴

  • 여러 컨트롤러를 하나의 진입점(Front Controller)으로 묶어 관리
  • 스프링 MVC의 핵심 아이디어와 동일
  • 점차 v1 ~ v5까지 발전:
    • v1: 가장 기본적인 Front Controller
    • v2: View 분리
    • v3: Model 추가
    • v4: 단순화된 컨트롤러
    • v5: 유연한 어댑터 도입

3. 스프링 MVC의 기본 기능

요청 매핑

  • @RequestMapping, @GetMapping, @PostMapping
  • 요청 URL과 HTTP 메서드에 따라 컨트롤러 매핑

요청 파라미터 처리

  • @RequestParam: 단일 파라미터 처리
  • @ModelAttribute: 객체 바인딩 및 모델 자동 추가
  • @RequestBody: JSON/XML 요청 바디 → 객체 변환

응답 처리

  • 뷰 템플릿 사용: Thymeleaf
  • @ResponseBody: HTTP 메시지 바디 직접 반환
  • ResponseEntity: 상태 코드와 헤더까지 제어 가능

HttpMessageConverter

  • 요청/응답을 변환하는 핵심 컴포넌트
  • String, JSON, byte[] 등 다양한 포맷을 자동 처리

ArgumentResolver & ReturnValueHandler

  • 파라미터와 반환값을 유연하게 처리하는 스프링의 확장 지점
  • @RequestParam, @ModelAttribute, @ResponseBody 등 모두 내부적으로 이를 통해 동작

4. 실제 웹 페이지 만들기

요구사항: 상품 관리 서비스

  • 목록, 상세, 등록, 수정 기능 제공
  • 도메인 모델: Item
  • 저장소: ItemRepository

화면 처리

  • 정적 HTML → 타임리프 템플릿 변환
  • th:text, th:each, th:if, th:href, th:action 등 핵심 문법 활용
  • Natural Template 특성으로 디자이너와 협업 용이

문제 해결: PRG(Post/Redirect/Get)

  • 등록 후 새로고침 시 중복 등록 문제 해결
  • redirect: 키워드와 RedirectAttributes 활용
  • 사용자에게는 “저장 완료!” 메시지 표시

5. 핵심 정리

  • 스프링 MVC는 단순히 “컨트롤러 + 뷰”를 연결하는 프레임워크가 아니다.
  • 요청 → 컨트롤러 → 모델 → 뷰 → 응답의 흐름 전체를 일관되게 제어하는 구조를 제공한다.
  • 확장 가능한 인터페이스(ArgumentResolver, ReturnValueHandler, HttpMessageConverter) 덕분에 실무 환경에 맞는 기능 커스터마이징도 가능하다.
  • 타임리프는 단순한 뷰 엔진이 아니라, 퍼블리셔와 개발자의 협업을 고려한 강력한 템플릿 엔진이다.

6. 회고

이 강의를 통해 단순히 “스프링 MVC를 사용할 줄 안다” 수준을 넘어서, 그 내부 동작 원리와 설계 철학을 깊이 이해할 수 있었다.

특히 인상 깊었던 부분은 다음과 같다:

  1. 직접 구현하며 배운 MVC 단순히 문법만 배우는 것이 아니라, 문제를 해결하기 위해 어떤 진화를 거쳤는지 알게 되었다.
  2. 서블릿과 JSP로 시작해, 직접 Front Controller를 단계별로 만들어 보면서 “왜 스프링이 이런 구조를 택했는가”를 몸으로 체득할 수 있었다.
  3. 확장 가능한 구조“프레임워크가 개발자를 가두는 것이 아니라, 개발자가 원하는 대로 확장할 수 있게 열어두는 것”이 스프링의 힘이라는 점을 느꼈다.
  4. 스프링이 제공하는 ArgumentResolver, HttpMessageConverter 같은 컴포넌트들은 인터페이스 기반으로 설계되어 있어 필요하면 언제든 확장 가능하다.
  5. 실무적 교훈 (PRG 패턴)이 부분에서 “현실적인 문제 해결 능력”이 프레임워크 학습의 진짜 가치라는 걸 깨달았다.
  6. 단순히 CRUD를 구현하는 것이 끝이 아니라, 실제 사용자 환경에서 발생할 수 있는 문제(중복 등록)를 해결하는 패턴까지 함께 배웠다.