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 |
댓글