개발 51

[SQL] 데이터의 저장, 논리적 I/O

기본적으로 SGA 테이블 스페이스라는 곳에 저장한다. 세그먼트 단위로 나누어서 테이블, 인덱스, 등에 관한 데이터를 묶어서 저장한다. 데이터는 익스텐트 단위로 확장된다. 실제 데이터가 기록될 때는 블록 단위로 저장된다. (오라클 기준 블록, Mysql 기준 페이지)데이터 파일에 블록이 저장되는데, 한 블록에는 같은 테이블에 대한 정보들이 들어있다.한 테이블에 대한 정보를 담은 블록은 데이터 파일에 분산되어 저장된다. (테이블 엑세스 시에 파일 경합이 벌어지는 것을 줄이기 위해서 그렇다.)따라서 같은 데이터 파일에 저장되었다고 해서 같은 테이블에 대한 정보가 저장되었다고 볼 수는 없다.  sql 의 성능을 끌어올리는 것은 I/O 작업을 줄이는 것에 목표가 있는데, 물리적 I/O 보다도 논리적 I/O 를 줄..

개발/TIL 2025.03.10

[SQL] 인덱스 기본 구조

인덱스 튜닝과 설계를 제대로 하기 위해, 인덱스가 수직 탐색, 수평 탐색 단 두 단계만 거친다는 것을 이해하자. 인덱스의 기본 구조와 원리에 대해 숙지하자. 기본적으로 데이터를 찾는 방법은 두가지이다. 테이블 전체를 대상으로 탐색 인덱스를 이용. 인덱스를 튜닝할 때 핵심은 두 가지이다. 인덱스 스캔 효율화 튜닝예시이름이 '홍길동' 이고 시력이 1.0~2.0 사이인 학생을 찾자! 표 3-2 에서는 이름과 시력 순으로 정렬, 표 3-3에서는 시력과 이름 순으로 정렬랜덤 엑세스 최소화 튜닝인덱스 스캔 이후에 테이블 레코드를 엑세스하는 과정은 랜덤 I/O 방식. 테이블 엑세스 횟수 최소화 예시다시 이름이 '홍길동'이고 시력이 1.0~2.0 인 학생을 찾자!이름이 '홍길동' 인 학생은 5명, 시력이 1.0~..

개발/TIL 2025.03.09

[SQL] spring JPA 에서 자주 등장하는 ':1' 은? (feat 파라미터 바인딩)

spring boot 프로젝트에서 JPA 를 이용해서 sql을 작성한 경우, 실행 로그를 볼 때 select m from Table m where m.name = :nameselect m from Table m where m.name = :0 이런 식으로 로그가 찍히는 것을  볼 때가 있다. 처음에는 JPA 에서 동적으로 쿼리를 만들기 위해서 존재하는 기능인가보다~ 생각했었는데,  요즘 SQL 을 깊게 공부하다 보니 이건 JPA 에서만 사용하는게 아니라, SQL 의 파라미터 바인딩 개념이라는 것을 알게 되었다.  간단히 원리를 설명하면, SQL 은 우리가 select, from, where, order by 등 선언적으로 (~하라 는 식으로만 작성. ) 작성하지만, 실제로 동작하기 위해서는 절차적인 언어..

개발/TIL 2025.03.06

java에서 비동기 처리하기 Mono와 Flux ( reactor.core 라이브러리)

📌 Reactor의 Publisher 개념 이해하기Reactor에서 Publisher는 비동기 데이터 스트림을 제공하는 핵심 인터페이스이다.Publisher는 데이터를 생산하고, Subscriber는 데이터를 소비하는 방식으로 동작하며, Reactive Streams 표준을 따른다. 링크 에 설명되어있는 바와 같이 CorePublisher 를 Implement 하고 있는 게 보인다. 1. Publisher란?Publisher는 비동기적으로 데이터를 방출하는 개체이다. Reactor의 Mono와 Flux는 이 Publisher 인터페이스를 구현하고 있다.   public interface Publisher { void subscribe(Subscriber subscriber);}  Publisher..

개발/TIL 2025.03.04

[SQL 튜닝] SQL 처리과정과 IO

