Avatar
๐Ÿ˜‰

Organizations

  • ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž…์žฅ์—์„œ ์ƒค๋”ฉ๋œ DB๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘ โ€œ๋ณต์žกํ•œโ€ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์งค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ์ฃผ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ ˆ๋ฒจ ์ค‘ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์œผ๋กœ ์ƒค๋”ฉ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


    1. ์™ธ๋ถ€ ํ”„๋ก์‹œ/๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉ (Mycat, Vitess, ProxySQL ๋“ฑ)

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณ€๊ฒฝ ์ œ๋กœ ๋˜๋Š” ์ตœ์†Œํ™”

      • ์ƒค๋“œ๋ณ„ DB URL(ํ˜ธ์ŠคํŠธ/ํฌํŠธ) ๋Œ€์‹ , ํ”„๋ก์‹œ์˜ ๋‹จ์ผ ์ ‘์ (๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ/ํฌํŠธ)์„ spring.datasource.url์— ์ง€์ •
      • ํŠธ๋ž˜ํ”ฝยท์ƒค๋“œ ํ‚ค ๊ธฐ๋ฐ˜ ๋ถ„๊ธฐ ๋กœ์ง์€ ํ”„๋ก์‹œ๊ฐ€ ๋Œ€์‹  ์ˆ˜ํ–‰
    • ๊ตฌํ˜„ ์‚ฌํ•ญ

      1. application.yml์— ํ•œ๋ฒˆ๋งŒ ํ”„๋ก์‹œ ์ ‘์  ์ •๋ณด ๋“ฑ๋ก

        spring:
          datasource:
            url: jdbc:mysql://proxy.example.com:3306/app_db
            username: app
            password: secret
        
      2. ํ•„์š” ์‹œ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ, ์ปค๋„ฅ์…˜ ํ’€, ๋ฆฌํ”Œ๋ฆฌ์นด ์ฝ๊ธฐ ์ „์šฉ ์„ค์ • ๋“ฑ ์ถ”๊ฐ€ ๊ตฌ์„ฑ

    Created Tue, 10 Jun 2025 08:49:58 +0900
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) ์ƒค๋”ฉ(DB Sharding)์ด๋ž€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ถ„์‚ฐยท๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์กฐ๊ฐ(์ƒค๋“œ, shard)์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ์„ ๋ณ„๋„์˜ ์„œ๋ฒ„์— ๋ถ„์‚ฐ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.


    1. ์™œ ์ƒค๋”ฉ์ด ํ•„์š”ํ•œ๊ฐ€?

    • ์„ฑ๋Šฅ ํ™•์žฅ์„ฑ(Scalability)

      • ๋‹จ์ผ ์„œ๋ฒ„์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์ €์žฅ ์šฉ๋Ÿ‰ยท์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์ด ํ•œ๊ณ„์— ๋ถ€๋”ชํž™๋‹ˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ์™€ ํŠธ๋ž˜ํ”ฝ์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋กœ๋“œ๊ฐ€ ์ง‘์ค‘๋˜์–ด ์‘๋‹ต ์ง€์—ฐ(latency)์ด๋‚˜ ๋ณ‘๋ชฉ(bottleneck)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณ ๊ฐ€์šฉ์„ฑ(High Availability)

      • ๊ฐ ์ƒค๋“œ๋ฅผ ๋…๋ฆฝ๋œ ๋…ธ๋“œ์— ๋‘๋ฉด, ์ผ๋ถ€ ๋…ธ๋“œ ์žฅ์•  ์‹œ์—๋„ ์ „์ฒด ์‹œ์Šคํ…œ์ด ์™„์ „ํžˆ ๋‹ค์šด๋˜์ง€ ์•Š๊ณ  ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ด€๋ฆฌ ์šฉ์ด์„ฑ

    Created Tue, 10 Jun 2025 08:44:58 +0900
  • ๋ฐฐ๊ฒฝ

    • local, dev, prod ๋“ฑ ํ”„๋กœํŒŒ์ผ์—์„  mysql ์…‹ํŒ…
    • test ํ”„๋กœํŒŒ์ผ์€ h2์— schema.sql, data.sql๋กœ ๋ฐ์ดํ„ฐ ์…‹ํŒ…
    • nativeQuery๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ DATE_FORMAT ๊ฐ™์€ mysql ํ•จ์ˆ˜ ์‚ฌ์šฉ.
    spring:
      datasource:
        url: jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1
    

    DATE_FORMAT ๋Œ€์ฒด

    public class H2Functions {
        public static String formatDate(java.sql.Timestamp timestamp, String format) {
            return new java.text.SimpleDateFormat(format).format(timestamp);
        }
    }
    

    schema.sql

    CREATE ALIAS IF NOT EXISTS DATE_FORMAT FOR "com.example.H2Functions.formatDate";
    

    Repository

    @Query(value = "SELECT DATE_FORMAT(order_date, 'yyyy-MM-dd') AS formatted_date, COUNT(*) " +
                   "FROM orders GROUP BY formatted_date", nativeQuery = true)
    List<Object[]> findOrderCountGroupedByDate();
    

    ์œ„์˜ ์ฝ”๋“œ๋Š” ์˜ˆ์‹œ์ด๋ฉฐ, ์‹ค์ œ๋กœ๋Š” h2์™€ mysql์—์„œ format์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. mysql์—์„œ๋Š” %m%d, %Y ๋“ฑ์œผ๋กœ ์“ฐ๊ณ  h2์—์„  ‘MMdd’, ‘yyyy’ ๋“ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    Created Sun, 01 Jun 2025 20:20:45 +0900
  • 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