서비스에서 DTO를 만들어서 사용해라!!!!! 그러면 몰라도 필요 없는 부분!!
Lazy로 걸려있어서 fail on empty beans 오류가 뜸
LAZY 전략이 걸려있는 부분은 @JsonIgnore 걸자!
DB에서 게시글을 조회해서 데이터를 받았는데... User랑 Reply 없죠? 즉, boardList는 전략이 레이지라 지금 user가 비어있는 상태. Board 객체 안에 User 비어있고, Reply도 비어있음. 마지막으로
return되면 DS로 넘어감. DS는 오브젝트로 응답하면 무조건 JSON으로 변환 시키는데, 그때 GETTER를 때림 즉, 메세지 컨버터는 -> GETTER를 때려서 그 값을 제이슨으로 옮겨넣는 일을 함 Board는 GETTER를 때려서 JSON으로 만들어내는데 user는 비어있는 상태. 그러니 통신을 요청해서 getter를 요청할 때(getUser) 받아옴 getUser는 자기 입장에선 제이슨을 만들려고 호출하는 것 메세지 컨버터가 getuser.getusername 이렇게 통신해서 넘어오니까 await해서 값이 넘어온 걸 확인해서 데이터를 그리면 문제가 없다. 그러나 empty 때문에 (=null인 채로 와서) 오류가 남. fail empty -> bean이 비어있어서 오류가 남 타이밍의 문제! 통신해서 데이터가 채워질 때까지 기다렸다가 그리면 됨 fail on Empty Bean <- @jasonIgnore 이 없는 상태에서 뜨는 오류 레이지 로딩과 메세지 컨버터의 타이밍이 맞지 않아서 터지는 오류!
해결법
메세지 컨버터한테 레이지 로딩을 맡기지 않으면 됨 서비스에서!!!!! DTO를!!!!!!!!! 만들어라!!!!!!!!!!!! 통신은 다 비동기로 되면 좋다. 요청을 했으니까 Await로 기다렸다가 만들면 되는데 JSON을 만들다가 (JSON은 GETTER를 때리면서 만들어짐. 레이지 로딩할때 GETTER가 필요해서) 메세지 컨버터랑 레이지 로딩이 타이밍이 안맞아서 터지는 오류 ! 그러니까!! 이런 일이 안 일어나려면 서비스에서 DTO를 만들어라!!!!!!!!!!!!
직렬화 역직렬화 ... 지금은 일단 이것만 기억하자. fail on empty beans!!!! 비어있는 객체를 serializer 해서 오류가 발생했다. -> 직역 : 비어있는 객체를 (레이지 로딩 되기 전 객체) serializer (제이슨으로 메세지 컨버터가 변환할 때) 터졌다 메세지 컨버터가 더 빨랐죠? 그래서 터졌죠?
Share article