1. 요청이 들어옴
2. 프론트컨트롤러가 파인더에게 요청을 넘겨 처리가능한 컨트롤러를 찾아달라고 부탁
3. 파인더(HandlerMapping)가 찾아서 프론트컨트롤러에게 돌려줌 (돌려주는정보=RequestMappingInfo: 어떤 요청을 어떤컨트롤러가 처리할수있다고알려줌)
4. 개별컨트롤러를 pojo로 만들었기때문에 고정된 코드로는 프론트컨트롤러가 직접 호출할 수 없기때문에 reflection으로 호출전문 컨트롤러(HandlerAdaptor=CommandInvoker)에게 다시 위임을 함
5. reflection코드바탕으로 해당 컨트롤러를 찾는 코드를 돌림
6. 알맞는 컨트롤러는 이제 back단 business logic으로 넘김
7. 그뒤로는 우리가 알던거
8. ...
확장성, 종속성 고려하여 골라쓸것
@NotBlank - javax.validation.constraints
@NotBlank - hibernate
XXdb의 not null 컬럼에 NotBlank(String), NotNull(Integer)
하나의 도메인이 등록,수정,삭제에 이용될 수 있음 -> 검증 방법도 달라져야함 -> groups 사용
Validator validator = Validation.byDefaultProvider()
.configure()
.messageInterpolator(
new ResourceBundleMessageInterpolator(
new PlatformResourceBundleLocator( "MyMessages" )
)
)
.buildValidatorFactory()
.getValidator();
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class) // 얘와 한쌍으로가는 validator필요
@Documented
@Repeatable(List.class)
public @interface CheckCase {
String message() default "{org.hibernate.validator.referenceguide.chapter06.CheckCase." +
"message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
CaseMode value();
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
@interface List {
CheckCase[] value();
}
}