[신세계I&C KDT][Spring Boot] #40 스프링부트 3 (0612)

박현아·2024년 7월 1일
0

신세계아이앤씨 KDT

목록 보기
44/56

14. 예외 처리

  • Controller에서 예외발생시 예외처리하는 방법임.

1) 기본

@GetMapping("/errorPage")
	public String errorPage() {
		logger.info("logger:MainController:{}", "/errorPage 요청");	
		throw new IllegalArgumentException("IllegalArgumentException 발생됨");
	}
  • SpringBoot는 자동으로 Whitelabel Error Page를 제공한다.
    이것이 boot의 특징인 auto configuration 이다
  • spring-boot-autoconfigure-2.7.18.jar 담당함.

2) 발생된 예외를 auto configuration 처리하지 말고 커스터마이징하자

(1) 지역 예외 처리

  • 예외가 발생된 특정 Controller 내에서 예외처리
@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
	}

(2) 글로벌 예외처리

  • 모든 Controller 예외처리
@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
	  }
        }

15. 국제화 (I18N : InternationalizatioN)

https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#features.internationalization

  • locale에 따라 화면의 언어를 다르게 랜더링이 가능하다
    다국어 처리 가능
  • Spring이 특정 언어를 선택하는 방법
    ==> 기본적으로 LocaleResolver를 이용해서 Locale을 인식하여 원하는 특정 언어를 선택

가. 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));
  • 구현 2
  • LocaleChangeInterceptor 이용해서 로케일 변경해줌.
    따라서 Controller에서 명시적으로 setLocale(new Locale("값")) 할 필요가 없음.
@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());
	}
}

16. webjar

1) 현재 사용 방식

2) 적용 방식

  • jquery와 bootstrap을 의존성 설정해서 사용하자

(1) webjar의 jQuery 경로

/META-INF/resources/webjars/jquery/3.7.1/jquery.min.js

(2) 사용할 경로

< script src="webjars/jquery/3.7.1/jquery.min.js"></ script>

(3) webjar의 bootstrap 경로

/META-INF/resources/webjars/bootstrap/5.3.3/css/bootstrap.min.css
/META-INF/resources/webjars/bootstrap/5.3.3/js/bootstrap.min.js

(4) 사용할 경로

< 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">

  • pom.xml
<!-- 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>

17. 폼 유효성 체크

1) 개요

  • 사용자 입력 폼의 데이터 유효성 검사 의미
  • 예> 필수 사항, 과거 날짜 선택 불가능, 값이 길이 n개 이상,...

2) 구현 방식

  • html 속성 이용 (클라이언트에서 처리하는 방법)
  • JS 이용 (클라이언트에서 처리하는 방법)
    ==> 클라이언트에서 JS를 비활성화 시키거나 보안 이슈 발생 가능성이 높음
  • Spring Boot 이용
    ==> 서버에서 유효성 체크하는 방법이다

3) 적용

(1) 의존성 설정

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

(2) DTO 생성

: 유효성 체크하기 위한 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;

(3) Controller 작업

  • 양방향 적용 (two-way binding)
				화면 요청 (GET)
Controller -----------------------> jsp
		   <-----------------------
           		실제 요청 (POST)
  • GET 방식과 POST 방식 요청에 전부 Command Bean(DTO)을 모델로 사용해야된다
				화면요청(GET)
Controller ---------------------> jsp
		   <---------------------
				실제요청(POST)

(1) Get 요청 구현

@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"; 
}

(2) Post 요청 구현

@PostMapping("/member") // 로직 요청
		public String member(@Valid  MemberDTO dto, BindingResult result) {
		System.out.println("MemberDTO" + dto);
		if(result.hasErrors()) {
				return "memberForm"; 
		}
			
		return "memberInfo"; 
}
  • memberForm.jsp
<%@ 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>

0개의 댓글