...


Singleton Pattern
์ฑ๊ธํค ํจํด์ ๋์์ธ ํจํด๋ค ์ค์์ ๊ฐ์ฅ ๊ฐ๋ ์ ์ผ๋ก ๊ฐ๋จํ ํจํด์ด๋ค.
ํ์ง๋ง ๊ฐ๋จํ ๋งํผ ์ด ํจํด์ ๋ํด ์ฝ๋๋ง ๋์ ธ์ฃผ๊ณ ๋๋ด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์์ด, ์ด๋์ ์ฐ์ด๋์ง ์ด๋ ํ ๋ฌธ์ ๊ฐ ์๋์ง ์ ๋๋ก ์์ง ๋ชปํ๊ณ ์ผ๋ ๋ฑ๋ ๋์ด๊ฐ๋ฒ๋ฆฌ๋ ๊ฒ์ด ๋ง์ ๋ณด์ธ๋ค.
์ด๋ฒ ์๊ฐ์๋ ๊ธฐ์ ๋ฉด์ ์ ๋จ๊ณจ ์ง๋ฌธ์ด๋ฉด์ ๊ฐ๋จํ์ง๋ง ๊ฒฐ์ฝ ๊ฐ๋จํ์ง ์์ ๋์์ธ ํจํด์ ์ฑ๊ธํค ํจํด์ ๋ํด ๊ผผ๊ผผํ๊ฒ ์์๊ฐ ๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์.
์ฑ๊ธํค ํจํด์ด๋ ๋จ ํ๋์ ์ ์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ฝ๋ ํจํด์ด๋ค.
์ฝ๊ฒ ๋งํ์๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ ์ํด, ์ธ์คํด์ค๊ฐ ํ์ํ ๋ ๋๊ฐ์ ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ค์ง ์๊ณ ๊ธฐ์กด์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ ํ์ฉํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค.
์ฐ๋ฆฌ๊ฐ ์ ์ญ ๋ณ์๋ผ๋ ๊ฑธ ๋ง๋ค์ด ์ด์ฉํ๋ ์ด์ ๋, ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์๋๋ง๋ค ์ง์ญ ๋ณ์๋ก ์ ์ธํด์ ์ฌ์ฉํ๋ฉด ๋ฌด์๋ฏธํ๊ธฐ๋ ์๊ณ ๋ญ๋น์ด๊ธฐ ๋๋ฌธ์, ์ ์ญ์์ ํ๋ฒ๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ๊ฐ๋ ์ ๊ทธ๋๋ก ํด๋์ค์ ๋์ ํ ๊ฒ์ด ์ฑ๊ธํค ํจํด์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ๋ณดํต ์ฑ๊ธํค ํจํด์ด ์ ์ฉ๋ ๊ฐ์ฒด๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ๊ทธ ๊ฐ์ฒด๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ฐจ์งํ๋ ์ญํ ์ ํ๋ ๋ฌด๊ฑฐ์ด ํด๋์ค์ผ๋ ์ ํฉํ๋ค.
๋ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋์ ์๋ก ๋ค ์ ์๋๋ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๋ ์์ (I/O ๋ฐ์ด๋)์ ๊ทธ ์์ฒด๋ก ๋ฌด๊ฑฐ์ด ์์ ์ ์ํ๋ฉฐ ๋ํ ํ๋ฒ๋ง ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋๋ ค์ฐ๋ฉด ๋์ง ๊ตณ์ด ์ฌ๋ฌ๋ฒ ์์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ์๋ ๋์คํฌ ์ฐ๊ฒฐ, ๋คํธ์ํฌ ํต์ , DBCP ์ปค๋ฅ์ ํ, ์ค๋ ๋ํ, ์บ์, ๋ก๊ทธ ๊ธฐ๋ก ๊ฐ์ฒด ๋ฑ์ ์ด์ฉ๋๋ค.
์ด๋ฌํ ๊ฐ์ฒด๋ค์ ๋ ์๋ก ๋ง๋ค์ด์ ์ฌ์ฉ๋ ์ผ๋ ์๊ฑฐ๋์ ์ฌ์ฉํด๋ ๋ฆฌ์์ค ๋ญ๋น์ผ ๋ฟ์ด๋ค. ๋ฐ๋ผ์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ ์ผํด์ผ ํ๋ฉฐ ์ ์ผํ ๊ฒ์ด ์ข์ ๊ฒ์ ์ฑ๊ธํค ๊ฐ์ฒด๋ก ๋ง๋ค๋ฉด ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ค์ ๋ก ์๋๋ก์ด๋ ์คํ๋์ค ์๋ฐ SDK์์ ๊ฐ ์กํฐ๋นํฐ ๋ค์ด๋, ํด๋์ค๋ง๋ค ์ฃผ์ ํด๋์ค๋ค์ ํ๋ํ๋ ์ ๋ฌํ๋๊ฒ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ด๋์๋ ์ ๊ทผํ๋๋ก ์ค๊ณ๋์๋ค.
์ฑ๊ธํค ํจํด ๊ตฌํ ์๋ฆฌ

