[Spring] HTML Form을 이용해 게시글 작성하기
[Spring] HTML Form을 이용해 게시글 작성하기
웹 애플리케이션에서 사용자가 게시글을 작성하려면 입력할 수 있는 Form을 제공하고, 사용자가 입력한 데이터를 서버로 전송하여 저장하는 과정이 필요하다.이번에는 Spring Boot에서 HTML Form을 사
hyemzzi.tistory.com
앞서 HTML Form을 이용해 게시글 작성 기능을 구현하였다.
현재는 사용자가 제목과 내용을 입력하지 않거나 너무 짧게 입력하더라도 그대로 게시글을 저장할 수 있다.
따라서 서버에서 사용자가 입력한 값이 올바른지 검사하는 과정이 필요하다.
이번에는 Spring Validation을 적용하여 게시글의 제목과 내용을 검증해 보았다.
1. Spring Validation 의존성 추가
먼저 Spring Validation을 사용하기 위해 의존성을 추가한다.
implementation("org.springframework.boot:spring-boot-starter-validation")
2. @Validated를 이용한 입력값 검증
처음에는 Controller 메서드의 매개변수에 직접 Validation 조건을 작성하였다.
@Validated
@RequiredArgsConstructor
@Controller
public class PostController {
...
}
@Validated는 Spring에서 메서드의 매개변수에 적용된 Validation 제약 조건을 검사할 수 있도록 한다.
그리고 Controller의 메서드 매개변수에 @NotBlank, @Size를 적용한다.
@NotBlank
@NotBlank는 값이 비어 있거나 공백만 입력된 경우를 허용하지 않는다.
message 속성을 사용하면 Validation에 실패했을 때 사용자에게 보여줄 오류 메시지를 직접 지정할 수 있다.
@NotBlank(message = "제목을 입력해주세요")
String title;
기본 오류 메시지 대신 "제목을 입력해주세요"라는 메시지를 사용하게 된다.
@Size
@Size는 문자열의 길이를 검사한다.
@Size(min = 2, max = 10, message = "제목은 2자 이상 10자 이하로 입력해주세요.")
String title;
위와 같이 설정하면 제목은 2자 이상 10자 이하로 입력해야 한다.
@Size 역시 message 속성을 사용하여 Validation 실패 시 표시할 메시지를 직접 지정할 수 있다.
내용 역시 동일한 방식으로 검증할 수 있다.
@NotBlank(message = "내용을 입력해주세요")
@Size(min = 2, max = 100, message = "내용은 2자 이상 100자 이하로 입력해주세요.")
String content;
이제 게시글을 저장하기 전에 제목과 내용에 대한 Validation이 수행된다.
3. 입력값을 하나의 객체로 관리하기
처음에는 Controller에서 제목과 내용을 각각 매개변수로 전달받고 Validation 조건도 직접 작성하였다.
public String doWrite( @NotBlank String title, @NotBlank String content )
입력값이 제목과 내용 두 개뿐이라면 큰 문제가 없어 보인다.
하지만 게시글에 작성자, 비밀번호, 카테고리 등 여러 입력값이 추가된다면 Controller 메서드의 매개변수가 계속 늘어나게 된다.
또한 각각의 매개변수에 Validation 조건까지 작성해야 하므로 관리하기 불편해진다.
이러한 입력값을 하나의 객체로 묶어서 관리하면 보다 깔끔하게 관리할 수 있다.
그래서 게시글 작성에 필요한 입력값을 PostWriteForm이라는 객체로 만들었다.
@AllArgsConstructor
@Getter
public static class PostWriteForm {
@NotBlank
@Size(min = 2, max = 10)
private String title;
@NotBlank
@Size(min = 2, max = 100)
private String content;
}
PostWriteForm은 게시글 작성 Form에서 전달되는 데이터를 담는 역할을 한다.
또한 각 필드에 필요한 Validation 조건도 함께 작성할 수 있다.
PostWriteForm을 내부 클래스로 만든 이유
현재 PostWriteForm은 게시글 작성 Controller에서만 사용하는 객체이다.
따라서 별도의 클래스로 분리하기보다는 PostController 내부 클래스로 만들어 사용하였다.
@Controller
public class PostController {
@AllArgsConstructor
@Getter
public static class PostWriteForm {
...
}
}
이렇게 하면 PostWriteForm이 PostController에서만 사용되는 Form 객체라는 것을 코드 구조에서도 명확하게 표현할 수 있다.
4. @Valid를 이용해 객체의 Validation 적용하기
PostWriteForm에 Validation 조건을 작성했지만, 이 객체를 Controller에서 사용한다고 해서 내부의 Validation이 자동으로 검사되는 것은 아니다.
Controller의 매개변수에 @Valid를 추가하면 PostWriteForm 객체에 정의된 Validation 조건을 검사할 수 있다.
@PostMapping("/posts/doWrite")
@ResponseBody
public String doWrite(@Valid PostWriteForm postWriteForm) {
//...
}
@Valid가 적용되면 Spring은 PostWriteForm 객체에 정의된 @NotBlank, @Size 등의 Validation 조건을 검사한다.
이 방식에서는 @Valid가 PostWriteForm 내부에 선언된 Validation 조건을 검사하기 때문에 기존에 클래스에 적용했던 @Validated는 제거할 수 있고 Controller에서 각각의 입력값에 Validation 어노테이션을 직접 작성하지 않아도 된다.
5. @ModelAttribute와 데이터 바인딩
PostWriteForm과 같은 객체를 Controller의 매개변수로 사용하면 Form에서 전달된 값이 객체의 필드에 자동으로 들어간다.
예를 들어 Form에서 다음과 같이 데이터를 전송한다고 하자.
<input type="text" name="title">
<textarea name="content"></textarea>
Spring은 요청 데이터를 PostWriteForm 객체에 바인딩한다.
PostWriteForm postWriteForm
결과적으로 다음과 같이 값을 사용할 수 있다.
postWriteForm.getTitle();
postWriteForm.getContent();
이처럼 요청으로 들어온 데이터를 객체의 필드에 연결하는 것을 데이터 바인딩이라고 한다.
이때 @ModelAttribute를 명시적으로 사용할 수도 있다.
public String doWrite(
@Valid @ModelAttribute PostWriteForm postWriteForm
)
하지만 Spring MVC에서는 객체 타입의 매개변수에 @ModelAttribute가 생략되어도 동일하게 동작할 수 있다.
따라서 현재 코드처럼 작성할 수도 있다.
public String doWrite(@Valid PostWriteForm postWriteForm)
5. Validation 적용 후 남은 문제
이제 게시글을 저장하기 전에 제목과 내용의 유효성을 검사할 수 있게 되었다.
하지만 Validation에 실패하면 문제가 하나 남아 있다.
예를 들어 제목을 입력하지 않고 작성 버튼을 누르면 Validation 오류가 발생한다.
제목을 입력해주세요.
이때 단순히 오류를 발생시키는 것에서 끝나는 것이 아니라,
- 어떤 필드에서 오류가 발생했는지 확인하고
- 오류 메시지를 사용자에게 보여주고
- 사용자가 입력했던 값을 유지하면서
- 다시 작성할 수 있도록 Form을 보여주는
처리가 필요하다.
다음 글에서는 BindingResult를 사용하여 Validation 오류를 직접 확인하고 처리하는 방법을 알아보자.
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] REST API란? SSR과 CSR 차이부터 JSON 응답까지 (0) | 2026.08.11 |
|---|---|
| [Spring] Validation 오류 처리하기 - BindingResult 활용 (0) | 2026.08.11 |
| [Spring] HTML Form을 이용해 게시글 작성하기 (0) | 2026.08.10 |
| [Spring] @PathVariable vs @RequestParam 차이와 사용 기준 (0) | 2026.08.07 |
| [Spring] 왜 Exception을 던질까? (0) | 2026.08.07 |
댓글