binchoo / spring-boot-210523

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 정독하기
0 stars 0 forks source link

[테스트 실패] PostsApiControllerTest 실패: @Transactional 선언하지 않았음 #7

Closed binchoo closed 3 years ago

binchoo commented 3 years ago

챕터; #6

[이슈 내용] PostsApiControllerTest 실패함

[이슈 원인] Posts 엔티티를 dirty하게 만들었으나, 업데이트 쿼리 수행되지 않음.

binchoo commented 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;
    }
}
binchoo commented 3 years ago

[참고 사항] 저서 113p

JPA의 영속성 컨텍스트: 엔터티를 영구 저장하는 환경이다. 엔터티가 영속성 컨텍스트에 포함되며 유지되는 상태라면, 이 데이터를 변경할 경우 Dirty가 된다. 이후 트랜잭션이 끝날 때, Dirty Entity는 DB로 Update된다.

추론가능한 점: @Transactional이 영속성 컨텍스트를 제공하는 군.