Day086

RISK_TAKER·2023년 6월 2일
0

쿠키(Cookie)

사용자쪽에 저장된다.(세션 : 서버쪽에 저장)
사용자가 직접 접속한 사이트에 종속된 공간
팝업 1주일간~~보지않기, 이런거 처리용도
장바구니 - 현재까지 장바구니에 담은 아이템 저장 용도
(로그인하지 않고 장바구니에 담은 경우 장바구니에 담은 아이템 쿠키에 저장해놓는다.)
스프링 어노테이션으로 쿠키를 가져오는 경우 특수문자, 한글은 표현이 제대로 되지 않는 경우가 있어서 사용을 자제해야 한다.
사용자가 개발자 도구를 열어서 쿠키를 확인할 경우 어떤 값인지 알지 못하도록 하는 것이 좋다.

쿠키를 생성 & 저장된 쿠키 값을 가져와서 사용하는 방법

@Controller
public class CookieController {

	@RequestMapping("/newCookie")
	public String newCookie(HttpServletResponse response) {

		//쿠키는 response에 담아서 보내야 한다.
		//넘기기 전 url encoding 과정을 거쳐야 한다.
		
		try {
			String ck1_str = URLEncoder.encode("넘긴 쿠키", "UTF-8");
			String ck2_str = URLEncoder.encode("서버에서userid쿠키", "UTF-8");
			
			Cookie ck1 = new Cookie("ck1", ck1_str);
			Cookie ck2 = new Cookie("userId", ck2_str);
			
			//쿠키의 유효시간 설정하기(s)
			ck1.setMaxAge(60 * 20); //20m
			ck2.setMaxAge(60 * 60 * 24); //1h * 24 = 1d
			
			response.addCookie(ck1);
			response.addCookie(ck2);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return "newCookie";
	}
	
	@RequestMapping("/readCookie")
	public String readCookie(HttpServletRequest request) {
		
		String value = CookieUtils.findCookie(request, "userId");
		
		Cookie[] cookies = request.getCookies();
		String value2 = CookieUtils.findCookie(cookies, "userId"); // 이 기능을 추가로 제공하는 형태로 변경
		String value3 = CookieUtils.findCookie(request, "ck1");
		String value4 = CookieUtils.findCookie(cookies, "JSESSIONID");
		
		if(value == null) {
			System.out.println("해당 쿠키가 없는 경우 로직");
		}
		
		System.out.println("request로 찾은 userid 쿠키 값 : " + value);
		System.out.println("cookie[]로 찾은 userid 쿠키 값 : " + value2);
		System.out.println("request로 찾은 ck1 값 : " + value3);
		System.out.println("cookie[]로 찾은 JSESSION 값 : " + value4);
		
		return "readCookie";
	}
	
	//쿠키를 가져올 수 있는 스프링 어노테이션
	@RequestMapping("/readCookieValue")
	public String readCookieValue(@CookieValue("userId") String userId,
								  @CookieValue(name = "ck1", defaultValue = "") String ckStr) {
		
		System.out.println(userId);
		System.out.println(ckStr);
		return "readCookie";
	}
}

저장된 쿠키를 디코딩해서 값을 넘겨주는 Util 관련 코드

public class CookieUtils {

	// 리팩토링 케이스 1.
	public static String findCookie(HttpServletRequest request, String cookieName) {

		Cookie[] cookies = request.getCookies();
		return findCookie(cookies, cookieName);
	}

	public static String findCookie(Cookie[] cookies, String cookieName) {
		try {
			for (Cookie ck : cookies) {
				if (ck.getName().equals(cookieName)) {
					String ck_value = URLDecoder.decode(ck.getValue(), "UTF-8");
					return ck_value;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}

		return null;
	}

	// 리팩토링 케이스 2.
	/*
	 * public static String findCookie(HttpServletRequest request, String
	 * cookieName) {
	 * 
	 * Cookie[] cookies = request.getCookies(); return findCookieValue(cookies,
	 * cookieName); }
	 * 
	 * public static String findCookie(Cookie[] cookies, String cookieName) { return
	 * findCookieValue(cookies, cookieName); }
	 * 
	 * //getCookieName public static String findCookieValue(Cookie[] cookies, String
	 * cookieName) {
	 * 
	 * try { for (Cookie ck : cookies) { if(ck.getName().equals(cookieName)) {
	 * String ck_value = URLDecoder.decode(ck.getValue(), "UTF-8"); return ck_value;
	 * } } } catch (Exception e) { // TODO: handle exception }
	 * 
	 * return null; }
	 */
}

properties

  • http://propedit.sourceforge.jp/eclipse/updates
    저장은 변환된 코드로 저장하되 우리가 보는 properties 파일에서는 한글로 볼 수 있게 해준다.
    이클립스 -> Help -> Install New Software -> Add
    (ppedit이란 이름으로 install 실행)

  • webapp/WEB-INF/spring/appServlet/servlet-context.xml 아래에 다음의 코드를 추가한다.

	<!-- Properties Message 처리 관련 설정 -->
	<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
		<beans:property name="basename" value="/WEB-INF/properties/property01"></beans:property>
	</beans:bean>
	
	<beans:bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
		<beans:constructor-arg ref="messageSource"></beans:constructor-arg>
	</beans:bean>

properties 파일 생성하기

프로젝트 WEB-INF/properties 폴더 생성
property01.properties 파일 생성

  • 모든 페이지에서 사용되는 경우 프로퍼티에 등록해서 사용한다.
    ex)일반적인 안내 메시지 등을 등록해놓고 가져다가 사용한다.

