๐Ÿ“Œ ์Šคํ”„๋ง Validation ์‹ฌํ™” - 4ํŽธ: ์ปค์Šคํ…€ Validator์™€ ๊ณ ๊ธ‰ ๊ฒ€์ฆ ์ „๋žต

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

SPRING

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

๐Ÿ“… 2025-04-23

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

1๏ธโƒฃย ์ปค์Šคํ…€ Validator ๊ตฌํ˜„ํ•˜๊ธฐ

์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๊ฒ€์ฆ ์–ด๋…ธํ…Œ์ด์…˜(@NotNull, @Size ๋“ฑ)๋งŒ์œผ๋กœ๋Š”

๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฒ€์ฆ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ

  • ์‚ฌ์šฉ์ž ID๊ฐ€ ํŠน์ • ํŒจํ„ด์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.
  • DB์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‚ ์งœ ๋ฒ”์œ„ ๊ฒ€์ฆ ๋“ฑ.

์ด๋Ÿด ๋•Œ ์ปค์Šคํ…€ Validator๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๊ฒ€์ฆ ๋กœ์ง์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… ์‚ฌ์šฉ์ž ์ •์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์ƒ์„ฑ

@Documented
@Constraint(validatedBy = UsernameValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidUsername {
    String message() default "์œ ํšจํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

โœ… ๊ฒ€์ฆ ๋กœ์ง ํด๋ž˜์Šค ๊ตฌํ˜„

public class UsernameValidator implements ConstraintValidator<ValidUsername, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && value.matches("^[a-zA-Z0-9]{5,12}$");
    }
}

2๏ธโƒฃย Validation ๊ทธ๋ฃน(Group) ๊ธฐ๋Šฅ

๊ฒ€์ฆ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ทœ์น™์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ)

  • ํšŒ์›๊ฐ€์ž…(Create) ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„์ˆ˜
  • ํšŒ์›์ •๋ณด ์ˆ˜์ •(Update) ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์„ ํƒ์ 
public interface CreateGroup {}
public interface UpdateGroup {}

public class PersonDto {
    @NotNull(groups = CreateGroup.class)
    private String name;
}
@PostMapping("/create")
public String create(@Validated(CreateGroup.class) PersonDto dto, BindingResult result) { ... }

3๏ธโƒฃย ๊ธ€๋กœ๋ฒŒ Validator ๋“ฑ๋ก

๊ณตํ†ต ๊ฒ€์ฆ ๋กœ์ง์„ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์— ์ž๋™ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

(์˜ˆ: ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ํŠน์ • ํ† ํฐ ๊ฒ€์ฆ ๋“ฑ)

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public Validator getValidator() {
        return new LocalValidatorFactoryBean();
    }
}

๐Ÿ’ก ๊ธ€๋กœ๋ฒŒ Validator๋Š” ๋ฐ˜๋ณต๋˜๋Š” ๊ฒ€์ฆ ๋กœ์ง์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค!


4๏ธโƒฃย ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ & ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ

  • resources/messages.properties ํŒŒ์ผ์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ.
  • ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์˜ Locale์— ๋”ฐ๋ผ ์ž๋™ ์ ์šฉ.
ValidUsername=์•„์ด๋””๋Š” ์˜๋ฌธ๊ณผ ์ˆซ์ž ์กฐํ•ฉ 5~12์ž๋ฆฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง ์„ค์ • ์˜ˆ์‹œ:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setBasename("messages");
    return source;
}

๐Ÿ”ฅ ์š”์•ฝ

  • ๊ธฐ๋ณธ ๊ฒ€์ฆ์œผ๋กœ ๋ถ€์กฑํ•  ๋•Œ๋Š” ์ปค์Šคํ…€ Validator ํ™œ์šฉ.
  • ๊ทธ๋ฃน ๊ธฐ๋Šฅ์œผ๋กœ ์ƒํ™ฉ๋ณ„ ๊ฒ€์ฆ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ.
  • ๊ธ€๋กœ๋ฒŒ Validator๋กœ ๊ณตํ†ต ๊ฒ€์ฆ ํ‘œ์ค€ํ™”.
  • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑ + ๋‹ค๊ตญ์–ด ์ง€์› ๊ณ ๋ ค.
  • โšก ๊ฒ€์ฆ ๋กœ์ง์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด์ž!

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


๋А๋‚€ ์ 

์ด๋ฒˆ ์‹ฌํ™” ํ•™์Šต์„ ํ†ตํ•ด ๋‹จ์ˆœํ•œ ์ž…๋ ฅ๊ฐ’ ์ฒดํฌ๋ฅผ ๋„˜์–ด,

์„œ๋น„์Šค ์ „๋ฐ˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒ€์ฆ ์ „๋žต์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํŠนํžˆ ์ปค์Šคํ…€ Validator์™€ ๊ทธ๋ฃน ๊ธฐ๋Šฅ์€ ์‹ค๋ฌด์—์„œ ๋ณต์žกํ•œ ๊ฒ€์ฆ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ด์ค„ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜€๋‹ค.

profile
Here, My Pale Blue.๐ŸŒ

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