Avatar
๐Ÿ˜‰

Organizations

  • 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 = 1
    
    • slow_query_log: ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ๋กœ๊ทธ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”
    • slow_query_log_file: ๋กœ๊ทธ ํŒŒ์ผ ์œ„์น˜
    • long_query_time: ๋ช‡ ์ดˆ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋А๋ฆฐ ์ฟผ๋ฆฌ๋กœ ๊ฐ„์ฃผํ• ์ง€ ์„ค์ • (์ดˆ ๋‹จ์œ„)
    • log_queries_not_using_indexes: ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ๋„ ๋กœ๊ทธ์— ๊ธฐ๋ก

    ์„ค์ • ํ›„ MySQL์„ ์žฌ์‹œ์ž‘ํ•ด์•ผ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

    Created Thu, 29 May 2025 20:20:45 +0900
  • MSA(Microservices Architecture) ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์ •์ฑ…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋˜๋Š” ์‚ฌํ›„ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜(Compensating Transaction) ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฉ์–ด์™€ ์ •์ฑ…์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.


    1. SAGA ํŒจํ„ด

    • ์ •์˜: MSA์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ํŒจํ„ด์œผ๋กœ, ๊ฐ ์„œ๋น„์Šค์˜ ๋กœ์ปฌ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณตํ•˜๋ฉด ๋‹ค์Œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ค‘๊ฐ„์— ์‹คํŒจ ์‹œ ์ด์ „์— ์ˆ˜ํ–‰๋œ ์ž‘์—…์„ ๋ณด์ƒ ์ž‘์—…(Compensation) ์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.

    • ์ข…๋ฅ˜:

      • Choreography ๊ธฐ๋ฐ˜: ์„œ๋น„์Šค๋“ค์ด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ์„œ๋กœ ๊ตฌ๋…ํ•˜๋ฉด์„œ ํŠธ๋žœ์žญ์…˜์„ ์ด์–ด๊ฐ. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๊ฐ€ ์—†์Œ.
      • Orchestration ๊ธฐ๋ฐ˜: ์ค‘์•™ ์ปจํŠธ๋กค๋Ÿฌ(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)๊ฐ€ ์ „์ฒด ํŠธ๋žœ์žญ์…˜ ํ๋ฆ„์„ ์ œ์–ด.
    • ์˜ˆ์‹œ: ์ฃผ๋ฌธ โ†’ ๊ฒฐ์ œ โ†’ ๋ฐฐ์†ก ์ˆœ์„œ์—์„œ ๊ฒฐ์ œ ์‹คํŒจ ์‹œ, ์ฃผ๋ฌธ์„ ์ทจ์†Œํ•˜๋Š” ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰.

    Created Mon, 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!");
        }
    }
    

    ์‚ฌ์šฉ ์˜ˆ์‹œ:

    Created Mon, 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 ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์งˆ์ง€๋ฅผ ์„ค๊ณ„ ์‹œ ๋ช…ํ™•ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    Created Mon, 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์™€ ํ˜ธํ™˜ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐฐ์—ด ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

    Created Wed, 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๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

    Created Wed, 21 May 2025 14:20:45 +0900