๐ŸŒฑ Spring MVC (8) Bean Validation 2 (View๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒ€์ฆ ์ ์šฉ - groups, ํผ ๊ฐ์ฒด ๋ถ„๋ฆฌ)

Kim Dae Hyunยท2021๋…„ 7์›” 13์ผ
0

Spring-MVC

๋ชฉ๋ก ๋ณด๊ธฐ
8/13
post-thumbnail

Github ์†Œ์Šค์ฝ”๋“œ

๐Ÿ”Ž ๊ฐ„๋‹จํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํผ์€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฒ€์ฆ ๋กœ์ง์ด๋‚˜ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ’ˆ ๋“ฑ๋ก ํผ๊ณผ ์ƒํ’ˆ ์ˆ˜์ • ํผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณผ๊ป˜์š”.
์ƒํ’ˆ ๋“ฑ๋ก ํผ์˜ ๊ฒฝ์šฐ ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰์„ 100๊ฐœ ์ดํ•˜๋กœ ์ž…๋ ฅํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ  ์ƒํ’ˆ ์ˆ˜์ • ํผ์˜ ๊ฒฝ์šฐ ์ˆ˜๋Ÿ‰์˜ ์ œํ•œ์ด ์—†๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒ€์ฆ๋กœ์ง์ด ๋™์ž‘ํ•ด์•ผ ๋ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Groups๋ฅผ ์‚ฌ์šฉ
  • ํผ ๊ฐ์ฒด ๋ถ„๋ฆฌ

๐Ÿ”Ž Groups

์ƒํ’ˆ ๋“ฑ๋ก ํผ๊ณผ ์ƒํ’ˆ ์ˆ˜์ • ํผ์— groups๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฒ€์ฆ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด๋ณผ๊ป˜์š”.

๋‘ ๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ๋ถ„์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์šฉ์€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

  • ItemSaveRequest
  • ItemUpdateRequest

Item ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • groups๋ฅผ ์ด์šฉํ•ด์„œ ๋“ฑ๋ก์‹œ(ItemSaveRequest)์™€ ์ˆ˜์ •์‹œ(ItemUpdateRequest) ์ ์šฉ๋  ๊ฒ€์ฆ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
@Data
public class Item {

    @NotNull(groups = {ItemUpdateRequest.class})
    private Long id;
    
    @NotEmpty(message = "์ƒํ’ˆ๋ช…์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.")
    private String itemName;

    @NotNull
    @Range(min=1000, max=1000000)
    private Integer price;

    @NotNull
    @Range(min=100, groups = {ItemSaveRequest.class})
    private Integer quantity;
}

Controller ์ธก์—์„œ ์–ด๋–ค ๊ตฌ๋ถ„์ž๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • @Validated์˜ valueํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ตฌ๋ถ„์ž(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@Slf4j
@Controller
@RequestMapping("/test")
public class TestController {

    @GetMapping
    public String form(@ModelAttribute Item item) {
        return "form";
    }

    @PostMapping
    public String add(
            @Validated(value = ItemSaveRequest.class) @ModelAttribute Item item, BindingResult bindingResult) {

        if (bindingResult.hasErrors()) {
            log.info("binding result = {}", bindingResult);
            return "form";
        }

        log.info("****** ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง ์ˆ˜ํ–‰ ********");

        return "form";
    }

    @PostMapping
    public String edit(
            @Validated(value = ItemUpdateRequest.class) @ModelAttribute Item item, BindingResult bindingResult) {

        if (bindingResult.hasErrors()) {
            log.info("binding result = {}", bindingResult);
            return "form";
        }
        
        log.info("****** ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง ์ˆ˜ํ–‰ ********");

        return "form";
    }

}

์ด๋ ‡๊ฒŒ groups๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•œ ๊ฐ์ฒด๋กœ ํผ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒ€์ฆ๋กœ์ง์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”Ž ํผ ๊ฐ์ฒด ๋ถ„๋ฆฌ

์œ„์ฒ˜๋Ÿผ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ groups๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด์—์„œ ๊ฒ€์ฆ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๊ธฐ๋Š” ํž˜๋“  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์˜ˆ์ œ์—์„œ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด(Entity)๋ฅผ ํผ ๋ฐ์ดํ„ฐ์™€ ๊ทธ๋Œ€๋กœ ๋งคํ•‘์‹œ์ผœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋งŽ์€ ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๊ฐ€ ํ•œ ๋ฒˆ์— ๋„˜์–ด์˜ฌ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ ๊ฐ์ฒด์— groups๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ํผ์— ๋”ฑ ๋งž์ถฐ์ง„ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜์—ฌ ๋งคํ•‘์‹œํ‚ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
๊ฒฐ๊ตญ ํผ ๊ฐ์ฒด๋ฅผ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ฒ ์ง€๋งŒ ๋ณต์žกํ•œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฑ ๋งž๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๊ณผ ๊ฒ€์ฆ์˜ ์šฉ์ด์„ฑ์„ ์ฑ™๊ธฐ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

ํผ๋งˆ๋‹ค ๋”ฑ ๋งž๋Š” ํผ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ณต์žกํ•œ ์ƒํ™ฉ์—๋„ ๋Œ€์ฒ˜ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค. !


์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง MVC 2ํŽธ ์„ ์ˆ˜๊ฐ•ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

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