ํด๋์ค์ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๋ ๊ฒ์ ์ ํ ๋ณต์กํ์ง ์๋ค.
์ด๋ ต๊ฒ ์๊ฐํ ํ์์์ด ์ฑ๊ธํค์ผ๋ก ์ด์ฉํ ํด๋์ค๋ฅผ ์ธ๋ถ์์ ๋ง๊ตฌ์ก์ด๋ก new ์์ฑ์๋ฅผ ํตํด ์ธ์คํด์คํ ํ๋ ๊ฒ์ ์ ํํ๊ธฐ ์ํด ํด๋์ค ์์ฑ์ ๋ฉ์๋์ private ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๊ทธ๋ฆผ์์ ๋ณผ ์ ์๋ฏ์ด getInstance() ๋ผ๋ ๋ฉ์๋์ ์์ฑ์ ์ด๊ธฐํ๋ฅผ ํด์ฃผ์ด, ๋ง์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ฑ๊ธํค ํด๋์ค๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ ค๋ฉด getInstance() ๋ผ๋ ๋ฉ์๋ ์คํ์ ํตํด instance ํ๋ ๋ณ์๊ฐ null ์ผ๊ฒฝ์ฐ ์ด๊ธฐํ๋ฅผ ์งํํ๊ณ null์ด ์๋๊ฒฝ์ฐ ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์์ผ๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ค.
๋ค์์ ์ฑ๊ธํค์ผ๋ก ๊ตฌ์ฑ๋ ํด๋์ค๋ฅผ ์ธ๋ถ์์ ๋ถ๋ฌ์ค๋ ์์ ์ด๋ค.
์ ์ ๋ฉ์๋๋ก getInstance()๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ ๋ณ์์ ์ ์ฅํ๊ณ ์ด๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ๋๊ฐ์ ๊ฐ์ฒด ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฑธ ๋ณผ ์ ์๋ค.
์ฆ, ๊ฐ์ฒด ํ๋๋ง ์์ฑํ๊ณ ์ฌ๋ฌ ๋ณ์์ ๋ถ๋ฌ์๋ ๋๋ ค์ฐ๊ธฐ๋ฅผ ํ ๊ฒ์ด๋ค.
public class Main {
public static void main(String[] args) {
// Singleton.getInstance() ๋ฅผ ํตํด ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๊ฐ๊ธฐ ๋ณ์๋ง๋ค ๋ฐ์์๋ ๋๊ฐ์ ๊ฐ์ฒด ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํด
Singleton i1 = Singleton.getInstance();
Singleton i2 = Singleton.getInstance();
Singleton i3 = Singleton.getInstance();
System.out.println(i1.toString()); // Singleton@1b6d3586
System.out.println(i2.toString()); // Singleton@1b6d3586
System.out.println(i3.toString()); // Singleton@1b6d3586
System.out.println(i1 == i2); // true
}
}
๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ ํ๋ฒํ ํด๋์ค ๋ง๋ค๊ณ ํ๋ฒ๋ง ์ธ์คํดํํ ํ๋ค ์ฌ์ฉ์ํ๋ฉด ์ฑ๊ธํค ํจํด๊ณผ ๋ฌด์จ ์ฐจ์ด๊ฐ ์๋๋ ์ถ๊ฒ ์ง๋ง, ๋ณธ๋ ๊ฐ๋ฐ์๋ ์ฌ๋์ด๊ณ ์ฌ๋์ ํญ์ ์ค์๋ฅผ ๋ฒ๋ณตํ๋ ์๋ฌผ์ด๋ผ, ์ด๋ฌํ ๋ฌธ๋ฒ์ ์ธ ๋ฒ๋ฅ ์ ํตํด ๊ตฌ์กฐ์ ์ผ๋ก ์ ํํ๋ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค.
์ฑ๊ธํค ํจํด ๊ตฌํ ๊ธฐ๋ฒ ์ข ๋ฅ
์ง๊ธ๋ถํฐ ์๋ฐ ์ฝ๋๋ฅผ ์์ ๋ก ๋ค์ด ์ฑ๊ธํค ํจํด์ ๋ํด ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ ๊ฒ์ด๋ค.
์ด๋ ํ ๋ชฉ์ ์ ๊ตฌํํ๊ธฐ ์ํด ์ฝ๋ ํจํด์ด๋ผ๋ ๊ฒ์ด ๊ผญ ํ๊ฐ์ง๋ง ์๋ ๊ฒ์ ์๋๋ค. ์ฌ๋ฌ๊ฐ์ง ์ฝ๋ ๊ธฐ๋ฒ๋ค์ด ์กด์ฌํ์ฌ ์ด๋ค ์ค ๊ฐ์ฅ ์ต์ ํ๋ ํจํด์ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
๋ค์์ ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ์ฝ๋ ๊ธฐ๋ฒ๋ค์ด๋ค.
์ด 7๊ฐ์ง๊ฐ ์์ผ๋ฉฐ ์ด๋ค์ ๋ชจ๋ ์ฑ๊ธํค์ ์งํฅํ๋ค๋ ์ ์์๋ ๊ฐ์ง๋ง ๊ฐ๊ธฐ ์ฝ๋ ํจํด๋ง๋ค ์ฅ๋จ์ ์ด ์กด์ฌํ๋ค. ๊ฐ ์์๋ง๋ค 1๋ฒ ๋ถํฐ ์กฐ๊ธ์ฉ ๋จ์ ์ ๋ณด์ํ๋ ์์ผ๋ก ํ๋ฌ๊ฐ๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค.
- Eager Initialization
- Static block initialization
- Lazy initialization
- Thread safe initialization
- Double-Checked Locking
- Bill Pugh Solution
- Enum ์ด์ฉ
๋ง์ผ ์ง๊ธ ๋น์ฅ ์ฌ์ฉํ ๊ฒ์ฆ๋ ์ฑ๊ธํค ์ฝ๋ ํจํด์ ๋ด์ผํ๋ค๋ฉด, Bill Pugh Solution๊ณผ Enum ์ด์ฉ ์์ ๋ง ๋ณด๋ฉด ๋๋ค.
๋ค๋ง ์ฐ๋ฆฌ๊ฐ ์ ๊ณต์์ ์ปดํจํฐ์ ์ญ์ฌ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์ฐ๋ ์ด์ ์ ๊ฐ์ด, ํ๋์ ๋ชฉ์ ์ ์ด๋ฃจ๊ณ ์ ํ์ํ ๋ค์ํ ์๋ฐ์ ์ฝ๋ ํจํด๋ค์ ๋ณด๋ฉฐ ์์๋๋ก ์ฝ๋๋ค์ด ์ต์ ํ๋๊ณ ๋ฐ์ ๋์ด์ ธ ๊ฐ๋ ๊ณผ์ ์ ์ฐจ๊ทผ์ฐจ๊ทผ ํ์ตํ๋ค๋ฉด, ๋์ค์ ์ฝ๋๋ฅผ ์ค๊ณํ ๋ ์ด๋ฌํ ๊ฒฝํ๋ค์ด ๋ถ๋ช ๋์์ด ๋ ๊ฒ์ด๋ค.
๋ํ ๋ ์๋ถ๋ค์ด ์๋ฐ ๊ฐ๋ฐ์๋ผ๋ฉด, ์ฑ๊ธํค์ ๊ตฌํํ๋ 7๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ตํ๋ฉด์ ๋๋ ๋ชฐ๋๋ ์ฌ๋ฌ ๊ธฐ๋ฒ๋ค์ ๋ฐฐ์๊ฐ๋ ์ ์ด ์ ์ ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํ์ตํ๋๊ฑธ ๊ถ์ฅํ๋ค.
Eager Initialization
- ํ๋ฒ๋ง ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋, ๊ฐ์ฅ ์ง๊ด์ ์ด๋ฉด์๋ ์ฌํํ ๊ธฐ๋ฒ
static final์ด๋ผ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์๋ ์์ ํจ- ๊ทธ๋ฌ๋ static ๋ฉค๋ฒ๋ ๋น์ฅ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ง์ผ ๋ฆฌ์์ค๊ฐ ํฐ ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ, ๊ณต๊ฐ ์์ ๋ญ๋น๊ฐ ๋ฐ์ํจ
- ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์
๋ง์ผ ์ฑ๊ธํค์ ์ ์ฉํ ๊ฐ์ฒด๊ฐ ๊ทธ๋ฆฌ ํฌ์ง ์์ ๊ฐ์ฒด๋ผ๋ฉด ์ด ๊ธฐ๋ฒ์ผ๋ก ์ ์ฉํด๋ ๋ฌด๋ฆฌ๋ ์๋ค.
class Singleton {
// ์ฑ๊ธํค ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ด์ ์ธ์คํด์ค ๋ณ์
private static final Singleton INSTANCE = new Singleton();
// ์์ฑ์๋ฅผ private๋ก ์ ์ธ (์ธ๋ถ์์ new ์ฌ์ฉ X)
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
Static block initialization
- static block ์ ์ด์ฉํด ์์ธ๋ฅผ ์ก์ ์ ์์
- ๊ทธ๋ฌ๋ ์ฌ์ ํ static ์ ํน์ฑ์ผ๋ก ์ฌ์ฉํ์ง๋ ์๋๋ฐ๋ ๊ณต๊ฐ์ ์ฐจ์งํจ
static block : ํด๋์ค๊ฐ ๋ก๋ฉ๋๊ณ ํด๋์ค ๋ณ์๊ฐ ์ค๋น๋ ํ ์๋์ผ๋ก ์คํ๋๋ ๋ธ๋ก
class Singleton {
// ์ฑ๊ธํค ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ด์ ์ธ์คํด์ค ๋ณ์
private static Singleton instance;
// ์์ฑ์๋ฅผ private๋ก ์ ์ธ (์ธ๋ถ์์ new ์ฌ์ฉ X)
private Singleton() {}
// static ๋ธ๋ก์ ์ด์ฉํด ์์ธ ์ฒ๋ฆฌ
static {
try {
instance = new Singleton();
} catch (Exception e) {
throw new RuntimeException("์ฑ๊ธํค ๊ฐ์ฒด ์์ฑ ์ค๋ฅ");
}
}
public static Singleton getInstance() {
return instance;
}
}
Lazy initialization
- ๊ฐ์ฒด ์์ฑ์ ๋ํ ๊ด๋ฆฌ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ
- ๋ฉ์๋๋ฅผ ํธ์ถํ์ ๋ ์ธ์คํด์ค ๋ณ์์ null ์ ๋ฌด์ ๋ฐ๋ผ ์ด๊ธฐํ ํ๊ฑฐ๋ ์๋ ๊ฑธ ๋ฐํํ๋ ๊ธฐ๋ฒ
- ์์ ๋ฏธ์ฌ์ฉ ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ ์ฐจ์ง์ ํ๊ณ์ ์ ๊ทน๋ณต
- ๊ทธ๋ฌ๋ ์ฐ๋ ๋ ์ธ์ดํ(Thread Safe) ํ์ง ์๋ ์น๋ช ์ ์ธ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ (์๋ ์ค๋ช )
class Singleton {
// ์ฑ๊ธํค ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ด์ ์ธ์คํด์ค ๋ณ์
private static Singleton instance;
// ์์ฑ์๋ฅผ private๋ก ์ ์ธ (์ธ๋ถ์์ new ์ฌ์ฉ X)
private Singleton() {}
// ์ธ๋ถ์์ ์ ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ทธ์ ์์ผ ์ด๊ธฐํ ์งํ (lazy)
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); // ์ค์ง 1๊ฐ์ ๊ฐ์ฒด๋ง ์์ฑ
}
return instance;
}
}
โ ๏ธ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์์ ์น๋ช ์ ์ธ ๋ฌธ์ ์
๋๋ถ๋ถ์ ์๋ฃ์์ ๋ณดํต ์์ ์ฝ๋๋ฅผ ์ฑ๊ธํค ํจํด ์ ์์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ฌ์ค ์ด๋ ์น๋ช ์ ์ธ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
์๋ฐ๋ ๋ฉํฐ ์ฐ๋ ๋ ์ธ์ด์ธ๋ฐ, ์ด ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ์ฐ๋ ๋ ์ธ์ดํ ํ์ง ์๋ค๋ ๊ฒ์ด๋ค.
๊ฐ ์ค๋ ๋๋ ์์ ์ ์คํ๋จ์๋ฅผ ๊ธฐ์ตํ๋ฉด์ ์ฝ๋๋ฅผ ์์์ ์๋๋ก ์ฝ์ด๊ฐ๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๋์์ฑ์ผ๋ก ์ธํ ์ฝ๋ ์คํ ๋ฌธ์ ์ ์ด ๋ฐ์ ํ ์ ์๊ฒ ๋๋ค.
- ์ค๋ ๋ A, ์ค๋ ๋ B ๊ฐ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํ๋ค.
- ์ค๋ ๋ A๊ฐ if๋ฌธ์ ํ๊ฐํ๊ณ ์ธ์คํด์ค ์์ฑ ์ฝ๋๋ก ์ง์ ํ์๋ค. (์์ง ์ด๊ธฐํ ์งํ X)
- ๊ทธ๋ฐ๋ฐ ๊ทธ๋ ์ค๋ ๋ B๊ฐ if๋ฌธ์ ํ๊ฐํ๋ค. ์์ง ์ค๋ ๋ A๊ฐ ์ธ์คํด์คํ ์ฝ๋๋ฅผ ์คํ์ ์์์ผฐ๊ธฐ ๋๋ฌธ์ ์ด if๋ฌธ๋ ์ฐธ์ด ๋๊ฒ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค๋ ๋ A์ B๊ฐ ์ธ์คํด์ค ์ด๊ธฐํ ์ฝ๋๋ฅผ ๋๋ฒ ์คํํ๋ ๊ผด์ด ๋๋ค. (์์์ฑ์ด ๊ฒฐ์ฌ)

