๐Ÿ“Œ Spring MVC ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(@Valid, BindingResult) ์‹ค์Šต

My Pale Blue Dotยท2025๋…„ 4์›” 24์ผ
0

SPRING

๋ชฉ๋ก ๋ณด๊ธฐ
6/36
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-04-24


๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฐœ์š”

  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(Validation)๋ž€? ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์ด ์ ์ ˆํ•œ์ง€ ์„œ๋ฒ„์—์„œ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •.
  • @Valid : DTO์— ์„ ์–ธ๋œ ๊ฒ€์ฆ ์• ๋…ธํ…Œ์ด์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๊ฒ€์ฆ ์ˆ˜ํ–‰.
  • BindingResult : ๊ฒ€์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ๋กœ์ง ๋ถ„๊ธฐ.

โœ”๏ธ ๊ฒ€์ฆ ํ๋ฆ„ ์š”์•ฝ

ํด๋ผ์ด์–ธํŠธ ์ž…๋ ฅ๊ฐ’ โ†’ Controller(@Valid) โ†’ BindingResult๋กœ ์—๋Ÿฌ ํ™•์ธ โ†’ View๋กœ ํ”ผ๋“œ๋ฐฑ


2๏ธโƒฃ MemoDto ์„ค์ •

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MemoDto {
    @Min(value = 10, message = "ID๋Š” 10 ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
    @Max(value = 65535, message = "ID์˜ ์ตœ๋Œ€ ์ˆซ์ž๋Š” 65535์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
    @NotNull(message = "ID๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์ž…๋‹ˆ๋‹ค.")
    private Integer id;

    @NotBlank(message = "๋ฉ”๋ชจ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
    private String text;

    @NotBlank(message = "์ž‘์„ฑ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
    @Email(message = "์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ํ˜•์‹์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
    private String writer;

    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
    @NotNull(message = "๋‚ ์งœ์ •๋ณด๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”")
    private LocalDateTime createAt;
}

3๏ธโƒฃ MemoController ์„ค์ •

@PostMapping("/add")
public void add_post(@Valid MemoDto dto, BindingResult bindingResult) {
    log.info("POST /memo/add..." + dto);

    if(bindingResult.hasErrors()) {
        for(FieldError error : bindingResult.getFieldErrors()) {
            log.info("Error Field: " + error.getField() + " Error Msg: " + error.getDefaultMessage());
        }
    }
}

4๏ธโƒฃ add.jsp (๋ฉ”๋ชจ ์ž‘์„ฑ ํผ)

<form action="${pageContext.request.contextPath}/memo/add" method="post">
    <div>
        <label>id : </label><input name="id" />
    </div>
    <div>
        <label>text : </label><textarea name="text"></textarea>
    </div>
    <div>
        <label>writer : </label><input name="writer" />
    </div>
    <div>
        <label>createAt : </label><input type="datetime-local" name="createAt" />
    </div>
    <div>
        <input type="submit" value="๋ฉ”๋ชจ์“ฐ๊ธฐ" />
    </div>
</form>

5๏ธโƒฃ servlet-context.xml ์„ค์ •

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<annotation-driven validator="validator"/>

6๏ธโƒฃ pom.xml ์˜์กด์„ฑ

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.5.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.6</version>
</dependency>

โš ๏ธ ์˜์กด์„ฑ ์„ค์ • ์‹œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ & ํ•ด๊ฒฐ ๊ณผ์ •

๐Ÿ’ฅ ๋ฌธ์ œ ๋ฐœ์ƒ

์ดˆ๊ธฐ์— hibernate-validator์˜ ์ตœ์‹  ๋ฒ„์ „์ธ 8.x๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋”๋‹ˆ, ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ์•„๋ž˜ ์—๋Ÿฌ ๋ฐœ์ƒ:

javax.validation.NoProviderFoundException:
Unable to create a Configuration, because no Bean Validation provider could be found.
  • ์›์ธ : Spring 5.x์™€ Hibernate Validator 8.x ๋ฒ„์ „ ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ
  • ๋ ˆ๊ฑฐ์‹œ(Spring Legacy, STS3) ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋ฒ„์ „์— ๋งž์ถฐ์•ผ ํ•จ.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • Hibernate Validator๋ฅผ 6.2.5.Final๋กœ ๋ฒ„์ „ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ
  • Maven ์—…๋ฐ์ดํŠธ ํ›„ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ โžœ ์ •์ƒ ์ž‘๋™!

Tip ๐Ÿ”ง

ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(Spring ๋“ฑ) ๋ฒ„์ „์— ๋งž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ํ™•์ธํ•˜์ž!

์ตœ์‹  ๋ฒ„์ „์ด ํ•ญ์ƒ ์ตœ์„ ์€ ์•„๋‹ˆ๋‹ค.


๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

Error Field: text Error Msg: ๋ฉ”๋ชจ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”
Error Field: createAt Error Msg: ๋‚ ์งœ์ •๋ณด๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”
Error Field: id Error Msg: ID๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์ž…๋‹ˆ๋‹ค.
Error Field: writer Error Msg: ์ž‘์„ฑ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”

๐Ÿ”ฅ ์ •๋ฆฌ

  • @Valid์™€ BindingResult ์กฐํ•ฉ์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์„œ๋ฒ„ ๊ฒ€์ฆ ๊ตฌํ˜„.
  • DTO ์ค‘์‹ฌ์˜ ๊ฒ€์ฆ ์„ค๊ณ„๋กœ ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”.
  • Validator ์„ค์ •๊ณผ ์˜์กด์„ฑ ๋ฒ„์ „์ด ํ•ต์‹ฌ ํฌ์ธํŠธ.
  • ์‹ค๋ฌด์—์„œ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ Model์— ๋‹ด์•„ View๋กœ ์ „๋‹ฌ โžœ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ๊ฐ•ํ™”.

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€