TIL

250124 금 TIL

파란배개 2025. 1. 24. 17:46

Spring Boot와 타임리프(Thymeleaf)를 활용한 폼 처리와 API 설계

주요 어노테이션 및 동작 원리

@ModelAttribute

  • 역할: 메서드의 인자를 객체로 받아온다. 생략 가능하다.

@Valid

  • 역할: 객체의 유효성 검사를 활성화한다.

BindingResult

  • 역할: 유효성 검사에서 발생한 예외 정보를 수집 및 처리한다. 프로그램 흐름을 중단하지 않고 에러를 관리할 수 있게 한다.
  • 에러 처리 예제:
if(bindingResult.hasErrors()) {
    String errorMessage = bindingResult.getFieldErrors().stream()
            .map(err -> err.getDefaultMessage())
            .collect(Collectors.joining());
    return errorMessage;
}
  • 주의사항:
    • 상위 클래스에 @Validated 어노테이션이 붙어 있으면 에러처리를 해도 예외가 Whitelabel Error Page로 처리된다.

PRG(Post-Redirect-Get) 패턴

이 패턴이 사용되는 문제 상황

  • 문제 상황: POST 요청 이후 새로고침하면 동일한 요청이 다시 실행되어 데이터가 중복 처리되는 문제.

@ResponseBody의 영향

제거 시: 메서드의 반환값을 템플릿 파일로 인식한다.

포함 시: 반환값을 HTTP 응답 바디로 직접 전송한다.

@ResponseBody를 포함한 채로 실행하면 POST 요청 후 새로고침하면 폼이 다시 제출되며, 제거하면  리턴이 HTTP 응답으로 안 보내지게 되는 문제가 발생한다.

  • 해결책: POST 요청 후 리다이렉트를 통해 GET 요청을 보내도록 설계.
  • 예제:
return "redirect:/posts";

타임리프(Thymeleaf)와 모델(Model)

모델(Model)

  • 역할: 템플릿으로 자바 변수를 전달.
  • 사용법:
model.addAttribute("errorMessage", errorMessage);
model.addAttribute("name", form.getName());
model.addAttribute("body", form.getBody());
  • 폼 객체와 연결:
    • @ModelAttribute를 사용하면 위와 같은 방법을을 사용하지 않아도 객체를 템플릿에 자동으로 전달 가능.
  • 예제:
@ModelAttribute("form")
WriteForm form

HTML과의 연결

HTML에서 모델로 받아온 데이터를 이용한 에러 처리 예제 - 데이터를 객체처럼 꺼내 쓸 수 있음

<div th:if="${#fields.hasAnyErrors()}">
    <div th:each="err : ${#fields.errors()}" th:text="${err}" />
</div>

HTML에서 모델로 받아온 데이터 바인딩 예제 - 타임리프 문법으로 조건문도 사용 가능하다!

<form method="post" th:object="${writeForm}">
    <input type="text" name="title" placeholder="제목" th:value="*{title}" /> <br>
    <textarea name="content" th:text="*{content}"></textarea> <br>
    <input type="submit" value="등록" /> <br>
</form>
  • 주의사항:
    • th:text가 사용되면 태그 안의 기존 텍스트는 덮어씌워진다.

RESTful API 설계

API 설계 원칙

  1. URL은 명사로 표현:
    • 행위는 HTTP 메서드(GET, POST, PUT, DELETE)를 사용.

예제 설계

HTTP 메서드URL설명

GET /posts 포스트 목록 가져오기(다건)
GET /posts/1 특정 ID(1)의 포스트 조회
POST /posts 새로운 포스트 등록
DELETE /posts/1 특정 ID(1)의 포스트 삭제
PUT /posts/1 특정 ID(1)의 포스트 수정

'TIL' 카테고리의 다른 글

250131 금 TIL  (0) 2025.01.31
250127 월 TIL  (2) 2025.01.27
250123 목 TIL  (0) 2025.01.23
250122 수 TIL  (0) 2025.01.22
250121 화 TIL  (1) 2025.01.21