: HTTP의 일종으로 인터넷 사용자가 웹 사이트 방문시, 그 사이트가 사용하고 있는 서버를 통해 사용자의 pc에 설치되는 작은 기록 정보 (사이트에 종속되는 데이터 조각?)
: session은 서버, cookie는 클라이언트 쪽에 값을 저장
: ex. 비회원 장바구니, 팝업창 일주일간 보지 않기, 로그인한 아이디 기억 등등..
ex. cookie 저장하기
@RequestMapping("/newCookie")
public String newCookie(HttpServletResponse response) {
// 쿠키는 response에 담아서 보내기
try {
String ck1_str = URLEncoder.encode("넘긴 쿠키", "UTF-8");
String ck2_str = URLEncoder.encode("서버에서userId", "UTF-8");
// 문자 그대로 넘기면 인식못해서 오류 발생 -> 인코딩 과정 거쳐야함
// exception 발생할 수 있어서 try-catch 문으로 감싸줘야함
Cookie ck1 = new Cookie("ck1", ck1_str);
Cookie ck2 = new Cookie("userId", ck2_str);
// 20분
ck1.setMaxAge(60 * 20);
// 24시간
ck2.setMaxAge(60 * 60 * 24);
response.addCookie(ck1);
response.addCookie(ck2);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "newCookie";
}
=> storage에 userId와 ck1이 저장된 모습
ex. cookie 불러오기
1. Cookie 배열 받아오는 경우
@RequestMapping("/readCookie")
public String readCookie(HttpServletRequest request ) {
// 넘어온 쿠키를 읽어..
// 쿠키 배열을 받는 getCookies
Cookie[] cookies = request.getCookies();
try {
for (Cookie ck : cookies) {
// encode해서 넣어줘야하는거처럼 decode해서 값 불러오기
String ck_value = URLDecoder.decode(ck.getValue(), "UTF-8");
System.out.println(ck.getName() + " : " + ck_value);
}
} catch(Exception e) {
}
return "readCookie";
}
@RequestMapping("/readCookieValue")
public String readCookieValue(@CookieValue("userId") String userId,
@CookieValue("ck1") String ckStr) {
System.out.println(userId);
System.out.println(ckStr);
return "readCookie";
}
결과
: 하드코딩된 값들을, (= 설정에 필요한 값들을) 설정하고 읽어들이기 위함. 한 파일에서 관리할 수 있고 서버 환경마다 값을 다르게 처리하여 효율적으로 관리할 수 있다는 장점
폴더구조
servlet-context.xml에 beans 추가
<!-- Properties Message 처리 관련 설정 -->
<!-- 애초에 프로퍼티 파일을 읽어와서 쓰겠다는거기 때문에 파일명 뒤에 확장자는 생략해도 됨 -->
<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
<!-- property01로 시작하는 파일을 불러오겠다 ex.property01_en, property01_ko -->
<beans:property name="basename" value="/WEB-INF/properties/property01"></beans:property>
</beans:bean>
+ 여러개의 properties 파일을 불러와야 하는 경우
<!--n개 등록 -->
<beans:property name="basenames">
<beans:list>
<beans:value>/WEB-INF/properties/파일이름1</beans:value>
<beans:value>/WEB-INF/properties/파일이름2</beans:value>
<beans:value>/WEB-INF/properties/파일이름3</beans:value>
</beans:list>
</beans:property>
MainController
package com.app.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@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) {
model.addAttribute("mainTitle", mainTitle);
model.addAttribute("engVar", engVar);
model.addAttribute("cnt1", cnt1);
System.out.println(mainTitle);
System.out.println(engVar);
System.out.println(cnt1);
return "main";
}
}
Main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${mainTitle} <hr/>
${engVar} <hr/>
${cnt1} <hr/>
</body>
</html>
/main에서 properties에 담긴 값들이 보이는 모습
+ properties 한글 인코딩 software
eclipse에서 Help -> Install New Software
propertiesEditor 체크 후 설치 진행
설치 이전에는 한글이 유니코드로 변환돼서 저장되었지만 설치 이후에 한글이 그대로 보이는 모습
: 메세지 국제화를 제공하는 인터페이스 (사용자의 브라우저를 기준으로, 설정 언어를 기준으로 맞춤 언어를 제공하는 기능)
servlet-context.xml에 beans 추가
<!-- 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
형식으로 파일 추가
msgPage.jsp
: jsp 상단에 메세지를 불러올 수 있는 태그 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>msgPage</h1>
<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>
</body>
</html>
: messageSource객체에서 로컬라이징된 메세지 얻기
getMessage(String code, @Nullable Object[] args, Locale locale)
브라우저 언어 설정이 한국어일때의 화면
브라우저 언어 설정이 영어일때의 화면
전체 Controller 코드
package com.app.controller;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MsgController {
//Auto 자동 wired 끈으로묶기
//스프링에 등록된 Bean 객체를 자동으로 맵핑시켜주는 어노테이션
@Autowired
ReloadableResourceBundleMessageSource messageSource;
@RequestMapping("/msgPage")
public String msgPage(Model model, Locale locale) {
String m1 = messageSource.getMessage("com.main.title", null, null);
String m2 = messageSource.getMessage("com.main.var1", null, null);
String m3 = messageSource.getMessage("com.main.cnt1", null, null);
System.out.println(m1);
System.out.println(m2);
System.out.println(m3);
// args에 객체 배열들을 넣어서 properties 파일에 {0}, {1} 부분에 순서대로 들어가게 함
Object[] args = {"고객", "아주 좋은"};
String m4 = messageSource.getMessage("com.main.userWelcome", args, null);
Object[] args2 = {"손", "그저그런"};
String m5 = messageSource.getMessage("com.main.userWelcome", args2, null);
System.out.println(m4);
System.out.println(m5);
//화면 단에서 args를 사용해서 환경마다 다르게 띄워야하기 때문에 model에 저장해준다
model.addAttribute("args", args);
model.addAttribute("args2", args2);
// ex. ko_KR, en_US
System.out.println(locale);
// locale 값을 받아서 넣어주면 spring에서 properties에 있는 맞는 언어 파일을 찾아줌..
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);
return "msgPage";
}
}
출처
https://velog.io/@yu-jin-song/Spring-MessageSource
https://kim-jong-hyun.tistory.com/26