[Spring Boot] 객체에서 Json 변경 시 특정 필드 제외하기(@JsonIgnore, @JsonProperty)

이종현·2023년 9월 11일
1

Spring / Spring Boot

목록 보기
6/6

자바 객체의 필드 중 특정 필드를 제외하고 Json 형태로 변환 시켜야 하는 경우

jackson 라이브러리에서 제공하는 @JsonIgnore 또는 @JsonProperty 을 제외 시키고자 하는 필드 위에 추가하면 된다.

@JsonIgnore : 객체에서 필드를 읽기 X , 객체 생성 시 해당 필드에 값을 쓰기 X

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) : 객체에서 필드를 읽기 X , 객체 생성 시 해당 필드에 값을 쓰기 O


@JsonIgnore 예시

commentDto라는 객체가 있고 필드 중 data_seq를 제외한 뒤,

ObjectMapper 라이브러리를 사용하여 map으로 변환하려 한다.

이때 아래와 같이 CommentDto 클래스의 data_seq 객체에 @JsonIgnore 어노테이션을 추가한다.

import lombok.Data;
import com.fasterxml.jackson.annotation.JsonIgnore;

@Data
public class CommentDto {
    @JsonIgnore
    private String data_seq;
    private String comment_seq;
    private String doc_id;
    private String doc_comment;
    private String co_id;
    private String user_id;
    private String dept_id;

이후 commentDto에 필드 별 값 세팅 (data_seq 포함) 및  Map으로 변경 시,

data_seq는 포함되지 않고 변환되는 것을 확인 할 수 있다.

	@Test
	public void getValidExcelDataTest() throws Exception {

		CommentDto commentDto = new CommentDto();
		commentDto.setData_seq("123");
		commentDto.setDoc_id("abc");

		Map<String,String> commentMap = objectMapper.convertValue(commentDto, Map.class);
		System.out.println(commentMap);
	}

단, 이 방법은 반대로 Map의 값을 DTO로 쓰기를 할 때에도 무시한다.

	@Test
	public void getValidExcelDataTest() throws Exception {

		Map<String, Object> commentMap = new HashMap<>();
		commentMap.put("data_seq", "456");
		commentMap.put("doc_id", "def");
		CommentDto commentDtoCvt = objectMapper.convertValue(commentMap, CommentDto.class);
		System.out.println(commentDtoCvt);
	}


@JsonProperty 예시

JsonProperty는 아래와 같이 WRITE_ONLY 속성을 추가하여 사용한다면

객체의 데이터를 json으로 읽을때에는 무시하지만, map 데이터를 객체로 생성할 때는 쓰기를 허용한다.

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

@Data
public class CommentDto {
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String data_seq;
    private String comment_seq;
    private String doc_id;
    private String doc_comment;
    private String co_id;
    private String user_id;
    private String dept_id;

}

위와 같은 차이가 있으므로 각각 상황에 맞게 사용해야 할 것 같다.

profile
백엔드 개발자의 소소한 개발 기록.

0개의 댓글