Spring

스프링 Cookie 활용방법(jsp방식보다 훨신간편) @CookieValue 예제

shika 2022. 1. 27. 23:05

이번에는 Cookie활용법에 대해서 알아보자

 

쿠키의 개념은 사진으로 살펴보자

브라우저가 서버에게 전달해주는것이 쿠키 response를 사용해야되겠죠?

Cookie는 일반 jsp에서 사용하는 방식과 

Spring에서 쿠키를 처리하는 방식

 

크게 2가지로 나뉜다.

 

내용을 살펴보면 알겠지만 spring에서의 Cookie활용방법이

훨신훨신 더 간편하고 내가 원하는 정보만을 뽑아서 사용할수 있어

편리하다.(꼭 스프링쿠키어노테이션 활용하자 @CookieValue)

 

쿠키는 일단 컨트롤러만 살펴보면 대략 감을 잡을 수 있을것이다.

load_cookie는 jsp방식

********** load_cookie2는 spring방식 **********

@Controller
public class TestController {
	//서버에서 쿠키를 저장하는건 아님(쿠키는 String만 가능하고 encoding decoding 필수!!)
	@GetMapping("/save_cookie") //파라미터에 넣은것은 reqeust아니고 response임!!
	public String save_cookie(HttpServletResponse response) {
		try {
			String data1 = URLEncoder.encode("문자열1","UTF-8"); //한글 들어가면 무조건 인코딩해야된다
			String data2 = URLEncoder.encode("문자열2","UTF-8");
			
			Cookie cookie1 = new Cookie("cookie1", data1);
			Cookie cookie2 = new Cookie("cookie2", data2);
			
			cookie1.setMaxAge(365 * 24 *60 * 60); //초단위로 적는다
			cookie2.setMaxAge(365 * 24 *60 * 60);
			
			response.addCookie(cookie1);
			response.addCookie(cookie2);
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		return "save_cookie";
	}
	
	@GetMapping("/load_cookie") //원래 jsp에서 쓰는방식 하나하나 모든 쿠키를 확인해야되므로 번거롭다
								//스프링에서 하는방식은 밑에 load_cookie2에서 살펴보자
	public String load_cookie(HttpServletRequest request) {
		//쿠키정보는 좋든싫든 쓰든안쓰든 무조건 브라우져는 서버로 쿠키정보를 보내준다.
		//우리는 그것을 받아다 쓰기만 하면된다(spring을 쓸때와 안쓸떄 쿠키처리 방법이 다를뿐)
		try {
			Cookie[] cookies = request.getCookies(); //쿠키를 원하는것 몇개만쓰고싶어도 모든 쿠키가 날아오니 다 선별해서 사용해야한다(그러니 배열로받음)
			for(Cookie cookie : cookies) {
				String str = URLDecoder.decode(cookie.getValue(), "UTF-8");
				//인코딩 디코딩 전부 다해주어야한다.
				if(cookie.getName().equals("cookie1")) {
					System.out.println("cookie1 : "+str);
				} else if (cookie.getName().equals("cookie2")) {
					System.out.println("cookie2 : "+str);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return "load_cookie";
	}
	
	@GetMapping("load_cookie2") //*****spring cookie방식****** 위에꺼보다 간편
	public String load_cookie2(@CookieValue("cookie1")String cookie1,
				@CookieValue("cookie2")String cookie2) { 
		//스프링에서는 파라미터로 쿠키받을수있음!! *디코딩*도 자동으로된다
		//jsp방식과는 다르게 원하는 쿠키만을 뽑아올수 있고, 쿠키이름을 통해 뽑아올수 있다.
		System.out.println("cookie1 : "+cookie1);
		System.out.println("cookie2 : "+cookie2);
		return "load_cookie2";
	}
}

방식부터 살펴보자.

먼저 save_cookie 와 [ load_cookie(jsp방식)  vs load_cookie2 (spring방식) ]으로 살펴보자

save_cookie내용은 뒤에껄 뭘 쓰든 알아야 된다는 말씀!

 

save_cookie내용 -

처음에 response를 이용해서 쿠키를 브라우져에 저장해주어야한다. (request아님! response!!!)

한글사용시 인코딩 디코딩이 필수이므로 try catch문을 사용해서

인코딩을 시켜준다.

그리고 Cookie객체 생성 후 정보를 넣고

cookie.setMaxAge를 이용해 쿠키수명을 적는다(초 단위로 적을것! ) ex) 60*60*24  하루겟죠?

그리고 response에 다시 넣어준다.

 

그 다음 jsp방식에서 받아서? 쓰는것을 간단히 보면

스프링 어노테이션을 사용하지않으면 쿠키를 원하는것만 받는것은 불가하다

(모든 쿠키가 내 의지와는 상관없이 전부 다 날아온다)

그 쿠키들을 배열로 받고 내가 원하는 것을 사용하려면

모든 것을 다 확인후에 사용해야한다(어떤것이 내가 원하는것인지 모르므로 전부다 확인해야됨)

물론 디코딩도 전부다 필수로 진행해 주어야한다.

상당히 번거롭다고 할 수 있다.

 

그에 반면에 

spring을 이용한

@CookieValue를 이용하면

내가 원하는 쿠키를 선택해서 받아서 사용할 수 있다.

(굳이 배열로 받고 전부 다 확인하고 디코딩하고 이런거 다 안해도됨!)

public String load_cookie2(@CookieValue("cookie1")String cookie1,
@CookieValue("cookie2")String cookie2) {  //이렇게 파라미터에 넣고 사용하자

 

그러면 바로 쿠키사용이 가능하고 디코딩도 바로 된다.

그냥 사용하기만 하면된다.

코드가 그냥 90퍼는 줄었다

 

이렇게 스프링의 쿠키사용이 간편하다

무조건 스프링 어노테이션을 통해 쿠키를 사용하자 땅땅땅