쿠키를 이용한 상태정보 유지하기 - accidentlywoo/legacyVue GitHub Wiki

쿠키를 이용한 상태정보 유지하기

  • 들어가기 전에 이번 시간엔 예제를 통해 쿠키에 대한 사용방법을 알아보도록 하겠습니다.

학습 목표

  1. 웹 어플리케이션에서 쿠키를 사용할 수 있습니다.
  2. Spring MVC의 CookieValue 애노테이션을 이용해 쿠키값을 읽어 들일 수 있습니다.

핵심 개념

  • javas.servlet.http.Cookie
  • @CookieValue

학습하기

실습코드

`package kr.or.connect.guestbook.controller;

import java.util.ArrayList; import java.util.List;

import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam;

import kr.or.connect.guestbook.dto.Guestbook; import kr.or.connect.guestbook.service.GuestbookService;

@Controller public class GuestbookController { @Autowired GuestbookService guestbookService;

@GetMapping(path="/list")
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
				   ModelMap model,
                   HttpServletRequest request,
				   HttpServletResponse response) {

    
	String value = null;
	boolean find = false;
	Cookie[] cookies = request.getCookies();
	if(cookies != null) {
		for(Cookie cookie : cookies) {
			if("count".equals(cookie.getName())) {
				find = true;
				value = cookie.getValue();
			}
		}
	}
	
  
	if(!find) {
		value = "1";
	}else { // 쿠키를 찾았다면.
		try {
			int i = Integer.parseInt(value);
			value = Integer.toString(++i);
		}catch(Exception ex) {
			value = "1";
		}
	}
	

	Cookie cookie = new Cookie("count", value);
	cookie.setMaxAge(60 * 60 * 24 * 365); // 1년 동안 유지.
	cookie.setPath("/"); // / 경로 이하에 모두 쿠키 적용. 
	response.addCookie(cookie);
	
	
	List<Guestbook> list = guestbookService.getGuestbooks(start);
	
	int count = guestbookService.getCount();
	int pageCount = count / GuestbookService.LIMIT;
	if(count % GuestbookService.LIMIT > 0)
		pageCount++;
	
	List<Integer> pageStartList = new ArrayList<>();
	for(int i = 0; i < pageCount; i++) {
		pageStartList.add(i * GuestbookService.LIMIT);
	}
	
	model.addAttribute("list", list);
	model.addAttribute("count", count);
	model.addAttribute("pageStartList", pageStartList);
	model.addAttribute("cookieCount", value); // jsp에게 전달하기 위해서 쿠키 값을 model에 담아 전송한다.
	
	return "list";
}

@PostMapping(path="/write")
public String write(@ModelAttribute Guestbook guestbook,
					HttpServletRequest request) {
	String clientIp = request.getRemoteAddr();
	System.out.println("clientIp : " + clientIp);
	guestbookService.addGuestbook(guestbook, clientIp);
	return "redirect:list";
}

}` list.jsp 에서 방명록 전체 수 옆에 방문한 수를 출력하는 el코드를 추가합니다.

  • 방명록 전체 수 : ${count}
  • 방문한 수 : ${cookieCount}

위의 코드를 Spring MVC가 제공하는 CookieValue애노테이션을 이용해 수정한 소스를 보도록 하겠습니다. `package kr.or.connect.guestbook.controller;

import java.util.ArrayList; import java.util.List;

import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam;

import kr.or.connect.guestbook.dto.Guestbook; import kr.or.connect.guestbook.service.GuestbookService;

@Controller public class GuestbookController { @Autowired GuestbookService guestbookService;

@GetMapping(path="/list")
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
				   ModelMap model, @CookieValue(value="count", defaultValue="1", required=true) String value,
				   HttpServletResponse response) {
	
    // 쿠키 값을 1증가 시킨다.
	try {
		int i = Integer.parseInt(value);
		value = Integer.toString(++i);
	}catch(Exception ex){
		value = "1";
	}
	
    // 쿠키를 전송한다.
	Cookie cookie = new Cookie("count", value);
	cookie.setMaxAge(60 * 60 * 24 * 365); // 1년 동안 유지.
	cookie.setPath("/"); // / 경로 이하에 모두 쿠키 적용. 
	response.addCookie(cookie);
	
	List<Guestbook> list = guestbookService.getGuestbooks(start);
	
	int count = guestbookService.getCount();
	int pageCount = count / GuestbookService.LIMIT;
	if(count % GuestbookService.LIMIT > 0)
		pageCount++;
	
	List<Integer> pageStartList = new ArrayList<>();
	for(int i = 0; i < pageCount; i++) {
		pageStartList.add(i * GuestbookService.LIMIT);
	}
	
	model.addAttribute("list", list);
	model.addAttribute("count", count);
	model.addAttribute("pageStartList", pageStartList);
	model.addAttribute("cookieCount", value); // 쿠키를 추가한다.
	
	return "list";
}

@PostMapping(path="/write")
public String write(@ModelAttribute Guestbook guestbook,
					HttpServletRequest request) {
	String clientIp = request.getRemoteAddr();
	System.out.println("clientIp : " + clientIp);
	guestbookService.addGuestbook(guestbook, clientIp);
	return "redirect:list";
}

}`

생각해보기

  1. HttpServletRequest는 특정 이름의 Cookie를 구하는 메소드를 가지고 있지 않습니다.
  2. 그렇기 때문에, 특정 이름의 쿠키를 구하여면 반복문을 이용해 원하는 이름의 쿠키가 있는지 찾아야 합니다.
  3. CookieValue애노테이션을 이용하면 쉽게 특정 이름의 쿠키 값을 구할 수 있습니다.
  4. 불편한 느낌의 코드가 있다면, 어떻게 개선해야 할지 이미 개선된 다른 방법이 있는지 찾아보세요.
⚠️ **GitHub.com Fallback** ⚠️