-
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ์์ **์ ๊ทํ(Normalization)**์ **๋ฐ์ ๊ทํ(Denormalization)**๋ ๋ฐ์ดํฐ์ **๋ฌด๊ฒฐ์ฑ(Integrity)**๊ณผ ์ฑ๋ฅ(Performance) ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ๋ ํต์ฌ์ ์ธ ๊ฐ๋ ์ ๋๋ค.
์ด ๋์ ๊ด๊ณ๋ ํํ **“๋ฐ์ดํฐ ์ ํฉ์ฑ vs. ์ฝ๊ธฐ ์ฑ๋ฅ”**์ ํธ๋ ์ด๋์คํ(Trade-off)๋ก ์์ฝํ ์ ์์ต๋๋ค. ๊ฐ ๊ฐ๋ ์ ํน์ง๊ณผ ํธ๋ ์ด๋์คํ ์์๋ฅผ ์์ธํ ๋ถ์ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ํต์ฌ ํธ๋ ์ด๋์คํ ์์ฝ
๊ฐ์ฅ ๋จผ์ ์ดํดํด์ผ ํ ํฐ ๊ทธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ๊ทํ: ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ๋ฌด๊ฒฐ์ฑ์ ์งํต๋๋ค. (์ฐ๊ธฐ ์ฑ๋ฅ ํฅ์, ์ฝ๊ธฐ ์ JOIN ๋น์ฉ ๋ฐ์)
- ๋ฐ์ ๊ทํ: ์ฑ๋ฅ์ ์ํด ์๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต์ํต๋๋ค. (์ฝ๊ธฐ ์ฑ๋ฅ ํฅ์, ์ฐ๊ธฐ ์ ๋๊ธฐํ ๋น์ฉ ๋ฐ์)
2. ์ ๊ทํ (Normalization)
๋ฐ์ดํฐ์ ์ค๋ณต์ ์ต์ํํ๊ณ , ์ด์ ํ์(Anomaly)์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์ด๋ธ์ ๋ถ๋ฆฌํ๋ ๊ณผ์ ์ ๋๋ค.
CreatedWed, 21 Jan 2026 21:20:45 +0900 -
์ฅ๋จ์
์คํ๋ง๋ถํธ(Spring Boot)์ JPA(Hibernate) ํ๊ฒฝ์์ **์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ(Streaming Query)**๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋งค์ฐ ์ค์ํ ๊ธฐ์ ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ
List<T>ํํ๋ก ์กฐํํ๋ฉด ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ๋ชจ๋ฆฌ(RAM)์ ์ ์ฌ๋์ง๋ง, ์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค์(Cursor)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋งํผ๋ง ์กฐ๊ธ์ฉ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค.์์ฒญํ์ ์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ์ ํน์ง๊ณผ ์ฅ๋จ์ ์ ์ ๋ฆฌํด ๋๋ฆฝ๋๋ค.
1. ์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ์ ์ฃผ์ ํน์ง
์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ๋ Java 8์
Stream<T>API๋ฅผ ํ์ฉํ์ฌ DB ๊ฒฐ๊ณผ๋ฅผ ๋ฌผ ํ๋ฅด๋ฏ ์ฒ๋ฆฌํฉ๋๋ค.- ์ปค์(Cursor) ๊ธฐ๋ฐ ๋์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ ์ปค์๋ฅผ ์ด๋์ํค๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฝ์ด์ต๋๋ค.
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading)๊ณผ ์ ์ฌ:
Stream๊ฐ์ฒด๋ฅผ ์์ฑํ ์์ ์๋ ์ฟผ๋ฆฌ๋ง ์คํ๋๊ณ , ์ค์ ๋ฐ์ดํฐ๋stream.forEach()๋next()๋ฑ์ ํธ์ถํ ๋ ๊ฐ์ ธ์ต๋๋ค. - ํธ๋์ญ์ ์์กด์ฑ: ์คํธ๋ฆผ ์ฒ๋ฆฌ๊ฐ ๋๋ ๋๊น์ง DB ์ฐ๊ฒฐ(Connection)์ ์ ์งํด์ผ ํ๋ฏ๋ก, ๋ฐ๋์ ํ์ฑํ๋ ํธ๋์ญ์ ์์์ ์ํ๋์ด์ผ ํฉ๋๋ค.
2. ์ฅ์ (Pros)
๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ(Batch ์์ , ์์ ๋ค์ด๋ก๋ ๋ฑ)์์ ๊ฐ๋ ฅํ ์ด์ ์ ๊ฐ์ง๋๋ค.
CreatedTue, 20 Jan 2026 21:20:45 +0900 -
Memcached์ Redis๋ ๋ ๋ค ๊ณ ์ฑ๋ฅ ์ธ๋ฉ๋ชจ๋ฆฌ(In-memory) ํค-๊ฐ(Key-Value) ์ ์ฅ์๋ก, ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ๋ฅผ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์๋๋ฅผ ๋์ด๋ ์บ์(Cache) ์ฉ๋๋ก ์ฌ์ฉ๋๋ค๋ ๊ณตํต์ ์ด ์์ต๋๋ค.
ํ์ง๋ง “๋จ์ํจ๊ณผ ๋ฉํฐ์ค๋ ๋(Memcached)” ๋ **“๊ฐ๋ ฅํ ๊ธฐ๋ฅ๊ณผ ์ ์ฐ์ฑ(Redis)”**์ด๋ผ๋ ๋ช ํํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ ๊ธฐ์ ์ ํต์ฌ์ ์ธ ์ฐจ์ด๋ฅผ 4๊ฐ์ง ๊ด์ (๋ฐ์ดํฐ ๊ตฌ์กฐ, ์ํคํ ์ฒ, ์์์ฑ, ํ์ฅ์ฑ)์์ ์ ๋ฆฌํด ๋๋ฆฝ๋๋ค.
1. ํ๋์ ๋ณด๋ ๋น๊ต (Executive Summary)
ํน์ง Memcached Redis ์ฃผ์ ์ปจ์ ๊ณ ์ฑ๋ฅ, ๋จ์ํจ, ๋ฉํฐ์ค๋ ๋ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ, ์์์ฑ, ๊ธฐ๋ฅ ํ๋ถ ์๋ฃ ๊ตฌ์กฐ String (๋จ์ ๋ฌธ์์ด/๋ฐ์ด๋๋ฆฌ) String, List, Set, Hash, Sorted Set, Geo ๋ฑ ์ค๋ ๋ ๋ชจ๋ธ ๋ฉํฐ ์ค๋ ๋ (Multi-threaded) ์ฑ๊ธ ์ค๋ ๋ (Single-threaded) (I/O๋ ๋ฉํฐ ๊ฐ๋ฅ) ๋ฐ์ดํฐ ์์์ฑ ์ง์ ์ ํจ (์ฌ๋ถํ ์ ๋ฐ์ดํฐ ์๋ฉธ) ์ง์ (RDB, AOF) ํ์ฅ์ฑ(Clustering) ํด๋ผ์ด์ธํธ ์ธก ๋ถ์ฐ (Consistent Hashing) ์๋ฒ ์ธก ๋ถ์ฐ (Redis Cluster) ๋ณต์ (Replication) ์ง์ ์ ํจ Master-Slave ๋ณต์ ์ง์ ์ฃผ์ ์ฉ๋ ๋จ์ ์บ์ฑ (์ธ์ , HTML ์กฐ๊ฐ) ๋ณต์กํ ์บ์ฑ, ๋ฆฌ๋๋ณด๋, ๋๊ธฐ์ด, ๋ฉ์์ง ๋ธ๋ก์ปค
2. ์์ธ ์ฐจ์ด์ ๋ถ์
โ ๋ฐ์ดํฐ ๊ตฌ์กฐ (Data Structures)
- Memcached: ์ค์ง **๋ฌธ์์ด(String)**๋ง ์ ์ฅํฉ๋๋ค. ๋ฆฌ์คํธ๋ ํด์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด JSON ๋ฑ์ผ๋ก ์ง๋ ฌํ(Serialize)ํด์ ๋ฌธ์์ด๋ก ๋ง๋ ๋ค ์ ์ฅํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ค๋ฉด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์์ ํ ๋ค ๋ค์ ๋ฎ์ด์จ์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค.
- Redis: ๋ค์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ง์ํฉ๋๋ค. ๋ฆฌ์คํธ(List)์ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ํด์(Hash)์ ํน์ ํ๋๋ง ์์ ํ๋ ๋ฑ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์กฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํ์ฉ ์: ‘์ค์๊ฐ ๋ญํน’ ๊ตฌํ ์ Redis์
Sorted Set์ ์ฐ๋ฉด ๋งค์ฐ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
โก ์ค๋ ๋ ๋ชจ๋ธ (Architecture)
๊ฐ์ฅ ํฐ ์ํคํ ์ฒ ์ฐจ์ด์ ๋๋ค.
CreatedTue, 20 Jan 2026 09:41:22 +0900 -
Kubernetes(์ฟ ๋ฒ๋คํฐ์ค)์ Docker(๋์ปค)์ ๊ด๊ณ๋ **“๊ฒฝ์ ๊ด๊ณ"๊ฐ ์๋๋ผ “์ํธ ๋ณด์์ ์ธ ๊ด๊ณ”**์ ๋๋ค. ์ด ๋์ ์ฐจ์ด๋ฅผ ๋ช ํํ ์ดํดํ๊ธฐ ์ํด ๊ฐ์ฅ ์ฌ์ด ๋น์ ๋ฅผ ๋ค์ด ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ํต์ฌ ๋น์ : ํ๋ฌผ์ ๊ณผ ํญ๋ง ์์คํ
์ด ๋ ๊ธฐ์ ์ ๊ด๊ณ๋ฅผ ๋ฌผ๋ฅ ์์คํ ์ ๋น์ ํ๋ฉด ์์ฃผ ๋ช ํํด์ง๋๋ค.
-
Docker (์ปจํ ์ด๋): **‘๊ท๊ฒฉํ๋ ํ๋ฌผ ์ปจํ ์ด๋ ๋ฐ์ค’**์ ๋๋ค.
-
๋ฌผ๊ฑด(์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ)์ ๋ฐ์ค์ ๋ด์ ํฌ์ฅํ๋ ๊ธฐ์ ์ ๋๋ค.
-
์ด ๋ฐ์ค๋ง ์์ผ๋ฉด ์ด๋ค ๋ฐฐ(์๋ฒ)๋ ํธ๋ญ(๋ ธํธ๋ถ)์ ์ค์ด๋ ๋ด์ฉ๋ฌผ์ด ์์ ํ๊ฒ ์ ๋ฌ๋ฉ๋๋ค.
-
Kubernetes (์กฐํ์/ํญ๋ง ๊ด๋ฆฌ์): **‘์์ฒ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๊ด๋ฆฌํ๋ ์์คํ ’**์ ๋๋ค.
-
์ปจํ ์ด๋๊ฐ ๋ฐฐ์ ์ ์ค๋ ธ๋์ง, ๋ฐฐ๊ฐ ํ๋ค๋ ค ์ปจํ ์ด๋๊ฐ ๋จ์ด์ง๋ฉด(์๋ฌ ๋ฐ์) ๋ค์ ์ค์ด์ฃผ๋์ง, ํ๋ฌผ์ด ๋ง์์ง๋ฉด ๋ฐฐ๋ฅผ ๋ ๋ถ๋ฅผ์ง(์ค์ผ์ผ๋ง)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
CreatedTue, 06 Jan 2026 10:30:03 +0900 -
-
๋ต
import java.util.ArrayList; // 30. ๊ฐ๋จํ ์ ๋์จ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํํ๊ธฐ public class Solution30 { private static int[] parent; private static int findRootNode(int x) { if (parent[x] == x) { return x; } parent[x] = findRootNode(parent[x]); return parent[x]; } private static void union(int x, int y) { int root1 = findRootNode(x); int root2 = findRootNode(y); parent[root2] = root1; } public static Boolean[] solution(int k, int[][] operations) { parent = new int[k]; for (int i = 0; i < k; i++) { parent[i] = i; } ArrayList<Boolean> answer = new ArrayList<>(); for (int[] op : operations) { if (op[0] == 0) { union(op[1], op[2]); } else { answer.add(findRootNode(op[1]) == findRootNode(op[2])); } } return answer.toArray(new Boolean[0]); } }์ฝ๋์์
return answer.toArray(new Boolean[0]);๊ตฌ๋ฌธ์ArrayList<Boolean>ํ์ ์ธanswer๋ฅผBoolean[]๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค.CreatedMon, 29 Dec 2025 09:37:03 +0900 -
ํ๋ก๊ทธ๋จ์ผ๋ก ํ์ธํ๊ธฐ.
๋ฐฉ๋ฒ 1: ์ง์ ๋ง๋ ์คํฌ๋ฆฝํธ (์์กด์ฑ ์์)
chmod +x scan-secrets.sh ./scan-secrets.sh๋ฐฉ๋ฒ 2: gitleaks ์ฌ์ฉ (๋ ์ ํํจ, ๊ถ์ฅ)
# gitleaks ์ค์น brew install gitleaks # ๋๋ apt install gitleaks # ๊ฐ ๋ ํฌ์์ ์คํ git clone git@github.com:dev-minimalism/kr-canslim-notifier.git cd kr-canslim-notifier gitleaks detect --source . --verbose # ์ ์ฒด ํ์คํ ๋ฆฌ ํฌํจ gitleaks detect --source . --verbose --log-opts="--all"๋ฐฉ๋ฒ 3: truffleHog (์ํธ๋กํผ ๊ธฐ๋ฐ ํ์ง)
pip install truffleHog truffleHog git git@github.com:dev-minimalism/kr-canslim-notifier.git --since_commit HEAD~100ํน์ ํ์คํ ๋ฆฌ ๋ค ๋ ๋ ค๋ฒ๋ฆฌ๊ณ ์ด๊ธฐํ ํ๊ธฐ
git checkout --orphan latest_branch git add . git commit -m "initial commit after reset" git branch -D main git branch -m main git push -f origin mainํน์ ํ์ผ๋ง ํ์คํ ๋ฆฌ์์ ์์ ํ ์์ ๊ธฐ (.env์ ์)
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch .env" --prune-empty --tag-name-filter cat -- --allCreatedWed, 17 Dec 2025 11:16:03 +0900