Closed binchoo closed 3 years ago
[이슈 원인]
PostsService.update()
에 @Transactional
선언하지 않음.
트랜잭션이 끝나는 시점에 dirty entity를 갱신시키기 때문에, 해당 어노테이션을 붙여줬어야 함.
@RequiredArgsConstructor // PostsRepository를 주입받는 생성자 만들어 짐.
@Service
public class PostsService {
private final PostsRepository postsRepository; // 따라서 Spring이 알아서 의존성을 주입함.
@Transactional
public Long save(PostsSaveRequestDto requestDto) {
return postsRepository.save(requestDto.toEntity()).getId();
}
public PostsResponseDto findById(Long id) {
Posts entity = postsRepository.findById(id)
.orElseThrow(()-> new IllegalArgumentException("해당 게시글이 없어요. id=" + id));
return new PostsResponseDto(entity);
}
@Transactional // 빠뜨리면 안 된다
public Long update(Long id, PostsUpdateRequestDto requestDto) {
Posts posts = postsRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없어요. id=" + id));
posts.update(requestDto.getTitle(), requestDto.getContent()); // 해당 id를 갖는 Posts 데이터의 칼럼 값을 대체 대입하는 것으로 update query 된다.
return id;
}
}
[참고 사항] 저서 113p
JPA의 영속성 컨텍스트: 엔터티를 영구 저장하는 환경이다. 엔터티가 영속성 컨텍스트에 포함되며 유지되는 상태라면, 이 데이터를 변경할 경우 Dirty가 된다. 이후 트랜잭션이 끝날 때, Dirty Entity는 DB로 Update된다.
추론가능한 점: @Transactional
이 영속성 컨텍스트를 제공하는 군.
챕터; #6
[이슈 내용]
PostsApiControllerTest
실패함[이슈 원인]
Posts
엔티티를dirty
하게 만들었으나, 업데이트 쿼리 수행되지 않음.