1. sql 파싱과 최적화sql 은 기본적으로 선언형, 구조적 언어이다. 집합-베이스이기도 하다.sql 문법을 보면 ~ 어떤 조건을 가지고(where) 어떤 테이블에서 (from) 데이터를 조회하라 (select) 하라는 선언적인 문법인데, 사실 이렇게 작성하더라도 내부적으로는 절차적으로 진행될 수 밖에 없다. 따라서 sql을 내부적으로 로우 소스로 변환하는 과정이 반드시 필한데, 그러한 프로시저를 만드는 dbms 내부의 엔진을 sql 옵티마이저라고 부른다.그리고 dbms 내부에서 프로시저를 작성하고 컴파일해서 실행가능한 상태로 만드는 전 과정을, 'sql 최적화'라고 부른다.최적화 과정은 다음과 같다.최적화 과정sql 파싱파싱 트리 생성: 기본적으로 sql 언어를 쪼개서 트리를 만든다.문법 체크 (sy..

개발/TIL 2025.03.03

java 개선된 switch 문 사용하기

사실 나온 지는 꽤 되었지만, 바보처럼 실수한 적도 있고 해서 정리해본다. Java 14부터 사용할 수 있게 되었고, 중괄호 없이 바로 사용할 수 있다는 게 장점이다. 중괄호를 사용할 경우에는 break 문을 반드시 써줘야 한다.  이 switch 문은 기본적으로 다음과 같은 문법을 따른다. 화살표 다음의 문장을 실행하거나 값을 반환하되, 다른 화살표의 내용은 실행하지 않는다는 것이 특징이다. case label_1, label_2, ..., label_n -> expression;|throw-statement;|block public class NewSwitchExample { public static String numToString(int number) { return switch (numb..

개발/TIL 2025.03.01

Validation과 Exception Handling

Validation과 Exception Handlingvalidate 및 예외 처리를 수행하는 전략에 대해 생각해본 내용을 정리했다. 예외가 발생할 가능성이 낮다면, 불필요한 Validation은 피하는 것이 좋다.평소에는 발생하지 않는 오류라면, 불필요한 validation은 코드의 가독성을 해칠 수 있고, 성능을 저하시킬 가능성이 있다. 예를 들어, count가 2 또는 3 이외의 값이 들어올 일이 거의 없는데, 불필요한 default case를 추가하여 IllegalArgumentException을 던지는 것이 꼭 필요할까?만약 count 값이 비즈니스 로직 상 절대 변하지 않는 값이라면, 애초에 해당 값이 올바른 범위를 벗어나는 일이 없도록 설계하는 것이 더 낫다. 즉, 사전에 Enum, 상수, ..

개발/TIL 2025.03.01

spring webflux 에 대한 개요

spring webflux 란 비동기식 서버(Netty) , 혹은 MSA 에서 다른 서비스에 데이터를 요청(WebClient) 할 때 유용하게 사용할 수 있는 웹 프레임워크이다. Spring MVC가 동기 방식(Servlet 기반)이라면, WebFlux는 Netty 기반의 논블로킹 방식으로 동작한다.  Reactive Streams 에 기반한 기술이며, 구성요소는 RouterFunctions, Annotation, WebClient가 있다. (비동기 HTTP client, RestTemplate의 대체제.) 동작 방식은 Event Loop 로써, 요청이 들어오면 큐에 등록하고 IO 작업이 완료되면 콜백함수를 실행한다.사용하는 데이터 타입은 Flux(stream) 혹은 Mono.(값이 0또는 1개) 이다...

개발/TIL 2025.02.27

kubernetes에서 yml 로 pod 관리하기

Kubernetes에서는 YAML 파일을 통해 클러스터 리소스를 선언적으로 정의한다. 다음 각 파일은 특정 목적과 역할을 가지고 있다. deployment.yml 애플리케이션의 배포를 정의하는 파일이다. 애플리케이션을 실행할 컨테이너 이미지, 포트, 환경 변수, 볼륨 등의 세부 사항을 명시한다. 복제본(Replica)을 지정하여 원하는 수의 포드를 항상 실행되도록 관리한다. 롤링 업데이트와 같은 배포 전략을 설정할 수 있다. hpa.yml Horizontal Pod Autoscaler(HPA)를 설정하는 파일이다. 클러스터의 리소스 사용률(예: CPU, 메모리 또는 사용자 정의 메트릭)을 모니터링하여 자동으로 포드 수를 조절한다. 부하에 따라 애플리케이션의 확장성과 효율성을 보장할 수 있다. ingres..

개발/TIL 2025.02.26
728x90
728x90