Jackson의 리플렉션 활용과 스프링의 주입 과정

궁금하면 500원·2024년 7월 11일
0

항상 스프링이 알아서 해주니까 그냥 믿고 쓰는거지~~ 하면서 지나갔는데, 계속 찜찜한 것이 맘에 걸렸다.

또한 값을 주입받으면서 그 과정에 내가 개입할 수 있는 방법이 있는지도 궁금했다.

(주입 받는 과정에서 Custom-Validation 을 할 수 있는지 등등)
그래서 조금 찾아봤는데, 정답은 Jackson에 의한 '리플렉션 활용'
이다.

    @Getter
    @Builder
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @AllArgsConstructor(access = AccessLevel.PRIVATE)
    public class Device {

        @NotNull
        private Long deviceId;
        @NotNull
        private Long port;
        private String deviceSerial;
    }

대략 이런 클래스가 있다고 해보면, Jackson 은 먼저 리플렉션으로 생성자를 호출한다.

Constructor<RelayDevice> constructor = RelayDevice.class.getDeclaredConstructor();
constructor.setAccessible(true); // private이나 protected 생성자에도 접근할 수 있도록 설정
RelayDevice relayDevice = constructor.newInstance();

대략 이런 과정을 거쳐서 NoArgsConstructor 의 접근을 풀고 새 인스턴스를 생성하게된다.

그리고 각 필드의 값은

Field deviceIdField = RelayDevice.class.getDeclaredField("deviceId");
deviceIdField.setAccessible(true); // private 필드 접근 가능하도록 설정
deviceIdField.set(relayDevice, 12345L);

이런 과정을 거쳐서 Setter 에 관계없이 직접 값을 주입하게 된다.

예전에도 분명 궁금해서 찾아봤던거 같은데, 기록을 해놓지 않으니 또 까먹고 찾아보고를 반복한다.

연차가 쌓일 수록 이런 기본적인 내용은 적어놓기가 조금 부끄럽기도 하다.

(연차 갖다가 부끄럽다고 하는 것도 부끄럽기도 하다.)

하지만 앞으로 같은 문제로 흔들릴 일은 없겠지

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글