DevLog ๐ถ
[Spring] Kotlin์์ data class์ ํ๋๊ฐ 1๊ฐ์ผ ๋ ์ญ์ง๋ ฌํ๊ฐ ์ ๋๋ ๋ฌธ์ (no delegate- or property-based Creator) ๋ณธ๋ฌธ
[Spring] Kotlin์์ data class์ ํ๋๊ฐ 1๊ฐ์ผ ๋ ์ญ์ง๋ ฌํ๊ฐ ์ ๋๋ ๋ฌธ์ (no delegate- or property-based Creator)
dolmeng2 2023. 6. 23. 15:03๐ฑ ๋ฌธ์ ์ํฉ
๊ฐ๋จํ๊ฒ ํ ์คํธํ๊ณ ์ถ์ ๋ด์ฉ์ด ์๊ฒจ์ DTO์ฉ data class๋ฅผ ์์ฑํ์๋๋ฐ, ์๋์ ๊ฐ์ด Jackson์ ์ญ์ง๋ ฌํ ๊ด๋ จ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค.
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `study.ticketService.domain.application.dto.ConcertTicketCreateRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)]
๋์ถฉ ์ค๋ฅ๋ฅผ ๋ณด๋ฉด ์ญ์ง๋ ฌํ๋ฅผ ํด์ผ ํ๋๋ฐ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์ด์ ํ ์ ์๋ค๋ ๋ด์ฉ์ด๋ค.
data class ConcertTicketCreateRequest(
@NotNull(message = "์ฌ์ฉ์ ์์ด๋๋ ๋น์ด์์ ์ ์์ต๋๋ค.")
val userId: Long
)
๋ฌธ์ ๊ฐ ๋ data class๋ ์์ ๊ฐ๋ค.
์ด ๊นํ๋ธ ์ด์์ ๊ฐ๋ฉด ์น์ ํ๊ฒ ๊ทธ ์ด์ ๋ฅผ ์ค๋ช ํด์ค๋ค.
ํ๋๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋๋ ์ ๋ต์ด Delegating / Properties-based๋ก ๋๋๋๋ฐ, ๋ ๋ชจ๋ ์ค์์ ์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ ์ง ์ ์ ์์ด์ ๋ฐ์ํ ์ค๋ฅ์ธ ๊ฒ์ด๋ค.
์ ์ด์์์๋ @JsonCreator ์ด๋ ธํ ์ด์ ์ ํตํด์ ๋ช ์์ ์ผ๋ก ๋ชจ๋๋ฅผ ์ง์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋๋ฐ, data class์์ ์ด๋ป๊ฒ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค ์ ์์๊น?
๐ฑ ํด๊ฒฐ ๋ฐฉ๋ฒ
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, ๊ธฐ๋ณธ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ๊ฑฐ๋, ๋ถ์์ฑ์๋ฅผ ํ์ฉํ๊ฑฐ๋, @JsonProperty๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ฌ ๊ธฐ๋ณธ ๊ฐ ์ง์ ํ๊ธฐ
data class ConcertTicketCreateRequest(
@NotNull(message = "์ฌ์ฉ์ ์์ด๋๋ ๋น์ด์์ ์ ์์ต๋๋ค.")
val userId: Long = 0L
)
์ฃผ์์ฑ์ ์์ฒด์ ๊ธฐ๋ณธ ๊ฐ์ ์ง์ ํด์ค๋ค. id ๊ฐ์ ํญ์ ๋น ๊ฐ์ด ๋ค์ด์ค์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ฐจํผ ๋์ฒด๋ ๊ฐ์ด๋ผ์ ์๊ด์๋ค.
๐ฌ ๋ถ์์ฑ์ ์ฌ์ฉํ๊ธฐ
data class ConcertTicketCreateRequest(
@NotNull(message = "์ฌ์ฉ์ ์์ด๋๋ ๋น์ด์์ ์ ์์ต๋๋ค.")
val userId: Long
) {
constructor() : this(0)
}
ํน์, ๋ถ์์ฑ์๋ฅผ ํ์ฉํด์ ๋ด๋ถ์ ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ด๊ธฐํํด์ค ์์ฑ์๋ฅผ ๋ง๋ค์ด์ค ์ ์๋ค.
๐ฌ @JsonProperty ํ์ฉํ๊ธฐ
data class ConcertTicketCreateRequest(
@JsonProperty("userId")
@NotNull(message = "์ฌ์ฉ์ ์์ด๋๋ ๋น์ด์์ ์ ์์ต๋๋ค.")
val userId: Long
)
ํ์ง๋ง, ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด๋๋ค๋ ๊ฒ ์๋นํ ์ฐ์ฐํ ์ผ์ฒ๋ผ ๋๊ปด์ง ์ ์๋ค.
์ด๋๋ @JsonProperty๋ฅผ ํตํด์ ๋ช ์์ ์ผ๋ก json ๊ฐ์ key์ ํด๋น ๊ฐ์ฒด์ ํ๋๋ฅผ ๋งค์นญ์์ผ์ค ์ ์๋ค.
ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ํด์ ์ข ๋ ์๊ณ ์ถ๋ค๋ฉด ์ด ๊ธ์ ์ฐธ๊ณ ํด ์ฃผ์ธ์! ๐
๊ฐ์ธ์ ์ผ๋ก๋ 1๋ฒ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๊น๋ํด์ ๊ทธ๋ฅ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํด์ฃผ๋ ๊ฑธ๋ก ๋ง๋ค์๋ค.
์ค๋ฅ ์์ด ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.