JSP - 26. 프론트 컨트롤러 역할, Hibernate Validator

godkimchichi·2020년 12월 23일
0

JSP+Spring

목록 보기
27/43

Front Controller

  • 컨트롤러를 찾아내야하고 -> finder
  • 호출해야함 -> reflection이 동적호출


1. 요청이 들어옴
2. 프론트컨트롤러가 파인더에게 요청을 넘겨 처리가능한 컨트롤러를 찾아달라고 부탁
3. 파인더(HandlerMapping)가 찾아서 프론트컨트롤러에게 돌려줌 (돌려주는정보=RequestMappingInfo: 어떤 요청을 어떤컨트롤러가 처리할수있다고알려줌)
4. 개별컨트롤러를 pojo로 만들었기때문에 고정된 코드로는 프론트컨트롤러가 직접 호출할 수 없기때문에 reflection으로 호출전문 컨트롤러(HandlerAdaptor=CommandInvoker)에게 다시 위임을 함
5. reflection코드바탕으로 해당 컨트롤러를 찾는 코드를 돌림
6. 알맞는 컨트롤러는 이제 back단 business logic으로 넘김
7. 그뒤로는 우리가 알던거
8. ...

Hibernate Validator

  • 요청 처리과정에서 validation이 필요한 부분을 설명하는 그림
  • 클라이언트사이드검증 + 서버사이드 검증 + db의 제약조건 검증
  • 3-tier구조에서 1,2,3 tier 모두 검증 필요
  • layered architecture 내 각 레이어에서도 검증 수행 필요
  • 검증 위한 중복코드 발생
  • 모든 레이어에서 공통적으로 사용하는 domain layer에서 검증을 수행한다면, 검증을 수행하는 코드가 빠져나갈 것임

사용방법

  • 확장성, 종속성 고려하여 골라쓸것

    • @NotBlank - javax.validation.constraints
    • @NotBlank - hibernate XX
  • db의 not null 컬럼에 NotBlank(String), NotNull(Integer)

  • 하나의 도메인이 등록,수정,삭제에 이용될 수 있음 -> 검증 방법도 달라져야함 -> groups 사용

group 분리

    1. Grouping constraints
  • InsertGroup, UpdateGroup, DeleteGroup 인터페이스 생성
    • 아무것도 안하는 인터페이스 = 마커 어노테이션
  • 그룹 생략될 시 default group

메세지 커스터마이징

  • 4.2.1. ResourceBundleLocator
Validator validator = Validation.byDefaultProvider()
        .configure()
        .messageInterpolator(
                new ResourceBundleMessageInterpolator(
                        new PlatformResourceBundleLocator( "MyMessages" )
                )
        )
        .buildValidatorFactory()
        .getValidator();

제약조건 커스텀

    1. Creating custom constraints
@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();
    }
}

과제

  • 우편번호, dbProp -> dao를 mybatis로
  • 우편번호 페이징을 서버사이드방식으로?
  • 상품수정제외해서 완성

내일

  • 오전 프레임워크수업
  • 오후에 리팩토링
profile
갈 길이 멀다

0개의 댓글