쿠키를 이용한 상태정보 유지하기 - accidentlywoo/legacyVue GitHub Wiki
- 들어가기 전에 이번 시간엔 예제를 통해 쿠키에 대한 사용방법을 알아보도록 하겠습니다.
- 웹 어플리케이션에서 쿠키를 사용할 수 있습니다.
- 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";
}
}`
- HttpServletRequest는 특정 이름의 Cookie를 구하는 메소드를 가지고 있지 않습니다.
- 그렇기 때문에, 특정 이름의 쿠키를 구하여면 반복문을 이용해 원하는 이름의 쿠키가 있는지 찾아야 합니다.
- CookieValue애노테이션을 이용하면 쉽게 특정 이름의 쿠키 값을 구할 수 있습니다.
- 불편한 느낌의 코드가 있다면, 어떻게 개선해야 할지 이미 개선된 다른 방법이 있는지 찾아보세요.