Study

[스프링 인 액션] #2 웹 애플리케이션 개발하기

voider 2021. 3. 13. 17:15

목표

MVC구조로 데이터베이스와 연결하지 않은 매우 간단한 웹 어플리케이션 개발해보기

요구사항

  • 타코 재료를 선택해서 자신만의 타코를 만들 수 있다.
  • 완성한 타코를 주문할 수 있다.

단계

  1. 도메인 설정
    도메인이란, 애플리케이션 이해에 필요한 개념을 다루는 영역이다.

  2. 컨트롤러 작성
    컨트롤러는 요청에 알맞은 작업을 처리하고 절절한 view를 반환한다. 뷰란 HTML을 말하고 타임리프 같은 템플릿을 이용하여 원하는 데이터를 넣어 줄 수 있다.

  3. 유효성 검사
    클라이언트가 폼 데이터를 올바르게 작성했는지 유효성을 검사한다.

2번까지는 매우 쉬운 내용이어서 생략하고, 3번을 간단하게 정리한다.

스프링은 빈 유효성 검사(Bean Validation) API를 제공한다. 애플리케이션에 if/else를 덕지덕지 붙여 검사하지 않고도 쉽게 유효한 데이터인지 걸러낼 수 있다.

  • 유효성을 검사할 클래스에 검사 규칙을 선언
  • 유효성 검사를 하는 컨트롤러 메서드에 검사를 수행한다는 것을 지정(@Valid 어노테이션)
  • 검사 에러를 보여주도록 View 수정

javax.validation패키지에 유용한 검사 애노테이션을 사용해서 검사 규칙을 지정할 수 있다.

validation애노테이션을 이용해서 유효성을 검사하는 부분을 약간 살펴보면 이런 모습이다.

    @NotBlank(message = "Zip code is required")
    private String deliveryZip;

    @CreditCardNumber(message = "Not a valid credit card number")
    private String ccNumber;

    @Pattern(regexp="^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$",
            message="Must be formatted MM/YY")
    private String ccExpiration;

    @Digits(integer = 3, fraction=0, message = "Invalid CVV")
    private String ccCVV;

크레딧 카드 넘버가 유효한지, null이나 공백은 아닌지(@NotBlank), MM/YY패턴으로 입력되었는지 등을 검사할 수 있다. 유효하지 않은 데이터의 경우 message 속성에 지정한 메세지를 화면에 띄워줄 수 있다.

이렇게 선언만 하면 끝나는 것이 아니라 컨트롤러에 이 클래스가 validation이 필요한 클래스라는 것을 지정해주어야 한다.

    @PostMapping
    public String processDesign(@Valid Taco design, Errors errors) {
        if (errors.hasErrors())
            return "design";

        log.info("Processing design : {} ", design);

        return "redirect:/order/current";
    }

이런 식으로 @Valid 애노테이션으로 이 클래스가 유효성 검증이 필요한 클래스라는 것을 명시한다. @Valid애노테이션이 붙은 파라미터 옆에는 Errors객체가 따라다닌다. 이 객체는 만약 유효성 검사에 실패한 필드가 있다면 그 내역을 저장하고 화면으로 보내는 역할을 한다.

이런 에러를 적절히 사용자에게 띄워줄 필요가 있기 때문에 View도 수정이 필요하다.

            <h3>Name your taco creation:</h3>
            <input type="text" th:field="*{name}">
            <span th:text="${#fields.hasErrors('name')}">XXX</span>
            <span class="validationError"
                  th:if="${#fields.hasErrors('name')}"
                  th:errors="*{name}">Name Error</span>
            <br>

이런 식으로 name필드에 잘못된 값이 들어왔다면 적절한 에러를 띄워주도록 설정해줘야 한다.

스프링부트에서 JSP를 쓰지 않는 이유

스프링은 다양한 템플릿 라이브러리를 제공한다. FreeMaker, Mustache, Thymeleaf등. 편하게 생각하는 템플릿을 사용해도 무방하다.

하지만 스프링부트에서는 JSP를 사용하지 않는다.

자바 서블릿 컨테이너는 /WEB-INF 밑에서 JSP코드를 찾기 때문에 JAR를 사용하는 스프링부트 프로젝트를 생성한다면 JSP파일을 찾을 수 없다. 따라서 JSP를 사용하려면 WAR파일로 프로젝트를 만들어야 하기 때문에 JSP는 스프링부트에서 잘 사용되지 않는다.