본문 바로가기
기록, 회고/InFlearn Warming-up 0기 BE

[8일 차] - 내용 정리(트랜잭션, JPA 영속성 컨텍스트), 개인 회고

by TwoJun 2024. 2. 26.
728x90
반응형

인프런에서 주최하는 Warming-up 클럽 0기 백엔드 스터디에 참여하고 있다.

 

스터디에 참여하면서 배우게 된 내용을 전체적으로 정리하고, 참여하면서 느낀 부분을 회고해 보고자 한다.

 

(1) 8일 차 : 2024-02-28(Wed)

 

 

 

 

1. 트랜잭션(Transaction)

1-1. 트랜잭션이란?, 트랜잭션의 Commit, Rollback

(1) 쇼핑몰 주문을 예로 들어보자. 상품 주문 후 결제가 완료되었다면?

- 주문 기록 저장 → 포인트 저장 → 결제 기록 저장 (...) 등 일련의 작업들이 진행된다.

- 만약 결제 기록 저장 부분에서 에러가 나서 결제 기록이 저장되지 않는다면? 고객들은 어떻게 해야 할까?

- 이러한 심각한 문제를 해결하기 위해 트랜잭션을 적용할 수 있었다.

 

 

(2) 트랜잭션이란, 데이터베이스 내부에서 실행되는 일련의 작업들을 하나의 논리적인 단위로 묶은 것을 의미한다.

- 추가적으로 제 블로그에 트랜잭션에 대해 조금 자세하게 적어놓은 부분이 있습니다. 참고해 보실 분들은 참고해 보시면 좋을 것 같습니다!

- 아래 포스팅 중후반부에 트랜잭션 관련 내용이 기재되어 있습니다.

https://twojun-space.tistory.com/166

 

[MySQL] - MySQL이란?, 관계형 데이터베이스의 정의와 여러 가지 특징, 트랜잭션 정리

1. MySQL 1-1. MySQL이란? (1) MySQL은 전세계적으로 많이 사용되는 오픈소스 기반 관계형 데이터베이스를 말하며 다중 스레드와 사용자 구조 질의어(SQL, Structured Query Language) 형식의 데이터베이스 관리

twojun-space.tistory.com

 

(3) 트랜잭션을 적용한 후 일련의 작업들이 모두 성공적으로 수행되어 데이터베이스에 실제로 반영 결과를 저장하는 것을 Commit(커밋), 하나라도 실패하여 작업 수행 이전으로 되돌아가는 것을 Rollaback(롤백)이라고 한다.

 

(4) 이러한 트랜잭션을 적용시키게 되면 일련의 작업들 A → B → C이 수행되는 코드가 있다고 해보자. A → B → C 작업들이 모두 성공하면 데이터베이스 트랜잭션을 커밋하면 되고, 하나라도 실패하면 롤백하면 데이터의 일관성을 유지할 수 있게 된다.

 

 

 

 

 

2. 트랜잭션 적용

2-1. 이상적인 트랜잭션의 적용

(1) 서비스 메서드 시작 시 트랜잭션 시작

(2) 서비서 메서드 로직이 모두 성공하면 트랜잭션 커밋, 하나라도 실패하거나 문제 발생 시 롤백되는 것

 

 

 

2-2. 트랜잭션 적용 방법 

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class UserServiceV2 {

    private final UserRepository userRepository;

    @Transactional
    public void updateUser(UserUpdateRequestDto request) {
        User findUser = userRepository.findById(request.getId())
                .orElseThrow(() -> new IllegalStateException("존재하지 않는 회원입니다."));

        findUser.updateName(request.getName());
//        userRepository.save(findUser);
    }
}

 

(1) @Transactional 어노테이션을 적용한다.

- 메서드 레벨에 적용하면 메서드가 시작될 때 트랜잭션을 적용해 주고 메서드가 종료될 때 커밋이나 롤백되도록 적용할 수 있다.

 

- 클래스 레벨에 적용시키면 클래스 내부 메서드가 실행될 때 트랜잭션을 적용시키도록 설정할 수 있다.

 

(2) 조회 기능의 경우 readOnly = true 옵션을 사용할 수 있다.(약간의 성능상 이점 존재)

 

 

 

 

2-3. 주의사항

(1) IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.

 

 

 

 

 

3. 영속성 컨텍스트(Persistence Context)

3-1. 영속성 컨텍스트

(1) 테이블과 매핑된 Entity(엔티티) 객체를 관리하며 보관하는 역할을 하는 공간으로 엔티티를 저장할 수 있는 환경이라는 의미이다.

- 추가적으로 제 블로그에 JPA, 영속성 컨텍스트에 대해 조금 자세하게 적어놓은 부분이 있습니다. 참고해 보실 분들은 참고해 보시면 좋을 것 같습니다!

https://twojun-space.tistory.com/161

 

[JPA] - 영속성 컨텍스트(Persistence Context), Entity의 생명 주기(Life-Cycle), 영속성 컨텍스트의 다양한

1. 데이터베이스 Dialect 1-1. 데이터베이스 Dialect(Database dialect) (1) JPA는 특정 데이터베이스에 종속적이지 않도록 설계되었다. (2) 각각의 관계형 데이터베이스는 SQL syntax와 제공되는 관련 함수들이

twojun-space.tistory.com

 

 

 

3-2. 영속성 컨텍스트의 첫 번째 기능  - 변경 감지(Dirty Checking)

(1) 특정 트랜잭션 내부에서 영속성 컨텍스트에게 관리되는 엔티티에 변경이 발생한 경우 트랜잭션 커밋 시점에 관련 변경 사항에 대한 쿼리가 데이터베이스로 전송된다.

 

 

 

3-3. 쓰기 지연 

(1) 관련된 쿼리들을 쓰기 지연 저장소에 모두 적재시켰다가 트랜잭션 커밋 시점에 모든 쿼리를 전송한다.

 

 

 

3-4. 1차 캐시

(1) 엔티티의 식별자를 기준으로 영속성 컨텍스트에 저장된 엔티티는 1차 캐시에 정보가 저장된다. 추후 해당 엔티티를 다시 조회한다면 데이터베이스에 조회 쿼리를 보내지 않고 1차 캐시를 검사해서 해당 엔티티를 조회한다.

 

 

 

 

4. Section 4 정리

(1) 문자열 SQL을 직접 작성하는 부분의 한계 → 해결책인 JPA, Spring Data JPA가 무엇인지 이해

 

(2) Spring Data JPA를 통해 기본적인 CRUD를 제어 

 

(3) 트랜잭션이 왜 필요한지 이해하고 스프링에서 트랜잭션을 적용하는 방법 확인

 

(4) JPA의 핵심 기능 중 하나인 영속성 컨텍스트를 알아보고 영속성 컨텍스트와 트랜잭션의 관계 이해, 영속성 컨텍스트의 주요 특징 확인

 

 

 

 

5. 개인 회고

(1) JPA를 사용하면서 중요한 2가지가 있다. JPA의 내부 매커니즘 이해, 객체와 테이블을 정확히 매핑하는 것.

 

(2) 어떤 기술이든 해당 기술의 사용법을 우선 익히기 보다는 내부 매커니즘을 정확하게 알고 사용법을 익히는 것이 중요하다고 생각했다.

 

 

 

6. Reference 

(1) 관련 레퍼런스는 인프런에서 활동하고 계시는 최태현 강사님의 온라인 강의를 듣고 내용을 정리했습니다.

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90/dashboard

 

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인

Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한 옵션들

www.inflearn.com

 

 

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다

728x90
반응형

댓글