전체 글(126)
-
JPA 영속성 컨텍스트, 엔티티 생명주기, 변경 감지
영속성 컨텍스트(persistence context) 쉽게 말하면 엔티티를 영구 저장하는 환경이다. 즉, 엔티티 메니저로 엔티티를 저장하거나 조회하면 엔티티메니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 영속성 컨텍스트는 엔티티 메니저 당 하나씩 할당한다 엔티티의 생명주기 엔티티는 4가지 상태가 존재한다. - 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태 순수한 객체 상태이며, 아직 저장되지 않음. DB와 전혀 관련 없는 객체 - 영속 : 영속성 컨텍스트에 저장된 상태 - 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태 영속성 컨텍스트가 관리하지 않으므로 거의 비영속 상태에 가깝고, 그렇기에 지연 로딩을 할 수 없다. 하지만, 식별자 값을 가지고 있다는 특징이 있다. - 삭제 : 삭제된..
2023.12.11 -
JPA Entity Manager
엔티티 메니저 이름 그대로 엔티티를 관리하는 관리자다. 엔티티를 저장, 수정, 삭제, 조회 등 엔티티와 관련한 모든 일을 처리한다. JPA 대부분 기능은 엔티티 메니저에서 제공한다. 엔티티 메니저는 DB 커넥션과 밀접한 관계가 있으므로 스레드 간 공유하거나 재사용을 하면 안 된다. 엔티티 메니저는 엔티티 메니저 팩토리를 통해 생성된다. 엔티티 메니저 팩토리 이름 그대로 엔티티 메니저를 만드는 공장이다. 데이터 커넥션 풀도 생성할 정도로 생성 비용이 아주 크다. 즉, 엔티티 메니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
2023.12.11 -
Mysql 아키텍처
Mysql은 크게 Mysql 엔진과 스토리지 엔진으로 구분한다. 사람으로 따지자면, Mysql 엔진은 머리 역할, 스토리지 엔진은 손발 역할을 담당한다. MYSQL 엔진 크게 커넥션 헨들러, 파서, 전처리기, 옵티마이저 등으로 구성되어 있다. 커넥션 헨틀러는 클라이언트로부터의 접속 및 쿼리 요청을 처리하고, 옵티마이저는 쿼리의 최적화된 실행을 진행한다. 스토리지 엔진 디스크 스토리지에 저장하거나, 데이터를 읽어오는 역할을 한다. MYSQL 엔진을 하나 두고, 스토리지 엔진을 여러 개 둘 수도 있다. 스토리지 엔진은 성능 향상을 위해 키 캐시나 버퍼 풀 같은 기능을 내장하고 있다. Mysql 스래딩 구조 Mysql 서버는 프로세스 기반이 아닌, 스레드 기반으로 동작한다. 크게 포그라운드 스레드와 백그라운드..
2023.11.26 -
Index 인덱스
인덱스란? 테이블의 검색 속도를 향상시키는 자료구조이다. 쉽게 생각해서 책의 색인과 같다 처음부터 완전 탐색하면 힘든데, abc순으로 정렬하면 빠르게 찾을 수 있지 않은가? ldex를 통해 조회 속도를 올릴 수 있으나, insert, delete,update 속도는 느려진다. 그리고 인덱스를 따로 관리하기 위한 추가 작업이 필요하고, 잘못 사용할 결우 오히려 성능이 악화된다. 인덱스는 그럼 언제 사용하는 것이 좋을까? - 규모가 큰 테이블 - insert, update, delete가 자주 발생하지 않는 컬럼 - join, where, order by가 자주 사용되는 컬럼 - 데이터 중복도가 낮은 컬럼 그럼 Index는 어떻게 구현하는가? 대표적인 방식이 헤시 테이블과 B+ Tree가 있다. 해시 테이블..
2023.11.26 -
DB Lock
Lock 같은 데이터를 동시에 접근하는 상황을 방지하기 위해 접근 한 곳, 혹은 허용되는 수만 접근 되도록 설정하는 것. 데이터의 무결성과 일관성을 지키기 위해 사용 Lock 종류는 다음과 같다 Shared Lock - 공유락 데이터를 변경하지 않는 읽기 명령에 주어진다. 여러 사용자가 동시에 데이터를 읽어도 데이터 일관성에는 아무런 영향을 주지 않는다. 따라서, 공유 락 끼리는 동시 접근이 가능하다. Exclusive Lock - 베타 락 데이터에 변경을 가하는 명령에 주어지는 락이다. Write Lock으로도 불린다. 다른 세션이 해당 자원에 접근(Select, Insert, update, delete...)를 막는다. 베타 락은 트랜젝션 동안 유지된다. Update Lock - 업데이트 락 배타 락..
2023.11.25 -
DB isolation level (격리수준)
격리수준이란(isolation level) 트랜젝션 간 고립 수준을 말한다. 즉, 다른 트랜젝션이 변경한 데이터에 대한 접근 강도를 의미한다. * dirty read : 다른 트렌젝션에서 아직 commit 되지 않은 데이터를 읽는 것 * non-repeatable read : 다른 트랙젝션에서 데이터 수정/삭제 시 커밋한 데이터를 읽을 수 있는 것. 한 트랜젝션에서 같은 쿼리로 2번 이상 조회했을 때 그 결과가 상이한 상황 * phantom read : 데이터 삽입 시 발생, 한 트랜젝션에서 같은 쿼리를 2번 이상 조회했을 때 없던 결과를 조회하는 상황, 다른 트랜젝션이 commit한 데이터가 있더라도, 자신의 트랜젝션에서 읽었던 내용만 사용 격리수준을 좀 더 자세히 알아보자 LEVEL 0 - Read ..
2023.11.25