1. @GetMapping, @PostMapping
@RequestMapping(value="/register/add", method=RequestMethod.GET)은 @GetMapping("/register/add")로 POST 요청은 @PostMapping으로 간단히 쓸 수 있다. URL이 같으면 충돌이 나지만 method가 다르면 충돌이 발생하지 않는다.
2. 클래스에 붙이는 @RequestMapping
URL이 "/register/add"로 같으면 공통으로 @RequestMapping("/register")로 빼낼 수 있다.
클래스 안의 모든 메서드의 URL에 "/register"가 붙는다. spring은 mapping을 클래스 단위가 아니라 메서드 단위로 하는데 하나의 클래스에 모든 메서드를 넣을 순 없다. 모듈 별로 나눠서 register를 RequestMapping으로 등록하고 나머지는 GET, POST 중 1개로 이후 경로만 적는다.
3. @RequestMapping의 URL패턴
URL 패턴에 우선순위가 있다. exacat mapping으로 정확히 일치가 우선순위가 제일 높고, 경로 맵핑인 path mapping 다음은 확장자 맵핑 extension mapping이다. 위에 모두 해당하지 않으면 404 에러가 발생한다.
@Controller
public class RequestMappingTest {
// @RequestMapping({"/login/hello.do", "/login/hi.do"})
@RequestMapping("/login/hello.do") // http://localhost/ch2/login/hello.do
public void test1(){
System.out.println("urlpattern=/login/hello.do");
}
@RequestMapping("/login/*") // /login/hello, /login/hi
public void test2(){
System.out.println("urlpattern=/login/*");
}
@RequestMapping("/login/**/tmp/*.do") // /login/tmp/hello.do, /login/aaa/tmp/hello.do
public void test3(){
System.out.println("urlpattern=/login/**/tmp/*.do");
}
@RequestMapping("/login/??")
public void test4(){ // /login/hi, /login/my.car
System.out.println("urlpattern=/login/??");
}
@RequestMapping("*.do") // /hello.do, /hi.do, /login/hi.do
public void test5(){
System.out.println("urlpattern=*.do");
}
@RequestMapping("/*.???") // /hello.aaa, /abc.txt
public void test6(){
System.out.println("urlpattern=*.???");
}
}
1. http://localhost/ch2/login/hello.do
@RequestMapping("/login/hello.do") // http://localhost/ch2/login/hello.do
public void test1(){
System.out.println("urlpattern=/login/hello.do");
}
2. http://localhost/ch2/login/hello2.do
@RequestMapping("/login/*") // /login/hello, /login/hi
public void test2(){
System.out.println("urlpattern=/login/*");
}
3. http://localhost/ch2/login/aa/bb/tmp/hello.do
@RequestMapping("/login/**/tmp/*.do") // /login/tmp/hello.do, /login/aaa/tmp/hello.do
public void test3(){
System.out.println("urlpattern=/login/**/tmp/*.do");
}
**는 하위 경로 1개 이상 들어갈 수 있다.
4. URL인코딩 - 퍼센트 인코딩
URL에 들어가는 한글을 변환하는 것을 URL 인코딩, 반대가 URL 디코딩이다. 요청을 받는 서버 컴퓨터가 어떤 OS를 혹은 어떤 인코딩을 쓰는지 모르기 때문이다. 한글로 인코딩 된 것만 쓸 것이라는 보장이 없다. 따라서 URL에 포함된 글자는 모두 ASCII여야한다. 모든 인코딩에 ASCII는 공통으로 들어가 있다. 0xEB82A8에서 EB, 82, A8 1byte 단위로 끊어 중간에 %를 넣어준 것이다.
A는 ASCII로 65이고 16진법으로는 0x41이다. A는 문자열 "41"로 바뀌는게 URL 인코딩이다. 즉 문자코드(숫자)를 문자열로 바꾸는 것이 URL 인코딩이다.
브라우저에 '남궁성'을 입력하고 GET, POST 방식 상관없이 요청을 하면 위와 같이 데이터가 전송된다. '남궁성' 이름으로 전달되지 않는다.
Postman을 사용해서 name에 '남궁성'을 입력하면 데이터 '%EB%82%A8%EA%B6%81%EC%84%B1'가 들어간다. GET, POST 둘다 URL 인코딩해서 데이터가 들어간다. 이 작업은 브라우저가 자동으로 해주며 데이터는 서버에게 전달된다. 서버는 이 데이터를 URL 디코딩해서 읽을 수 있다.
기본적으로 UTF-8로 주고받기 때문에 request.setCharacterEncoding("UTF-8");을 꼭 적어야 한다. 그래야 request.getParameter("name");을 제대로 읽을 수 있다. 매번 쓰기가 힘들어서 한글 인코딩 필터를 넣어준다.
web.xml에 보면 한글 필터를 넣었다.
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
org.springframework.web.filter.CharacterEncodingFilter에 들어있다.
filterChain.doFilter(request, response);
이 한줄이 핵심이다. 이 코드가 DispatcherServlet으로 보내는데 메서드 doFilterInterna안에 있는 것이 전처리로 DispatcherServlet에 보내기전에 한글처리를 해준다.
if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
request, reponse 요청 응답 인코딩을 지정한다. 따라서 request.setCharacterEncoding("UTF-8");를 쓰지 않아도 이 부분이 해주기 때문에 request.getParmeter를 해도 한글이 깨지지 않는다.
Maven Dependencies안에 있는 파일들은 pom.xml에 등록되어 있는 모듈들에 의해서 다운받아진다.
다운 받아지는 경로가 사용자 - m.2 - repository에 있다. spring의 알 수 없는 문제들이 많은데 대부분 프로젝트에서 사용하고있는 모듈의 충돌에 의해 발생한다. 따라서 이 repository를 삭제하고 STS를 실행하고 Maven - update project로 다시 다운 받을 수 있다.
spring-web-5.0.7.RELEASE-sources.jar에서 안의 파일을 보기 위해 확장자를 zip으로 바꾸고 안을 보면 우리가 STS에서 확인했던 파일을 다 볼 수 있다.
'스프링의 정석 > Ch. 02 Spring MVC' 카테고리의 다른 글
23. 쿠키(Cookie)란 (0) | 2023.08.13 |
---|---|
22. redirect와 forward (0) | 2023.07.27 |
20. @GetMapping, @PostMapping (1) (0) | 2023.07.25 |
19. 회원가입 화면 작성하기 (0) | 2023.07.22 |
18. @RequestMapping (0) | 2023.07.20 |