-
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ์์ ์ค๋ฉ๋ DB๋ฅผ ์ฐ๊ธฐ ์ํด์ ์ง์ โ๋ณต์กํโ ์ฝ๋๋ฅผ ๋ง์ด ์งค ํ์๋ ์์ต๋๋ค. ๋์ , ์ฃผ๋ก ๋ค์ ๋ ๊ฐ์ง ๋ ๋ฒจ ์ค ํ๋์ ๋ฐฉ์์ผ๋ก ์ค๋ฉ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
1. ์ธ๋ถ ํ๋ก์/๋ฏธ๋ค์จ์ด ์ฌ์ฉ (Mycat, Vitess, ProxySQL ๋ฑ)
-
์ ํ๋ฆฌ์ผ์ด์ ๋ณ๊ฒฝ ์ ๋ก ๋๋ ์ต์ํ
- ์ค๋๋ณ DB URL(ํธ์คํธ/ํฌํธ) ๋์ , ํ๋ก์์ ๋จ์ผ ์ ์ (๊ฐ์ ํธ์คํธ/ํฌํธ)์
spring.datasource.url์ ์ง์ - ํธ๋ํฝยท์ค๋ ํค ๊ธฐ๋ฐ ๋ถ๊ธฐ ๋ก์ง์ ํ๋ก์๊ฐ ๋์ ์ํ
- ์ค๋๋ณ DB URL(ํธ์คํธ/ํฌํธ) ๋์ , ํ๋ก์์ ๋จ์ผ ์ ์ (๊ฐ์ ํธ์คํธ/ํฌํธ)์
-
๊ตฌํ ์ฌํญ
-
application.yml์ ํ๋ฒ๋ง ํ๋ก์ ์ ์ ์ ๋ณด ๋ฑ๋กspring: datasource: url: jdbc:mysql://proxy.example.com:3306/app_db username: app password: secret -
ํ์ ์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ, ์ปค๋ฅ์ ํ, ๋ฆฌํ๋ฆฌ์นด ์ฝ๊ธฐ ์ ์ฉ ์ค์ ๋ฑ ์ถ๊ฐ ๊ตฌ์ฑ
-
CreatedTue, 10 Jun 2025 08:49:58 +0900 -
-
๋ฐ์ดํฐ๋ฒ ์ด์ค(DB) ์ค๋ฉ(DB Sharding)์ด๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ถ์ฐยท๊ด๋ฆฌํ๊ธฐ ์ํด ํ๋์ ๊ฑฐ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ์กฐ๊ฐ(์ค๋, shard)์ผ๋ก ๋๋์ด ๊ฐ๊ฐ์ ๋ณ๋์ ์๋ฒ์ ๋ถ์ฐ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ์ ๋งํฉ๋๋ค.
1. ์ ์ค๋ฉ์ด ํ์ํ๊ฐ?
-
์ฑ๋ฅ ํ์ฅ์ฑ(Scalability)
- ๋จ์ผ ์๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ์ ์ฅ ์ฉ๋ยท์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ํ๊ณ์ ๋ถ๋ชํ๋๋ค.
- ๋ฐ์ดํฐ์ ํธ๋ํฝ์ด ๋์ด๋ ์๋ก ๋ก๋๊ฐ ์ง์ค๋์ด ์๋ต ์ง์ฐ(latency)์ด๋ ๋ณ๋ชฉ(bottleneck)์ด ๋ฐ์ํฉ๋๋ค.
-
๊ณ ๊ฐ์ฉ์ฑ(High Availability)
- ๊ฐ ์ค๋๋ฅผ ๋ ๋ฆฝ๋ ๋ ธ๋์ ๋๋ฉด, ์ผ๋ถ ๋ ธ๋ ์ฅ์ ์์๋ ์ ์ฒด ์์คํ ์ด ์์ ํ ๋ค์ด๋์ง ์๊ณ ๊ฐ์ฉ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
-
๊ด๋ฆฌ ์ฉ์ด์ฑ
CreatedTue, 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=-1DATE_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’ ๋ฑ์ ์ฌ์ฉํฉ๋๋ค.
CreatedSun, 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 = 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