
๐จ ๋ฌธ์ ์ํฉ
- ์ฆ์: ๋ ๊ฑฐ์๋ก ํ๋ก๊ทธ๋จ์ JDBC ์ปค๋ฅ์ ์ ๋ชป ์ก์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐํ์ ์ผ๋ก ํฐ์ง
- ํ๊ฒฝ: HikariCP ์ฌ์ฉ ์ค, MySQL max_connections = 10,000
- ์๋ฌธ: ์ปค๋ฅ์ ํ๋ ์๊ณ MySQL ์ค์ ๋ ์ถฉ๋ถํ๋ฐ ์?
๐ ์์ธ ๋ถ์
1. ์ค๋ ๋ ์ vs ์ปค๋ฅ์ ํ ํฌ๊ธฐ ๋ถ๊ท ํ
์ ํ๋ฆฌ์ผ์ด์
์ค๋ ๋ ๊ตฌ์ฑ:
โโ ์ค์ผ์ค๋ฌ ์ค๋ ๋: 15๊ฐ
โโ ๋น๋๊ธฐ ์ค๋ ๋: 5-20๊ฐ
โโ SMS ์์ปค ์ค๋ ๋: 3๊ฐ
โโ LED ์ค๋ ๋: 3-10๊ฐ
์ด ์ต๋ 48๊ฐ ์ค๋ ๋
HikariCP ์ปค๋ฅ์
ํ: 15๊ฐ โ
→ ์ค๋ ๋ ์๊ฐ ์ปค๋ฅ์
ํ๋ณด๋ค 3๋ฐฐ ๋ง์!
2. 1๋ถ ์ค์ผ์ค๋ฌ์ ๋๋ ๊ฐ๋ณ UPDATE
// ๋งค 1๋ถ๋ง๋ค 2๊ฐ ์ค์ผ์ค๋ฌ ๋์ ์คํ
@Scheduled(cron = "0 0/1 * * * *")
public void startMethod2() { /* ์๋ํด์ค, ์คํฐ๋๋ฃธ ๊ด๋ฆฌ */ }
@Scheduled(cron = "0 0/1 * * * *")
public void startMethod3() { /* ์์ต์ค ์๊ฐ ์ค์ผ์ค */ }
์ปค๋ฅ์ ํญ์ฆ ์๋๋ฆฌ์ค:
๋งค 1๋ถ ์ ๊ฐ:
โโ ์๋ํด์ค 50๋ช
× ๊ฐ๋ณ UPDATE = 50๊ฐ ์ปค๋ฅ์
โโ ์คํฐ๋๋ฃธ 20๊ฐ × ๊ฐ๋ณ UPDATE = 20๊ฐ ์ปค๋ฅ์
โโ ๊ธฐํ ์กฐํ/์
๋ฐ์ดํธ = 30๊ฐ ์ปค๋ฅ์
โโ ์ผ๋ฐ ์น ์์ฒญ = 10๊ฐ ์ปค๋ฅ์
์ด 110๊ฐ ์ปค๋ฅ์
๋์ ์ฌ์ฉ! (ํ ํฌ๊ธฐ: 15๊ฐ)
3. ๋ถํ์ํ SMS DB ์ค์
<!-- ์ฌ์ฉํ์ง ์๋ SMS DB (์ปค๋ฅ์
ํ ์์) -->
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- ๋งค๋ฒ ์ ์ปค๋ฅ์
์์ฑ/ํด์ → ์ฑ๋ฅ ์ ํ -->
</bean>
๐ ํด๊ฒฐ ๋ฐฉ์
1. HikariCP ์ปค๋ฅ์ ํ ์ต์ ํ
<!-- ๊ธฐ์กด ์ค์ -->
<property name="minimumIdle" value="3"/>
<property name="maximumPoolSize" value="15"/>
<property name="idleTimeout" value="30000"/> <!-- 30์ด -->
<property name="maxLifetime" value="1200000"/> <!-- 20๋ถ -->
<!-- ๊ฐ์ ๋ ์ค์ -->
<property name="minimumIdle" value="10"/> <!-- ์์ ์ ๊ธฐ๋ณธ ์ฐ๊ฒฐ -->
<property name="maximumPoolSize" value="50"/> <!-- ์ค๋ ๋ 48๊ฐ ๋์ -->
<property name="idleTimeout" value="600000"/> <!-- 10๋ถ -->
<property name="maxLifetime" value="1800000"/> <!-- 30๋ถ -->
<property name="leakDetectionThreshold" value="60000"/> <!-- 1๋ถ, ๋น ๋ฅธ ๊ฐ์ง -->
2. ๋ฐฐ์น ์ ๋ฐ์ดํธ ๋์
๊ธฐ์กด ๋ฐฉ์ (N+1 ๋ฌธ์ ):
for(int i=0; i<list.size(); i++) {
// ๊ฐ๋ณ UPDATE (๋งค๋ฒ ์ปค๋ฅ์
์ฌ์ฉ)
params.put("querykey", "seat_power_state_update");
params.put("power_number", powerNumber);
params.put("power_state", "0");
comService.simpleUpdate(params); // ์ปค๋ฅ์
1๊ฐ ์ฌ์ฉ
}
๊ฐ์ ๋ ๋ฐฉ์ (๋ฐฐ์น ์ฒ๋ฆฌ):
List<String> powerNumbers = new ArrayList<String>();
for(int i=0; i<list.size(); i++) {
// ๋ฐ์ดํฐ๋ง ์์ง (์ปค๋ฅ์
์ฌ์ฉ ์ ํจ)
powerNumbers.add(powerNumber);
}
// ํ ๋ฒ์ ๋ฐฐ์น ์
๋ฐ์ดํธ (์ปค๋ฅ์
1๊ฐ๋ง ์ฌ์ฉ)
comService.batchUpdateSeatPowerState(powerNumbers, "0");
๋ฐฐ์น UPDATE ์ฟผ๋ฆฌ:
<update id="seat_power_state_batch_update">
UPDATE xe_tbl_seat
SET power_state = #{power_state}
WHERE power_number IN
<foreach collection="power_numbers" item="power_number" open="(" close=")" separator=",">
#{power_number}
</foreach>
</update>
3. ์ฌ์ฉํ์ง ์๋ SMS DB ์ค์ ์ ๊ฑฐ
<!-- ์ ๊ฑฐ๋ ์ค์ ๋ค -->
<bean id="dataSource2">...</bean>
<bean id="sqlSessionFactory2">...</bean>
<bean id="transactionManager2">...</bean>
<bean id="sqlSession2">...</bean>
๐ ์ฑ๋ฅ ๊ฐ์ ๊ฒฐ๊ณผ
์ปค๋ฅ์ ์ฌ์ฉ๋ ๋น๊ต
| ์๋๋ฆฌ์ค | ๊ธฐ์กด | ๊ฐ์ ํ | ๊ฐ์ ์จ |
|---|---|---|---|
| ์๋ ํด์ค 50๋ช | 50๊ฐ UPDATE | 1๊ฐ UPDATE | 98% ๊ฐ์ |
| ์คํฐ๋๋ฃธ 20๊ฐ | 20๊ฐ UPDATE | 1๊ฐ UPDATE | 95% ๊ฐ์ |
| ์ ๋ฌด ๋ง๊ฐ 100์ข์ | 100๊ฐ UPDATE | 1๊ฐ UPDATE | 99% ๊ฐ์ |
| 1๋ถ ์ค์ผ์ค๋ฌ ์ ์ฒด | 170๊ฐ ์ปค๋ฅ์ | 20๊ฐ ์ปค๋ฅ์ | 88% ๊ฐ์ |
์ค์ SQL ์คํ ๋น๊ต
-- ๊ธฐ์กด: 100๊ฐ ์ข์ ์ฒ๋ฆฌ ์
UPDATE xe_tbl_seat SET power_state = '0' WHERE power_number = '1';
UPDATE xe_tbl_seat SET power_state = '0' WHERE power_number = '2';
-- ... 100๋ฒ ๋ฐ๋ณต
-- ๊ฐ์ : 100๊ฐ ์ข์ ์ฒ๋ฆฌ ์
UPDATE xe_tbl_seat SET power_state = '0'
WHERE power_number IN ('1','2','3',...,'100');
๐ก๏ธ ์์ ํ ์ ์ฉ ์ ๋ต
๋ฐฐ์น ์ ์ฉ ๊ธฐ์ค
โ ์ ์ฉ ๊ฐ๋ฅ
- ์ํ๊ฐ์ด ๋ช ํํ๊ฒ ๋์ผํ ๊ฒฝ์ฐ
- ๋ก์ง์ด ๋จ์ํ ๊ฒฝ์ฐ
- ์์ ์ฑ์ด ๋ณด์ฅ๋๋ ๊ฒฝ์ฐ
โ ์ ์ฉ ์ ์ธ
- ์ํ๊ฐ์ด ๋์ ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ
- ๋ณต์กํ ์กฐ๊ฑด๋ฌธ์ด ์๋ ๊ฒฝ์ฐ
- ๊ธฐ์กด ๋ก์ง ๋ณ๊ฒฝ ์ํ์ด ์๋ ๊ฒฝ์ฐ
์ ์ฉ๋ 4๊ฐ์ง ์ผ์ด์ค
- ์๋ ํด์ค: ์๊ฐ ๋ง๋ฃ → ๋ชจ๋ OFF
- ์คํฐ๋๋ฃธ ํด์ค: ์์ฝ ์ข ๋ฃ → ๋ชจ๋ OFF
- ์คํฐ๋๋ฃธ ์ ์ค: ์์ฝ ์์ → ๋ชจ๋ ON โญ
- ์ ๋ฌด ๋ง๊ฐ: ์ด์ ์ข ๋ฃ → ๋ชจ๋ OFF
๐ฏ ํต์ฌ ๊ตํ
1. ์ค๋ ๋ ์์ ์ปค๋ฅ์ ํ ํฌ๊ธฐ์ ๊ด๊ณ
- ๋์ ์คํ ๊ฐ๋ฅํ ์ค๋ ๋ ์ ≤ ์ปค๋ฅ์ ํ ํฌ๊ธฐ
- ์ค์ผ์ค๋ฌ, ๋น๋๊ธฐ ์์ ๋ฑ ๋ชจ๋ ์ค๋ ๋ ๊ณ ๋ ค ํ์
2. ๋ฐฐ์น ์ฒ๋ฆฌ์ ์๋ ฅ
- N+1 ๋ฌธ์ ํด๊ฒฐ๋ก ๊ทน์ ์ธ ์ฑ๋ฅ ํฅ์
- ์์ ํ ๋ถ๋ถ๋ง ์ ๋ณ ์ ์ฉํด๋ ํฐ ํจ๊ณผ
3. ๋ชจ๋ํฐ๋ง์ ์ค์์ฑ
- ์ปค๋ฅ์ ๋์ ๊ฐ์ง ์๊ฐ ๋จ์ถ (5๋ถ → 1๋ถ)
- ๋ฐฐ์น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ก๊น ์ผ๋ก ํจ๊ณผ ์ธก์
๐ก ๊ฒฐ๋ก
"์ค๋ ๋ ์๋ฅผ ๊ณ ๋ คํ ์ปค๋ฅ์ ํ ํฌ๊ธฐ ์กฐ์ + ์ ๋ณ์ ๋ฐฐ์น ์ ๋ฐ์ดํธ ์ ์ฉ"
- ์ค์ผ์ค๋ฌ ์คํ ํ์๋ ๊ทธ๋๋ก ์ ์ง
- ์ปค๋ฅ์ ์ฌ์ฉ๋๋ง 88% ๊ฐ์
- ๊ธฐ์กด ๊ธฐ๋ฅ ์์ ๋ณด์กด
- ์์ ์ฑ๊ณผ ์ฑ๋ฅ ๋ ๋ง๋ฆฌ ํ ๋ผ ๋ชจ๋ ํ๋ณด
๊ฒฐ๊ณผ: ์ปค๋ฅ์ ํ ๊ณ ๊ฐ ๋ฌธ์ ํด๊ฒฐ๋๊ฑฐ๊ฐ์ผ๋ ๊ฒฝ๊ณผ๋ฅผ ์ง์ผ๋ด์ผํ ๊บผ๊ฐ๋ค..