-
MySQL์์ Slow Query(์ฌ๋ก์ฐ ์ฟผ๋ฆฌ) ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ค์ํ ์์ ์ ๋๋ค. ๋ค์์ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ๋ค์ ๋๋ค:
1. ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ ํ์ฑํํ๊ธฐ
์ฌ๋ก์ฐ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํด MySQL ์ค์ ์ ์กฐ์ ํฉ๋๋ค.
๋ฐฉ๋ฒ 1:
my.cnf๋๋my.iniํ์ผ ์์ [mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1slow_query_log: ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ ๊ธฐ๋ฅ ํ์ฑํslow_query_log_file: ๋ก๊ทธ ํ์ผ ์์นlong_query_time: ๋ช ์ด ์ด์ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ๋๋ฆฐ ์ฟผ๋ฆฌ๋ก ๊ฐ์ฃผํ ์ง ์ค์ (์ด ๋จ์)log_queries_not_using_indexes: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ฟผ๋ฆฌ๋ ๋ก๊ทธ์ ๊ธฐ๋ก
์ค์ ํ MySQL์ ์ฌ์์ํด์ผ ๋ฐ์๋ฉ๋๋ค.
CreatedThu, 29 May 2025 20:20:45 +0900 -
MSA(Microservices Architecture) ํ๊ฒฝ์์ ์๋น์ค ๊ฐ ํธ์ถ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ ์ ์ฑ ์ ์ผ๋ฐ์ ์ผ๋ก ๋ถ์ฐ ํธ๋์ญ์ ๋๋ ์ฌํ ๋ณด์ ํธ๋์ญ์ (Compensating Transaction) ๋ฐฉ์์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์ฉ์ด์ ์ ์ฑ ์ผ๋ก ์ค๋ช ๋ฉ๋๋ค.
1. SAGA ํจํด
-
์ ์: MSA์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ํธ๋์ญ์ ์ฒ๋ฆฌ ํจํด์ผ๋ก, ๊ฐ ์๋น์ค์ ๋ก์ปฌ ํธ๋์ญ์ ์ด ์ฑ๊ณตํ๋ฉด ๋ค์ ์๋น์ค๋ฅผ ํธ์ถํ๊ณ , ์ค๊ฐ์ ์คํจ ์ ์ด์ ์ ์ํ๋ ์์ ์ ๋ณด์ ์์ (Compensation) ์ผ๋ก ๋๋๋ฆฝ๋๋ค.
-
์ข ๋ฅ:
- Choreography ๊ธฐ๋ฐ: ์๋น์ค๋ค์ด ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ ์๋ก ๊ตฌ๋ ํ๋ฉด์ ํธ๋์ญ์ ์ ์ด์ด๊ฐ. ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์์.
- Orchestration ๊ธฐ๋ฐ: ์ค์ ์ปจํธ๋กค๋ฌ(์ค์ผ์คํธ๋ ์ดํฐ)๊ฐ ์ ์ฒด ํธ๋์ญ์ ํ๋ฆ์ ์ ์ด.
-
์์: ์ฃผ๋ฌธ โ ๊ฒฐ์ โ ๋ฐฐ์ก ์์์์ ๊ฒฐ์ ์คํจ ์, ์ฃผ๋ฌธ์ ์ทจ์ํ๋ ๋ณด์ ํธ๋์ญ์ ์ํ.
CreatedMon, 26 May 2025 20:20:45 +0900 -
-
์๋ฐ(Java)์์ **์ฑ๊ธํค ํจํด(Singleton Pattern)**์ ํน์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํ๊ณ , ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ณต์ ํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๋์์ธ ํจํด์ ๋๋ค. ์ฃผ๋ก ๊ณตํต๋ ์ค์ , ๋ก๊น , ์ค๋ ๋ ํ, ์บ์, DB ์ฐ๊ฒฐ ๊ด๋ฆฌ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
โ ์ฑ๊ธํค ํจํด์ ํต์ฌ ๊ฐ๋
- ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑ.
- ์ ์ญ ์ ๊ทผ์ (Global Access Point) ์ ๊ณต.
- ์์ฑ์๋ฅผ
private์ผ๋ก ์จ๊น. - ์ ์ ๋ฉ์๋๋ก ์ธ์คํด์ค๋ฅผ ๋ฐํ.
๐ฆ ์ฑ๊ธํค ํจํด ๊ตฌํ ์์
1. ๊ธฐ๋ณธ ์ฑ๊ธํค (Lazy Initialization)
public class Singleton { private static Singleton instance; // ์์ฑ์๋ฅผ private์ผ๋ก ์ค์ ํ์ฌ ์ธ๋ถ์์ new๋ก ์ธ์คํด์ค ์์ฑํ์ง ๋ชปํ๋๋ก ํจ private Singleton() {} // ์ธ์คํด์ค๋ฅผ ํ์ํ ๋ ์์ฑ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public void showMessage() { System.out.println("Hello from Singleton!"); } }์ฌ์ฉ ์์:
CreatedMon, 26 May 2025 20:20:45 +0900 -
๋ฉฑ๋ฑ์ฑ(Idempotence)์ ์ปดํจํฐ ๊ณผํ์์ ์์ฃผ ๋ฑ์ฅํ๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ์๋์ ์ผ๋ฐ์ ์ธ ์๋ฏธ์ API ๊ฐ๋ฐ๊ณผ์ ๊ด๋ จ์ฑ์ ๋๋์ด ์์ธํ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๐ก ๋ฉฑ๋ฑ์ฑ(Idempotence)์ด๋?
๋ฉฑ๋ฑ์ฑ์ด๋ ๋์ผํ ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ํํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์์ง๋ ์ฑ์ง์ ๋งํฉ๋๋ค. ์ํ์์ ์ถ๋ฐํ ๊ฐ๋ ์ธ๋ฐ, ์๋ฅผ ๋ค์ด ํจ์
f(x)๊ฐ ์์ ๋ ๋ค์์ด ์ฑ๋ฆฝํ๋ฉด ๋ฉฑ๋ฑํจ์๋ผ๊ณ ํฉ๋๋ค:f(f(x)) = f(x)์์ (์ํ์ ๊ด์ )
- ์ ๋๊ฐ ํจ์:
| |x|| = |x| - ์งํฉ์ ํฉ์งํฉ ์ฐ์ฐ:
A โช A = A
๐ ๋ฉฑ๋ฑ์ฑ๊ณผ API ๊ฐ๋ฐ
์น API ์ค๊ณ ์, ๋ฉฑ๋ฑ์ฑ์ ์์ ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ API๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋งค์ฐ ์ค์ํ ์ฑ์ง์ ๋๋ค. ํนํ REST API์์๋ ๊ฐ HTTP ๋ฉ์๋๊ฐ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง์ง๋ฅผ ์ค๊ณ ์ ๋ช ํํ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
CreatedMon, 26 May 2025 20:20:45 +0900 - ์ ๋๊ฐ ํจ์:
-
Object[] ์ ArrayList ์ ์ฐจ์ด
์๋ฅผ ๋ค์ด Partner๋ผ๋ ํด๋์ค๊ฐ ์์ ๋
Partner[] p = new ArrayList์ ๊ฐ์ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ ๋ArrayList๋ Java์ ์ปฌ๋ ์ (List) ํ์ ์ด๊ณ ,Partner[]๋ ๋ฐฐ์ด ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ก ํธํ๋์ง ์๋ ํ์ ์ ๋๋ค.
๐ ์ ํํ ์ฐจ์ด์
Partner[]โ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฐฐ์ดArrayList<Partner>โ ๊ฐ๋ณ ํฌ๊ธฐ์ ๋ฆฌ์คํธ (๋ฐฐ์ด ๊ธฐ๋ฐ์ ์ปฌ๋ ์ )
โ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ
1.
ArrayList๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋List<Partner> p = new ArrayList<>(); p.add(new Partner("name1")); p.add(new Partner("name2"));- ๋ฆฌ์คํธ๋ก ์ ์ธํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
- ์ด ๋ฐฉ๋ฒ์ด ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ ์ ์ฐํ๊ณ ํธ๋ฆฌํฉ๋๋ค.
2.
ArrayListโPartner[]๋ก ๋ณํ์ด ํ์ํ ๊ฒฝ์ฐList<Partner> pList = new ArrayList<>(); pList.add(new Partner("a")); pList.add(new Partner("b")); Partner[] pArray = pList.toArray(new Partner[0]); // ๋ฐฐ์ด๋ก ๋ณํ
โ ๏ธ ์๋ชป๋ ์์
Partner[] p = new ArrayList<>(); // โ ์ปดํ์ผ ์๋ฌ: incompatible types
โ ์์ฝ
๋ชฉ์ ์ฝ๋ ArrayList์ ์ธList<Partner> p = new ArrayList<>();๋ฆฌ์คํธ โ ๋ฐฐ์ด ๋ณํ Partner[] pArray = pList.toArray(new Partner[0]);๋ฐฐ์ด๋ณด๋ค
ArrayList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ ํ๊ณ ์ ์ฐํฉ๋๋ค. ๋ค๋ง ๋ฐฐ์ด์ด ํ์ํ API์ ํธํํ๊ฑฐ๋ ์ฑ๋ฅ์ ์ด์ ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฐฐ์ด ๋ณํ์ ์ฌ์ฉํ์ธ์.CreatedWed, 21 May 2025 19:20:45 +0900 -
Redis์์
Pub/Sub(Publish/Subscribe) ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ์๋๋ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์์ ์ ๋๋ค.
๐ง ๊ฐ๋ ์์ฝ
Redis Pub/Sub๋ ๋ฉ์์ง ๋ธ๋ก์ปค ์ญํ ์ ์ํํ์ฌ, ํ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐํ(Publish)ํ๋ฉด, ํด๋น ์ฑ๋์ ๊ตฌ๋ (Subscribe)ํ๊ณ ์๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ค์ด ์ค์๊ฐ์ผ๋ก ๊ทธ ๋ฉ์์ง๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
- Publisher: ์ฑ๋์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ํด๋ผ์ด์ธํธ
- Subscriber: ํน์ ์ฑ๋์ ๊ตฌ๋ ํ๊ณ ๋ฉ์์ง๋ฅผ ๋ฐ๋ ํด๋ผ์ด์ธํธ
๐ ๋ช ๋ น์ด
PUBLISH <channel> <message>: ๋ฉ์์ง๋ฅผ ๋ฐํSUBSCRIBE <channel> [<channel> ...]: ์ฑ๋ ๊ตฌ๋UNSUBSCRIBE [<channel> ...]: ์ฑ๋ ๊ตฌ๋ ์ทจ์
๐ป ์์ (CLI ๊ธฐ์ค)
ํฐ๋ฏธ๋ 1 โ Subscriber
redis-cli > SUBSCRIBE newsํฐ๋ฏธ๋ 2 โ Publisher
redis-cli > PUBLISH news "Hello from Redis!"Subscriber๋ ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ๋ฐ์ต๋๋ค:
CreatedWed, 21 May 2025 14:20:45 +0900