@GetMapping("/errorPage")
public String errorPage() {
logger.info("logger:MainController:{}", "/errorPage 요청");
throw new IllegalArgumentException("IllegalArgumentException 발생됨");
}
@ExceptionHandler
# Controller 안에서
@ExceptionHandler(value = {NullPointerException.class,
IllegalArgumentException.class})
public String errorPage(Exception e, Model m) {
logger.info("logger:errorPage:{}", e.getMessage());
m.addAttribute("error_message", e.getMessage());
return "errorPage"; // errorPage.jsp
}
@ControlAdvice
# 새로운 빈에서
@ControllerAdvice
public class GlobalExceptionHandler {
Logger logger = LoggerFactory.getLogger(getClass());
@ExceptionHandler(value = {ClassCastException.class,
ArithmeticException.class})
public String errorPage(Exception e, Model m) {
logger.info("logger:errorPage:{}", e.getMessage());
m.addAttribute("error_message", e.getMessage());
return "errorPage"; // errorPage.jsp
}
}
https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#features.internationalization
가. AcceptHeaderLocaleResolver
- 요청 헤더값을 이용해서 locale 정보를 얻음
- Accept-Language 헤더값 이용
- 기본적으로 적용되는 방법임.
나. CookieLocaleResolver
- 쿠키를 이용해서 locale 정보를 저장및얻음
- setLocale("ko|en|");
다. SessionLocaleResolver
- 세션을 이용해서 locale 정보를 저장및얻음
- setLocale("ko|en|");
구현 1
1) 리소스 번들 파일 작성 (resouece bundle 파일)
- 문법:
src/main/resources 폴더
파일명-언어코드.properties
- 키=값
- 기본 번들 파일: message.properties
greeting=안녕하세요
한국어 번들 파일: message_ko.properties
greeting=안녕하세요
영어 번들 파일 : message_en.propertis
greeting=hello
- 번들 파일의 인코딩은 모두 utf-8로 변경.
2) application.properties에 리소스 번들 등록
# 리소스 번들 파일 등록
spring.messages.basename=bundle/message
spring.messages.encoding=utf-8
3) spring.messages.fallback-to-system-locale=false
기본: true. message.properties 가 아닌 system의 locale(제어판의 국가별 설정)ㅑ 적용함.
false. message.properties 적용.
4) SessionLocaleResolver 생성
@ Configuration
public class WebMvc {
// 기본인 AcceptHeaderLocaleResolver 인데
// 기본을 SessionLocaleResolver로 변경하는 작업이다.
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver locale =
new SessionLocaleResolver();
locale.setDefaultLocale(new Locale("ko"));
return locale;
}
}
5) Controller 에서 개발자가 직접 locale 변경
@GetMapping("/bundle")
public String bundle( HttpServletRequest request,
HttpServletResponse response,
@RequestParam String lang) {
//SessionLocaleResolver의 로케일을 변경.
locale.setLocale(request, response,
new Locale(lang));
@Configuration
public class WebMvc implements WebMvcConfigurer{
// 기본인 AcceptHeaderLocaleResolver 인데
// 기본을 SessionLocaleResolver로 변경하는 작업이다.
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver locale =
new SessionLocaleResolver();
locale.setDefaultLocale(new Locale("ko"));
return locale;
}
//LocalChangeInterceptor 생성
@Bean
public LocaleChangeInterceptor changeInterceptor() {
LocaleChangeInterceptor xxx = new LocaleChangeInterceptor();
// ?lang=en|ko|jp
xxx.setParamName("lang");
return xxx;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(changeInterceptor());
}
}
/META-INF/resources/webjars/jquery/3.7.1/jquery.min.js
< script src="webjars/jquery/3.7.1/jquery.min.js"></ script>
/META-INF/resources/webjars/bootstrap/5.3.3/css/bootstrap.min.css
/META-INF/resources/webjars/bootstrap/5.3.3/js/bootstrap.min.js
< script src="webjars/bootstrap/5.3.3/js/bootstrap.min.js"></ script>
< link rel="stylesheet" href="webjars/bootstrap/5.3.3/css/bootstrap.min.css">
<!-- https://mvnrepository.com/artifact/org.webjars/jquery -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.webjars/bootstrap -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
: 유효성 체크하기 위한 DTO
(Command Bean / form backing object : 양식보조객체 라고도 함)
==> 변수에 어노테이션으로 유효성 조건을 지정한다
public class memberDTO {
@NotNull
String userid;
@Size(min=3, message="세 글자 이상입니다!!")
String username;
// 010-1234-5678 전화번호 정규표현식 검색해서 쓰세용
//@Pattern()
//String phone;
@NotNull
@FutureOrPresent(message = "현재 또는 미래 날짜만 가능합니다")
LocalDate targetDate;
화면 요청 (GET)
Controller -----------------------> jsp
<-----------------------
실제 요청 (POST)
화면요청(GET)
Controller ---------------------> jsp
<---------------------
실제요청(POST)
@GetMapping("/member") // 화면 요청
public String memberForm(ModelMap m) {
MemberDTO dto = new MemberDTO();
// MemberDTO dto = new MemberDTO("aaa","홍길동", LocalDate.now());
// m.addAttribute("memX", dto); // 임의의 값 지정하면 에러 발생
m.addAttribute("memberDTO", dto); // command bean으로 반드시 설정한다
return "memberForm";
}
@PostMapping("/member") // 로직 요청
public String member(@Valid MemberDTO dto, BindingResult result) {
System.out.println("MemberDTO" + dto);
if(result.hasErrors()) {
return "memberForm";
}
return "memberInfo";
}
<%@ taglib uri="http://www.springframework.org/tags/form"
prefix="form"%>
<form:form method="post"
modelAttribute="memberDTO">
아이디:<form:input type="text" path="userid" />
<form:errors path="userid"></form:errors>
<br>
이름:<form:input type="text" path="username" />
<form:errors path="username"></form:errors>
<br>
날짜:<form:input type="date" path="targetDate" />
<form:errors path="targetDate"></form:errors>
<br>
<input type="submit" value="가입">
</form:form>