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 설계 원칙
- 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 |