2023.10.14 - [웹/Spring vue 웹 개발] - spring vue 댓글 02
spring vue 댓글 02
이전에 이어서 service랑 controller를 작성을 전부 완료하였고 테스트도 완료하였습니다. 내일은 프론트단을 완료하고 현재 pc내에서 웹 작동해볼 예정이고 운영웹에는 테스트 조금더 한후에 적용
kwaksh2319.tistory.com
10월 중순부터 11월 아마 중순까지는 주말마다 바쁘기도 했고 주말마다 좀 바쁠 예정입니다. 아마 12월 넘어가야 여유가 생길듯합니다. 일단 그래도 틈틈히 시간나면 개발하겠습니다. 요즘 알고리즘이 여러가지 복습을 하다보니 좀 늦어지네요.
일단 게시판불러오면서 댓글들도 불러오는게 문제여서 몇가지를 수정했습니다.
Resolved [org.springframework.http.converter.HttpMessageNotWritableException:
Could not write JSON: failed to lazily initialize a collection of role:
kr.co.kshproject.webDemo.Domain.Notice.Notice.comments,
could not initialize proxy - no Session; nested exception is com.fasterxml.
jackson.databind.JsonMappingException: failed to lazily initialize a collection of role:
kr.co.kshproject.webDemo.Domain.Notice.Notice.comments,
could not initialize proxy
- no Session (through reference chain: java.util.ArrayList[0]-
>kr.co.kshproject.webDemo.Domain.Notice.Notice["comments"])]
원인은 아래와 LazyInitializationException 오류 메시지는 Hibernate 세션이 닫혀있는 상태여서 그렇습니다. lazy loading 으로 인한 문제라고합니다.
Hibernate 세션이란?
https://www.tutorialspoint.com/hibernate/hibernate_sessions.htm
Hibernate - Sessions
Hibernate Sessions - A Session is used to get a physical connection with a database. The Session object is lightweight and designed to be instantiated each time an interaction is needed with the database. Persistent objects are saved and retrieved through
www.tutorialspoint.com
데이터베이스와 물리적으로 연결하는 데 사용됩니다. Session 개체는 가볍고 데이터베이스와의 상호 작용이 필요할 때마다 인스턴스화되도록 설계되었습니다. 영구 객체는 Session 객체를 통해 저장되고 검색이라고 하는데. 제가 이해한건 그냥 로그인이나 원격 같은데 접속할떄 그 세션과 동일하게 db 세션객체에 접근해서 crud를 해줄수 있는게 아닐까 생각합니다.
제가 생각한게 맞은게아니라면 잘못된거면 지적 부탁드리겠습니다.
lazy loading 이란?
즉, 사용자가 보지 않는 것들을 당장 로딩하지 않는다.
그러다가 나중에 사용자가 필요로 하는 시점에 로딩하는 것입니다.
https://ko.wikipedia.org/wiki/%EC%A7%80%EC%97%B0%EB%90%9C_%EB%A1%9C%EB%94%A9
FetchType.LAZY
@OneToMany(mappedBy = "notice", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Comment> comments = new ArrayList<>();
그래서 일단 transcationl(readyOnly=true) 접근하여 해결하였습니다.
여러가지 방법이 있는데
다음에는 DTO방식으로 접근하는걸로 수정해보도록 하겠습니다.
그리고 다른방식으로는 osiv도 있는데요 이것도 잠재적 위험성을 가지고 있다고합니다.
https://medium.com/frientrip/spring-boot%EC%9D%98-open-in-view-%EA%B7%B8-%EC%9C%84%ED%97%98%EC%84%B1%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC-83483a03e5dc
Spring Boot의 open-in-view, 그 위험성에 대하여.
실제 서버 장애 해결과정을 중심으로
medium.com
spring.jpa.open-in-view = false
링크글을 빌리면 저도 비슷하게 db connection deadlock을 걸려본적이있는데 당시에는 제가 enitiyManger.close를 하지않아 발생한거였습니다. 반대로 이글을 빌리자면 opiv 을 true로 변경시 문제가 발생할수 있다고합니다. 와 무섭네요...
아무튼 lazy-loading을 해결하기위해 여러가지 방법이 있긴하지만 그중에서 가장 좋은 방향으로 선택하는게 좋겠네요
서비스
@Transactional(readOnly = true)
@Override
public List<Notice> findAllWithComments() {
return noticeRepository.findAllWithComments();
}
컨트롤러
@GetMapping
public ResponseEntity<List<Notice>> findAll(){
return ResponseEntity.ok( noticeService.findAllWithComments());
}
이렇게 하니 문제없이 잘 되었습니다.
성공화면 :

'웹 > Spring vue 웹 개발' 카테고리의 다른 글
spring vue 댓글 05 (1) | 2023.11.11 |
---|---|
spring vue 댓글04 (1) | 2023.11.11 |
spring vue 댓글 02 (0) | 2023.10.14 |
spring vue 댓글 01 (1) | 2023.10.09 |
spring vue 게시판 리팩토링 완료 (프론트단 및 백단 연결 변경 완료) (0) | 2023.10.08 |