1. @PostMapping과 @GetMapping

@Controller 
public class RegisterController {

    @GetMapping("register/add")
    public String register() {
    	return "registerForm"; // WEB-INF/views/registerForm.jsp
    }

    @PostMapping("register/add")
    public String save() {
    	return "registerInfo"; // WEB-INF/views/registerInfo.jsp
    }

}

다음과 같이 @PostMapping과 @GetMapping 을 @RequestMapping 대신 사용하면

GET 메소드, 또는 POST 메소드로만 데이터를 전송하게 설정할 수 있다.

(데이터 전송 방법이 다르기 때문에 URL이 같아도 구분이 가능하게 된다)

 

이전에 @RequestMapping을 사용했을때는 두 메소드 모두 다 사용가능했지만

페이지의 용도에 따라 특정 메소드를 사용하게 될 때는 @PostMapping과 @GetMapping 애너테이션을 사용하면 된다.

 

2. 클래스에 붙이는 @RequestMapping

맵핑될 URL의 공통 부분을 @RequestMapping으로 클래스에 적용가능

@Controller
@RequestMapping("/register")
public class Practice { 
	@GetMapping("/add")
	public String register() {
		return "registerForm";
	}
	
	@PostMapping("/add")
	public String save(User user, Model m) throws Exception {
		if(!isValid(user)) {
			String msg = URLEncoder.encode("id를 잘못입력하셨습니다.", "utf-8");
			
			m.addAttribute("msg", msg);
			return "redirect:/register/add";
		}
		
		return "registerInfo";
	}

 

3. @RequestMapping의 URL패턴

1. 정확히 일치하는 패턴

2. 경로 맵핑

3. 확장자 맵핑

 

 

4. URL인코딩 - 퍼센트 인코딩

URL에 포함된 non-ASCII 문자를 문자코드(16진수) 문자열로 반환

 

홍길동 -> URLEncoder.encode() -> "%ED%99%8D%EA%B8%B8%EB%8F%99"

         <- URLDecoder.decode() <-

 

문자 UTF-8
0xED998D
0xEAB8B8
0xEB8F99

 

GET이나 POST 메소드로 한글을 전송할 경우 위와 같이 인코딩이 되어 전송이 된다.

즉, 홍길동이 %ED%99%8D%EA%B8%B8%EB%8F%99 로 전송이 되는 것이다.

 

 

 

 

redirect와 forward

1. redirect와 forward의 처리 과정 비교

redirect)

수동으로 요청(GET 또는 POST 메소드) -> 300 Redirect 응답

-> 주어진 Location으로 새로운 요청을 하게 됨(자동, 이 때는 무조건 GET 메소드를 사용하게 됨) -> 새로운 응답

 

즉 2번의 요청, 2번의 응답

 

 

forward)

요청을 그대로 전달해줌

요청 -> forward(전달) -> 응답

 

 

2. RedirectView

Controller가 반환한 redirect:/register/add을 RedirectView에 전달하고

RedirectView는 응답 헤더를 만들어내서 클라이언트에 응답을 함

브라우저는 응답을 받아서 자동으로 요청을 다시 하게 됨

 

 

 

3. JstlView

Controller에서 registerForm이라는 문자열을 반환하면

DispatcherServlet은 InternalResourceViewResolver에 해당 문자열을 전달하여 실제로 어떤 파일인지 알려줌

/WEB-INF/views/registerForm.jsp 라는 파일임을 JstlView에 전달하고 JstlView는 registerForm.jsp에게 Model을 넘겨줌

registerForm.jsp 에서 최종적으로 응답을 하게 됨.

 

4. InternalResourceView

Controller가 forward:/register/add 를 DispatcherServlet에 반환하고, 이것을 InternalResourceView에 전달함

InternalResourceView는 /register/add를 다시 DispatcherServlet에 전달하게 됨.

그 이후는 일반적인 처리과정과 같음. 마치 처음부터 /register/add를 요청받은 것 처럼.

 

 

 

쿠키(Cookie)란?

 

1. Cookie

이름(name)과 값(value)의 쌍으로 구성된 작은 정보. ASCII 문자만 가능

서버에서 생성 후 전송, 브라우저에 저장. 유효기간 이후 자동 삭제

서버에 요청시 domain, path가 일치하는 경우(하위 경로도 포함)에만 자동 전송

 

 

2. 쿠키의 작동 과정

서버에 요청을 하면, 서버가 쿠키를 만드는 코드를 실행하고 응답헤더에 쿠키를 담아서 응답함.

브라우저에 쿠키가 저장되고, 나중에 다시 서버에 요청할 때 요청헤더에 쿠키정보도 같이 전송하게 됨.

서버는 그 쿠키를 보고 클라이언트를 식별할 수 있게 됨.

 

즉, 쿠키는 클라이언트 식별 기술.

 

 

3. 쿠키의 생성

