-
패스트캠퍼스 챌린지 6일차JAVA/Spring 2021. 11. 6. 23:37
1. AOP & Transactional 실전
트랜잭션을 통해 DB 데이터 전송 중 오류가 날 경우 롤백하여 데이터를 안전하게 보존할 수 있다.
아래는 트랜잭션을 @Transactional 어노테이션 없이 수동으로 적용시킨 부분이다.
dmaker.service.DMakerService
@Service @RequiredArgsConstructor public class DMakerService { private final DeveloperRepository developerRepository; // 일종의 DB private final EntityManger en; public void createDeveloper(){ // 트랜잭션 객체를 가져옴 EntityTransaction transaction = en.getTransatction(); try { // 트랜잭션 시작 transaction.begin(); Developer developer = Developer.builder() .developerLevel(DeveloperLevel.JUNIOR) .developerSkillType(DeveloperSkillType.FRONT_END) .experienceYears(2) .name("Harry") .age(31) .build(); developerRepository.save(developer); // developerRepository.delete(developer) 등의 작업도 수행 가능하다. // 해당 트랜잭션을 끝내고 DB에 반영한다. transaction.commit(); } catch (Exception e) { /* A 계좌에서 B 계좌로 송금한다고 가정했을 때 처리 과정은 A 계좌에서 1만원 줄임 -> B 계좌에서 1만원 늘림이 되어야 한다. 그러나 도중 오류가 날 경우, 어떤 과정도 커밋하지 않고 롤백을 시켜야하므로 catch 단계에서 롤백을 해준다. */ transaction.rollback(); throw e; } } }
위의 예시와 같이 트랜잭션을 일일히 서술할 수도 있지만 @Transactional 어노테이션을 이용해 편리하게 전체 URL 패턴이 아니라 원하는 클래스 혹은 메서드에만 적용시킬 수 있다.
AOP를 돌이켜보면 Join Point라 불리우는 연결 가능 지점이 존재했고 Pointcut을 통해 연결 가능 지점들 중 조건에 해당하는 지점에만 로직을 정의해둔 Advice를 적용시킬 수 있다.
주로 어노테이션을 기반으로 한 Pointcut을 주로 사용한다.
dmaker.service.DMakerService
@Service @RequiredArgsConstructor // Class 단위에서 오류가 날 경우 모든 과정을 롤백시킨다. @Transactional public class DMakerService { private final DeveloperRepository developerRepository; // 메서드에서 오류가 날 경우 모든 과정을 롤백시킨다. @Transactional public void createDeveloper(){ Developer developer = Developer.builder() .developerLevel(DeveloperLevel.JUNIOR) .developerSkillType(DeveloperSkillType.FRONT_END) .experienceYears(2) .name("Harry") .age(31) .build(); developerRepository.save(developer); developerRepository.delete(developer1); } }
알아두어야 할 것은 @Transactional 어노테이션을 쓰는 경우 오류가 날 경우 무조건 롤백을 하는 것은 아니다.
설정에 따라 오류가 나더라도 커밋을 진행시키고 에러 메시지만 띄울 수 있다.
Throwing을 어떤 것을 설정하느냐에 따라서 오류 처리에 대한 행동을 설정할 수 있다.
본 포스팅은 패스트 캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
https://bit.ly/3FVdhDa'JAVA > Spring' 카테고리의 다른 글
패스트캠퍼스 챌린지 8일차 (0) 2021.11.08 패스트캠퍼스 챌린지 7일차 (0) 2021.11.07 패스트캠퍼스 챌린지 5일차 (0) 2021.11.05 패스트캠퍼스 챌린지 4일차 (0) 2021.11.04 패스트캠퍼스 챌린지 3일차 (0) 2021.11.03