์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Spring
- Java
- Operating System
- DDL
- MariaDB
- error
- ํ์
- Git
- hashCode
- constraints
- aws
- docker
- ConnectionPool
- greedy
- JDBC
- DBCP
- ์๊ณ ๋ฆฌ์ฆ
- equals
- database
- ์๊ณ ๋ฆฌ์ฆ #๋ฐฑ์ค #1717
- where
- hikaricp
- ๋ฐฑ์ค
- interrupt
- dml
- GPG
- springboot
- MySQL
- DataSource
- oauth2
- Today
- Total
did_story
[Spring] ์ปค๋ฅ์ ํ๊ณผ ํธ๋์ญ์ ๊ด๋ฆฌ, ์ ํ์ํ ๊น? ๋ณธ๋ฌธ
[Spring] ์ปค๋ฅ์ ํ๊ณผ ํธ๋์ญ์ ๊ด๋ฆฌ, ์ ํ์ํ ๊น?
์ด์ ์์ 2025. 1. 20. 15:37์ด๋ฒ ๊ธ์์๋ ์ปค๋ฅ์ ํ๊ณผ ๋ฐ์ดํฐ์์ค์ ๊ฐ๋ ๊ณผ ํ์์ฑ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
1. ์ปค๋ฅ์ ํ(Connection Pool)์ด๋?
โก๏ธ ์ปค๋ฅ์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋๊ณ , ํ์ํ ๋ ๊ฐ์ ธ์์ ์ฌ์ฌ์ฉํ๋ ๊ธฐ์ ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก JDBC์์ DriverMaanager.getConnection()์ ํธ์ถํ๊ฒ ๋๋ฉด ๋งค๋ฒ ์๋ก์ด DB ์ฐ๊ฒฐ์ด ์์ฑ๋๋๋ฐ, ์ด๋ ์ฑ๋ฅ์ ํฐ ๋ถ๋ด์ด ๋๋ค!
๋ฐ๋ผ์, ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฏธ๋ฆฌ์์ฑ๋ ์ปค๋ฅ์ ์ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ DB ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ผ ์ ์๋ค. ์ฆ ๋ฐ๋ณต์ ์ธ ์ฐ๊ฒฐ ์์ฑ ๋น์ฉ์ ์ค์ด๊ณ , ๋์ ์ ์์ฌ์ฉ์์ ์์ฒญ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค!
๐ ์ปค๋ฅ์ ํ์ด ํ์ํ ์ด์
- DB ์ฐ๊ฒฐ ์๋ ๊ฐ์ : ์ปค๋ฅ์ ์ ๋งค๋ฒ ์์ฑํ๋ ๋์ , ๋ฏธ๋ฆฌ ์์ฑ๋ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๊ฑฐ ์๋ต ์๋๋ฅผ ํฅ์ํ๋ค
- ๋์ ์ ์ ์ฒ๋ฆฌ ํฅ์ : ๋ค์์ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์์ฒญํ ๋ ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ๋ถํ๋ฅผ ๋ถ์ฐํ ์ ์๋ค.
- ๋ฆฌ์์ค ๊ด๋ฆฌ ์ต์ ํ : ๋ฏธ์ฌ์ฉ ์ปค๋ฅ์ ์ ์๋์ผ๋ก ํด์ฒดํ๊ณ ์ผ์ ์๊ฐ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ํ์์ ์ ๊ฑฐํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๋ค.
๐ ์ปค๋ฅ์ ํ์ ๋์ ๊ณผ์
- ์ ํ๋ ์ผ์ด์ ์์ ์, ์ค์ ๋ ๊ฐ์๋งํผ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋๋ค. (MySQL์ 10๊ฐ๋ก ์๊ณ ์์ด์!)
- ํด๋ผ์ด ์ธํธ๊ฐ DB ์ฐ๊ฒฐ์ ์์ฒญํ๋ฉด ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค๋ฅ์ ์ ์ ๊ณตํ๋ค.
- ์์ฉ์ด ๋๋ ์ปค๋ฅ์ ์ close()๋ฅผ ํธ์ถํ์ง๋ง, ์ค์ ๋ก๋ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋์ง ์๊ณ ๋ค์ ํ์ ๋ฐํ๋๋ค.
- ํ์ ์ค์ ์ ๋ฐ๋ผ ์ผ์ ์๊ฐ ๋์ ์ฌ์ฉ๋์ง ์์ ์ปค๋ฅ์ ์ ์๋์ผ๋ก ํด์ ๋๊ฑฐ๋ ํ์ํ ๊ฒฝ์ฐ ์๋ก์ด ์ปค๋ฅ์ ์ ์ถ๊ฐ๋ก ์์ฑํ๋ค.
๐ ์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ํ์ ์ธ ์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- HikariCP (Spring Boot ๊ธฐ๋ณธ ์ปค๋ฅ์
ํ, ์ฑ๋ฅ ์ฐ์,
(2025.01.20 ๊ธฐ์ค ์ด๊ฒ์ ์ฃผ๋ก ์จ์์ด์!)) - Apache Commons DBCP
- C3 P0
- Tomcat JDBC Connection Pool
2. ๋ฐ์ดํฐ์์ค(DataSource)๋?
โก๏ธ ๋ฐ์ดํฐ ์์ค๋ JDBC์์ ์ปค๋ฅ์ ํ์ ๊ด๋ฆฌํ๋ ์ธํฐํ์ด์ค์ด๋ค. ๊ธฐ์กด์ DriverManager๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ์ปค๋ฅ์ ์ ์์ฑํ๋ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ DataSource๋ ์ปค๋ฅ์ ํ์ ํตํด ํจ์จ์ ์ธ ์ฐ๊ฒฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋์์ค๋ค.
์ฆ, DataSource๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฑ์ ํ๋ ๊ฒ์ด ์๋๋ผ, ์ค์ ํ์ผ์ ํตํด ์ปค๋ฅ์ ์ ๋ณด๋ฅผ ์ค์์์ ๊ด๋ฆฌํ ์ ์๋ค.
๐ DataSource๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ์ปค๋ฅ์ ํ์ ์ฝ๊ฒ ํ์ฉ ๊ฐ๋ฅ: DataSource๋ฅผ ํตํด HikariCP, DBCP ๊ฐ์ ์ปค๋ฅ์ ํ์ ์์ฝ๊ฒ ์ค์ ํ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ถ๋ฆฌ: DB ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํ๋ค.
- ๋ณด์ ๊ฐํ: DB ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ค์ ํ์ผ์ ์ ์ฅํ์ฌ ์์ค ์ฝ๋์ ๋ ธ์ถ๋์ง ์๋๋ก ๊ด๋ฆฌํ ์ ์๋ค.
๐ Spring Boot์์ DataSource ์ค์
Spring Boot์์๋ application.properties ๋๋ application.yml์์ ๊ฐ๋จํ๊ฒ DataSource๋ฅผ ์ค์ ํ ์ ์๋ค.
๐ HikariCP๋ฅผ ์ด์ฉํ ์ค์ (Spring Boot ๊ธฐ๋ณธ๊ฐ)
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/{my-database}
spring.datasource.username={my-username}
spring.datasource.password={my-password}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.maximum-pool-size=10
โ: ์ ์ค์ ์ ์ ์ฉํ๋ฉด Spring Boot๋ ์๋์ผ๋ก HikariCP๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋ฅ์ ํ์ ๊ด๋ฆฌํ๋ค.
3. ํธ๋์ญ์ (Transaction)์ด๋?
โก๏ธ ํธ๋์ญ์ ์(Transaction)์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ์ํ๋๋ ์ผ๋ จ์ ์์ ์ ํ๋์ ๋ ผ๋ฆฌ์ ๋จ์๋ก ๋ฌถ๋ ๊ฐ๋ ์ด๋ค. ํธ๋ธ์์ ์ ๋ฐ๋์ ์ํ๋๊ฑฐ๋, ์คํจ์ ์ํ๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ง๋ค์ด์ผ ํ๋ค!
๐ ํธ๋์ญ์ ์ ํน์ง (ACID ์์น)
- ์์์ฑ(Atomicity): ๋ชจ๋ ์์ ์ด ์๋ฒฝํ๊ฒ ์ํ๋๊ฑฐ๋ ์ ํ ์ํ๋์ง ์์์ผ ํ๋ค.
- ์ผ๊ด์ฑ(Consistency): ํธ๋์ญ์ ์ด ์๋ฃ๋ ํ ๋ฐํฐ์ด ๋ฌด๊ฒฐ์ฑ์ด ์ ์ง๋์ด์ผ ํ๋ค.
- ๊ณ ๋ฆฝ์ฑ(Isolation): ๊ฐ ํธ๋์ญ์ ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋ค.
- ์ง์์ฑ(Durability): ์ ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ๊ธ๋ก ์ํ๋๋ฉด ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋๋ค.
๐ ํธ๋์ญ์ ๊ด๋ฆฌ ์์ (Spring Boot & JDBC)
@Transactional
public void increaseFolderCount(Integer folderId) {
// 1๏ธโฃ ์นดํ
๊ณ ๋ฆฌ ์กฐํ (์์ผ๋ฉด ์์ธ ๋ฐ์)
Folder folder = folderRepo.findById(folderId)
.orElseThrow(() -> new EntityNotFoundException("ํด๋น ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค: " + categoryId));
// 2๏ธโฃ ์ฝํ
์ธ ๊ฐ์ ์ฆ๊ฐ
folder.increaseFolderCount();
// 3๏ธโฃ ๋ณ๊ฒฝ ์ฌํญ ์ ์ฅ (ํธ๋์ญ์
์ ์ํด ์๋ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ)
folderRepo.save(folder);
}
โ: ํ๋์ ํธ๋์ญ์ ์์ ์ฝ๋!
- "์กฐํ → ๋ณ๊ฒฝ → ์ ์ฅ"์ด ํ๋์ ๋จ์๋ก ์ฒ๋ฆฌ๋จ (์ค๊ฐ์ ์ค๋ฅ ๋ฐ์ ์ ๋กค๋ฐฑ)
- @Transactional์ด ์ด๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ์ฌ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํจ.