본문 바로가기
Blog/TIL

2025-03-04 (화)

by 코젼 2025. 3. 4.
728x90
반응형
  • 데이터베이스 설계 및 코틀린 비동기 처리 관련 개념 학습
  • 복합 키 설정, 테이블 구조 최적화, MDC(Context Propagation) 활용법

1️⃣ 복합 키를 활용하면 데이터 무결성을 유지하면서도 중복 저장을 방지할 수 있다.

2️⃣ MySQL의 CHECK 제약 조건을 사용하면 특정 컬럼 값의 범위를 제한할 수 있다.

3️⃣ SMALLINT UNSIGNED는 0~65,535까지 저장 가능하며, 리포트 기간을 저장할 때 적절하다.

4️⃣ Kotlin의 runBlocking(Dispatchers.IO + MDCContext())을 사용하면 I/O 작업을 최적화하면서도 로깅 컨텍스트를 유지할 수 있다.


✅ 1. 데이터베이스 설계 및 복합 키 설정

📌 1) 복합 키(Composite Primary Key) 설정

  • 하나의 테이블에서 두 개 이상의 컬럼을 조합하여 PK(Primary Key) 를 설정할 수 있다.
  • 예를 들어, 리소스_이력 테이블에서 리포트_ID, 이메일, 생성일자를 조합하여 중복 저장을 방지하면서도 중복 발송 이력을 관리할 수 있도록 설계할 수 있다.
  • PRIMARY KEY (리포트_ID, 이메일, 생성일자)를 설정하면 동일한 리포트라도 발송 시점이 다르면 중복 저장 가능하다.

✔ 기본 복합 키 설정

PRIMARY KEY (id, 이메일, 생성일자)

✔ 이미 존재하는 테이블에 복합 키 추가

ALTER TABLE 리소스_이력
DROP PRIMARY KEY,
ADD PRIMARY KEY (id, 이메일, 생성일자);

✔ 복합 유니크 키 설정 (PK가 아니라 특정 조합만 유니크하게 유지하는 경우)

UNIQUE KEY 유니크명 (`id`, `이메일`, `생성일자`)

📌 2) MySQL CHECK 제약 조건 설정 + SMALLINT 범위

MySQL에서 특정 컬럼의 값을 제한하고 싶을 때 CHECK 제약 조건을 사용할 수 있다.

✔ 예제: 날짜가 1~365 사이의 값만 저장되도록 제한

`날짜` SMALLINT UNSIGNED NOT NULL CHECK (`날짜` BETWEEN 1 AND 365)
  • CHECK를 사용하면 잘못된 값이 DB에 들어가는 것을 사전에 방지할 수 있다.
  • 하지만 MySQL 8.0 이전 버전에서는 CHECK가 제대로 동작하지 않으므로 버전 확인 필요.

MySQL에서 SMALLINT의 범위는 16비트(2바이트) 크기의 정수값을 저장할 수 있다.

✔ SIGNED (기본값, 음수 포함 가능)

  • 범위: 32,768 ~ 32,767 ✔ UNSIGNED (양수만 저장)
  • 범위: 0 ~ 65,535 ✔ 리포트의 기간(일 단위)이 1~365라면 SMALLINT UNSIGNED를 사용하면 충분함.

✅ 2. Kotlin 비동기 처리 및 MDC(Context Propagation)

📌 1) runBlocking(Dispatchers.IO + MDCContext())란?

  • runBlocking → 현재 스레드를 블로킹하면서 코루틴을 실행하는 함수
  • Dispatchers.IO → I/O 작업(파일, DB, 네트워크)을 최적화된 백그라운드 스레드에서 실행하도록 함
  • MDCContext() → 로깅 컨텍스트(Mapped Diagnostic Context)를 유지하면서 실행하도록 설정

✔ 예제 코드

runBlocking(Dispatchers.IO + MDCContext()) {
    val result = 데이터_조회_서비스.데이터_가져오기()
    println(result)
}

✔ 실행 흐름

1️⃣ 현재 스레드를 블로킹하면서 코루틴 실행

2️⃣ 백그라운드 스레드에서 I/O 작업을 최적화

3️⃣ MDC(Context Propagation)를 유지하여 로그 추적 가능

✔ 사용 이유

  • 멀티스레드 환경에서도 로그 컨텍스트(MDC)를 유지하기 위해 사용
  • I/O 작업(DB 조회, 파일 처리 등)을 최적화하여 성능 개선
  • 블로킹이 필요한 환경(main 함수 등)에서 코루틴을 동기적으로 실행할 때 유용

728x90
반응형

'Blog > TIL' 카테고리의 다른 글

2025-03-06 (목)  (0) 2025.03.06
2025-03-05 (수)  (0) 2025.03.05
2025-02-28 (금)  (1) 2025.02.28
2025-02-25 (화)  (0) 2025.02.25
2024-02-24 (월)  (0) 2025.02.24

댓글