Day 89

dokiru·2023년 6월 2일
0

학원

목록 보기
48/51

: 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";
	}
  1. @CookieValue를 사용하는 경우
	@RequestMapping("/readCookieValue")
	public String readCookieValue(@CookieValue("userId") String userId,
								  @CookieValue("ck1") String ckStr) {
		System.out.println(userId);
		System.out.println(ckStr);
		return "readCookie";
	}

결과

Properties

: 하드코딩된 값들을, (= 설정에 필요한 값들을) 설정하고 읽어들이기 위함. 한 파일에서 관리할 수 있고 서버 환경마다 값을 다르게 처리하여 효율적으로 관리할 수 있다는 장점

폴더구조

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 체크 후 설치 진행

  • 설치 이전에는 한글이 유니코드로 변환돼서 저장되었지만 설치 이후에 한글이 그대로 보이는 모습


Message Source

: 메세지 국제화를 제공하는 인터페이스 (사용자의 브라우저를 기준으로, 설정 언어를 기준으로 맞춤 언어를 제공하는 기능)

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>

getMessage

: messageSource객체에서 로컬라이징된 메세지 얻기

getMessage(String code, @Nullable Object[] args, Locale locale)

  • 객체 배열을 만들어서 getMessage 메소드의 args 파라미터의 위치에 넣어주면 {0}, {1}의 순서에 맞게 들어가는 모습 !


  • Controller에서 locale을 불러와서 브라우저의 기준 언어가 무엇인지 확인, 메세지를 다르게 보여줄 수 있음

  • locale.ENGLISH로 설정해주면 브라우저 언어 설정이 영어가 아닐때도 property01_en.properties 파일 안에 들어있는 com.main.welcome의 값을 확인할 수 있음!

브라우저 언어 설정이 한국어일때의 화면

브라우저 언어 설정이 영어일때의 화면

전체 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

profile
안녕하세요!

0개의 댓글