kok202
스프링 부트 강의 정리 (16~18 : 템플릿 엔진, 에러 핸들링, 데이터 바인딩)

2019. 4. 27. 20:41[공부] 영상/스프링 부트 강의

스프링 부트 MVC는 다음과 같은 템플릿 엔진을 기본적으로 지원한다. 

  • FreeMarker (업데이트가 느려서 권장 x)
  • Groovy
  • Thymleaf
  • Mustache
  • JSP (사용을 권하지 않음)

위의 템플릿 엔진을 사용할 때 파일을 불러오는 기본 경로는 src/main/resources/templates 이다.

Thymeleef 사용 예시

Thymeleef dependency 추가

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

src/main/resources/templates/helloView.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="utf-8" />
</head>
<body>
	<div th:text="${name}"></div>
</body>
</html>

src/main/com/testcompany/testproject/controller/HelloController.java

@Controller
public class HelloController {
	@RequestMapping("/hello")
	public String index(Model model) {
		model.addAttribute("name", "kok202");
		return "helloView";
	}
}

 

 

 

 

가능하면 스프링 부트를 사용할 때 JSP 을 권하지 않는 이유는 다음과 같다.

스프링 부트와 같이 Embeded servlet container를 실행가능한 파일로 패키징할 때 사용할 경우 문제가 있다.

1. War 패키징할 때만 사용 가능하다. Tomcat에 하드코딩된 코드 때문에 Jar 는 동작하지 않는다. 

2. Jetty 를 사용할 때 War 패키징만 사용 가능하다.

3. Undertow는 jsp 를 지원하지 않는다.

4. 커스텀한 error.jsp 페이지가 에러 핸들링에 필요한 기본 뷰를 오버라이딩 하지 않기 때문에 문제가 된다.

5. 등....

그래도 꼭 JSP를 사용하고 싶다면 아래 포스팅을 참조

https://jayden-lee.github.io/post/spring/spring-boot-jsp-how-to-use/

 

Spring Boot에서 JSP 사용하기

Spring Boot에서 JSP 사용하기 기존 Spring Framework에서는 웹 애플리케이션을 구성할 때, View 영역에 JSP를 많이 사용했습니다. 그런데 Spring Boot로 기술을 변

jayden-lee.github.io

 

 

 

 

 

스프링 부트는 /error 맵핑을 지원한다. 기본적으로 global error 로 이미 whitelabel 페이지가 등록되어 있다. 

static HTML으로 에러 코드에 해당하는 에러 페이지를 src/main/resources/error/ 이하 경로에 넣어두면 어떤 status code 에 대해서 에러 페이지를 지정해줄 수 있다. ex) src/main/resources/error/404.html

 

에러 핸들링

@ControllerAdvice : 스프링 전역에서 발생하는 Exception 관리

@ExceptionHandler : 해당 클래스내에서 value 에해당하는 Exception 이 발생할 경우 아래 메소드를 실행한다.

@ControllerAdvice  
public class MyControllerAdvice {
	@ExceptionHandler(value=MyException.class)
	public String handleMyException(MyException e){
		return e.getMessage();
	}
}  

 

 

 

 


데이터 바인딩 : Request로 들어오는 값들을 @PathVariable 또는 @RequestParam 으로 받는다. 이 때 Request 들어온 데이터를 @PathVariable, @RequestParam 변수들의 타입에 맞춰서 변경하는 과정 

 

데이터 바인딩을 하는 3가지 방법

1. Property editor

스프링 기능이 아니고 자바 Bean 규약.

Thread safe 하지 않다는 최대 단점이 있다.

싱글톤 @Bean으로 등록하면 안된다.

 

2. Converter

Converter<String, MyClass>를 implements 해서 MyClassConverter를 만든다.

ConfigurableWebBindingInitializer 를 빈으로 등록해서 MyClassConverter를 등록한다.

@SpringBootApplication
public class Main{
	@Bean
	public ConfigurableWebBindingInitializer initializer(){
		ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
		ConfigurableConversionService conversionService = new FormattingConversionService();
		conversionService.addConverter(new MyClassConverter());
		initializer.setConversionService(conversionService);
		return initializer;
	}
	
	public static main(String[] args){
    	...
	}
}

 

3. WebMvcConfigurer

Converter<String, MyClass>를 implements 해서 MyClassConverter를 만든다.

Web를 사용하기

@Configuration
public class WebConfig implements WebMvcConfigurer{
	@Override
	public void addFormatters(FormatterRegistry registry){
		registry.addConverter(new MyClassConverter());
	}
}

 

4. MyClassConverter를 @Component로 빈등록하기

빈으로 등록되면 스프링 부트가 알아서 Converter를 찾아서 실행해준다.

 

 

 

 

 

스프링 HATEOAS

Hypermedia As The Engine Of Application State

사용자가 보내는 이 본문과 관련있는 Hypermedia 정보들 (링크 정보등...) 을 같이 보내는 것

스프링 HATEOAS 설정은 @EnableAutoConfiguration 을 대신해서 @EnableHypermediaSupport를 사용하면 된다.

 

 

 

 

 

스프링 CORS

Cross Origin Resource Sharing

다른 도메인에서도 (daum.net) 나의 도메인의 하위 페이지(myhome.com/test/123) 에 접근 가능하도록 하는 것이다. 스프링 부트는 기본적인 CROS 설정이 들어가 있어서 컨트롤러에 @CrossOrigin 을 붙여서 사용하기만 하면 된다.  @CrossOrigin을 붙이지 않고 CROS 를 지원하려는 컨트롤러를 설정 파일으로 관리하고 싶다면 다음과 같이 설정 작성하면 된다.

 

@Configuration
public class MyConfiguration {
	@Bean
	public WebMvcConfigurer corsConfigurer() {
		return new WebMvcConfigurer() {
			@Override
			public void addCorsMappings(CorsRegistry registry) {
				registry.addMapping("/api/**");
			}
		};
	}
}