  • Bean객체를 자동으로 맵핑시켜주는 어노테이션

	@Autowired
	ReloadableResourceBundleMessageSource messageSource;
  • property파일 작성하는 방법
  com.main.title=사이트제목
  com.main.var1=englishVar
  com.main.cnt1=450
  com.main.welcome=안녕하세요! 어서오세요!
  com.main.userWelcome={0}님 반갑습니다~! {1} 사이트입니다.

view 페이지에서 보여줄 값을 넘겨주는 방법

	Object[] args = {"고객", "아주 좋은"};
	Object[] args2 = {"손", "그저 그런"};
	String m4 = messageSource.getMessage("com.main.userWelcome", args, null);
	String m5 = messageSource.getMessage("com.main.userWelcome", args2, null);
		
	//model.addAttribute("m4", m4); //얘를 넣어주면 안된다.
	model.addAttribute("args", args);
	model.addAttribute("args2", args2);

view 페이지에서 값을 전달받아 출력하는 방법

  • 아래의 taglib를 추가해준다.
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  
  • 넘겨 받은 값을 출력하는 부분
	<p><spring:message code="com.main.title"/></p>
	<p><spring:message code="com.main.var1"/></p>
	<p><spring:message code="com.main.cnt1"/></p>
	
	<p><spring:message code="com.main.welcome"/></p>
	<!-- 화면에서는 브라우저의 언어 설정에 따라 달리 출력된다. -->
	<p><spring:message code="com.main.userWelcome" arguments="${args}"/></p>
	<p><spring:message code="com.main.userWelcome" arguments="${args2}"/></p>

locale, 지역 정보를 가져오는 방법

//Locale locale을 넣어 준다.
public String msgPage(Model model, Locale locale) {
	//Locale, 지역정보를 출력
	System.out.println(locale);
    
    String msg_ko = messageSource.getMessage("com.main.welcome", null, locale);
    String msg_en = messageSource.getMessage("com.main.welcome", null, locale.ENGLISH);; //강제로 지정하는 방법
    
    System.out.println(msg_ko);
	System.out.println(msg_en);
  • property 파일명 뒤에 _ko, _en를 붙여주면 Spring이 알아서 지역정보를 매칭해준다.
    ex) property01_ko.properties, property01_en.properties

위와 같은 스프링 설정없이 property파일을 사용하려면 다음 코드와 같이 사용해야 한다.

@Controller
@PropertySource("WEB-INF/properties/property01.properties")
@PropertySource("WEB-INF/properties/db.properties")
@PropertySource( value = {
		("WEB-INF/properties/property01.properties"),
		("WEB-INF/properties/db.properties")
})
public class MainController {

	@Value("${com.main.title}")
	String mainTitle;
	
	@Value("${com.main.var1}")
	String engVar;
	
	@Value("${com.main.cnt1}")
	int cnt1;
	
	@Value("${db.userId}")
	String dbUserId;
	
	@RequestMapping("/main")
	public String main(Model model) {
		
		//jsp페이지에서 아래와 같이 모델에 담아 사용하지 않으려면 따로 설정이 필요하다.
		model.addAttribute("mainTitle", mainTitle);
		model.addAttribute("engVar", engVar);
		model.addAttribute("cnt1", cnt1);
		
		System.out.println(mainTitle);
		System.out.println(engVar);
		System.out.println(cnt1);
		
		System.out.println(dbUserId);
		
		
		return "main";
	}
}
	<!-- view 페이지에서 출력하는 부분 -->
	${mainTitle}<hr/>
	${engVar}<hr/>
	${cnt1}<hr/>

0개의 댓글