블로그

데이터베이스 2 - 모델링, 정규화, 트랜잭션, 격리수준, ...

출처 도서 - MySQL로 배우는 데이터베이스 이론과 실습 모델링개념적 모델링, 논리적 모델링, 물리적 모델링 정규화1. 제 1 정규화 : 속성값은 모두 원자값이어야 한다.2. 제 2 정규화 : 기본키가 복합키일 때, 복합키 중 다른 속성의 결정자가 있으면 안 된다.예를 들어, A B C D 속성이 있으며 A와 B가 기본키라고 하자.기본키(A와 B)가 C의 결정자가 아닌 B만이 C의 결정자인 경우 문제가 발생한다.그렇다면 A와 B가 기본키인 A, B, D 속성이 있는 테이블과B가 기본키인 B, C 속성이 있는 테이블로 테이블 분리를 시행하는 것이 해결 방법이 된다.3. 제 3 정규화 : 속성들이 이행적으로 종속되어 있으면 안 된다.A -> B -> C 라면, A -> B, B -> C로 분리해야한다.4. BCNF : 후보키가 아닌 속성이 다른 속성의 결정자이면 문제가 됨결정자를 기본키로 테이블을 분리 변경해야한다.   트랜잭션 : 데이터 처리 단위. all or nothing.원자성(Automicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability) 동시성 제어 락 : 트랜잭션이 데이터를 읽거나 수정할 때 데이터에 표시하는 잠금 장치. 공유락 : 읽기용 락 배타락 : 읽기/쓰기용 락 -> 둘 다 안 됨 락이 걸려있으면 대기 상태가 된다. 락 유지시간으로 인해 락 해제 발생 가능 -> 이 때는 2단계 락킹을 이용. 데드락 발생할 수 있음 -> 하나 강제로 중지 작업 필요   고립 수준 READ UNCOMMITTED : 커밋되지 않은 데이터 읽어들임(오손 읽기) READ COMMITTED : 커밋된 데이터만 읽어들임다른 트랜잭션에서 update + commit된 데이터 읽힘(반복불가능 읽기; 데이터 불일치 문제) REAPEATABLE READ :반복불가능 읽기 문제 방지하지만 다른 트랜잭션에서 insert + commit된 데이터 나타나는 유령 데이터 현상 있음 SERIALIZABLE : select에 공유락 설정. 성능에 안 좋음   JPA와 트랜잭션, 락 보통은 READ COMMITTED 수준에서 낙관적 락, 비관적 락 사용 @Version : JPA에서의 낙관적 락 -> 트랜잭션이 충돌하지 않을 것으로 가정하기에 충돌이 난 후 롤백예외 처리로 다시 업데이트 시도도 가능 @Lock : READ, WRITE, NONEREAD가 JPA의 비관적 락 -> 트랜잭션이 충돌할 것으로 가정하기에 조회할 때부터 락; select for update  

데이터베이스모델링정규화트랜잭션격리수준Lock

[워밍업 스터디 클럽 0기 BE] 트랜잭션 이란?

