■ 배운것
- 스프링 MVC 요청 처리 과정
- 스프링 프로젝트 구조
- 기본 파일 살펴보기(web.xml, servelt-context, HomeController.java)
- 컨드롤러 생성
- 요청으로 넘겨준 파라미터를 컨트롤러가 받는 방법
* jsp 수정
■ 스프링 MVC 요청 처리 과정

- 스프링MVC는 디스패처서블릿 1개가 요청을 다 받아서 처리한다.
- 기본적으로 다 셋팅 되어있어서 나는 컨트롤러, 서비스, DAO, 뷰 만 만들어주면 된다.
① URL로 클라이언트가 요청함
② DispatcherServlet : 야(HandlerMapping) 나 이거 요청 받았는데 어떤 컨트롤러한테 줘야해?
② HandlerMapping : URL과 컨트롤러의 메서드들 Map 형태로 가지고 있어서 컨트롤러 지정해서 알려줌
③④⑤ 핸들매핑이 알려준 컨트롤러한테 요청 줘서 컨트롤러가 서비스랑 다오 통해서 처리하고
뷰 이름 디스패처 서블릿에게 반환함.
⑥ 디스패처 서블릿은 뷰 이름만 알아서는 jsp파일을 찾지 못함.
ViewResolver에게 뷰 이름 주고 뷰 리졸버가 실제 뷰 이름(경로까지해서) 줌.
디스패처가 그래서 그 뷰한테 전달함.
■ 스프링 프로젝트 구조

