본문 바로가기

Programing/Framework

(58)
[spring] JSR-303 과 @Valid 과 @Validated Controller 에서는 요청바디에 대해서는 @Valid 라는 annotation을 붙이면 Bean Validation(JSR-303)기능을 수행해준다. 하지만 @PathVariable 에 대해서는 적용이 불가능하다. 만약 bean validation 을 통해 하고자 한다면 @Validated 을 Controller 클래스(타입)에 붙여주면 동작을 한다. @Valid의 경우 바인딩이 실패가되면 MethodArgumentNotValidException 을 발생시킨다. 하지만 @Validated 로 바인딩 validation 실패가 발생하면 ConstraintViolationException 예외가 발생하였다. javax.validation.ConstraintViolationException: null a..
[spring] URL path template에서 매핑된 값 구하기 인터셉터를 구현하다보니 URL 요청에서 template로 매핑된 부분의 값을 구할 필요가 있었다. 아래 코드에서 thisValue에 해당하는 부분이다. @GetMapping("/i/wanna/{thisValue}/really") public SomeResponse getSomeHanlder(@PathVariable String thisValue) { // ... 어떻게 구할까 고민을 하다가 @PathVariable 를 처리하는 PathVariableMethodArgumentResolver 에서 힌트를 얻을 수 있었다. package org.springframework.web.servlet.mvc.method.annotation; public class PathVariableMethodArgumentRes..
[spring] ServletWebRequest 생성 package org.springframework.web.servlet.mvc.method.annotation; public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean { @Nullable protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { ServletWebRequest webRequest = new ServletWebRequ..
[Spring] Controller & RequestMapping : RequestMappingInfo AbstractAutowireCapableBeanFactory # createBean → doCreateBean → initializeBean → invokeInitMethods → (InitializingBean) afterPropertiesSet RequestMappingHandlerMapping # afterPropertiesSet AbstractHandlerMethodMapping # afterPropertiesSet → initHandlerMethods → processCandidateBean → if (isHandler(beanType)) → detectHandlerMethods → getMappingForMethod RequestMappingHandlerMapping # getMappingF..
[JOOQ] MySQL JDBC batch 벤치마킹 batch 처리에 대한 의견 코드리뷰를 하다 jdbc의 batch 처리를 하면 성능 효과를 얻을 수 있을 것 같다는 성준님의 의견이 있었다. executeBatch 를 이용한 방법입니다. (e.g Batch Processing in JDBC atBaeldung) 단일 DELETE N 건 실행 대비, 성능상 이점이 있습니다. 평소 성준님은 최적화에 대해 M.A.Jackson의 말을 인용하시던 분이었다. 최적화를 할 때는 아래의 두 규칙을 따르라. 규칙1: 하지마라 규칙2: (전문가들만 따를 것) 아직은 하지마라 - 완벽히 명료한, 최적화되지 않은 해답을 얻을 때까지는. - M. A. 잭슨(M. A. Jackson) 사실 네트워크 round-time을 생각해본다면 상식적으로 한번에 batch로 보내는 것이 ..
[Spring MVC] HandlerMethodArgumentResolver 구현하기 가끔 Controller 에 특정 타입의 값을 자동으로 받고 싶을 경우가 있다. path가 "foo/{a}/{b}" 인데 a 랑 b값을 aggregation 해서 특정 객체로 만들고 싶은데 프레임워크에게 시키고 싶은 것이다. 이럴 경우 @PathVariable 에 대한 메서드 인자 Resolver 를 만들어주면 해결이 가능하다. 기본적으로 @PathVariable Resolver는 두 가지가 있다. PathVariableMethodArgumentResolver PathVariableMapMethodArgumentResolver 위의 경우는 파라미터의 이름이나 @PathVariable 에 지정된 value 의 값을 매핑시켜준다. 가끔 타입 변환이 필요한 경우에는 conversionService에게 타입 변..
[JPA] @Converter 는 어떻게 동작할까? 지니님이 기본 데이터 타입과 String 등을 enum 으로 바꾸는 작업을 진행하셨다. 대부분은 아래와 같이 @Enumerated 으로 enum의 이름을 사용하도록 작업을 했다. import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Table(name = "TEST") @Getter @Setter public class TestEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "SEQ") private Integer id; @Column(name = "ACTION_TYPE", length = 100) @Enumerated(..
[스프링] 생성자가 private 일때 스프링은 객체는 어떻게 만들까? 어제 지니님의 요청한 코드리뷰를 하다 아래와 같은 코드를 발견했다. (이름은 적절히 각색하였습니다.) import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor(access = AccessLevel.PRIVATE) class ReceiptProperties { private String receiptUrl; } 내가 하려는 이야기는 lombok을 썼다는 것이 아니고 왜 private 생성자로 결정 했을까가 포인트이다. 위의 코드를 일반 자바코드로 풀어쓰면 아래와 같다. class ReceiptProperties { p..