✏️ (강의 링크 - https://inf.run/XKQg) 트랜잭션 이란?쪼갤 수 없는 업무의 최소 단위모든 SQL을 성공시키거나, 중간에 하나라도 실패하면 모두 실패시킴=> 즉 한 번에 성공시키거나 한 번에 실패시킨다.트랜잭션 시작하기start transaction;트랜잭션 정상 종료하기commit;트랜잭션 실패 처리(SQL 미반영)rollback; Spring에서 트랜잭션 적용하기@TransactionalSELECT 쿼리만 사용한다면, readOnly 옵션을 쓸 수 있다@Transactional(readOnly - true)IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.  영속성 컨텍스트 란?테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고,트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.영속성 컨텍스트의 특수 능력 4가지- 변경 감지 (Dirty Check): 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.- 쓰기 지연: DB의 INSERT / UPDATE / DELETE SQL을 바로 날리는 것이 아니라,트랜잭션이 commit될 때 모아서 한 번만 날린다.- 1차 캐싱: ID를 기준으로 Entity를 기억User user1 = userRepository.findById(1L).get();ID가 1인 유저 조회 -> 영속성 컨텍스트가 1인 유저를 기억 - 지연 로딩: 꼭 필요한 순간에 데이터를 로딩한다. @Transactional public void returnBook(BookReturnRequest request) { User user = userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); System.out.println("Hello"); user.returnBook(request.getBookName()); }

트랜잭션

한범석

인프런 워밍업 클럽 0기 - 백엔드 코스 (2주차 회고)

인프런 2주차까지 모든 강의와 과제들을 마무리했습니다.1주차에 학습했던 내용과 함께 스프링 컨테이너, Spring Data Jpa, 트랜잭션 등 스프링과 DB 개념 그리고 스프링과 DB 매핑 방법과 같이 전반적인 백엔드 기술들을 배울 수 있었습니다. 이후에는 이를 활용한 다른 요구사항 개발과정들을 다시 복습할 수 있는 과정으로 이어져 배운 내용들을 활용해볼 수 있는 기회를 가질 수 있었습니다. 6일차이전에 모든 계층이 JdbcTemplate이나 다른 계층의 객체에 의존적으로 설계되어 있었습니다. 이러한 구조는 의존할 객체가 변경될 경우 의존할 객체를 변경해주어야 되므로, 객체지향 개발 원리 중 OCP와 DIP를 위반하고 있습니다. 그렇기 때문에 스프링이 제공하는 스프링 컨테이너를 활용해 클래스 내부에서 사용할 다른 클래스들을 스프링 빈으로 등록하고, 필요할 때 등록된 빈을 자동 주입받는 형식으로 사용하도록 변경되었습니다.이럴 경우 인터페이스의 구현체만 사용자가 변경해주면 자동적으로 스프링이 주입할 빈을 선택하여 자동 주입해주기 때문에 스프링 빈을 사용하는 구간에서는 코드의 변경이 발생하지 않고 사용할 수 있습니다.사용할 인터페이스에 구현체가 여러 개일 경우 @Primary 어노테이션이나 @Qualifer를 통해 자동 주입 받을 빈을 선택하는 방법도 있습니다. 과제https://www.inflearn.com/blogs/6817 7~8일차이전까지는 JdbcTemplate을 활용해 직접 SQL 쿼리를 작성해 DB에 접근했습니다.이러한 경우 쿼리문에 실수를 해도 컴파일 시점에 오류를 파악할 수 없다는 문제점이 있습니다. 또한, SQL쿼리가 하나의 데이터베이스에 종속적이게 됩니다.그래서 JPA를 활용함으로써 이러한 단점들을 극복하려 했습니다.Jpa는 자바에서 데이터베이스에 접근할 수 있도록 도와주는 ORM입니다. 이 ORM을 통해 객체와 테이블을 매핑할 수 있는 기술을 제공해주고, 영속성 컨텍스트를 통해 한 트랜잭션 내 데이터를 영구히 저장할 수 있도록 해줍니다.영속성 컨텍스트의 특징은 다음과 같다.하나의 DB 작업 단위를 나타내는 트랜잭션 내부에서는 변경 감지 기능이 있다. 처음 DB에서 데이터를 조회하는 경우 데이터의 첫 상태를 스냅샷 형태로 저장한 뒤, 트랜잭션이 끝나는 시점에 데이터를 스냅샷과 비교하여 변경이 발생했다면 UPDATE쿼리를 통해 데이터를 자동 수정해준다.트랜잭션 내부에서 데이터를 삽입했다면 해당 트랜잭션이 끝날 때까지 데이터 삽입을 지연시킵니다.트랜잭션 내부에서 조회한 엔티티를 다시 조회할 경우 DB에 접근하지 않고 영속성 컨텍스트 내부에서 똑같은 인스턴스를 제공해준다. 과제https://www.inflearn.com/blogs/6850 9일차현재까지 배운 스프링 컨테이너, Jpa, 트랜잭션 이론을 활용할 수 있는 개발을 진행했습니다.Jpa를 스프링 내에서 좀 더 쉽게 사용할 수 있고 간단한 쿼리 메서드를 제공해주는 Spring Data Jpa를 활용해 개발을 진행했습니다.

백엔드영속성컨텍스트트랜잭션스프링컨테이너인프런워밍업클럽

채널톡 아이콘