Jackson과 Lombok @Data 어노테이션을 이용한 JSON 데이터 처리
자바에서 JSON 데이터를 자바 객체로 변환할 때는 Jackson 라이브러리를 많이 사용한다.
Jackson은 ObjectMapper를 사용하여 JSON 데이터를 쉽게 자바 객체로 변환할 수 있게 해준다.
이번 포스팅에서는 Jackson을 활용해 JSON 데이터를 객체로 변환하는 방법과, Lombok의 @Data 어노테이션을 사용하여 자동으로 생성된 메서드들이 어떻게 유용하게 작동하는지 살펴보겠다.
또한, 여러 클래스에 @Data 어노테이션을 사용할 경우에도 어떻게 정확하게 값을 추출할 수 있는지에 대해 설명할 것이다.
Jackson을 이용한 JSON 데이터 변환
Jackson은 JSON 데이터를 자바 객체로 변환하는 데 매우 유용하다.
ObjectMapper를 사용하여 JSON 데이터를 원하는 자바 객체에 매핑할 수 있다.
이때 JSON 데이터에서 "answer"와 같은 특정 필드를 자바 객체의 필드에 자동으로 매핑할 수 있다.
Lombok의 @Data 어노테이션
@Data 어노테이션은 Lombok 라이브러리의 기능으로,
해당 클래스에 대해 getter, setter, toString, equals, hashCode 메서드를 자동으로 생성한다.
이 어노테이션 덕분에 자바 클래스를 작성할 때 번거로운 메서드들을 직접 작성할 필요가 없으며, 필요한 메서드를 자동으로 생성해준다.
예를 들어, 아래와 같은 클래스를 정의했다고 가정하자.
@Data
public class SubmissionRequest {
private String user;
private String answer;
}
@Data 어노테이션이 붙은 클래스는 **getUser()**와 getAnswer() 메서드를 자동으로 생성해준다.
이를 통해 객체를 생성한 후, getAnswer() 메서드를 호출하여 answer 값을 가져올 수 있다.
Jackson과 Lombok을 함께 사용하기
Jackson 라이브러리와 Lombok의 @Data 어노테이션을 결합하면, JSON 데이터를 자동으로 자바 객체로 변환하고, 그 객체에서 자동으로 생성된 getter 메서드를 통해 필드 값을 쉽게 가져올 수 있다.
아래는 JSON 데이터와 그 데이터를 자바 객체로 변환하는 코드 예시이다.
예시 코드
- JSON 데이터:
{
"user": "미니",
"answer": "java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int sum = 0; String[] inputs = br.readLine().split(\" \"); for (int i = 0; i < n; i++) sum += Integer.parseInt(inputs[i]); System.out.println(sum);"
}
2. 자바 클래스 (SubmissionRequest):
@Data
public class SubmissionRequest {
private String user;
private String answer;
}
3. ObjectMapper를 이용한 JSON → 자바 객체 변환:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
String json = "{\"user\":\"미니\", \"answer\":\"java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int sum = 0; String[] inputs = br.readLine().split(\\\" \\\"); for (int i = 0; i < n; i++) sum += Integer.parseInt(inputs[i]); System.out.println(sum);\"}";
try {
// ObjectMapper를 이용해 JSON을 자바 객체로 변환
ObjectMapper objectMapper = new ObjectMapper();
SubmissionRequest request = objectMapper.readValue(json, SubmissionRequest.class);
// 변환된 객체에서 getAnswer() 메서드로 answer 값을 가져옴
System.out.println("Answer: " + request.getAnswer());
} catch (Exception e) {
e.printStackTrace();
}
}
}
위 코드에서 ObjectMapper를 사용하여 JSON 데이터를 SubmissionRequest 클래스 객체로 변환하고, request.getAnswer()를 호출하여 answer 값을 추출한다.
이렇게 하면 JSON 데이터에서 "answer" 필드가 SubmissionRequest 객체의 answer 필드에 자동으로 매핑된다.
@Data 어노테이션이 많은 클래스가 있을 경우
@Data 어노테이션이 여러 클래스에 적용된 경우, 각 클래스에서 정의된 answer 필드를 정확히 찾아서 사용할 수 있다. 중요한 점은 JSON 데이터가 어떤 클래스에 매핑될지 명확히 지정하는 것이다.
예를 들어, 두 개의 클래스가 각각 answer 필드를 가지고 있다고 가정하자.
@Data
public class SubmissionRequest {
private String user;
private String answer;
}
@Data
public class AnotherRequest {
private String user;
private String answer;
}
이때 ObjectMapper를 사용하여 JSON 데이터를 SubmissionRequest 클래스나 AnotherRequest 클래스에 맞게 변환하면, 각 클래스에서 제공하는 getAnswer() 메서드를 통해 각각의 answer 값을 정확하게 얻을 수 있다.
예시 코드: 클래스가 여러 개인 경우
ObjectMapper objectMapper = new ObjectMapper();
// JSON 데이터를 SubmissionRequest 객체로 변환
SubmissionRequest submissionRequest = objectMapper.readValue(json, SubmissionRequest.class);
// JSON 데이터를 AnotherRequest 객체로 변환
AnotherRequest anotherRequest = objectMapper.readValue(json, AnotherRequest.class);
// 각 객체에서 getAnswer()를 호출하여 answer 값을 가져옴
System.out.println("Answer from SubmissionRequest: " + submissionRequest.getAnswer());
System.out.println("Answer from AnotherRequest: " + anotherRequest.getAnswer());
이처럼, 각 클래스에 명확하게 JSON 데이터를 매핑하고 각 클래스의 메서드를 호출하면, 여러 클래스가 존재하는 상황에서도 원하는 값을 정확하게 추출할 수 있다.
총 정리
- Jackson은 JSON 데이터를 자바 객체로 변환할 때 매우 유용한 라이브러리이다.
- ObjectMapper를 통해 JSON 데이터를 자바 객체로 변환하고, 변환된 객체에서 자동으로 생성된 getter 메서드를 통해 필드 값을 쉽게 가져올 수 있다.
- Lombok의 @Data 어노테이션은 클래스에 자동으로 getter, setter, toString, equals, hashCode 메서드를 생성해주므로, 코드 작성이 간결해진다.
- @Data 어노테이션이 여러 클래스에 달린 경우에도 Jackson 라이브러리가 각 클래스에 맞게 데이터를 변환하여, 필드 값을 정확히 추출할 수 있다.
'JAVA > Spring' 카테고리의 다른 글
@RequiredArgsConstructor와 @AllArgsConstructor 비교 [spring 의존성 주입] (0) | 2025.01.17 |
---|---|
Spring WebSocket의 기본 개념과 [클라이언트-서버] 연결 (0) | 2025.01.01 |
Java에서 ProcessBuilder와 클래스패스 설정에 대한 이해 (0) | 2024.12.30 |
Spring 의존성 주입: 생성자 주입과 수정자 주입의 동작 원리 (1) | 2024.12.21 |
Spring @ComponentScan의 includeFilters와 excludeFilters 완벽 이해 (0) | 2024.12.21 |
댓글