Spring에서는 @transanctianl 어노테이션을 사용해서 트랜잭션을 관리한다.
문제 상황은 다음과 같다.
@Transactional
public Rec getRecAndUpdateViewCount(Long id) {
Rec rec = recRepository.getRecById(id);
rec.setViewCount(rec.getViewCount()+1);
return recRepository.save(rec);
}
data jpa를 사용하며, 값을 가져와서 view count를 업데이트 한 후 다시 save하는 메소드이다.
관심사 분리 측면에서 해당 값을 반환하는 부분과 view count를 업데이트 하는 부분을 분리하기로 했다.
public Rec getRec(Long id) {
updateViewCount(id);
return recRepository.getRecById(id);
}
@Transactional
public void updateViewCount(Long id) {
Rec rec = recRepository.getRecById(id);
rec.setViewCount(rec.getViewCount() + 1);
recRepository.save(rec);
}
해당 경우에, update view count 메소드가 실행이 됨에도 db에 반영이 되지 않는다.
Spring AOP 프록시가 호출되는 것이 아닌. getRec 메소드에서 this.updateViewCount 메소드 - 같은 클래스의 메소드를 직접 호출하기 때문이다.
따라서 나는 해당 메소드 updateview count를 별도의 클래스로 분리했다.
해당 메소드 뿐만 아니라, 같은 클래스 내에서 관심사 분리가 필요하다고 생각되는 부분을 리팩토링 과정에서 분리하는 작업을 통해 해결할 수 있었다.