
항상 스프링이 알아서 해주니까 그냥 믿고 쓰는거지~~ 하면서 지나갔는데, 계속 찜찜한 것이 맘에 걸렸다.
또한 값을 주입받으면서 그 과정에 내가 개입할 수 있는 방법이 있는지도 궁금했다.
(주입 받는 과정에서 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 에 관계없이 직접 값을 주입하게 된다.
예전에도 분명 궁금해서 찾아봤던거 같은데, 기록을 해놓지 않으니 또 까먹고 찾아보고를 반복한다.
연차가 쌓일 수록 이런 기본적인 내용은 적어놓기가 조금 부끄럽기도 하다.
(연차 갖다가 부끄럽다고 하는 것도 부끄럽기도 하다.)
하지만 앞으로 같은 문제로 흔들릴 일은 없겠지