ACID Isolation(격리성)
·
Spring
트랜잭션의 ACID 속성 중 격리성(Isolation)이란?트랜잭션의 격리성(Isolation)은 동시에 여러 트랜잭션이 수행될 때, 서로의 연산에 영향을 받지 않도록 보장하는 성질을 의미합니다.즉, 하나의 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 해당 데이터에 접근하거나 변경할 수 없습니다.격리성이 보장되지 않을 때 발생할 수 있는 문제점들Dirty Read (더티 리드)다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 현상트랜잭션 A가 수정 중인 데이터를 트랜잭션 B가 읽었는데, 이후 A가 롤백하면 B가 잘못된 데이터를 읽게 됨Non-Repeatable Read (반복 불가능한 읽기)동일한 쿼리를 두 번 실행했을 때, 결과가 다른 현상트랜잭션 A가 특정 데이터를 두 번 읽는 동안, 트랜잭션 B가 ..
N + 1 문제
·
Spring/JPA
JPA에서 N+1 문제란?N+1 문제는 JPA에서 연관된 엔티티를 조회할 때 불필요한 추가 쿼리가 발생하여 성능이 저하되는 현상입니다.N+1: 1개의 조회 쿼리(Parent)와 연관된 N개의 추가 조회 쿼리(Child)가 발생하는 구조를 의미합니다.예를 들어, 부모 엔티티를 조회할 때 연관된 자식 엔티티를 개별적으로 조회하게 되면, 부모 1개 조회 시 자식 N개만큼 추가 쿼리가 발생합니다.발생 예시// Parent 엔티티@Entitypublic class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "..
세그먼트 트리
·
자료구조
세그먼트 트리(Segment Tree)는 구간 합, 최소/최대값 등 특정 범위의 질의를 빠르게 처리할 수 있도록 돕는 자료구조입니다. public class SegmentTree { private int[] tree; // 세그먼트 트리 배열 private int n; // 원본 배열 크기 public SegmentTree(int[] arr) { this.n = arr.length; // 세그먼트 트리 크기 설정 (4배 크기면 충분) tree = new int[4 * n]; build(arr, 1, 0, n - 1); } // 세그먼트 트리 생성 (재귀적으로 노드 값 채움) private void build(i..
2. 애플리케이션 계층
·
컴퓨터 네트워크
1. 네트워크 애플리케이션의 원리네트워크 코어 장비는 애플리케이션 계층에서 기능하지 않는 대신 네트워크 계층 및 그 하위 계층에서 가능합니다. 종단 시스템에만 애플리케이션 소프트웨어가 존재합니다.클라이언트-서버 구조 웹 애플리케이션에서는 2개의 브라우저(클라이언트)가 직접적으로 통신하지 않습니다.서버가 고정 IP 주소를 가집니다. 하나의 서버가 모든 클라이언트의 요청을 처리하는 것은 불가능합니다.이를 해결하기위해 데이터 센터를 사용합니다.데이터 센터는 많은 수의 호스트를 가집니다.P2P구조서버에 의존하지 않거나 최소한으로 의존 피어(peer)라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신다른 호스트, 운영체제에서 실행되는 프로세스 간 통신 : 컴퓨터 네트워크를 통한 메시지 교환으로 서로 통신두 프로세..
RestTemplate URL, URI 인코딩 이슈
·
Spring/RestTemplate
문제상황RestTemplate은 HTTP 통신용 클라이언트로 RESTful API 호출시 자주 사용된다..getForObject() , .exchange() 등의 메서드를 활용하여 응답을 받아올 수 있는데문제는 파라미터로 URL을 전달할때 이 URL이 String 타입인 경우이다. URL이 String 타입인 경우 RestTemplate은 내부적으로 UriTemplateHandler 를 호출하여 URL 문자열을 URI 객체로 만들어 처리한다.이때, UriTemplateHandler는 UriTemplateHandler 의 expand() 메서드를 사용하는데@Overridepublic URI expand(String uriTemplate, Object... uriVariables) { UriCompon..
오프셋 페이지네이션 & 커서 페이지네이션 (SQL)
·
DBMS/SQL
오프셋 페이지네이션과 커서 페이지네이션 비교실행되는 SQL 쿼리문을 살펴보면 두 방식의 차이를 쉽게 이해할 수 있다. 오프셋 페이지네이션SELECT *FROM messagesWHERE channel_id = 'abc-123...'ORDER BY created_at DESCLIMIT 11 OFFSET 10;OFFSET은 정렬된 데이터 중 앞의 10개를 건너뛰고 가져온다.이때 실제로는 앞의 10개도 읽고 버리는 과정이 필요하므로, 데이터가 많아질수록 성능이 떨어질 수 있다.하지만 페이지 번호 기반 접근(page=5 등) 은 직관적이고 편리하다.커서 페이지네이션SELECT *FROM messagesWHERE channel_id = 'abc-123...' AND created_at 이전 페이지의 마지막 커서(..