API 통신을 하다 보면 대부분 JSON 형태로 데이터를 주고 받습니다. 이때, 서로 파라미터 작성 방식(카멜케이스, 스네이크케이스) 또는 파라미터명이 다를 경우 데이터를 파싱하는 도중에 에러 또는 원활하게 파싱이 되지 않는 경우가 있습니다 !
카멜 케이스, 스네이크 케이스란?
카멜케이스(Camel Case)
첫 글자는 소문자로, 중간 글자들은 대문자로 시작하는 표기법입니다.
ex) memberId, memberName, memberPhoneNumber
스네이크 케이스(Snake Case)
첫 글자는 소문자로, 중간 글자들은 언더바(_)가 포함되는 표기법
ex) member_id, member_name, member_phone, member_phone_number
일반 코드 예시
간단하게 Json 형태로 Request를 전달받는 코드를 작성해보겠습니다 !
// UserDto
@Getter
@Setter
@ToString
public class UserDto {
private String memberId;
private String memberName;
private String member_phone_number;
private String zipCode;
}
// Controller
@RestController
@RequestMapping("/api")
class PostApiController {
@PostMapping("/test")
public UserRequestDto postMappingObject(@RequestBody UsertDto request) {
System.out.println(request.toString());
return request;
}
}
Postman으로 데이터를 전달하여 테스트를 진행해보겠습니다 !
위 이미지와 같이 memberPhoneNumber로 요청한 데이터는 member_phone_number 파라미터로 저장이 되지 않는 것을 확인하실 수 있습니다 ! 이유는 요청한 key 이름(memberPhoneNumber)와 응답 객체(member_phone_number)의 파라미터 명이 다르기 때문에 발생한 문제입니다.
@JsonProperty, @JsonNaming 코드 예시
@JsonProperty와 @JsonNaming 어노테이션을 사용하기 위해서는 Jackson 라이브러리를 추가해줘야합니다 !
- Maven
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.2</version>
<type>bundle</type>
</dependency>
- Gradle
implementation 'com.fasterxml.jackson.core:jackson-core:2.13.2'
Spring Boot를 사용할 경우 아래 Dependency에 위 패키지가 포함되어 있어, 따로 추가하실 필요는 없습니다 !
혹시라도 특정 버전이 필요하실 경우에는 따로 추가하셔도 됩니다 !!
-> implementation 'org.springframework.boot:spring-boot-starter-web'
@JsonProperty
@JsonProperty 어노테이션은 객체를 JSON 형식으로 변환할 때 key의 이름을 설정할 수 있습니다. 위 테스트에서 실패한 member_phone_number 변수에 해당 어노테이션을 추가하여 다시 확인해보겠습니다 !
@Getter
@Setter
@ToString
public class UserDto {
private String memberId;
private String memberName;
@JsonProperty("memberPhoneNumber")
private String member_phone_number;
private String zipCode;
}
위 이미지에서와 같이 이번에는 memberPhoneNumber까지 정상적으로 파싱되어 전달된 것을 확인하실 수 있습니다. 그러나 1~2개 정도인 경우에는 해당 어노테이션을 사용하여 해결할 수 있겠지만 10~20개 이상이 된다면 필드 하나하나 추가하는 것은 코드도 길어지고 유지보수 면에서도 번거로운 작업이 됩니다......이럴 때 사용하는 것이 바로 ! @JsonNaming 어노테이션입니다.
@JsonName
@JsonName 어노테이션은 위에서 설명했던 것과 같이 클래스에 존재하는 모든 필드를 스네이크 케이스로 전달 받을 수 있습니다 ! PostMan을 통해 모두 스네이크 케이스 형태로 Reqeust를 보내보겠습니다.
@Getter
@Setter
@ToString
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequestDto {
private String memberId;
private String memberName;
private String memberPhoneNumber;
private String zipCode;
}
정상적으로 파싱된 것을 확인하실 수 있습니다.
위 응답 값을 확인해보면 Dto에는 카멜케이스로 작성되어 있는데, 응답 값은 스네이크케이스로 되어 전달되고 있는 것을 확인하실 수 있습니다.(로그 상에서는 정상적으로 카멜케이스로 보여짐)
이는 @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)에서 SnakeCaseStrategy.class에서 해당 Dto 파일의 필드들을 스네이크케이스 형태로 바꿔서 사용하기 때문입니다.
(return 값에서 UserDto를 그대로 사용하여 return 시에도 SnakeCaseStrategy에 의해 스네이크 케이스로 변환되어 전달됩니다.)
'프로그래밍 > Java' 카테고리의 다른 글
[Java, 자바] 불변 객체에 대하여 (0) | 2024.06.27 |
---|---|
[Java, 자바] Object클래스에 관하여 (0) | 2024.06.23 |
[Java, 자바] 추상클래스와 추상메소드 (0) | 2024.06.19 |
[Java, 자바] JVM의 동작원리와 기본개념 (0) | 2024.06.18 |
[Spring, Spring Boot] @Value가 null일 때의 원인과 해결 방법 (0) | 2024.06.17 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!