| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |
- GoogleLogin
- oauth
- injection๊ณต๊ฒฉ
- Jenkins
- ๋ ผ๋ธ๋กํน
- MySQL
- ์ฟ ๋ฒ๋คํฐ์ค
- db์ ๋ต
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- dockerhub
- java์ฑํ
- ์๊ณ ๋ฆฌ์ฆ
- @scheduler
- Java
- React
- spring scheduler
- CICD
- ์ฝํ
- node.js mysql ์ฐ๋
- ์๋ฐ
- ์ค๋ธ์
- SpringBoot
- Personal Access Token
- Node.js
- db์ํคํ ์ณ
- ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ
- docker
- ์ฝ๋ฉํ ์คํธ
- spring
- ๋์์ธํจํด
- Today
- Total
<Hello Hosung๐/>
[Java] ๋์์ธ ํจํด - ์ฑ๊ธํค ๋ณธ๋ฌธ
[Java] ๋์์ธ ํจํด - ์ฑ๊ธํค
์ข์ถฉ์ฐ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ผ๊ธฐ๐ง 2024. 11. 13. 22:34
์ฑ๊ธํค(Singleton) ํจํด์ ๊ฐ์ฒด์ ์ธ์คํด์ค๊ฐ ์ค์ง ํ๋๋ง ์กด์ฌํ๋๋ก ๋ณด์ฅํ๋ ๋์์ธ ํจํด์
๋๋ค.
์ฃผ๋ก ํ๋์ ์ธ์คํด์ค๋ง ํ์ํ๊ฑฐ๋, ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๊ณต์ ํด์ผ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋ ๋ก๊ทธ ์ฒ๋ฆฌ๊ธฐ์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค.
1. ์ฑ๊ธํค ํจํด์ ํต์ฌ ํน์ง
- ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋๋ฉฐ, ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฅผ ๊ณต์ ํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์ ๊ทผ์ ์ ๊ณตํ์ฌ ํ๋ก๊ทธ๋จ ์ด๋์๋ ํด๋น ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ธ์คํด์ค๋ฅผ ์ ์ญ์ผ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
2. ์ฑ๊ธํค ํจํด ๊ตฌํ ์์ (Java)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฑ๊ธํค ํจํด์ Java๋ก ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
์์ ์ฝ๋: ๊ธฐ๋ณธ ์ฑ๊ธํค ๊ตฌํ
public class Singleton {
// ์ ์ ๋ณ์๋ก ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ์ ์ธ
private static Singleton instance;
// private ์์ฑ์๋ฅผ ์ ์ธํ์ฌ ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ๋ชปํ๋๋ก ์ค์
private Singleton() {}
// ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฉ์๋
public static Singleton getInstance() {
if (instance == null) { // ์ฒ์ ํธ์ถ๋ ๋ ์ธ์คํด์ค๊ฐ null์ธ์ง ํ์ธ
instance = new Singleton(); // ์ธ์คํด์ค๊ฐ ์์ผ๋ฉด ์์ฑ
}
return instance; // ์ด๋ฏธ ์์ผ๋ฉด ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ฐํ
}
public void showMessage() {
System.out.println("์ฑ๊ธํค ์ธ์คํด์ค์
๋๋ค!");
}
}
์ฌ์ฉ ์์
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
singleton1.showMessage(); // ์ถ๋ ฅ: ์ฑ๊ธํค ์ธ์คํด์ค์
๋๋ค!
// ๋ ์ธ์คํด์ค๊ฐ ๋์ผํ์ง ํ์ธ
System.out.println(singleton1 == singleton2); // true (๋ ๊ฐ์ฒด๋ ๋์ผํ ์ธ์คํด์ค)
}
}
3. ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฑ๊ธํค ํจํด ์ฌ์ฉ
๊ธฐ๋ณธ ์ฑ๊ธํค ๊ตฌํ์ ๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฌธ์ ์์ด ์๋ํ์ง๋ง, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ getInstance() ๋ฉ์๋๊ฐ ๋์์ ํธ์ถ๋ ์ ์์ด ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ์ํ์ด ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด synchronized ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํํ๊ฑฐ๋, ์ด๋ฅธ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ฝ๋: ์ค๋ ๋ ์์ ํ ์ฑ๊ธํค (Double-Checked Locking)
public class ThreadSafeSingleton {
private static volatile ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static ThreadSafeSingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) { // ๋๊ธฐํ ๋ธ๋ก
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
}4. ์ฑ๊ธํค ํจํด์ ์ฅ๋จ์
์ฅ์
- ์ธ์คํด์ค๊ฐ ํ๋๋ง ์์ฑ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ ์ญ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๋จ์
- ์์กด์ฑ์ด ๊ฐํด์ ธ ๋จ์ ํ ์คํธ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์๋ชป ๊ตฌํํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํฉ๋๋ค.
5. ์ฑ๊ธํค ํจํด์ด ์ ์ฉํ ์ํฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ: ํ๋์ ์ฐ๊ฒฐ ์ธ์คํด์ค๊ฐ ์ ์ญ์์ ๊ณต์ ๋๋๋ก ํด์ผ ํ ๋.
- ์ค์ ๊ด๋ฆฌ ๊ฐ์ฒด: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ ๋์ผํ ์ค์ ์ ์ฐธ์กฐํ ๋.
- ๋ก๊น ํด๋์ค: ๋ชจ๋ ํด๋์ค๊ฐ ๋์ผํ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋กํด์ผ ํ ๋.
์ถ๊ฐ์ ์ผ๋ก Spring ํ๋ ์์ํฌ์์๋ ์ง์ ์ฑ๊ธํค ํจํด์ ๊ตฌํํ ํ์๊ฐ ๊ฑฐ์ ์์ต๋๋ค. Spring์ด ๋น(Bean) ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํตํด ์ฑ๊ธํค ํจํด์ ์๋์ผ๋ก ์ ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค.
Spring์ ์ฑ๊ธํค ๊ด๋ฆฌ ๋ฐฉ์
Spring ์ปจํ
์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋ ๋ชจ๋ ๋น์ ์์ฑํ๊ณ , ๊ธฐ๋ณธ ์ค์ฝํ๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ค์ ํด ๋น ํ๋๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ณต์ ํ ์ ์๋๋ก ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฑ๊ธํค ํจํด์ ์์ฑํ์ง ์๊ณ ๋, ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์์: Spring์์ ์ฑ๊ธํค ๋น ์ฌ์ฉํ๊ธฐ
@Service
public class MyService {
public void doSomething() {
System.out.println("์์
์ํ ์ค...");
}
}
์ ์ฝ๋์์ MyService๋ Spring์ @Service ์ด๋ ธํ ์ด์ ์ ํตํด ๋น์ผ๋ก ๋ฑ๋ก๋๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค ์ค์ฝํ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด ๋น์ ์ฌ๋ฌ ๊ณณ์์ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋๋ผ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค.
๋ค์ํ ๋น ์ค์ฝํ
Spring์์๋ ๋ค์ํ ๋น ์ค์ฝํ๋ฅผ ์ ๊ณตํด ํ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
- ์ฑ๊ธํค(Singleton): ๊ธฐ๋ณธ ์ค์ฝํ์ด๋ฉฐ, ๋ชจ๋ ์์ฒญ์์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํ๋กํ ํ์ (Prototype): ๋งค๋ฒ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ฌ์ฉํฉ๋๋ค.
- ๋ฆฌํ์คํธ(Request), ์ธ์ (Session): ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์ ๊ฐ๊ฐ ์์ฒญ, ์ธ์ ๋น ํ๋์ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
Spring์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํ๋ ์์ํฌ์ ๋น ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํตํด ์ฑ๊ธํค ํจํด์ ํจ๊ณผ๋ฅผ ์ฝ๊ฒ ์ป์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ Spring์์๋ ์ฑ๊ธํค ํจํด์ ์ง์ ๊ตฌํํ์ง ์๊ณ , ๋น์ ์ค์ฝํ ์ค์ ์ ํตํด ์ ์ ํ ์ธ์คํด์ค ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.