dto에 항상 @Getter 및 @NoArgsConstructor를 추가해야 하는 이유는 무엇입니까?

웹 애플리케이션 개발을 계속하면서 Request-POJO-Response를 통해 데이터가 흐른다는 것을 알게 되었습니다.

이를 위해 dto에 @Getter와 @NoArgsConstructor를 추가하여 함수를 구현했습니다.

이렇게 json 데이터를 dto 객체로 변환한 후, 처리된 데이터를 다시 json 형식으로 변환하는 작업을 누가 하는지 궁금했습니다.

이를 주로 처리하는 라이브러리는 SpringBoot 스타터에 포함된 Jackson 라이브러리입니다.

Jackson 라이브러리와 @Getter 및 @NoArgsConstructor를 추가해야 하는 이유에 대해 자세히 알아보려고 합니다.

Jackson은 JSON 데이터 구조를 쉽게 처리하는 라이브러리입니다.

dto 객체를 json으로 변환하는 것을 직렬화라고 하고 json 데이터를 dto로 변환하는 것을 역직렬화라고 합니다.

@Getter
@NoArgsConstructor
public class ReviewUpdateDto {

  private Long id;

  private String review;

}

우리 프로젝트에서 dto 객체의 모든 속성은 비공개로 선언됩니다.

이와 같이 공공의그만큼 ~ 아니다사적인 또는 보호~처럼 선포하다 만약에 게터붓다 함께 그것을 설정하여 json 데이터와 매핑하다 숫자 있다.

getter {“id”:”1″, “review”:”lalal”}을 설정하면 이러한 방식으로 각 필드가 getId() 및 getReview() 메서드를 통해 매핑됩니다.

@Getter 주석을 추가하면 JSON 데이터에 내보낸 필드 이름을 개체에 포함된 필드 이름과 쉽게 일치시킬 수 있습니다.

이 두 필드 이름이 일치하지 않으면 JsonProcessingException이 발생할 수 있습니다.

또한 getter 방식을 기반으로 속성명을 확인하므로,

우편 배달부로 테스트할 때 필드 이름이 일치하는지 확인해야 합니다!(일반적인 실수입니다)

@Getter 어노테이션이 아닌 다른 메소드를 정의하고 리턴 값을 2번과 같이 수정한다고 가정해 봅시다.

//1. 일반적인 getter 메서드
public int getAge(Entity entity) {
	return this.age;
}

//2. 값을 고정한 getter 메서드
public int getAge(Entity entity) {
	return 23;
}

이 경우 JSON 데이터 변환 작업이 완료되면 JSON 데이터에 다음과 같이 {“age”: 23}도 포함되어 있다고 합니다.

이 상황을 통해 getter의 역할을 볼 수 있습니다.

1. getter는 연관 관계를 설정할 수 있습니다.

2. JSON 데이터를 직렬화하여 내보낼 때 getter의 반환 값을 데이터로 내보냅니다.

이 때문에 getter는 JSON 변환에서 빼놓을 수 없는 필수 어노테이션임을 알 수 있다.

처음에는 프로젝트를 변환할 때 기본 생성자가 존재하거나 존재하지 않을 수 있는 주석이라고 생각했습니다.

ObjectMapper가 데이터 바인딩을 수행하려면

1. 기본 생성자를 사용하여 새 개체를 만듭니다.

2. getter, setter 또는 공개 필드를 통해 속성 이름을 찾습니다.

3. java.lang.reflection 패키지를 통해 값을 주입합니다.

이 과정을 거쳐야 합니다.

그래서 @NoArgsConstructor를 통해 기본 생성자를 생성했습니다.

그러나 이러한 변환은 기본 생성자 없이도 가능합니다.

속성 및 생성자가 위임되면 정보를 사용하여 직렬화/역직렬화하는 데 사용되는 ObjectMapper 내에 논리가 있습니다.

대리자 주석에는 @JsonProperty, @JsonAutoDetect 및 @JsonCreator가 포함됩니다.

여기서 위임이란 객체를 애노테이션으로 변환(직렬화/역직렬화)할 때 사용할 정보를 직접 선언하는 것을 의미합니다.

이 위임을 자동화하는 jackson-datatype-jdk8이라는 라이브러리가 있습니다.


현재 프로젝트에도 포함되어 있습니다. 위에서 언급한 세 가지 모듈이 모두 지원됩니다.

@JsonProperty 주석을 통해 jackson-module-parameter-names 모듈에 대한 지원을 받으세요.

이 모듈은 기본 생성자가 없더라도 다른 생성자를 교체하여 역직렬화를 수행할 수 있다고 설명합니다.

SpringBoot에서 이 모듈은 Jackson 바인딩이 실행될 때 ObjectMapper에 추가됩니다. 원래 등록된 것으로 전해졌다.

따라서 컨트롤러로 들어오는 dto 요청에 기본 생성자가 없더라도 역직렬화를 계속 수행할 수 있습니다.