loose
이로운 개발하기
loose
전체 방문자
오늘
어제
  • 전체 (207)
    • ☕ Java (24)
    • 📘 Effective Java (9)
    • 🍃 Spring (48)
    • 📖 ORM (9)
    • ☸️ Kubernetes (13)
    • 🐧 Linux (5)
    • 🐋 Docker (5)
    • 🛠️ CI & CD (7)
    • 🕸️ Web (6)
    • 🔗 Distributed System (3)
    • 📜 Js (10)
    • 📈 Database (11)
    • 🗂️ Etc (34)
    • 🧑 Chitchat (11)
    • 📒 문학 (11)
    • 👜 개인 공부 창고 (1)

공지사항

반응형

최근 글

최근 댓글

loose
🍃 Spring

@JsonProperty 사용법에 대한 모든 것

🍃 Spring

@JsonProperty 사용법에 대한 모든 것

2023. 7. 9. 21:24
반응형

필드명이 다를 때 치환 용도

	@GetMapping("/changeCamelCase1")
    public String changeCamelCase1(@RequestBody Student1 student) {
        System.out.println(student.myAge + "--" + student.myName);
        return "ok";
    }

    @GetMapping("/changeCamelCase2")
    public String changeCamelCase2(@RequestBody Student2 student) {

        System.out.println(student.myAge + "--" + student.myName);
        return "ok";
    }

    @Data
    public static class Student1 {
        @JsonProperty("my_name")
        private String myName;

        @JsonProperty("my_age")
        private String myAge;
    }

    @Data
    @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
    public static class Student2 {
        private String myName;
        private String myAge;
    }

다른 블로그에 나와 있듯이 my_name이라는 Client 영역에서 넘어오는 Snake Case 문법을 Camel Case로 바꾸는 데에 사용할 수 있다.

 

메소드 레벨에서 사용하기

	@GetMapping("/using-in-method")
    public ResponseEntity<MyObject> usingInMethod() throws JsonProcessingException {
        MyObject myObject = new MyObject();

        ObjectMapper mapper = new ObjectMapper();
        // Serialize Java object and change @JsonProperty at the method level to reflect in the resulting JSON data.
        String json = mapper.writeValueAsString(myObject);
        // "{\"myName\":\"stir\"}" Json Data created in Java Object is deserializing to Json
        MyObject obj = mapper.readValue(json, MyObject.class);

        System.out.println(obj.myName());

        return ResponseEntity.ok(myObject);
    }
    public static class MyObject {
        String myName;
        @JsonProperty
        public String myName() {
            return "stir";
        }
    }

 

myName이라는 메소드 위에 @JsonProperty를 사용했다. 

그리고 MyObject를 ResponseEntity나 ResponseBody를 통해서 Java Object를 JSON 형태로 치환해주는 과정에서 myName 메소드 이름이 JSON 값으로 들어가게 된다.

{
	"myName" : "stir"
}

@JsonProperty가 필요 없는 경우

	@Data
    public static class Student {
        @JsonProperty
        private String myName;
    }

 

위에서 @JsonProperty 기능은 myName 값을 Json으로 변환시켜주는 기능을 한다.

하지만 위와 같이 필드에 @JsonProperty를 사용하면서 어노테이션 안에 아무것도 안적어주는 경우는 지워주는 것이 좋다.

왜냐면 오류가 나지는 않지만 기능의 중복이 발생하기 때문이다.

예를들어 Student를 Controller에서 @ResponseBody로 Return하는 경우에 알아서 JSON으로 변환해주기 때문이다.

필드에서 사용하는 @JsonProperty는 필드 네임 매칭이 아니라면 쓸 일이 없다.

그러므로 위와 같이 사용하는 코드는 냄새나는 코드로 간주하고 지워서 사용하는 것이 좋다.

 

무분별한 JsonProperty 사용을 하려면 Enum으로 관리하기

 	enum DevType{

        MOBILE(Constant.MOBILE),
        WEB(Constant.WEB),
        SERVER(Constant.SERVER);

        public static class Constant {
            public static final String MOBILE = "안드로이드";
            public static final String WEB = "스프링";
            public static final String SERVER = "리눅스";
        }
        private String krName;

        private DevType(String krName){
            this.krName = krName;
        }
        public String getKrName() {
            return krName;
        }
    }
    public class MyObject3 {
        @JsonProperty(DevType.Constant.MOBILE)
        private String android;
        @JsonProperty(DevType.Constant.WEB)
        private String spring;

    }