1. java : 클래스 파일 들어감(자바 코드)
2. resources : 기타 프로젝트 설정 파일, xml 파일
3. webapp : 외부에서 접근할 수 있는 웹root
4. resources : 이미지, css, 자바스크립트
5. WEB-INF : 웹에 대한 설정(외부에서 직접 접근 불가한 폴더)
http://localhost:8090/soldsoldmarket/WEB-INF/views/home.jsp 이거 안됨
6. lib : 라이브러리 폴더
(메이븐에서 태그 라이브러리 잘 인식 안되어서 라이브러리 직접 넣었다.)
7. spring : 스프링 설정
8. servlet-context : 웹과 관련된 빈 설정 웹이랑 관련된 설정
(컨트롤러, 핸들맵핑, 뷰리졸버, 서비스, 다오)
9. root-context : 공통으로 쓰는 빈 설정
내가 필요한 라이브러리(마이바티스 등), 서블릿이 여러개여도 공통으로 쓸 애들
10. views : jsp 파일
11. web.xml : 톰켓이 서버 실행할 때 가장 먼저 읽는 파일, 서블릿 등록, 필터 등록
12. pom.xml
■ 기본 파일 살펴보기(web.xml, servelt-context, HomeController)
web.xml
톰켓 구동
→ 톰켓에서 내가 만든 웹 애플리케이션 web.xml 참고해서 구동시킴
→ 웹 애플리케이션이 올라가고 내려가는게 이벤트라서
이벤트 리스너 ContextLoaderListener 실행되고
→ 이게 실행되면 루트 애플리케이션 컨텍스트 생성
- context-param
ContextLoaderListener에서 Root WebApplicationContext를 생성하기 위한 설정 파일의 경로 지정
- listener - ContextLoaderListener
웹 애플리케이션의 시작, 종료 이벤트에 대한 이벤트 리스너이다.
웹 애플리케이션 구동 시 루트 애플리케이션 컨텍스트를 생성하고
웹 애플리케이션 종료 시 루트 애플리케이션 컨텍스트를 소멸한다.
=> 위에 설정한 파일 읽어서 필요한 빈들 만듬
- DispatcherServlet
사용자의 요청을 받는 컨트롤러 서블릿
DispatcherServlet 서블릿 마다 독립적인 WebApplicationContext를 갖는다.
=> 따라서 해당 프로젝트가 실행되면 애플리케이션context가 총 2개임
ContextLoaderListener가 만든 root,
DispatcherServlet 가 만든 servlet
servelt-context
- <annotation-driven />, context:component-scan/>
HandlerMapping, Controller을 xml로 따로 안적고 어노테이션(태그) 사용하겠다는 뜻
빈은 되도록이면 어노테이션 기반으로 만들어야 함(코드 줄여서 에러 줄이게)
- <resources mapping="/resources/**" location="/resources/" />
모든 요청 디스패처서블릿이 받는데
URL "/resources/**" 오면 webapp의 resources가 처리하게 한다.
=> 자바스크립트 내려주거나, 이미지 내려주는 것들은 디스패처서블릿 통해서 요청 처리할 필요 없음.
이렇게 오는 요청은 디스패처 서블릿 말고 바로 폴더로 매핑해서 바로 동작해라
- ViewResolver 설정 : URL로 요청온거 실제 뷰 이름으로 반환
이거는 왜 있냐면, 실제로 view를 jsp말고 다른거로도 만들수가 있어
그럴 때 매번 실제 이름을 반환하면 .jsp 를 다른거로 다 바꿔야하는데
이거 이용하면 여기만 수정하면 되니까 확장성이 높아짐
HomeController.java
localhost:80080/mvc/
로컬호스트의 8080포트에 있는 톰켓에서 우리가 만든 프로젝트를 찾아가기 위한 경로
context-path : 애플리케이션을 찾아가는 경로
/ : web root
스프링에서는 / (슬래시)를 요청 받아서 홈컨트롤러로 이동시킨다.
■ 컨드롤러 생성
1. 클래스 이름 위에 @Controller
- 컨트롤러 역할하는 빈으로 등록
* 빈 : 스프링에서 관리할 객체(애플리케이션 컨텍스트에서 관리하는 객체)
2. 맵핑
- URL과 컨트롤러의 메소드(프로그램) 연결
@RequestMapping(value = "/login", method = {RequestMethod.POST})
@GetMapping("/login")
@PostMapping("/login")
■ 요청으로 넘겨준 파라미터를 컨트롤러가 받는 방법
- URL : /login/?id=aaa&pwd=123 으로 요청 시 컨트롤러가 aaa, 123 등 받기
1. @RequestParam 어노테이션
- 매개변수의 이름과 파라미터의 name 속성의 값이 동일하면 @RequestParam 어노테이션을 생략할 수 있다.
(생략 시 defaultValue 설정이 불가능하다.)
2. @PathVariable 어노테이션
- URL 패스상에 있는 특정 값을 가져오기 위해 사용하는 방법
ex. /login/?id=aaa&pwd=123 여기서 login이라는 문자열을 가지고 오고 싶을 때 사용
3. @ModelAttribute 어노테이션
- 요청 파라미터가 많은 경우 객체 타입으로 파라미터를 넘겨받는 방법이다.
- 단, 기본 생성자와 Setter가 존재해야 한다.
- @ModelAttribute 어노테이션을 생략해도 객체로 매핑된다.
@Slf4j // 롬복 라이브러리 이용해서 log 변수 쓰기
@Controller // 컨트롤러 등록
public class MemberController {
@RequestMapping(value="/login", method = {RequestMethod.POST})
public String login(@RequestParam("id") String id,
@RequestParam("password") String password){
System.out.println(member);
return "home"; // 리턴값은 뷰의 이름
}
@GetMapping("/member/{id}")
public String findMember(@PathVariable("id") String id) {
log.info("findMember() - 호출 : {}", id);
return "home";
}
@PostMapping("/login") // URL과 메소드 연결
public String login(@ModelAttribute Member member) {
System.out.println(member);
return "home";
}
}
■ jsp 파일 수정
<%@ page session="false" %> 지우고 (로그인하려면 세션 사용해야함)
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> 작성
pageEncoding : JSP 페이지에 대한 인코딩
contentType 차이점 : 서블릿으로 변환해서 클라이언트한테 전달 되어 넘어오는 페이지를 브라우저에서 인코딩 하는 것
댓글