자바 웹 개발 시작하기 (7주차 : 국제화,...

25
자바 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리) 2011. 12. 09 DEVELOPMENT #2 이덕곤

Upload: dk-lee

Post on 20-Dec-2014

464 views

Category:

Technology


2 download

DESCRIPTION

Java web development 07 자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리) 2011. 12. 09 벌써 2년도 넘은 자료지만 그래도 필요하신분이 있을지 몰라서... (지금보니 2년사이 많은것을 배운것 같네요 ㅎㅎ)

TRANSCRIPT

자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)

2011. 12. 09

DEVELOPMENT #2

이덕곤

§  간단한 게시판을 커뮤니티를 만들어보자!

§  DataBase : MySQL, JDBC, DBCP

§  하이버네이트, 기초 쿼리(CRUD)

§  Transaction(TX)

§  쿠키와 세션

§  커뮤니티 프로젝트의 시작

§  로그인과 테스트와 국제화, 검증, 예외처리

§  jUnit : 단위 테스트 전략 알아보기(다음시간)

§  세션과 로그인 처리

§  국제화 : I18N

§  Validation

§  예외처리 : Exception

§  과제 : 국제화된 커뮤니티로 만들어 오기

§  세션에 사용자 정보를 담아서 인증합니다

§  세션 객체를 제작

§  저장할 정보 §  로그인 여부 : boolean

§  사용자 번호 : int

§  아이디 : String

§  이름 : String

§  별명 : String

§  전자우편 : String

package com.starpl.study.base.bean;

public class UserSession

{

private boolean logged;

private int userIdx;

private String userName;

private String nickName;

private String userId;

private String email;

public int getUserIdx() {

return userIdx;

}

public void setUserIdx(int userIdx) {

this.userIdx = userIdx;

}

}

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="customArgumentResolvers"> <list> <bean class="com.starpl.study.base.aop.GlobalArgumentResolver" /> </list> </property> <property name="messageConverters"> …… </property> </bean> <mvc:interceptors> <bean class="com.starpl.study.base.aop.RequestInterceptor" /> </mvc:interceptors>

package com.starpl.study.base.aop;

public class GlobalArgumentResolver implements WebArgumentResolver { @Override public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) { if (UserSession.class == methodParameter.getParameterType()) { HttpSession session = (HttpSession) webRequest.getSessionMutex(); if (session != null) { UserSession userSession = (UserSession) session.getAttribute("userSession"); if (userSession != null) { return userSession; } else { return new UserSession(); } } } return UNRESOLVED; } }

package com.starpl.study.base.aop;

public class RequestInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); UserSession userSession = (UserSession) session.getAttribute("userSession"); if (userSession != null) { request.setAttribute("_USER", userSession); } else { request.setAttribute("_USER", userSession = new UserSession()); } return true; } }

§  확인 : 시스템 구성 단위가 목표한 대로 동작하기 위한 작업으로, 시스템의 모든 계층에 꼭 필요함

§  JSR 303 Bean Validation §  도메인 객체를 확인하기 위한 Java 표준 기술

§  어노테이션으로 확인 규칙을 명시

§  hibernate-validator-4.2.0.Final.jar

§  validation-api-1.0.0.GA.jar

§  스프링 폼 태그와 연동

<bean id="validator“ class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="validationMessageSource" ref="messageSource" /> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="customArgumentResolvers"> …… </property> <property name="messageConverters"> …… </property> <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> </bean> </property> </bean>

package com.starpl.study.model.domain;

public class UserJoinCommand

{

@Length(min = 4, max = 16) private String userId;

@Length(min = 4, max = 16) private String userName;

@Length(min = 4, max = 16) private String nickName;

@Length(min = 4, max = 16) private String userPassword;

@Length(min = 4, max = 16) private String userPassword2;

@Email @NotBlank private String email;

// getter, setter 정의

}

@RequestMapping(value = { "/join" }, method = RequestMethod.POST)

public String joinUser(HttpServletRequest request, Model model, @Valid UserJoinCommand userJoinCommand, BindingResult result)