๋ฐฑ๋ ์ด๋ก ๋ง ๋ณด๋ ๊ฒ๋ณด๋ค ์ง์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด ๋จธ๋ฆฟ์์ ๋ ์ ๋ค์ด์จ๋ค.
๋ค์์ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ณ ์ฑ๊ธํค ํด๋์ค๋ฅผ getํ์ฌ ์ ๋ง๋ก ์ด ๊ฐ์ฒด๊ฐ ์ ์ผํ ๊ฐ์ฒด์ธ์ง ํด์์ฝ๋๋ก ํ๋ณํ๋ ์ฝ๋์ด๋ค.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// ์ฑ๊ธํค ๊ฐ์ฒด
class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); // ์ค์ง 1๊ฐ์ ๊ฐ์ฒด๋ง ์์ฑ
}
return instance;
}
}
public class Main {
public static void main(String[] args) {
// 1. ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๋ด์ ๋ฐฐ์ด
Singleton[] singleton = new Singleton[10];
// 2. ์ค๋ ๋ ํ ์์ฑ
ExecutorService service = Executors.newCachedThreadPool();
// 3. ๋ฐ๋ณต๋ฌธ์ ํตํด 10๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ์ธ์คํด์ค ์์ฑ
for (int i = 0; i < 10; i++) {
final int num = i;
service.submit(() -> {
singleton[num] = Singleton.getInstance();
});
}
// 4. ์ข
๋ฃ
service.shutdown();
// 5. ์ฑ๊ธํค ๊ฐ์ฒด ์ฃผ์ ์ถ๋ ฅ
for(Singleton s : singleton) {
System.out.println(s.toString());
}
}
}

