๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/๊ฐœ๋…

[Spring] ์ œ์•ฝ ์กฐ๊ฑด, @Valid๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฒ€์ฆํ•ด๋ณด์ž.

by hyeong._.ing 2026. 6. 15.

 

 

์š”์ฒญ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด
๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค.
์ด๋•Œ @Valid๋ฅผ ์‚ฌ์šฉํ•ด์„œ
๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฒ€์ฆํ•ด๋ณด์ž.

 

 

 

1. @Valid

  • ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์š”์ฒญ ๋ฐ์ดํ„ฐ(DTO)์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ• ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ถ™์ด๋ฉด ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์„ค์ •๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฒ€์ฆํ•œ๋‹ค.
  • @NotNull, @Size ๋“ฑ์˜ ์ œ์•ฝ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉฐ ์„œ๋น„์Šค ๊ณ„์ธต๊นŒ์ง€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์‚ฌ์ „์— ์ฐจ๋‹จํ•˜์—ฌ ๊ณ„์ธต์  ๋ฐฉ์–ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

 


 

 

 

2. @Valid ์˜ˆ์‹œ ์ฝ”๋“œ

  • @Valid X
    ์ด๋ฆ„์€ ํ•„์ˆ˜, ๋‚˜์ด๋Š” 0๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค.
@PostMapping("/user")
public void createUser(@RequestBody UserDto user) {

    // if๋ฌธ์œผ๋กœ ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์™”๋Š”์ง€
    // ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋งž๊ฒŒ ๋“ค์–ด์™”๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.
    
    if (user.getName() == null || user.getName().isEmpty()) {
        throw new IllegalArgumentException("์ด๋ฆ„์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.");
    }
    if (user.getAge() <= 0) {
        throw new IllegalArgumentException("๋‚˜์ด๋Š” 0๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
    }
    userService.save(user);
}
์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์•ˆ์ข‹์€ ์ ์ด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ์ด๋ฆ„๊ณผ ๋‚˜์ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ทธ ์•ˆ์— ๋˜ ๊ฒ€์ฆ ๋กœ์ง์„ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ๋˜๋ฉด ๊ฒ€์ฆ ๋กœ์ง์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ฐ€ ์„ž์ด๊ณ  ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ• ๋•Œ ๋ฌด์ฒ™ ํž˜๋“ค์–ด์ง„๋‹ค.

 

  • @Valid O
    ์ด๋ฆ„์€ ํ•„์ˆ˜, ๋‚˜์ด๋Š” 0๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค
public class UserDto {

    @NotEmpty(message = "์ด๋ฆ„์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.")
    private String name;

    @Min(value = 1, message = "๋‚˜์ด๋Š” 1๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
    private int age;
    
}
๋ฐ”๋กœ @Valid๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ถ™์ด๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค. ๋จผ์ € DTO ํŒŒ์ผ์— ๋‚ด๊ฐ€ ์ œ์•ฝํ•ด์•ผํ•  ์กฐ๊ฑด์„ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค. name์— @NotEmpty๋กœ ๊ณต๋ฐฑ์ด ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  age๋Š” @Min์„ 1๋กœ ์„ค์ •ํ•ด์„œ ์ตœ์†Œ๊ฐ’์„ 1, ๊ทธ๋‹ˆ๊นŒ 0์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์—†๋„๋ก ํ–ˆ๋‹ค.

 

@PostMapping("/user")
public void createUser(@Valid @RequestBody UserDto user) {
    // ๊ฒ€์ฆ ํ†ต๊ณผ ์‹œ์—๋งŒ ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋จ
    userService.save(user);
}
์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ์— @Valid๋ฅผ ๋ถ™์ด๋ฉด ๋๋‚œ๋‹ค. ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ Spring์ด ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ DTO ๋‚ด๋ถ€ ํ•„๋“œ๋“ค์„ ์ž๋™์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค. ๋งŒ์•ฝ DTO์— ์ •์˜๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์–ด๊ธฐ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•œ๋‹ค.