스프링 웹 MVC(inflearn) - 백기선
Springframework
백기선님의 스프링 웹 MVC강의를 수강하고 공부내용을 정리하고 있습니다.
해당 강좌는 스프링 MVC에 대하여 핵심원리, 설정, 활용으로 나누어 강의해주고 있습니다.
모든 예제는 github에 올리고 있습니다.
스프링 MVC 소개
- 스프링 MVC
- M: 모델
- 도메인 객체 또는 DTO로 화면에 전달할 또는 화면에서 전달 받은 데이터를 담고 있는 객체.
- 평범한 자바 객체 POJO
- ex)
- V: 뷰
- 데이터를 보여주는 역할. 다양한 형태로 보여줄 수 있다. HTML, JSON, XML, …
- HTML. JSP, 타임리프, …
- 스프링부트는 기본적으로 동적인 뷰를 resources - templates디렉토리에서 찾는다.
- ex)
- C: 컨트롤러
- 사용자 입력을 받아 모델 객체의 데이터를 변경하거나, 모델 객체를 뷰에 전달하는 역할.
- 입력값 검증
- 입력 받은 데이터로 모델 객체 변경
- 변경된 모델 객체를 뷰에 전달
- @Controller 사용한 클래스
- ex)
- M: 모델
tip
- Java9는 적은수의 요소로 편리하게 Collections의 인스턴스를 생성 할 수 있는 새로운 정적 팩토리를 지원한다.
- 다만 정적 팩토리 메소드로 작성된 콜렉션은 불변이므로, 요소 또는 null을 add/put 하려고 하면 java.lang.UnsupportedOperationException 또는 java.lang.NullPointerException 을 발생 시킨다.
List<String> immutableList = List.of("one","two","three");
Set<String> immutableSet = Set.of("one","two","three");
Map<Integer,String> immutableMap = Map.of(1,"one",2,"two",3,"three")
- MVC 패턴의 장점
- 동시 다발적(Simultaneous) 개발 - 백엔드 개발자와 프론트엔드 개발자가 독립적으로 개발을 진행할 수 있다.
- 높은 결합도 - 논리적으로 관련있는 기능을 하나의 컨트롤러로 묶거나, 특정 모델과 관련있는 뷰를 그룹화 할 수 있다.
- 낮은 의존도 - 뷰, 모델, 컨트롤러는 각각 독립적이다.
- 개발 용이성 - 책임이 구분되어 있어 코드 수정하는 것이 편하다.
- 한 모델에 대한 여러 형태의 뷰를 가질 수 있다.
- MVC 패턴의 단점
- 코드 네비게이션 복잡함
- 코드 일관성 유지에 노력이 필요함
- 높은 학습 곡선
서블릿
서블릿 (Servlet)
- 자바 엔터프라이즈 에디션은 웹 애플리케이션 개발용 스팩과 API 제공.
- 요청 당 쓰레드 (만들거나, 풀에서 가져다가) 사용
- 그 중에 가장 중요한 클래스중 하나가 HttpServlet.
서블릿 등장 이전에 사용하던 기술인 CGI (Common Gateway Interface)
- 요청 당 프로세스를 만들어 사용
서블릿의 장점 (CGI에 비해)
- 빠르다.
- 플랫폼 독립적
- 보안
- 이식성
서블릿 엔진 또는 서블릿 컨테이너 (톰캣, 제티, 언더토, …)
- 세션 관리
- 네트워크 서비스
- MIME 기반 메시지 인코딩 디코딩
- 서블릿 생명주기 관리
- …
우리가 만든 서블릿 어플리케이션은 직접 사용할 수 없으며, 반드시 서블릿 컨테이너를 이용하여 사용할 수 있다.
서블릿 생명주기
- 서블릿 컨테이너가 서블릿 인스턴스의 init() 메소드를 호출하여 초기화 한다.
- 최초 요청을 받았을 때 한번 초기화 하고 나면 그 다음 요청부터는 이 과정을 생략한다.
- 서블릿이 초기화 된 다음부터 클라이언트의 요청을 처리할 수 있다. 각 요청은 별도의 쓰레드로 처리하고 이때 서블릿 인스턴스의 service() 메소드를 호출한다.
- 이 안에서 HTTP 요청을 받고 클라이언트로 보낼 HTTP 응답을 만든다.
- service()는 보통 HTTP Method에 따라 doGet(), doPost() 등으로 처리를 위임한다.
- 따라서 보통 doGet() 또는 doPost()를 구현한다.
- 서블릿 컨테이너 판단에 따라 해당 서블릿을 메모리에서 내려야 할 시점에 destroy()를 호출한다
- 서블릿 컨테이너가 서블릿 인스턴스의 init() 메소드를 호출하여 초기화 한다.
서블릿 어플리케이션 개발
가장 기본적이고 원시적인 서블릿 어플리케이션 개발
메이븐 프로젝트 생성
- archetype 사용(메이븐이 만들어 놓은 프로젝트 틀)
- webapp archetype 사용

- archetype 사용(메이븐이 만들어 놓은 프로젝트 틀)
Java Servlet API 의존성 추가
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>- provided 스코프는 코딩시점에서는 사용이 가능하나, runtime시점에는 사용할 수 없다.(어디선가 제공할것이다.
- 톰캣 컨테이너에서 제공(서블릿 컨테이너)
- provided 스코프는 코딩시점에서는 사용이 가능하나, runtime시점에는 사용할 수 없다.(어디선가 제공할것이다.
톰캣 설치 및 추가
- artifacts 는 war-exploded로 추가한다.
- war는 압축된것 exploded 풀린상태
- web.xml에 서블릿 클래스 추가 및 매핑 추가
- artifacts 는 war-exploded로 추가한다.
서블릿 리스너와 필터
서블릿 리스너
웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고 각 이벤트에 특별한 작업이 필요한 경우에 사용할 수 있다.
- 서블릿 컨텍스트 수준의 이벤트
- 컨텍스트 라이프사이클 이벤트
- 컨텍스트 애트리뷰트 변경 이벤트
- 세션 수준의 이벤트
- 세션 라이프사이클 이벤트
- 세션 애트리뷰트 변경 이벤트
- 서블릿 컨텍스트 수준의 이벤트
예제
- 서블릿 리스너 생성
- implements ServletContextListener
- web.xml에 리스너 등록
- 리스너 적용 및 결과
- 서블릿 리스너 생성
서블릿 필터
들어온 요청을 서블릿으로 보내고, 또 서블릿이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우에 사용할 수 있다.
체인 형태의 구조

예제
서블릿 필터 생성
- implements Filter(javax.servlet)
doFilter 설정
- 다음 필터 적용 또는 마지막 필터인 경우 서블릿은 연결해준다.
web.xml에 필터 등록 및 매핑
- 매핑은 servlet-name 또는 url-pattern 으로 매핑할 수 있다.
- 리스너 - 필터 - 서블릿 순서로 init destroy는 역순