Jackson 라이브러리의 @JacksonInject 어노테이션은 JSON에서 해당 값을 읽어오는 대신, 역직렬화되는 객체에 값을 직접 주입(inject)할 때 사용합니다. 필드에 값을 주입하려면 InjectableValues 클래스를 활용하고, ObjectMapper가 InjectableValues 객체에서 주입값을, JSON 문자열에서 나머지 값을 모두 읽어오도록 설정해야 합니다.
@JacksonInject 어노테이션의 동작 방식
JSON 페이로드에 포함되지 않은 값(예: 보안상 JSON에 노출하지 않는 ID, 요청 컨텍스트 정보 등)을 역직렬화 과정에서 채워 넣어야 할 때 유용합니다. @JacksonInject는 필드뿐 아니라 메서드, 생성자 매개변수, 애노테이션 타입에도 적용할 수 있습니다.
문법(Syntax)
@Target(value={ANNOTATION_TYPE,METHOD,FIELD,PARAMETER})
@Retention(value=RUNTIME)
public @interface JacksonInject
예제 코드
아래 예제는 JSON 문자열에서 직원 이름(empName)은 읽어오고, 직원 ID(empId)는 InjectableValues를 통해 주입받는 코드입니다.
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import java.io.*;
public class JacksonInjectTest {
public static void main(String args[]) throws IOException {
String jsonString = "{\"empName\": \"Raja Ramesh\"}";
InjectableValues injectableValues = new InjectableValues.Std().addValue(int.class, 110);
Employee emp = new ObjectMapper().reader(injectableValues).forType(Employee.class).readValue(jsonString);
System.out.println(emp);
}
}
// Employee 클래스
class Employee {
@JacksonInject
public int empId = 0;
public String empName = "Adithya";
@Override
public String toString() {
return "Employee{" +
"empId=" + empId +
", empName='" + empName + '\'' +
'}';
}
}
코드 설명
- InjectableValues.Std().addValue(int.class, 110) : int 타입에 주입할 값 110을 등록합니다.
- new ObjectMapper().reader(injectableValues) : ObjectMapper에 InjectableValues를 설정하여 reader를 생성합니다.
- @JacksonInject : empId 필드에 주입된 값이 할당되며, JSON에 해당 필드가 없어도 오류가 발생하지 않습니다.
실행 결과
Employee{empId=110, empName='Raja Ramesh'}
실행 결과를 보면 JSON에는 empId가 없었음에도 불구하고, InjectableValues를 통해 주입된 값 110이 empId에 정상적으로 할당된 것을 확인할 수 있습니다.