Cookie cookie = new Cookie("id", "asdf"); // 쿠키 생성
cookie.setMaxAge(60*60*24); // 유효기간 설정(초)
response.addCookie(cookie); // 응답에 쿠키 추가

(서버에서 실행되는 코드)

 

 

응답헤더)

HTTP/1.1 200
Set-Cookie: id=asdf; Max-Age=86400; Expires=Tue, 16-Nov-2021 11:12:15 GMT
Content-Type : text/html; charset=UTF-8
Content-Language: ko-KR
Content-Length: 175
Date: Mon, 15 Nov 2021 11:12:15 GMT

(Max-Age=86400; 는 상대시간,

Expires=Tue, 16-Nov-2021 11:12:15 GMT 는 절대시간이다.)

 

이렇게 해서 쿠키가 생성되고 브라우저에 저장이 된다.

 

 

4. 쿠키의 삭제와 변경

 

쿠키의 삭제)

Cookie cookie = new Cookie("id", ""); // 변경할 쿠키와 같은 이름의 쿠키를 생성
cookie.setMaxAge(0); // 유효기간을 0으로 설정(삭제)
response.addCookie(cookie); // 응답에 쿠키 추가

 

쿠키의 변경)

Cookie cookie = new Cookie("id", ""); // 변경할 쿠키와 같은 이름의 쿠키 생성.
cookie.setValue(URLEncoder.encode("홍길동")); // 값의 변경
cookie.setDomain("www.fastcampus.co.kr"); // 도메인의 변경
cookie.setPath("/ch2"); // 경로의 변경
cookie.setMaxAge(60*60*24*7); // 유효기간의 변경
response.addCookie(cookie); // 응답에 쿠키 추가

 

5. 쿠키 읽어오기

Cookie[] cookies = request.getCookies(); // 쿠키 읽기, 없으면 null

for(Cookie cookie : cookies) {
	String name = cookie.getName();
    String value = cookie.getValue();
    
    System.out.printf("[cookie]name=%s, value=%s%n", name, value);
}

 

JSP 에서 쿠키에 저장된 값을 사용하려면

${cookie.id.value} 과 같이 el을 활용하면 된다.

cookie에 "id" 라는 이름으로 저장된 value를 의미한다. 

 

 

세션(Session) - 이론

 

1. 세션이란?

서로 관련된 요청, 응답들을 하나로 묶은 것 - 쿠키를 이용

browser마다 개별 저장소(session객체)를 서버에서 제공, 서버에 저장

 

 

2. 세션의 생성 과정

첫 요청 -> 서버에서 무조건 세션 객체(저장소)를 생성, 세션 ID를 가지게 됨

응답헤더의 쿠키에 세션 ID를 담아서 브라우저로 전송함. 브라우저에서 쿠키를 저장.

 

그 다음 요청부터는 쿠키에 세션 ID가 같이 전송되고 서버는 세션ID를 통해 같은 브라우저에서 온 요청인지 구별함.

세션 ID가 일치하는 세션 저장소를 사용할 수 있게 됨.

 

(브라우저가 다르면 세션 ID도 다름)

 

 

3. 세션 객체 얻기

 

컨트롤러에서 

HttpSession session = request.getSession();
session.setAttribute("id","asdf");

다음과 같이 request 객체로부터 세션 객체를 만들고 데이터를 저장할 수 있음. (서버에서 세션 ID가 일치하는 객체에 저장하게 됨)

 

 

4. 세션과 관련된 메소드

 

 

5. 세션의 종료

 

수동 종료)

HttpSession session = request.getSession();
session.invalidate(); // 세션을 즉시 종료
session.setMaxInactiveInterval(30*60); // 예약 종료(30분 후)

 

자동 종료 - web.xml

<session-config>
	<session-timeout>30</sesstion-timeout>
</session-config>

(분 단위, 이 경우에는 30분)

 

 

StandardManager가 timeout된 세션 객체를 자동으로 제거함

그래도 Session을 많이 사용하면 서버에 부담이 되기 때문에 최소한으로 사용해야 한다

 

 

 

6. 쿠키 vs 세션

 

* 쿠키를 허용하지 않는 브라우저는

<c:url> 태그를 사용하면 url에 jsession id를 자동으로 붙여서 요청을 하게 된다.

 

 

3. 세션을 시작할까?

 

세션은 서버에 부담이 많이 가기 때문에 세션 유지기간을 가능한 짧게 해야 한다.

 

session = "true"     ->  세션 없을 때 세션을 생성함.

session = "false"    ->  세션 없을 때 세션을 생성하지 않음.

 

세션이 있을때는 true나 false의 차이가 없음. 두 경우 모두 추가 세션을 만들지 않음.

다만 세션이 없을 때 생성하느냐 마느냐의 차이인데,

세션이 필요없는 페이지에서는 세션이 없어도 생성할 필요가 없기 때문에 false로 설정하는게 좋다.

 

 

+ Recent posts