@JsonProperty를 이곳 저곳에 사용하다보면 무분별하게 사용되기도 하고 값을 한 곳에서 관리하기가 힘들 수 있다.

그럴 때는 위처럼 Enum을 사용하면 좀 더 중앙 집중적으로 관리할 수 있다.

 

 

하지만 Enum은 보통 그룹화된 상수를 관리하기 위한 목적으로 쓰이기 때문에 위와 같이 단순히 1:1 매칭으로만 쓰이는 상수라면 단순한 Final을 써도 상관없다.

만약에 변경해야 될 값이 여러개고 비슷한 값들이 모여있는 그룹화된 상수를 활용하려면 아래와 같이 사용하면 좋다.

Enum으로 Group으로 묶여진 상수 관리하기

  	enum DevType{

        MOBILE(new SpecificDev[]{
                SpecificDev.IOS, SpecificDev.ANDROID
        }),
        WEB(new SpecificDev[]{
                SpecificDev.SPRING, SpecificDev.NODE, SpecificDev.PYTHON
        }),
        SERVER(new SpecificDev[]{
                SpecificDev.LINUX, SpecificDev.WINDOWS
        });

        enum SpecificDev{
            ANDROID(Constant.ANDROID),
            IOS(Constant.IOS),
            SPRING(Constant.SPRING),
            NODE(Constant.NODE),
            PYTHON(Constant.PYTHON),
            LINUX(Constant.LINUX),
            WINDOWS(Constant.WINDOWS);

            private String krName;
            SpecificDev(String krName) {
                this.krName = krName;
            }

            public String getKrName() {
                return krName;
            }
            public static class Constant {
                public static final String ANDROID = "안드로이드";
                public static final String IOS = "아이폰";
                public static final String SPRING = "스프링";
                public static final String NODE = "노드";
                public static final String PYTHON = "파이썬";
                public static final String LINUX = "리눅스";
                public static final String WINDOWS = "윈도우";
            }
        }
        
        private SpecificDev[] specificDev;

        private DevType(SpecificDev[] specificDevs){
            this.specificDev = specificDevs;
        }
        public SpecificDev[] getSpecificDev() {
            return specificDev;
        }
    }
    public class MyObject3 {
        @JsonProperty(DevType.SpecificDev.Constant.ANDROID)
        private String android;
        @JsonProperty(DevType.SpecificDev.Constant.SPRING)
        private String spring;
    }

중분류, 소분류 형태로 만든 것이라고 보면 된다.

위와 같은 방식으로 @JsonProperty를 좀 더 효율적으로 관리할 수 있다.

 

728x90

'🍃 Spring' 카테고리의 다른 글

Spring Actuator와 Thread(+@Scheduled)  (0) 2023.08.12
@Transactional을 테스트에 써야할까?  (0) 2023.07.23
스프링 클라우드 Config 구성하기(4)  (0) 2023.07.05
스프링 클라우드 Eureka 구성하기(3)  (0) 2023.07.05
스프링 클라우드 Gateway 구성하기(2)  (0) 2023.07.05
  • 필드명이 다를 때 치환 용도
  • 메소드 레벨에서 사용하기
  • @JsonProperty가 필요 없는 경우
  • 무분별한 JsonProperty 사용을 하려면 Enum으로 관리하기
  • Enum으로 Group으로 묶여진 상수 관리하기
'🍃 Spring' 카테고리의 다른 글
  • Spring Actuator와 Thread(+@Scheduled)
  • @Transactional을 테스트에 써야할까?
  • 스프링 클라우드 Config 구성하기(4)
  • 스프링 클라우드 Eureka 구성하기(3)
loose
loose
불만하는 사람은 90명, 해결하는 사람은 9명, 리드하는 사람은 1명
음악과 낭만을 좋아합니다.
hELLO. 티스토리 스킨을 소개합니다.
제일 위로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.