2022/01/12 : 싫어

싫어

Spring에서는 Api 요청 시 Controller 메소드의 매개변수로 받은 json 포맷을 자동은 Dto로 변환 작업을 해준다. (역직렬화)
하지만 이때, 기본 생성자와 Getter or Setter가 필요하다.
그래서 대부분 Dto를 보면
Post요청이면, @NoArgsConstructor(AccessLevel.PRIVATE)과 @Getter 어노테이션을 붙여놓고,
Get 요청이면, @Setter를 붙여놓는다. 또는

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.initDirectFieldAccess();
    }

로 필드를 직접 접근할 수 있게 바꾸면 @Setter도 생략할 수 있게 할 수도 있다.

코딩이 암기과목이 되는 느낌이 들기 때문에 나는 이런 규칙이 싫다!!
또, 이런 규칙들로 개발자들간에 Dto는 이래서 이래서 Getter가 필요하고, 기본생성자가 필요해라면서 주입식 교육을 해버릴 것이다. 나의 자유를 침해해버리지 맛!
그래서 방법을 찾아봤더니
ObjectMapper 를 빈으로 등록해서 Getter 없이도 매핑 되게 할 수 있다고 한다. 이런 방법들로 다 바꿔버리고 말겠어!

   JavaTimeModule module = new JavaTimeModule();
        module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
        module.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        module.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
        module.addDeserializer(ZonedDateTime.class, new ZonedDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));

        ObjectMapper mapper = objectMapper.copy();
        mapper.setTimeZone(TimeZone.getDefault());
        mapper.registerModule(module);
        mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
        mapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
        mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);

        mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);


Post 요청시 Jackson2HttpMessageConverter의 ObjectMapper를 사용하고,
Get 요청시 Json 데이터가 아니기 때문에(Query Parameter) WebDataBinder를 사용한다.

좋은 웹페이지 즐겨찾기