Search

.InvalidDefinitionException: No serializer found for class ~

νƒœκ·Έ
JPA
λͺ©μ°¨
μ¦‰μ‹œ λ‘œλ”©κ³Ό 지연 λ‘œλ”©

μ§€μ—°λ‘œλ”© λ‹ˆκ°€ λ„λŒ€μ²΄ 뭔데…

μ–Όλ§ˆμ „ JPA κ°•μ˜λ₯Ό μˆ˜κ°• ν•˜λ©΄μ„œ μ–‘λ°©ν–₯ 맀핑을 ν•˜μ§€λ§κ³ , 일단 단방ν–₯ λ§€ν•‘μœΌλ‘œ μ—”ν‹°ν‹° 섀계λ₯Ό 해라. 그리고 μ§€μ—°λ‘œλ”©μ„ μ‚¬μš©ν•΄λΌ λΌλŠ” 말을 듀은 μ €λŠ” 묡묡히 κ·Έλ₯Ό μˆ˜ν–‰ν–ˆμ§€λ§Œβ€¦ λ‹€μŒκ³Ό 같은 μ—λŸ¬λ₯Ό λ§žμ΄ν–ˆμŠ΅λ‹ˆλ‹€. 개발자의 아버지 μ˜ν•œλ‹˜ 이게 무슨 μΌμΈκ°€μš”β€¦ 🫠
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: j ava.util.ArrayList[0]->wanted.assignment.pmsystem.domain.planner.board.dto.responses.BoardDetailResponse["taskDetailResponses"]-> java.util.ArrayList[0]->wanted.assignment.pmsystem.domain.planner.task.domain.Task["taskBox"]-> wanted.assignment.pmsystem.domain.planner.taskBox.domain.TaskBox["board"]-> wanted.assignment.pmsystem.domain.planner.board.domain.Board$HibernateProxy$Q6gL9Sv7["hibernateLazyInitializer"])
Plain Text
볡사
일단 λ¬Έμ œκ°€ 생긴 μ—”ν‹°ν‹°λ₯Ό μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 TaskBox(μΉΈλ°˜λ³΄λ“œμ˜ 컬럼 λΆ€λΆ„) κ°€ Many, Board κ°€ One μ΄λ―€λ‘œ 맀핑도 잘 ν–ˆκ³ β€¦ λ­”κ°€ λ¬Έμ œκ°€ μ—†μ–΄λ³΄μ˜€λŠ”λ°μš”β€¦
@Entity public class TaskBox { // ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") private Board board; // ... }
Java
볡사
개발자의 μ†Œμ–‘ 폭풍 ꡬ글링을 톡해 원인을 찾을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ—”ν‹°ν‹°λ₯Ό μ•„λž˜μ™€ 같이 μˆ˜μ •ν•΄μ£Όλ‹ˆ λ¬Έμ œλŠ” ν•΄κ²° λ˜μ—ˆλŠ”λ°μš”, λ„λŒ€μ²΄ @JasonIgnore 이 뭐길래 μ΄λ ‡κ²Œ μ‰½κ²Œ ν•΄κ²° λœκ±ΈκΉŒμš”?
@Entity public class TaskBox { // ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id") @JasonIgnore private Board board; // ... }
Java
볡사

FetchType.LAZY 와 JSON 직렬화

μ œκ°€ λ§ˆμ£Όν•œ λ¬Έμ œλŠ” Hibernate κ°€ 지연 λ‘œλ”©μ„ μ²˜λ¦¬ν•˜λŠ” 방식과 Jackson 이 μžλ°” 객체λ₯Ό JSON 으둜 직렬화 ν•˜λŠ” 방식과 관련이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. @ManyToOne(fetch = FetchType.LAZY) λ₯Ό μ‚¬μš©ν•˜λ©΄ Hibernate λŠ” 접근을 ν•˜κΈ°μ „κΉŒμ§€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 값을 μ°Ύμ•„μ˜€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉 ν”„λ‘μ‹œ μ—”ν‹°ν‹°λ‘œ 쑰회되며, μ‹€μ œ Board λ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμ μ— μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€(DB 쑰회). μ΄λŠ” λΆˆν•„μš”ν•œ λ°μ΄ν„°λ² μ΄μŠ€ ν˜ΈμΆœμ„ λ°©μ§€ν•˜κ³  μ„±λŠ₯을 ν–₯상 μ‹œν‚΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Jackson 은 이λ₯Ό μ§€κΈˆ 직렬화 ν•΄μ•Ό ν•˜λŠ”λ°μš” Β λ°”λ‘œΒ μ—¬κΈ°μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 것 μ΄μ˜€μŠ΅λ‹ˆλ‹€.
즉, Jackson 은 ν”„λ‘μ‹œλ₯Ό 직렬화 ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μœ„μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ•Œλ¬Έμ— @JsonIgnore λ₯Ό μΆ”κ°€ν•˜μ—¬ Jackson 이 ν•΄λ‹Ή ν•„λ“œλ₯Ό λ¬΄μ‹œν•  수 μžˆλ„λ‘ ν•˜λ©΄ λ¬Έμ œλŠ” ν•΄κ²°λ©λ‹ˆλ‹€. λ§Œμ•½ μ–‘λ°©ν–₯ 관계인 경우 μ–‘μͺ½μ„ 직렬화 ν•˜λ©΄ λ¬΄ν•œ μž¬κ·€κ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ 이λ₯Ό μΆ”κ°€ν•˜λ©΄ 도움이 λ©λ‹ˆλ‹€.

λ‘œλ”©μ— λŒ€ν•΄ 더 μ•Œμ•„λ³΄κ³  μ‹Άλ‹€λ©΄?