์์ ๊ฒฐ๊ณผ ์ฒ๋ผ ์ฑ๊ธํค ํด๋์ค์ธ๋ฐ ๊ฐ์ฒด ๋๊ฐ๊ฐ ๋ง๋ค์ด์ ธ ๋ฒ๋ฆฌ๊ฒ ๋๋ค.
Thread safe initialization
synchronizedํค์๋๋ฅผ ํตํด ๋ฉ์๋์ ์ฐ๋ ๋๋ค์ ํ๋ํ๋์ฉ ์ ๊ทผํ๊ฒ ํ๋๋ก ์ค์ ํ๋ค. (๋๊ธฐํ)- ํ์ง๋ง ์ฌ๋ฌ๊ฐ์ ๋ชจ๋๋ค์ด ๋งค๋ฒ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ๋
synchronized๋ฉ์๋๋ฅผ ๋งค๋ฒ ํธ์ถํ์ฌ ๋๊ธฐํ ์ฒ๋ฆฌ ์์ ์ overhead๊ฐ ๋ฐ์ํด ์ฑ๋ฅ ํ๋ฝ์ด ๋ฐ์ํ๋ค.
synchronizedํค์๋๋ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋๊ฐ ์ด์์ ์ฐ๋ ๋๊ฐ ํ๋์ ๋ณ์์ ๋์์ ์ ๊ทผ์ ํ ๋ Race condition(๊ฒฝ์์ํ)์ด ๋ฐ์ํ์ง ์๋๋ก ํ๋ค.
ํ๋ง๋๋ก ์ฐ๋ ๋๊ฐ ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๋ ๋์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ๊ธ(lock)์ ๊ฑฐ๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค.
์๋ ๊ทธ๋ฆผ ์ฒ๋ผ thread-1์ด ๋ฉ์๋์ ์ง์ ํ๋ ์๊ฐ ๋๋จธ์ง thread-2 ~ 4์ ์ ๊ทผ์ ์ ํํ๊ณ , thread-1์ด ์๋ฃ๊ฐ ๋๋ฉด ๋ค์ ์ค๋ ๋๋ฅผ ์ ๊ทผ์ํจ๋ค.
class Singleton {
private static Singleton instance;
private Singleton() {}
// synchronized ๋ฉ์๋
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Double-Checked Locking
- ๋งค๋ฒ
synchronized๋๊ธฐํ๋ฅผ ์คํํ๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๋ฉด, ์ต์ด ์ด๊ธฐํํ ๋๋ง ์ ์ฉํ๊ณ ์ด๋ฏธ ๋ง๋ค์ด์ง ์ธ์คํด์ค๋ฅผ ๋ฐํํ ๋๋ ์ฌ์ฉํ์ง ์๋๋ก ํ๋ ๊ธฐ๋ฒ - ์ด๋ ์ธ์คํด์ค ํ๋์
volatileํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ I/O ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ค. - ๊ทธ๋ฌ๋
volatileํค์๋๋ฅผ ์ด์ฉํ๊ธฐ์ํด์ JVM 1.5์ด์์ด์ด์ผ ๋๊ณ , JVM์ ๋ํ ์ฌ์ธต์ ์ธ ์ดํด๊ฐ ํ์ํ์ฌ, JVM์ ๋ฐ๋ผ์ ์ฌ์ ํ ์ฐ๋ ๋ ์ธ์ดํ ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ง์ํ๋ ํธ์ด๋ค.
[ volatile ํค์๋ ]
Java์์๋ ์ฐ๋ ๋๋ฅผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ฑ๋ฅ์ ์ํด์ ๊ฐ๊ฐ์ ์ฐ๋ ๋๋ค์ ๋ณ์๋ฅผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ(RAM)์ผ๋ก๋ถํฐ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ์บ์(Cache) ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
๋ฌธ์ ๋ ๋น๋๊ธฐ๋ก ๋ณ์๊ฐ์ ์บ์์ ์ ์ฅํ๋ค๊ฐ, ๊ฐ ์ฐ๋ ๋๋ง๋ค ํ ๋น๋์ด์๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณ์๊ฐ์ด ์ผ์นํ์ง ์์์ ์๋ค๋ ์ ์ด๋ค.
๊ทธ๋์volatileํค์๋๋ฅผ ํตํด ์ด ๋ณ์๋ ์บ์์์ ์ฝ์ง ๋ง๊ณ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด์ค๋๋ก ์ง์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
class Singleton {
private static volatile Singleton instance; // volatile ํค์๋ ์ ์ฉ
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
// ๋ฉ์๋์ ๋๊ธฐํ ๊ฑฐ๋๊ฒ ์๋, Singleton ํด๋์ค ์์ฒด๋ฅผ ๋๊ธฐํ ๊ฑธ์ด๋ฒ๋ฆผ
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton(); // ์ต์ด ์ด๊ธฐํ๋ง ๋๊ธฐํ ์์
์ด ์ผ์ด๋์ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ์ต์ํ
}
}
}
return instance; // ์ต์ด ์ด๊ธฐํ๊ฐ ๋๋ฉด ์์ผ๋ก ์์ฑ๋ ์ธ์คํด์ค๋ง ๋ฐํ
}
}
Bill Pugh Solution (LazyHolder) โจ
- ๊ถ์ฅ๋๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ค ํ๋
- ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ณ Lazy Loading(๋์ค์ ๊ฐ์ฒด ์์ฑ) ๋ ๊ฐ๋ฅํ ์๋ฒฝํ ์ฑ๊ธํค ๊ธฐ๋ฒ
- ํด๋์ค ์์ ๋ด๋ถ ํด๋์ค(holder)๋ฅผ ๋์ด JVM์ ํด๋์ค ๋ก๋ ๋งค์ปค๋์ฆ๊ณผ ํด๋์ค๊ฐ ๋ก๋๋๋ ์์ ์ ์ด์ฉํ ๋ฐฉ๋ฒ (์ค๋ ๋ ์ธ์ดํํจ)
- static ๋ฉ์๋์์๋ static ๋ฉค๋ฒ๋ง์ ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ํด๋์ค๋ฅผ static์ผ๋ก ์ค์
์ด๋ฐ์๋ ๋ด๋ถ ํด๋์ค์ ์น๋ช ์ ์ธ ๋ฌธ์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ ๋ด๋ถ ํด๋์ค๋ฅผ static์ผ๋ก ์ค์ - ๋ค๋ง ํด๋ผ์ด์ธํธ๊ฐ ์์๋ก ์ฑ๊ธํค์ ํ๊ดดํ ์ ์๋ค๋ ๋จ์ ์ ์ง๋ (Reflection API, ์ง๋ ฌํ/์ญ์ง๋ ฌํ๋ฅผ ํตํด)
class Singleton {
private Singleton() {}
// static ๋ด๋ถ ํด๋์ค๋ฅผ ์ด์ฉ
// Holder๋ก ๋ง๋ค์ด, ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ง ์๊ณ getInstance ๋ฉ์๋๊ฐ ํธ์ถ๋์ด์ผ ๋ก๋๋จ
private static class SingleInstanceHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingleInstanceHolder.INSTANCE;
}
}
- ์ฐ์ ๋ด๋ถํด๋์ค๋ฅผ static์ผ๋ก ์ ์ธํ์๊ธฐ ๋๋ฌธ์, ์ฑ๊ธํค ํด๋์ค๊ฐ ์ด๊ธฐํ๋์ด๋ SingleInstanceHolder ๋ด๋ถ ํด๋์ค๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ง ์์
- ์ด๋ ํ ๋ชจ๋์์
getInstance()๋ฉ์๋๋ฅผ ํธ์ถํ ๋, SingleInstanceHolder ๋ด๋ถ ํด๋์ค์ static ๋ฉค๋ฒ๋ฅผ ๊ฐ์ ธ์ ๋ฆฌํดํ๊ฒ ๋๋๋ฐ, ์ด๋ ๋ด๋ถ ํด๋์ค๊ฐ ํ๋ฒ๋ง ์ด๊ธฐํ๋๋ฉด์ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ต์ด๋ก ์์ฑ ๋ฐ ๋ฆฌํดํ๊ฒ ๋๋ค. - ๋ง์ง๋ง์ผ๋ก final ๋ก ์ง์ ํจ์ผ๋ก์ ๋ค์ ๊ฐ์ด ํ ๋น๋์ง ์๋๋ก ๋ฐฉ์งํ๋ค.
๋ง์ผ ์์ ์ฝ๋ ํ๋ฆ ํจํด์ ๋ํด ์ ํ ๊ฐ์ ๋ชป์ก๋ ๊ฒ์ด๋ผ๋ฉด, JVM์ Class Loader์ ํด๋์ค ๋ก๋ฉ ๋ฐ ์ด๊ธฐํ ๊ณผ์ ์ ์์ง ์ ๋ชจ๋ฅด๋ ๊ฒ์ด๋ค.
์๋ฐ ์ฝ๋๋ฅผ ์คํํ๋ฉด ํด๋์ค๊ฐ ์ด๋ ํ ์์๋๋ก ๋ก๋๋๊ณ ์ด๊ธฐํ ๋๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ ํด๋์ค๋ฅผ ์ฐ๋๋ฐ ์ ํํ static ํค์๋๋ฅผ ๋ถ์ธ ๋ด๋ถ ํด๋์ค์ฌ์ผ ํ๋์ง, ๊ทธ ์๋ฆฌ์ ๋ํด์ ๊น์ด ์๊ณ ์ถ๋ค๋ฉด ๋ค์ ํฌ์คํ ๋ค์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[JAVA] โ ํด๋์ค๋ ์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ & ์ด๊ธฐํ ๋๋๊ฐ โ
JVM์ ํด๋์ค ๋ก๋ (Class Loader) ์๋ฐ์ ํด๋์ค๋ค์ด ์ธ์ ์ด๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ณ ํด๋์ค ๋ฉค๋ฒ๋ค์ด ์ด๊ธฐํ๋๋์ง, ์๋ฆฌ๋ฅผ ์๊ธฐ์ํด์ ์ฐ์ JVM(์๋ฐ ๊ฐ์ ๋จธ์ )์ ํด๋์ค ๋ก๋(Class Loader)์ ์งํ
inpa.tistory.com
[JAVA] โ ๋ด๋ถ ํด๋์ค๋ static ์ผ๋ก ์ ์ธ ์ํ๋ฉด ํฐ์ผ ๋๋ค
Inner ํด๋์ค์ ๋ฌธ์ ์ ์ธํ ๋ฆฌ์ ์ด์ ๊ฐ์ IDE์์ ๋ด๋ถ ํด๋์ค๋ฅผ ์ ์ธํ์ฌ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฒฝ๊ณ ๋ฉ์ธ์ง๊ฐ ๋ฐ ๊ฒ์ด๋ค. (๋ด๋ถ ํด๋์ค๊ฐ ์ธ๋ถ์ ๋ฉค๋ฒ๋ฅผ ์ฐธ์กฐํ์ฌ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ) ๋ฉ์ธ์ง
inpa.tistory.com
Enum ์ด์ฉ โจ
- ๊ถ์ฅ๋๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ค ํ๋
- enum์ ์ ์ด์ ๋ฉค๋ฒ๋ฅผ ๋ง๋ค๋ private๋ก ๋ง๋ค๊ณ ํ๋ฒ๋ง ์ด๊ธฐํ ํ๊ธฐ ๋๋ฌธ์ thread safeํจ.
- enum ๋ด์์ ์์ ๋ฟ๋ง ์๋๋ผ, ๋ณ์๋ ๋ฉ์๋๋ฅผ ์ ์ธํด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์ด์ฉํด ์ฑ๊ธํค ํด๋์ค ์ฒ๋ผ ์์ฉ์ด ๊ฐ๋ฅ
- ์์ Bill Pugh Solution ๊ธฐ๋ฒ๊ณผ ๋ฌ๋ฆฌ, ํด๋ผ์ด์ธํธ์์ Reflection์ ํตํ ๊ณต๊ฒฉ์๋ ์์
- ํ์ง๋ง ๋ง์ผ ์ฑ๊ธํค ํด๋์ค๋ฅผ ๋ฉํฐํค(์ผ๋ฐ์ ์ธ ํด๋์ค)๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผํ ๋ ์ฒ์๋ถํฐ ์ฝ๋๋ฅผ ๋ค์ ์ง์ผ ๋๋ ๋จ์ ์ด ์กด์ฌํ๋ค. (๊ฐ๋ฐ ์คํ์ ์ธ์ ์ด๋์ ๋ณ๊ฒฝ ๋ ์ ์๊ธฐ ๋๋ฌธ์)
- ํด๋์ค ์์์ด ํ์ํ ๋, enum ์ธ์ ํด๋์ค ์์์ ๋ถ๊ฐ๋ฅํ๋ค.
enum SingletonEnum {
INSTANCE;
private final Client dbClient;
SingletonEnum() {
dbClient = Database.getClient();
}
public static SingletonEnum getInstance() {
return INSTANCE;
}
public Client getClient() {
return dbClient;
}
}
public class Main {
public static void main(String[] args) {
SingletonEnum singleton = SingletonEnum.getInstance();
singleton.getClient();
}
}
[JAVA] โ Enum ์ด๊ฑฐํ ํ์ ๋ฌธ๋ฒ & ์์ฉ ๐ฏ ์ ๋ฆฌ
Enum ์ด๊ฑฐ ํ์ ๋จผ์ Enum์ "Enumeration"์ ์ฝ์๋ค. Enumeration์ "์ด๊ฑฐ, ๋ชฉ๋ก, ์ผ๋ํ" ๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ณดํต ํ๊ธ๋ก๋ ์ด๊ฑฐํ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฆ, ์ด๊ฑฐํ(enum)์ ์์, ๋ฉค๋ฒ๋ผ ๋ถ๋ฆฌ๋ ๋ช ๋ช ๋ ๊ฐ
inpa.tistory.com
์ต์ข ์ ๋ฆฌํ์๋ฉด, ์ฑ๊ธํค ํจํด ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ Bill Pugh Solution ๊ธฐ๋ฒ์ ์ฌ์ฉํ๊ฑฐ๋ Enum์ผ๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ค๋ง, ์ด ๋์ ์ฌ์ฉ ์ ํ์ ์์ ์ ์ฑ๊ธํค ํด๋์ค์ ๋ชฉ์ ์ ๋ฐ๋ผ ๊ฐ๋ฆฌ๊ฒ ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
- LaszHolder : ์ฑ๋ฅ์ด ์ค์์ ๋๋ ํ๊ฒฝ
- Enum : ์ง๋ ฌํ, ์์ ์ฑ ์ค์์ ๋๋ ํ๊ฒฝ
์ฑ๊ธํค ํจํด์ ์ํฐ ํจํด?
์ด์ฒ๋ผ ์ฑ๊ธํค ํด๋์ค๋ ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ์ง๊ณ ํ๋์ ์ธ์คํด์ค๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ, DBCP(DataBase Connection Pool)์ฒ๋ผ ๊ณตํต๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํด์ผ ํ๋ ์ํฉ์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
ํ์ง๋ง ์ฑ๊ธํค ํจํด์ ์ป๋ ์ด์ ๊ณผ ๋๋ถ์ด ๋ง์ ๋ฌธ์ ์ ๋ค์ ์๋ฐํ๊ธฐ ๋๋ฌธ์ trade-off๋ฅผ ์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ฑ๊ธํค์ ๋ฌธ์ ์
1. ๋ชจ๋๊ฐ ์์กด์ฑ์ด ๋์์ง๋ค.
๋๋ถ๋ถ์ ์ฑ๊ธํค์ ์ด์ฉํ๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๊ฐ ์๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ ์ ์ ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ฌ์ด์ ๊ฐํ ์์กด์ฑ๊ณผ ๋์ ๊ฒฐํฉ์ด ์๊ธฐ๊ฒ ๋๋ค.
์ฆ, ํ๋์ ์ฑ๊ธํค ํด๋์ค๋ฅผ ์ฌ๋ฌ ๋ชจ๋๋ค์ด ๊ณต์ ๋ฅผ ํ๋๊น, ๋ง์ผ ์ฑ๊ธํค์ ์ธ์คํด์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์ฐธ์กฐํ๋ ๋ชจ๋๋ค๋ ์์ ์ด ํ์ํ๊ฒ ๋๋ค.
๋ํ ํด๋ผ์ด์ธํธ ์ฝ๋์์ ๋๋ฌด ๋ง์ ๊ณณ์์ ์ฌ์ฉํ๋ฉด ํด๋์ค๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์์ ธ ์คํ๋ ค ํจํด์ ์ฌ์ฉ ์ํ๋๋๋ง ๋ชปํ๊ฒ ๋ ์๋ ์๋ค.
2. S.O.L.I.D ์์น์ ์๋ฐฐ๋๋ ์ฌ๋ก๊ฐ ๋ง๋ค.
์ฐ์ ์ฑ๊ธํค ์ธ์คํด์ค ์์ฒด๊ฐ ํ๋๋ง ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ์ง ์ฑ ์์ ์ง๋๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๋จ์ผ ์ฑ ์ ์์น(SRP)๋ฅผ ์๋ฐํ๊ธฐ๋ ํ๊ณ , ์ฑ๊ธํค ์ธ์คํด์ค๊ฐ ํผ์ ๋๋ฌด ๋ง์ ์ผ์ ํ๊ฑฐ๋, ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ์ํค๋ฉด ๋ค๋ฅธ ํด๋์ค๋ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์์ง๊ฒ ๋์ด ๊ฐ๋ฐฉ-ํ์ ์์น(OCP)์๋ ์๋ฐฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์กด ๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ๊ฐ์ ์ถ์ํ๊ฐ ์๋, ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๊ฒ ๋์ด ์์กด ์ญ์ ์์น(DIP)๋ ์๋ฐํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ๋๋ฌด ๋ง์ ๊ณณ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ชป๋ ๋์์ธ ํํ๊ฐ ๋ ์๋ ์๋ค.
๊ทธ๋์ ์ฑ๊ธํค ํจํด์ ๊ฐ์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ํฐ ํจํด์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
3. TDD ๋จ์ ํ ์คํธ์ ์ ๋ก์ฌํญ์ด ์์
๋ง์ง๋ง์ผ๋ก ์ฑ๊ธ์ฝ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋์ ํ ์คํธํ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ด๋ค.
๋จ์ ํ ์คํธ๋ฅผ ํ ๋, ๋จ์ ํ ์คํธ๋ ํ ์คํธ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ฉฐ ํ ์คํธ๋ฅผ ์ด๋ค ์์๋ก๋ ์คํ ํ ์ ์์ด์ผ ํ๋๋ฐ, ์ฑ๊ธํค ์ธ์คํด์ค๋ ์์์ ๊ณต์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ํ ์คํธ๊ฐ ๊ฒฐํจ์์ด ์ํ๋๋ ค๋ฉด ๋งค๋ฒ ์ธ์คํด์ค์ ์ํ๋ฅผ ์ด๊ธฐํ์์ผ์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์ํ๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ๊ฐ ์จ์ ํ๊ฒ ์ํ๋์ง ๋ชปํ ์๋ ์๋ค.
๋ง์ ํ ์คํธ ํ๋ ์์ํฌ๊ฐ Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์์์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํด์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ด๋ ต๋ค.
์ด์ฒ๋ผ ์ฑ๊ธํค ๊ธฐ๋ฒ์ ์ค์ง ํ ๊ฐ์ ์ธ์คํด์ค ์์ฑ์ ๋ณด์ฆํ์ฌ ํจ์จ์ ์ฐพ์ ์ ์์ง๋ง, ๊ทธ์ ๋ชป์ง๋ง๊ฒ ์๋ฐ๋๋ ๋ฌธ์ ์ ๋ ๋ง๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ค์ ์๊ณ ์๋ ์ฑ๊ธํค ํจํด์ ์ ์ฐ์ฑ์ด ๋ง์ด ๋จ์ด์ง๋ ํจํด์ด๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋์ ์ง์ ์ ์ ๊ฐ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค๋, ์คํ๋ง ์ปจํ ์ด๋ ๊ฐ์ ํ๋ ์์ํฌ์ ๋์์ ๋ฐ์ผ๋ฉด ์ฑ๊ธํค ํจํด์ ๋ฌธ์ ์ ๋ค์ ๋ณด์ํ๋ฉด์ ์ฅ์ ์ ํํ์ ๋๋ฆด ์ ์๋ค.
์คํ๋ง ํ๋ ์์ํฌ์์๋ ์ฑ๊ธํค ํจํด์ด๋๊ฒ ์๊ณ ๋ด๋ถ์ ์ผ๋ก ํด๋์ค์ ์ ์ด๋ฅผ Ioc(Inversion Of Control) ๋ฐฉ์์ ์ปจํ ์ด๋์๊ฒ ๋๊ฒจ ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ํตํด ํ๋ฒํ ๊ฐ์ฒด๋ ํ๋์ ์ธ์คํด์ค ๋ฟ์ธ ์ฑ๊ธํด์ผ๋ก ์กด์ฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ๋จ์ ์ด ์๋ค.
๋ฐ๋ผ์ ๋ง์ผ ํ๋ ์์ํฌ ๋์ ์์ด ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์์์ ์ดํด๋ณธ ์ฅ๋จ์ ์ ์ ๊ณ ๋ คํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://refactoring.guru/ko/design-patterns/singleton
http://www.btechsmartclass.com/java/java-threads-synchronization.html
https://www.youtube.com/watch?v=5oUdqn7WeP0
https://www.youtube.com/watch?v=bHRETd1rFfc
https://youtu.be/3rfbnQYOCFA
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.