๐พ [CS] ์ฑ๊ธํค ํจํด.
1๏ธโฃ ์ฑ๊ธํค ํจํด(Singleton pattern)
- ์ฑ๊ธํค ํจํด(singleton pattern)์ ํ๋์ ํด๋์ค์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ๊ฐ์ง๋ ํจํด์ ๋๋ค.
- ํ๋์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ์ ์ธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ ํ๋์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋จ ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ก์ง์ ๋ง๋๋๋ฐ ์ฐ์
๋๋ค.
- ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
- ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋๊ณ ํด๋น ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ๊ณต์ ํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋๋ ๋น์ฉ์ด ์ค์ด๋๋ ์ฅ์ ์ด ์์ต๋๋ค.
- ํ์ง๋ง ์์กด์ฑ์ด ๋์์ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
2๏ธโฃ Java์์์ ์ฑ๊ธํค ํจํด.
- Java์์ Singleton ํจํด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง, ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ ์ค ๋ช ๊ฐ์ง๋ฅผ ์๊ฐํ๊ฒ ์ต๋๋ค.
- Eager Initialization(์ฆ์ ์ด๊ธฐํ)
- Lazy Initialization(์ง์ฐ ์ด๊ธฐํ)
- Thread-safe Singleton(์ค๋ ๋ ์์ ์ฑ๊ธํค)
- Synchronized Method
- Double-checked Locking
- Bill Pugh Singleton(Holder ๋ฐฉ์)
1๏ธโฃ Eager Initialization(์ฆ์ ์ด๊ธฐํ)
- ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก, ํด๋์ค๊ฐ ๋ก๋๋ ๋ ์ฆ์ Singleton ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
public class Singleton { // ์ ์ผํ ์ธ์คํด์ค ์์ฑ private static final Singleton instance = new Singleton(); // private ์์ฑ์: ์ธ๋ถ์์ ์ธ์คํด์ค ์์ฑ์ ๋ฐฉ์ง private Singleton() {} // ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ public static Singleton getInstance() { return instance; } }
- ์ด ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด์ง๋ง, ํด๋์ค๊ฐ ๋ก๋๋ ๋ ๋ฐ๋ก ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์, ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋์ง ์๋๋ผ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.
2๏ธโฃ Lazy Initialization(์ง์ฐ ์ด๊ธฐํ)
- ์ธ์คํด์ค๊ฐ ์ฒ์์ผ๋ก ํ์ํ ๋ ์์ฑ๋๋๋ก ํฉ๋๋ค.
- ์ด ๋ฐฉ๋ฒ์ ์ด๊ธฐํ์ ๋๋ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ ์ ๋ฆฌํฉ๋๋ค.
```java
public class Singleton {
// ์ ์ผํ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ ๋ณ์ (์ด๊ธฐ์๋ null)
private static Singleton instance;
// private ์์ฑ์: ์ธ๋ถ์์ ์ธ์คํด์ค ์์ฑ์ ๋ฐฉ์ง
private Singleton() {}// ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ (ํ์ํ ๋๋ง ์์ฑ)
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
``` - ์ด ๋ฐฉ๋ฒ์ ์ด๊ธฐํ์ ๋๋ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ ์ ๋ฆฌํฉ๋๋ค.
- ์ด ๋ฐฉ๋ฒ์ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ์ ์ธ ๋๊ธฐํ๊ฐ ํ์ํฉ๋๋ค.
3๏ธโฃ Thread-safe Singleton(์ค๋ ๋ ์์ ์ฑ๊ธํค)
- ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ Lazy Initialization์ ๊ตฌํํ๋ ค๋ฉด ๋๊ธฐํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1๏ธโฃ Synchronized Method
public class Singleton {
private static Singleton instance;
private Singleton() {}
// synchronized ํค์๋๋ก ์ค๋ ๋ ์์ ํ๊ฒ ๋ง๋ฆ
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- ์ด ๋ฐฉ๋ฒ์ ์์ ํ์ง๋ง, ์ฑ๋ฅ์ ์ฝ๊ฐ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
-
'synchronized'
๋ก ์ธํด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ โgetInstance()
โ ๋ฅผ ํธ์ถํ ๋ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
-
2๏ธโฃ Double-checked Locking
- ์ด ๋ฐฉ๋ฒ์ ์ฑ๋ฅ๊ณผ ์ค๋ ๋ ์์ ์ฑ์ ๋ชจ๋ ๊ณ ๋ คํ ์ต์ ํ๋ ๋ฐฉ์์
๋๋ค.
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
- ์ฌ๊ธฐ์
'volatile'
ํค์๋๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์ค๋ ๋ ๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
4๏ธโฃ Bill Pugh Singleton(Holder ๋ฐฉ์)
- ์ด ๋ฐฉ๋ฒ์ Lazy Initialization์ ์ฌ์ฉํ๋ฉด์๋, ์ฑ๋ฅ๊ณผ ์ค๋ ๋ ์์ ์ฑ์ ๋ชจ๋ ๋ณด์ฅํฉ๋๋ค.
public class Singleton { private Singleton() {} // SingletonHolder๊ฐ ํด๋์ค ๋ก๋ ์์ ์ ์ด๊ธฐํ๋จ private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }
- ์ด ๋ฐฉ๋ฒ์ ๋ด๋ถ ์ ์ ํด๋์ค๊ฐ JVM์ ์ํด ํด๋์ค ๋ก๋ ์ ์ด๊ธฐํ๋๋ฏ๋ก, ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ์ ์ค ํ๋์
๋๋ค.
- ํด๋์ค๊ฐ ๋ก๋๋ ๋ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ฏ๋ก, ๋๊ธฐํ๋ ์ถ๊ฐ์ ์ธ ์ฝ๋ ์์ด๋ ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
3๏ธโฃ Spring Boot์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ ๊ทธ๋ฆฌ๊ณ ์ฑ๊ธํด ํจํด.
- Spring Boot์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋, ๋ด๋ถ์ ์ผ๋ก โ์ฑ๊ธํด ํจํดโ ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋ ์ด ํจํด์ ์ง์ ๊ตฌํํ ํ์๋ ์์ต๋๋ค.
- โSpring Frameworkโ ์์ฒด๊ฐ ์ฑ๊ธํด ํจํด์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฐ ๊ด๋ฆฌ์ ๊ด๋ จ๋ โBean(๊ฐ์ฒด)โ ์ ๊ด๋ฆฌํฉ๋๋ค.
- ๊ทธ๋ฌ๋ ์ด ํจํด์ ์ง์ ๊ตฌํํ ํ์๋ ์์ต๋๋ค.
1๏ธโฃ Spring Boot์ ์ฑ๊ธํด ํจํด.
- Spring Framework๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ Bean์ ์ฑ๊ธํด ์ค์ฝํ๋ก ๊ด๋ฆฌํฉ๋๋ค.
- ์ด๋ ํน์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ๋ด์์ ํ ๋ฒ๋ง ์์ฑ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ ๊ณต์ ๋จ์ ์๋ฏธํฉ๋๋ค.
2๏ธโฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์์์ ์ฑ๊ธํด ํจํด ์ฌ์ฉ.
-
-
DataSource Bean.
- Spring Boot์์ MySQL๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ๋
'DataSource'
๋ผ๋'Bean'
์ ์์ฑํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. - ์ด
'DataSource'
๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ฉฐ, Spring์ ์ด'Bean'
์ ์ฑ๊ธํด์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฆ, Spring ์ ํ๋ฆฌ์ผ์ด์
๋ด์์๋
'DataSource'
๊ฐ์ฒด๊ฐ ํ๋๋ง ์์ฑ๋์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์์ฒญ์์ ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
- Spring Boot์์ MySQL๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ๋
-
DataSource Bean.
-
-
EntityManagerFactory ๋ฐ SessionFactory.
- JPA๋ Hibernate์ ๊ฐ์ ORM์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,
'EntityManagerFactory'
๋'SessionFactory'
์ ๊ฐ์ ๊ฐ์ฒด๋ ์ฑ๊ธํด ํจํด์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์ด๋ค ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ณ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๋ฉฐ, ์ญ์ Spring์ ์ํด ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
- JPA๋ Hibernate์ ๊ฐ์ ORM์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,
-
EntityManagerFactory ๋ฐ SessionFactory.
-
-
Spring์ ์ฑ๊ธํด ๊ด๋ฆฌ.
- Spring์ ๊ฐ๋ฐ์๊ฐ
'Bean'
์ ์ง์ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์๋๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์คํธ ๋ด์์'Bean'
์ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. - ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ ๊ด๋ จ ํด๋์ค๋ค์ด ์ด
'Bean'
๋ค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ํจ์จ์ ์ด๊ณ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- Spring์ ๊ฐ๋ฐ์๊ฐ
-
Spring์ ์ฑ๊ธํด ๊ด๋ฆฌ.
3๏ธโฃ ์์: Spring Boot์์ MySQL ์ฐ๊ฒฐ ์ค์ .
- Spring Boot์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ์ค์ ์
'application.properties'
ํ์ผ์ด๋'application.yml'
ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- ์ด ์ค์ ์ Spring Boot๊ฐ
'DataSource'
'Bean'
์ ์๋์ผ๋ก ์์ฑํ๋๋ก ํ๋ฉฐ, ์ด'Bean'
์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
4๏ธโฃ โ๏ธ ์์ฝ
- Spring Boot์์ MySQL๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋, Spring์ ๋ด๋ถ์ ์ผ๋ก ์ฑ๊ธํด ํจํด์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํฉ๋๋ค.
-
'DataSource'
,'EntityManagerFactory'
๋ฑ์ ๊ฐ์ฒด๊ฐ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.- Spring ์์ฒด๊ฐ ์ด ํจํด์ ์ฒ๋ฆฌํ๋ฏ๋ก, ๊ฐ๋ฐ์๋ ๋ณ๋๋ก ์ฑ๊ธํด ํจํด์ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค.
-
4๏ธโฃ Java Servlet ์ปจํ ์ด๋์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ทธ๋ฆฌ๊ณ ์ฑ๊ธํด ํจํด.
- Java Servlet ์ปจํ
์ด๋์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋, ์ฑ๊ธํด ํจํด์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ค๋ง, ์ด ํจํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ง์ ๊ตฌํ๋๋ ๊ฒ์ด ์๋๋ผ, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
1๏ธโฃ JDBC DataSource
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋(์: Tomcat, Jetty)์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ค์ ํ ๋ ๋ณดํต
'DataSource'
๋ฅผ ์ฌ์ฉํฉ๋๋ค.- ์ด
'DataSource'
๊ฐ์ฒด๋ ๋ณดํต ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ ์ ๊ณตํฉ๋๋ค.
- ์ด
-
Connection Pooling
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฐ๊ฒฐ ํ๋ง(Connection pooling)์ ์ฌ์ฉํฉ๋๋ค.
- ์ฐ๊ฒฐ ํ์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ์ฌ์ฌ์ฉํ๋๋ก ๊ด๋ฆฌํฉ๋๋ค.
- ์ฐ๊ฒฐ ํ์ ๊ด๋ฆฌํ๋ ๊ฐ์ฑ๋
'DataSource'
์ด๊ณ , ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋์ด, ์ฌ๋ฌ ์๋ธ๋ฆฟ์์ ๋์ผํ'DataSource'
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฐ๊ฒฐ ํ๋ง(Connection pooling)์ ์ฌ์ฉํฉ๋๋ค.
2๏ธโฃ ์ฑ๊ธํด ํจํด์ ํ์ฉ.
-
DataSource ๊ฐ์ฒด
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ๋ณดํต
'DataSource'
๊ฐ์ฒด๋ฅผ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.-
'DataSource'
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ ๊ด๋ฆฌํ๋ฉฐ, ์ด ๊ฐ์ฒด๊ฐ ํ ๋ฒ๋ง ์์ฑ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
-
- ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ๋ณดํต
-
Connection ๊ฐ์ฒด
- ๊ฐ ์์ฒญ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ํ์ํ ๋๋ง๋ค ์๋ก์ด
'Connection'
๊ฐ์ฒด๊ฐ ์์ฑ๋๊ฑฐ๋ ํ์์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.- ํ์ง๋ง
'DataSource'
์์ฒด๋ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์, ๋์ผํ'DataSource'
๊ฐ์ฒด๋ฅผ ํตํด ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ง๋๋ค.
- ํ์ง๋ง
- ๊ฐ ์์ฒญ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ํ์ํ ๋๋ง๋ค ์๋ก์ด
3๏ธโฃ ์์: Tomcat์์ DataSource ์ค์
- Tomcat๊ณผ ๊ฐ์ ์๋ธ๋ฆฟ ์ปจํ
์ด๋์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ์ค์ ํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์
'context.xml'
ํ์ผ์์'DataSource'
๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
<Context>
<Resource name="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
maxTotal="100"
maxIdel="30"
maxWaitMillis="10000"
username="root"
password="password"
driverClassName="com.myslq.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"/>
</Context>
- ์ด ์ค์ ์
'jdbc/MyDB'
๋ผ๋ JNDI ๋ฆฌ์์ค๋ฅผ ์ ์ํ๊ณ ,'DataSource'
๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฐ๊ฒฐ ํ๋ง์ ๊ด๋ฆฌํฉ๋๋ค.- ์ด
'DataSource'
๋ Tomcat ๋ด์์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์ด
4๏ธโฃ ์ฑ๊ธํด ํจํด์ ์ด์ .
-
ํจ์จ์ฑ.
- ์ฌ๋ฌ ์๋ธ๋ฆฟ์ด ๋์ผํ
'DataSource'
๊ฐ์ฒด๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ์ ์์์ ์ ์ฝํ ์ ์์ต๋๋ค.
- ์ฌ๋ฌ ์๋ธ๋ฆฟ์ด ๋์ผํ
-
๊ด๋ฆฌ์ ์ฉ์ด์ฑ.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ๋ฅผ ์ค์ํํ ์ ์์ผ๋ฉฐ, ์ฝ๋์์ ์ง์ ๊ด๋ฆฌํ ํ์ ์์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ด๋ฅผ ๋ด๋นํฉ๋๋ค.
5๏ธโฃ โ๏ธ ์์ฝ
- Java Servlet ์ปจํ
์ด๋์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋, ์ฑ๊ธํด ํจํด์ ์ฃผ๋ก
DataSource
๊ฐ์ฒด์ ์ ์ฉ๋ฉ๋๋ค.- ์ด
DataSource
๊ฐ์ฒด๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ํด ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ ํตํด ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค.- ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋๊ณ ์ฑ๋ฅ์ด ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
- ์ด
3๏ธโฃ Java ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ ๊ทธ๋ฆฌ๊ณ ์ฑ๊ธํด ํจํด.
- Java ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋, ์ฑ๊ธํด ํจํด์ ์ฐ์ํ ์ญํ ์ ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ ์ด ํจ๋ก์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ง์ ๊ตฌํ๋์ง ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
1๏ธโฃ DataSource์ Connection Pooling
- Java ์ ํ๋ฆฌ๊ฒ์ด์
์๋ฒ(์: JBoss/WildFly, GlassFish, WebSphere)์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋ ์ผ๋ฐ์ ์ผ๋ก
'JDBC DataSource'
์'Connection Pooling'
์ ์ฌ์ฉํฉ๋๋ค.- ์ด๋ DataSource ๊ฐ์ฒด๋ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฐ๊ฒฐ ํ์ ์ฌ์ฉํฉ๋๋ค.
-
DataSource ์ฑ๊ธํด ๊ด๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด DataSource๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด DataSource ๊ฐ์ฒด๋ ์๋ฒ์์ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ๋์ผํ DataSource ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด DataSource ๊ฐ์ฒด๋ ์๋ฒ์์ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
- DataSource๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ ๊ด๋ฆฌํ๋ฉฐ, ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์์ฒญ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด DataSource๋ฅผ ์์ฑํฉ๋๋ค.
-
Connection ๊ฐ์ฒด ๊ด๋ฆฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ Connection ๊ฐ์ฒด๋ ๋งค๋ฒ ์๋ก์ด ์์ฒญ์ด ์์ ๋๋ง๋ค DataSource์์ ๊ฐ์ ธ์ค์ง๋ง, DataSource๋ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๋ฏ๋ก ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผ๊ด๋ ์ฐ๊ฒฐ ํ์ด ์ฌ์ฉ๋ฉ๋๋ค.
2๏ธโฃ Java EE ํ๊ฒฝ์์์ DataSource ๊ด๋ฆฌ
- Java EE ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์์๋
'JNDI(Java Naming and Directory Interface)'
๋ฅผ ํตํด DataSource๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.- ์ด๋ ์๋ฒ์ ์ ์ญ ์ค์ ์์ ๊ด๋ฆฌ๋๋ฉฐ, ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ณต์ ํ ์ ์๋๋ก ํฉ๋๋ค.
-
JNDI๋ฅผ ํตํ DataSource ์ค์ ์์
```xml
- ์ด ์ค์ ์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๊ฐ ์ฑ๊ธํด DataSource ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋๋ก ํฉ๋๋ค.
### 3๏ธโฃ ์ฑ๊ธํด ํจํด์ ์ญํ .
- **ํจ์จ์ฑ**
- ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌ๋๋ DataSource๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ ์ ์ฒด์์ ํ๋์ ๊ฐ์ฒด๋ก ์ ์ง๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฌ์ฉ์ด ์ต์ ํ๋ฉ๋๋ค.
- **์ผ๊ด์ฑ**
- ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฉ์ ๊ฑธ์ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์ผ๊ด๋๊ฒ ๊ด๋ฆฌ๋ฉ๋๋ค.
- **๊ด๋ฆฌ ์ฉ์ด์ฑ**
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ๊ฐ ์ค์ํ๋์ด, ๊ฐ ์ ํ๋ฆฌ๊ฒ์ด์
์์ ๋ฐ๋ก ๊ด๋ฆฌํ ํ์ ์์ด ์๋ฒ์์ ํตํฉ ๊ด๋ฆฌ๋ฉ๋๋ค.
### 4๏ธโฃ EJB์์ ํตํฉ.
- JavaEE ํ๊ฒฝ์์ EJB(Enterprise JavaBeans)๋ ์ฃผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์์ ๊ด๋ฆฌ๋๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- EJB์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฌ์ฉํ ๋๋ ์ฑ๊ธํด ํจํด์ด ์ ์ฉ๋ DataSource๋ฅผ ํตํด ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ง๋๋ค.
```java
@Stateless
public class MyService {
@Resource(lookup = "java:/jdbc/MyDB")
private DataSource dataSource;
public void doSomething() {
try (Connection connection = dataSource.getConnection()) {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ํ
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- ์ด ์ฝ๋์์
'dataSource'
๋ ์๋ฒ์ ์ํด ๊ด๋ฆฌ๋๋ ์ฑ๊ธํด DataSource ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
5๏ธโฃ โ๏ธ ์์ฝ,
- Java ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ ๋, ์ฑ๊ธํด ํจํด์ DataSource์ ๊ฐ์ ์ค์ํ ๊ฐ์ฒด ๊ด๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด ํจํด์ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํจ์จ์ ์ด๊ณ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ฐ๊ฒฐ ํ๋ง์ ํตํด ์์ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ DataSource๋ฅผ ์ฑ๊ธํด์ผ๋ก ๊ด๋ฆฌํจ์ผ๋ก์จ, ์๋ฒ ์ ๋ฐ์ ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ ๊ณตํ๊ณ ํจ์จ์ฑ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
- ์ด ํจํด์ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํจ์จ์ ์ด๊ณ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ฐ๊ฒฐ ํ๋ง์ ํตํด ์์ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.