8일차 트랜잭션이 무엇이고_왜 사용해야 하는가

nakyeonko3·2024년 3월 3일
0
post-thumbnail

tags : #인프런워밍업스터디BE #SpringBoot #java
트랜잭션이 무엇이고, 왜 사용해야 하는가?

  • 트랜잭션
    쪼갤수 없는 업무 단위
    하나라도 실패하면 모두를 실패시키는 기능
  • 트랜잭션을 이용하면 데이터의 일관성을 유지할 수 있다.
    여러 쿼리문을 동시에 수행되도록 할 수 있다.
    이 쿼리문 중에서 하나라도 실패하면 모두가 실패하게끔 할 수 있다.
  • 트랜잭션 적용하기
    org.springframework.transaction.annotation.Transactiona@Transactional을 서비스 메서드에 붙여주면 된다.
    @Transactional
    public List<UserResponse> getUsersByAge(int startage,int endage){
        checkAgeVality(startage, startage);
       return userRepository.findByAgeBetween(startage, endage);
    }
  • @Transactional(readOnly = true)
    readOnly = true 읽기 전용이라는 표시, 업데이트 삭제 추가 메서드에는 쓰지 못하고 오직 읽기 전용 메서드에만 쓸수 있다.
  • 트랜잭션 중에 예외가 일어나면 롤백시킨다.
    unchecked Exception 이 발생하면 해당 쿼리문을 커밋시키지 않고 롤백시킨다.

아래 코드는 IllegalArgumentException예외가 일어나서
saveUser 안에 있는 쿼리문을 커밋시키지 않고 롤백시켜서 데이터베이스에 반영되지 않는다.

    @Transactional
    public void saveUser(UserCreateRequest request){
        User user = userRepository.save(new User(
                request.getAge(),
                request.getName()
        ));
        throw new IllegalArgumentException();
    }

  • 영속성 컨텍스트 기능
    1. 변경감지
    - 변경을 감지하고 자동으로 업데이트, save를 사용하지 않아도 @Transactional어노테이션을 쓴 메서드는 영속성을 감지하고 업데이트시켜준다.
    2. 쓰기지연
    - 쿼리문이 한 번에 여러개가 실행되게 해준다.
    3. 1차 캐싱
    - id 기준으로 Entity를 기억한다. 만약에 같은 id 를 여러 번 조회 한다면 쿼리를 날리지 않고, 영속성 컨텍스트에 이미 캐싱해둔 Entity를 가져온다.
  • Checked ExceoptionUnchecked Exception

메모


  • 어떻게 내가 배우는 내용을 공유할까?
  • 팀프로젝트를 진행한다면, 어떻게 내가 업데이트하거나 추가한 기능을 상대방이 알아 듣게 설명할 수 있을까?
  • MySql update statement
UPDATE _table_name_  
SET _column1_ = _value1_, _column2_ = _value2_, ...  
WHERE _condition_;

Site Unreachable

메모


  • 어떻게 하면 글쓰기를 자동화 할 수 있을까?
  • 블로그에 글을 올리는 절차는 빠르게 할 수는 없을까?

참고


profile
블로그 이전 작업중. 올해(2024년)까지만 여기에 블로그글만 올릴 것임.

0개의 댓글