@Transactional(readOnly = true)
public FeedDetailResponse getFeedDetail(Long feedId) {
Feed feed = feedRepository.findById(feedId)
.orElseThrow(() -> FeedNotFoundException.EXCEPTION);
feed.addViews();
return FeedDetailResponse.builder()
.feedId(feed.getId())
.title(feed.getTitle())
.content(feed.getContent())
.createdAt(feed.getCreatedAt())
.updatedAt(feed.getUpdatedAt())
.views(feed.getViews())
.name(feed.getUser().getName())
.build();
}
→ readOnly = true 를 지워줌
트랜잭션에 readOnly = true 옵션을 주면 스프링 프레임워크가 하이버네이트
세션 플러시 모드를 MANUAL로 설정함.
이렇게 되면 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않음
따라서 트랜잭션을 커밋하더라도 영속성 컨텍스트가 플러시 되지 않아서
엔티티의 등록, 수정, 삭제가 작동하지 않음 -> 이거 때문에 오류났음
또한 읽기 전용으로, 영속성 컨텍스트는 변경 감지를 위한
스냅샷을 보관하지 않으므로 성능이 향상된다.
어느 한 URL ...
@GetMapping("/feed/{feed-id}) {
@PathVariable ~~~~
코드 ...
}
또 다른 URL ...
@GetMapping("/feed/{title}) {
@PathVariable ~~~~
코드 ...
}
예외 코드 ...
심각: Servlet.service() for servlet [spring] in context with path [/library] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '<http://localhost:8080/library/mgr>': {public java.lang.String com.sun.controller.MainController.mgr(org.springframework.ui.Model) throws java.lang.Exception, public java.lang.String baedo.baedoController.MgrController.list(int,org.springframework.ui.Model) throws java.lang.Exception}] with root cause
java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '<http://localhost:8080/library/mgr>': {public java.lang.String com.sun.controller.MainController.mgr(org.springframework.ui.Model) throws java.lang.Exception, public java.lang.String baedo.baedoController.MgrController.list(int,org.springframework.ui.Model) throws java.lang톸
→ URL을 바꿔준다