스프링 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를 사용할 줄 안다” 수준을 넘어서, 그 내부 동작 원리와 설계 철학을 깊이 이해할 수 있었다.
특히 인상 깊었던 부분은 다음과 같다:
- 직접 구현하며 배운 MVC 단순히 문법만 배우는 것이 아니라, 문제를 해결하기 위해 어떤 진화를 거쳤는지 알게 되었다.
- 서블릿과 JSP로 시작해, 직접 Front Controller를 단계별로 만들어 보면서 “왜 스프링이 이런 구조를 택했는가”를 몸으로 체득할 수 있었다.
- 확장 가능한 구조“프레임워크가 개발자를 가두는 것이 아니라, 개발자가 원하는 대로 확장할 수 있게 열어두는 것”이 스프링의 힘이라는 점을 느꼈다.
- 스프링이 제공하는 ArgumentResolver, HttpMessageConverter 같은 컴포넌트들은 인터페이스 기반으로 설계되어 있어 필요하면 언제든 확장 가능하다.
- 실무적 교훈 (PRG 패턴)이 부분에서 “현실적인 문제 해결 능력”이 프레임워크 학습의 진짜 가치라는 걸 깨달았다.
- 단순히 CRUD를 구현하는 것이 끝이 아니라, 실제 사용자 환경에서 발생할 수 있는 문제(중복 등록)를 해결하는 패턴까지 함께 배웠다.
'Spring' 카테고리의 다른 글
[Spring] MVC 22편 - 웹 페이지 만들기 (4, 최종 정리) (0) | 2025.08.18 |
---|---|
[Spring] MVC 21편 - 웹 페이지 만들기 (3) (1) | 2025.08.18 |
[Spring] MVC 20편 - 웹 페이지 만들기 (2) (0) | 2025.08.18 |
[Spring] MVC 19편 - 웹 페이지 만들기 (1) (1) | 2025.08.18 |
[Spring] MVC 18편 - HTTP 응답과 메시지 컨버터 (0) | 2025.08.18 |