{

// @Valid 수행 후 에러가 있으면

if (result.hasErrors())

{

// 다시 가입폼으로 보내줍니다.

return viewBase + "/join";

}

…… // 이상이 없으면 가입 처리

}

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <style> .form-item { margin: 20px 0; } .form-label { font-weight: bold; } .form-error-field { background-color: #FFC; } .form-error-message { font-weight: bold; color: #900; } </style> <form:form commandName="userJoinCommand"> <div class="form-item"> <div class="form-label">userId:</div> <form:input path="userId" size="20" cssErrorClass="form-error-field"/> <div class="form-error-message"><form:errors path="userId" /></div> </div> </form:form>

§  선택이 아닌 필수

§  properties 파일에 저장

§  messages_en.properties

§  messages_ko.properties

§  Properties Editor 플러그인 필요

§  이클립스 마켓에서 다운

§  properties 파일을 ascii값으로 변경

§  "안녕하세요“ 변경하면… "\uc548\ub155\ud558\uc138\uc694"

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="defaultEncoding" value="UTF-8"/> <property name="basename" value="/WEB-INF/view/i18n/messages" /> </bean> <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor"> <constructor-arg ref="messageSource" /> </bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <bean class="com.starpl.study.base.aop.RequestInterceptor" /> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />

§  messages_en.properties §  org.hibernate.validator.constraints.NotBlank.message=Can not be empty.

§  org.hibernate.validator.constraints.Length.message =length must be between {2} and {1}.

§  already_login_err=Have already Logined.

§  not_login_err=No login information.

§  messages_ko.properties §  org.hibernate.validator.constraints.NotBlank.message=비워둘 수 없습니다.

§  org.hibernate.validator.constraints.Length.message =길이는 {2}와 {1} 사이 여야합니다.

§  already_login_err=이미 로그인 되어 있습니다.

§  not_login_err=로그인 정보가 없습니다.

§  자바에서 사용하기 §  @Autowired private MessageSourceAccessor msa;

§  msa.getMessage("not_login_err");

§  JSP에서 사용하기 §  <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

§  Locale = ${pageContext.response.locale} ( <a href="?locale=ko_kr">ko</a>|<a href="?locale=en_us">us</a> )

§  <fmt:message key="Join"/>

§  에러(Error) 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

§  예외(Exception) 프로그램 실행 중에 발생하는 예기치 않은 사건 중 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

§  예외가 발생하는 예 §  정수를 0으로 나누는 경우

§  배열의 첨자가 음수 또는 범위를 벗어나는 경우

§  부적절한 형 변환이 일어나는 경우

§  입출력을 위한 파일이 없는 경우 등

§  자바 언어는 프로그램에서 예외를 처리할 수 있는 기법을 제공

§  예외 블록의 지정 try { ...... // try 블록 : 예외가 발생할 가능성이 있는 문장을 지정한다 } catch(예외타입N 매개변수N) { ...... // 예외 처리 블록 N } finally { ...... // finally 블록 : 예외의 발생여부와 상관없이 무조건 수행 }

§  예외를 발생시키기 위해 throw 문 사용

throw new 예외객체타입(매개변수);

Ex : throw new StarplStudyI18nException("already_login_err");

public class StarplStudyException extends RuntimeException { private static final long serialVersionUID = 1L; String message; /** * @param message */ public StarplStudyException(String message) { super(message); this.message = message; } }

<bean id="exceptionResolver"

class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="com.starpl.study.base.bean.StarplStudyException"> common/exception</prop>

<prop key="com.starpl.study.base.bean.StarplStudyI18nException"> common/exceptionI18n</prop>

</props>

</property>

</bean>

<%@ page language="java“ contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="utf-8" /><title>에러</title>

<link type="text/css" rel="stylesheet" href="/res/css/board.css" />

</head>

<body>

<p align="center">${exception.message}</p>

<div class="button"><a href="javascript:history.back()">뒤로</a></div>

</body>

</html>

§  세션을 사용해 로그인을 관리할 수 있습니다

§  국제화된 어플을 만들 수 있습니다

§  유효성 검사를 할 수 있습니다

§  예외처리를 할 수 있습니다

§  그동안 수고하셨습니다. 다음주 부터는 실전!! ^^*

§  프로젝트 설계

§  명세서를 만들어 보자

§  로그인과 보드의 통합

§  단위테스트

§  동작하는 소프트웨어가 포괄적인 문서보다 우선이다 : 애자일 동맹 선언 중

§  Properties Editor http://blog.kangwoo.kr/6

§  국제화 http://choija.com/216

§  Validation http://www.slideshare.net/kingori/spring-3-jsr-303

§  예외처리 http://blog.ohmynews.com/icorea77/34761 http://ivis.changwon.ac.kr/wiki/index.php?title=%EA%B7%B8%EB%A6%BC:Java_%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC_%EC%84%B8%EB%AF%B8%EB%82%98.ppt&redirect=no