✍🏻study
Sync vs Async, blocking vs non-blocking
잡아 놓고 가면 좋은 개념일 거 같아서 정리를 하려고 한다. Sync, Async를 비교하고, blocking, non-blocking을 비교한 후, 두 개의 조합에 대해서 비교를 하겠다. 알아보기 이전에 용어에 대해서 알아보면 좋을 거 같다. 1. 제어권 - 제어권은 자신의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다. blocking, non-blocking을 설명할 때 사용할 용어이다. 2. 결과값을 기다린다 - A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미한다. Blocking과 Non-Blocking A 함수가 B 함수를 호출했을 때, "제어권"을 어떻게 처리하느냐에 따라서..
영속성 관리
이 글은 김영한님의 "자바 ORM 표준 JPA 프로그래밍" 3장 영속성 관리 부분을 읽고 정리한 포스트입니다!! 영속성 컨텍스트란❓ 엔티티를 영구 저장하는 환경이다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 엔티티의 상태 비영속: 영속성 컨텍스트와 전혀 관계가 없는 상태 영속: 영속성 컨텍스트에 저장된 상태 준영속: 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제: 삭제된 상태. 여기서 영속 상태라는 것은 "영속성 컨텍스트"에 의해 "관리"되는 엔티티라는 것이다. 영속성 컨텍스트 특징 1. 영속성 컨텍스트는 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)을 가져야 한다. - 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 때문에, 반..
Transaction정리
Transaction이란❓ 하나의 논리적 기능을 수행하기 위한 작업의 단위이다. 즉, 복수 쿼리를 독립적으로 한 단위로 묶는 것이다. 물론, 하나의 쿼리도 transaction으로 볼 수 있다. 여기서 논리적 단위란 한 번에 수행되어야 일련의 연산이다. 그럼 Transaction을 왜 써야 할까❓ 데이터의 일관성을 유지하면서, 안정적으로 데이터를 복구하기 위해서 써야된다. 아직 써야되는 이유가 와닿는 거 같지는 않다. Transaction의 특징을 알아보자!! Transaction 특징 transaction의 특징은 ACID이다. Atomicity(원자성) -> 단위 - 한 트랜잭션 내에서 실행한 연산들은 하나의 작업으로 본다. 즉, 모두 성공하거나 모두 실패하는 구조를 가진다. Consistency(일..
Index정리
Index란❓ 데이터베이스 테이블의 검색 속도를 향상 시키기 위한 자료구조이다. 장점으로는 검색 속도를 향상 시킬 수 있다. 즉 조회 성능을 향상 시키기 위해서 사용하는 것이다. 그럼 어떤 단점이 있을까? 단점으로는 인덱스를 관리하기 위한 별도의 공간이 필요하다.(DB의 약 10%) 인덱스를 관리하기 위해, 인덱스 추가, update, delete 작업이 필요합니다. 그래서 잘못 사용하는 경우에는 오히려 성능을 저하시킬 수 있습니다. Index는 어떤 자료구조를 사용할 까❓ 먼저 정답부터 말하자면 B+tree(Mysql기준)를 사용한다. 그럼 왜 B+tree를 사용할까? b+tree는 b-tree에서 나온 자료구조이다. 또 b-tree는 이진 검색 트리에서 나온 자료구조이다. 이진 검색 트리의 특징을 먼..
JPA N+1 문제
N+1 문제에 대해서 생각없이 구현을 진행하다가, 친구와 얘기하다가 내가 구현한 부분에서 N+1문제가 일어날 거 같다는 말을 듣고, N+1 문제에 대해서 다시 공부하고, 정리를 해보려고 한다. Review라는 엔티티가 있다. @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class Review extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZ..