inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현

API 문서화 (2) - Swagger를 이용한 API 문서화

자주 나오는 질문 - DTO에 @Allargs, @Noargs 문제

882

euichan

작성한 질문수 3

0

스크린샷 2023-04-26 오후 1.31.07.png실행할 때 IntelliJ IDEA 가 아닌 Gradle로 돌려야 합니다

spring-boot jpa web-api

답변 1

0

구파고

해당 질문이 많이 나와서, 찾아 봤었는데 버전이나 환경, 세팅에 따라서 다른것 같고, 추가적인 어노테이션을 붙이는걸로 가이드 드렸었는데 원인이 저 부분이었군요!!

 

공유해주셔서 감사합니다. 다른분들한테도 많이 도움이 될꺼 같네요!

1

euichan

저 문제가 원인일 수도 있고, 아닐 수도 있는 것 같더라고요.. 그래서 정리해봤습니다.

틀린 부분 있으면 피드백 부탁드립니다!


@RequestBody

파라미터에 @RequestBody가 있으면

스프링은 RequestResponseBodyMethodProcessor(ArgumentResolver)MappingJackson2HttpMessageConvertor를 이용해서 역직렬화를 수행하는데,
이때 기본적으로는 기본 생성자로 DTO를 생성해서 기본생성자가 필요합니다.
하지만 @JsonProperty, @JsonAutoDetect 등을 이용한 Property 기반 클래스이거나, 생성자가 위임된 경우라면 필요하지 않습니다.
image하지만 다음과 같이 애노테이션을 사용하면 문제가 될 수 있는게, 명시된 기본 생성자가 없을 때 @Builder 애노테이션을 사용하면 @AllArgsConstructor(access = AccessLevel.PRIVATE)이 붙게 됩니다.
따라서 기본 생성자가 만들어지지 않고, 역직렬화 시 기본 생성자가 없어 역직렬화 에러가 발생합니다.

@Builder를 제거해주면 됩니다.
리플렉션을 사용해 필드에 값을 넣어주므로, @Getter와 @Setter 둘 중 하나만 있으면 됩니다.

 

기본 생성자만 있고 getter 가 없다면, deserialize 불가능합니다.

https://jenkov.com/tutorials/java-json/jackson-objectmapper.html#how-jackson-objectmapper-matches-json-fields-to-java-fields
다음 글을 찾아보면,

기본적으로 Jackson은 JSON 필드의 이름을 Java 오브젝트의 getter 및 setter 메서드와 일치시켜 JSON 오브젝트의 필드를 Java 오브젝트의 필드에 매칭합니다. Jackson은 getter 및 setter 메서드 이름의 "get" 및 "set" 부분을 제거하고 나머지 이름의 첫 문자를 소문자로 변환합니다.

예를 들어 brand라는 JSON 필드는 getBrand() 및 setBrand() 라는 Java getter 및 getter 메서드와 일치합니다. engineNumber라는 JSON 필드는 getEngineNumber() 및 setEngineNumber()라는 getter 및 setter와 일치합니다.

다른 방식으로 JSON object 필드를 Java object 필드와 일치시켜야 하는 경우 custom serializer 및 deserializer를 사용하거나 많은 Jackson Annotation 중 일부를 사용해야 합니다.
라고 나와있습니다.


@ResponseBody

객체를 Json으로 직렬화할 때는 @Getter가 필요합니다

 


(정리한 내용은 기본적으로 인스턴스 변수가 private일 때를 가정한 것입니다. Getter 없이도 public이면 직렬화가 가능합니다)

출처

https://www.one-tab.com/page/RTm8ARImR9iXDFNOnKdIzA

https://projectlombok.org/features/Builder

OAUTH2 질문

0

96

2

카카오토큰관련

0

82

2

auditing

0

76

1

전역에러처리질문

0

115

2

토큰 발급 관련 문의 드립니다.

0

131

2

이 흐름이 맞을까요??

0

126

2

OpenFeign을 어떤 상황에서 어떻게 사용하는지 감이 안옵니다...

0

220

2

도메인형 패키지 구조 질문

0

242

1

application.yml token 선언 시 오류

0

322

1

토큰발행시 500 INTERNAL_SERVER_ERROR

0

158

1

oauth 회원가입 시 필수 추가 정보는 어떤 식으로 받으시나요?

0

288

2

io.jsonwebtoken.security.WeakKeyException 해결방법

0

387

1

리프레시 토큰 사용 관련 문의 건

0

336

1

Xss 에서 WebConfig 오류 발생됩니다.

0

673

1

applycation.yml 의 readTimeout 이 적용이 안됩니다.

0

697

2

강사님 Swagger에 질문드립니다.

0

294

2

kakao token 발급 시 에러

0

729

2

아직 초반부분인데 질문이있습니다.

0

204

1

socialLoginApiService map 주입

0

291

1

전역 에러 처리 메시지 관리

0

608

2

안드로이드 스튜디오와 협업

0

646

2

String accessToken = authorizationHeader.split(" ")[1];은 accessToken이 맞나요?

0

312

1

SocialLoginApiServiceFactory 생성자 관련 질문입니다.

0

256

1

OAuthAttributes 클래스의 toMemberEntity의 파라미터로 memberType이 들어가야하는 이유가 궁금합니다.

0

445

2