@JsonNaming

BK·2024년 5월 13일

Spring

목록 보기
5/6

@JsonNaming

Jackson library의 @JsonNaming을 통해 client와 server간 naming rule의 차이를 해결할 수 있다.

Naming Strategy

snake_case, camelCase, kebab-case 등 다양한 작명 방법이 있으며, Jackson libarary의 PropertyNamingStrategy class에서는 아래와 같이 7가지 naming strategy에 대한 변환을 지원한다.

singleton pattern으로 구현되어 있으며, 각각은 NamingBase 클래스를 상속받아 abstract method인 translate() method를 구현하도록 되어있다. 아래와 같은 테스트 코드를 통해 변환을 확인할 수 있다.

package com.pda.practice.test;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

public class TestDto {

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.LowerCamelCaseStrategy.class)
    public static class LowerCamelCase {
        private String testValue;
    }

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.UpperCamelCaseStrategy.class)
    public static class UpperCamelCase {
        private String testValue;
    }

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
    public static class SnakeCase {
        private String testValue;
    }

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.UpperSnakeCaseStrategy.class)
    public static class UpperSnakeCase {
        private String testValue;
    }

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.LowerCaseStrategy.class)
    public static class LowerCase {
        private String testValue;
    }

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.KebabCaseStrategy.class)
    public static class KebabCase {
        private String testValue;
    }

    @NoArgsConstructor
    @Getter
    @Setter
    @JsonNaming(value = PropertyNamingStrategies.LowerDotCaseStrategy.class)
    public static class LowerDotCase {
        private String testValue;
    }

}
package com.pda.practice.test;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@Slf4j
@RequestMapping("/test")
public class TestController {

    @PostMapping("/lower-camel")
    public ResponseEntity<String> lowerCamelTest(@RequestBody TestDto.LowerCamelCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }

    @PostMapping("/upper-camel")
    public ResponseEntity<String> upperCamelTest(@RequestBody TestDto.UpperCamelCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }

    @PostMapping("/snake")
    public ResponseEntity<String> snakeTest(@RequestBody TestDto.SnakeCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }

    @PostMapping("/upper-snake")
    public ResponseEntity<String> upperSnakeTest(@RequestBody TestDto.UpperSnakeCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }

    @PostMapping("/lower")
    public ResponseEntity<String> lowerTest(@RequestBody TestDto.LowerCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }

    @PostMapping("/kebab")
    public ResponseEntity<String> kebabTest(@RequestBody TestDto.KebabCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }

    @PostMapping("lower-dot")
    public ResponseEntity<String> lowerDot(@RequestBody TestDto.LowerDotCase reqBody) {
        log.info("Req body : {}", reqBody.getTestValue());
        return new ResponseEntity<>(reqBody.getTestValue(), HttpStatus.OK);
    }
}

0개의 댓글