ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 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

     

    수강료 100% 환급 챌린지 | 패스트캠퍼스

    딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

    fastcampus.co.kr

    '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

    댓글

Designed by Tistory.