이 글은 크레이그 윌즈의 "스프링 인 액션(5판)"을 읽고 간략히 정리한 글이다.
정보 보여주기
데이터를 가져오고 요청을 처리하는 것이 컨트롤러.
데이터를 저장하는 것이 모델.
브라우저에 보여주는 데이터를 HTML로 나타내는 것은 뷰.
@Slf4j → 이 애노테이션은 다음 코드를 추가한 것과 같은 효과를 낸다.
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(클래스이름.class);
@Controller 애노테이션은 클래스가 컨트롤러로 식별되게 하며, 컴포넌트 검색이 되게 한다. Application Context가 Bean으로 이 클래스의 인스턴스를 자동 생성한다.
@RequestMapping, @GetMapping, @PostMapping 등의 애노테이션은 요청받는 경로를 나타낸다.
클래스 수준에서는 @RequestMapping을, 메소드 수준에서는 더 특화된 @GetMapping, @PostMapping 등을 사용하는 것이 좋다.
Thymeleaf 의존성을 추가하면 스프링 부트의 Auto Configuration에서 classpath의 Thymeleaf를 찾아 빈을 자동으로 생성한다.
폼 입력 유효성 검사하기
스프링에서 지원하는 Bean Validation API를 사용해 입력한 데이터의 유효성을 검사할 수 있다.
Hibernate 컴포넌트가 이 유효성 검사 API를 구현한다.
선언할 수 있는 유효성 검사 규칙
- @NotNull
- @Size
- @NotBlank
- @CreditCardNumber
- @Pattern
- @Digits
모든 애노테이션은 message 속성을 가지고 있다. 이 속성을 통해 유효성 규칙을 충족하지 못했을 시에 보여줄 메시지를 정의할 수 있다.
hibernate bean validation 종류 : https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-builtin-constraints
그리고 컨트롤러의 메서드로 전달되는 인자 앞에 @Valid 애노테이션을 추가해야 한다.
뷰 컨트롤러로 작업하기
데이터를 처리하지 않는 간단한 컨트롤러는 다른 방법으로 정의할 수 있다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegostry registry) {
registry.addViewController("/").setViewName("home");
}
}
뷰 템플릿 라이브러리 선택하기
스프링에서 지원되는 템플릿
- FreeMarker
- Groovy
- JSP
- Mustache
- Thymeleaf
의존성을 추가하면 자동으로 뷰로 연결해준다.
JSP의 경우, 서블릿 컨테이너가 JSP 명세를 구현하고 있기 때문에 의존성에 추가할 필요가 없다. 또한 자바 서블릿 컨테이너는 JSP 파일을 /WEB-INF 밑에서 찾기 때문에 애플리케이션을 JAR로 생성하면 안되고 WAR로 생성해야 한다.
템플릿 캐싱
기본적으로 템플릿은 최초로 사용될 때 한번만 파싱되며 이 결과는 캐시에 저장된다.
하지만 개발 시에는 이 기능이 불편한데 이를 비활성화 시킬 수 있다. application.properties 파일에 다음을 추가해주면 된다.
spring.thymeleaf.cache=false // Thymeleaf
spring.freemaker.cache=false // FreeMaker
spring.groovy.template.cache=false // Grrovy
spring.mustache.cache=false // mustache
근데 사실 그냥 DevTools를 사용하는게 편하다. 자동으로 모든 템플릿 라이브러리 캐싱을 비활성화한다. 그리고 실제 배포시에는 비활성화되므로 문제없다.
'공부 > Spring' 카테고리의 다른 글
[스프링 인 액션] Chapter 4 스프링 시큐리티 (0) | 2022.06.16 |
---|---|
[스프링 인 액션] Chapter 3 데이터로 작업하기 (0) | 2022.05.08 |
[스프링 인 액션] Chapter 1 스프링 시작하기 (0) | 2022.04.08 |
[스프링 프레임워크 Core] 스프링 IoC 컨테이너와 빈 (0) | 2020.06.06 |
스프링 AOP & PSA (0) | 2020.05.31 |