You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
레벨 시스템에서 특정 API가 호출될 때 회원에게 포인트를 지급하는 기능을 개발 중이었다. 예를 들어 댓글이 채택되면 댓글의 작성자에게 포인트 20을 지급한다.
PayPoint 라는 어노테이션이 붙은 메서드들의 수행이 완료되면, 메서드의 반환값으로 회원 id를 받아서 AOP로 처리할 생각이었다. (PayPoint는 얼마의 포인트를 지급할건지 나타내기 위해 value값을 가진다.)
PointManager
@Aspect
@Component
@RequiredArgsConstructor
public class PointManager {
private final MemberReader memberReader;
@AfterReturning(value = "@annotation(PayPoint)", returning = "memberId")
public void payPoint(
final JoinPoint joinPoint,
final Long memberId
) {
final int point = getPoint(joinPoint);
final Member member = memberReader.read(memberId);
member.earnPoint(point);
}
private int getPoint(final JoinPoint joinPoint) {
...생략
return payPoint.value();
}
}
Member
public void earnPoint(final int point) {
this.levelPoint += point;
}
나는 회원의 포인트가 증가하는 업데이트를 @transactional을 사용하여 변경감지로 처리해야겠다고 생각했다.
하지만 업데이트는 발생하지 않았다.
그래서 결국 memberRepository.save(member) 를 통해 업데이트를 처리했다.
궁금한 사항 👀
왜 AOP에는 변경감지를 통한 업데이트가 처리되지 않을까?
트랜잭션이 작동하긴 할까?
변경감지는 되고 있을까? 변경감지는 되는데 flush 호출이 안된 것이 아닐까?
The text was updated successfully, but these errors were encountered:
문제 상황
레벨 시스템에서 특정 API가 호출될 때 회원에게 포인트를 지급하는 기능을 개발 중이었다. 예를 들어 댓글이 채택되면 댓글의 작성자에게 포인트 20을 지급한다.
PayPoint
라는 어노테이션이 붙은 메서드들의 수행이 완료되면, 메서드의 반환값으로 회원 id를 받아서 AOP로 처리할 생각이었다. (PayPoint
는 얼마의 포인트를 지급할건지 나타내기 위해 value값을 가진다.)PointManager
Member
나는 회원의 포인트가 증가하는 업데이트를 @transactional을 사용하여 변경감지로 처리해야겠다고 생각했다.
하지만 업데이트는 발생하지 않았다.
그래서 결국
memberRepository.save(member)
를 통해 업데이트를 처리했다.궁금한 사항 👀
The text was updated successfully, but these errors were encountered: