์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ์ค๋ ์์ฐ์
- ์์
- ๋ผ๋๋ฌด์คdvd
- ์ฝ๋ํ๋ก๊ทธ๋๋จธ์ค
- EFCore
- intellij
- vscode
- extraParams
- c#
- Config
- error
- Store
- dbContext
- JSON
- ORM
- ๋ช ์์ ์ธ๋ํค
- Request
- lazy loading
- scanner
- ๋์ ๋ณธ์์์
- ์์ค๊ฐ๋ ์ค๋
- LINQ
- JavaScript
- ViewModel
- extjs
- mac
- .net
- React
- minimalAPI
- c#์ฝ๋ฉ์๊ธฐ์ ์ค์ ํธ
- Today
- Total
ejyoo's ๊ฐ๋ฐ ๋ ธํธ
์ฑ๊ธํค ํจํด์ ๋ํด์ (Keyword : ์ฑ๊ธํค ๋์์ธ ํจํด) ๋ณธ๋ฌธ
์ฑ๊ธํค ํจํด์ ๋ํด์ (Keyword : ์ฑ๊ธํค ๋์์ธ ํจํด)
ejyoovV 2021. 3. 15. 19:11๐ก ๋ค์ด๊ฐ๊ธฐ ์ ์
๋ฌดํ์ผ๋ก ์กด์ฌํ๋ ์์์ ์กด์ฌํ์ง ์๋๋ค. ์ปดํจํฐ๊ฐ ์ ๊ณตํ๋ ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํ๋์ด ์๋ค.
์ด๋ฌํ ์ํฉ์์ ์ธ์คํด์ค๊ฐ ๋จ์ฉ๋๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๊ณ
ํ๋์ ์์์ผ๋ก ๋ชจ๋๊ฐ ๊ณต์ ํด์ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ค.
๐ก ์ฑ๊ธํค ํจํด(Singleton pattern)์ด๋?
์ํํธ์จ์ด ๋์์ธ ํจํด์์ ์ฑ๊ธํค ํจํด์ ๋ฐ๋ฅด๋ ํด๋์ค๋, ์์ฑ์๊ฐ ์ฌ๋ฌ ์ฐจ๋ก ํธ์ถ๋๋๋ผ๋, ์ค์ ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ ํ๋์ด๊ณ ์ต์ด ์์ฑ ์ดํ์ ํธ์ถ๋ ์์ฑ์๋ ์ต์ด์ ์์ฑ์๊ฐ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
์ฆ ์์ฑ์์ ํธ์ถ์ด ๋ฐ๋ณต์ ์ผ๋ก ์ด๋ค์ ธ๋ ์ค์ ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ ์ต์ด ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ ํด์ฃผ๋ ๊ฒ์ด๋ค.
๐ ํ๋์ ๊ฐ์ฒด๋ง์ ์์ฑํด ์ดํ์ ํธ์ถ๋ ๊ณณ์์๋ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ฌ ํ๋ก๊ทธ๋จ ์ ๋ฐ์์ ํ๋์ ์ธ์คํด์ค๋ง์ ์ฌ์ฉํ๊ฒ ํจ.
๐ ์ด๋ค ํด๋์ค๊ฐ ์ต์ด ํ๋ฒ๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ (Static) ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋์์ธ ํจํด์ ์๋ฏธํจ.
๋์์ธ ํจํด์ ์ ๋ฐฐ ๊ฐ๋ฐ์ ๋ถ๋ค์ด ๊ฐ๋ฐ์ ํ์๋ฉด์,
์ด๋ฐ์์ผ๋ก ๊ฐ๋ฐ์ ํ๋ฉด ์ข๋ค ์ด๋ฐ ๊ฒ๋ค์ ํจํด์ผ๋ก ์ ์ํ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฑ๊ธํค ํจํด๋ ๋์์ธ ํจํด ์ค ํ๋์ด๊ณ , ๊ผญ ์จ์ผ๋๋๊ฒ์ ์๋๋ค. ์ํฉ์ ๋ง๊ฒ ์ฐ๋ฉด ๋๋ ๊ฒ์ด๋ค.
๐ก ์ฑ๊ธํค ํจํด ์์
์๋์ ์์ ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ BoardServiceImpl ํด๋์ค๋ก
์ฑ๊ธํค ํจํด ๊ตฌํ ์ ์ธํฐํ์ด์ค์ธ IBoardService๋ฅผ ํ์ ์ผ๋ก ์ง์ ํ ๋ค,
BoardServiceImpl ์์ฑ์ ํธ์ถ ์ BoardDaoImpl๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.(๋คํ์ฑ ๊ฐ๋ )
public class BoardServiceImpl implements IBoardService{
private IBoardDao boardDao;
private Connection conn;
// ์ฑ๊ธํค ๊ฐ์ฒด ์ํ ์์ ๊ฐ์ฒด ์์ฑ
private static IBoardService boardService;
private BoardServiceImpl() {
boardDao = BoardDaoImpl.getInstance();
}
public static IBoardService getInstance() {
if(boardService == null) {
boardService = new BoardServiceImpl();
}
return boardService;
}
ํด๋์ค ๋ณ์์ ์์ฑ์๋ฅผ ์ธ๋ถ์์ ์์ฑํ ์ ์๋๋ก ์ ํ์ ๋์ด
๊ฐ์ฒด ์์ฑ ์ ํ๋์ ๊ฐ์ฒด์ ์ฃผ์๋ง ์ฌ์ฉํ๋๋ก ํ ์ ์๋ค.
๐ก ์ฑ๊ธํค ํจํด์ ์ฌ์ฉ?
์ฃผ๋ก ๊ณตํต๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํด์ ์ฌ์ฉํ๋ DBCP(DataBase Connection Pool)๊ณผ ๊ฐ์ ์ํฉ์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
๐ก ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ ์ด์ ๋?
ํ๋ฒ์ ๊ฐ์ฒด ์์ฑ์ผ๋ก ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ฑ๊ธํค์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ๋ฌด์กฐ๊ฑด ํ๋ฒ ์์ฑ์ผ๋ก ์ ์ญ์ฑ์ ๋๊ธฐ์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ณต์ ๊ฐ ์ฉ์ดํ๋ค.
๐ก ์ฑ๊ธํค ํจํด์ ๋ฌธ์ ์
์ฑ๊ธํค ํจํด์ ์ ์ญ์ฑ์ ๋๋ฉด์
๋ค๋ฅธ ๊ฐ์ฒด์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ ๋ช ๊ฐ์ง ์ผ์ด์ค์์๋ง ์ฌ์ฉํ ๋ ํจ์จ์ ์ด๋ฉฐ
๊ทธ ์ธ์๋ ๋ฌธ์ ์ ์ด ์๊ธธ ์ ์๋ค.
์ฑ๊ธํค์ผ๋ก ๋ง๋ ๊ฐ์ฒด์ ์ญํ ์ด ๊ฐ๋จํ ๊ฒ์ด ์๋ ์ญํ ์ด ๋ณต์กํ ๊ฒฝ์ฐ๋ผ๋ฉด
ํด๋น ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ์ ๊ฒฐํจ๋๊ฐ ๋์์ ธ์
๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น์ ์ด๊ธ๋๊ฒ ๋๋ค. (๊ฐ๋ฐฉ-ํ์)
ํด๋น ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ ํ ๊ฒฝ์ฐ, ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์์ ์ฌ์ด๋ ์ดํฉํธ ๋ฐ์ํ ํ๋ฅ ์ด ์๊ธฐ๊ฒ ๋๋ฉฐ
๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ ์ฒ๋ฆฌ ๋ฌธ์ ๋ฑ์ด ์๊ธฐ๊ฒ ๋๋ค.
๋ค์ํ ์ฑ๊ธํค์ ๊ตฌํ
๐ก static block
public class ExampleClass1 {
//Instance
private static ExampleClass1 instance;
//private construct
private ExampleClass1() {}
static {
try {instance = new ExampleClass1();}
catch(Exception e) { throw new RuntimeException(
"Create instance fail. error mse = " + e.getMessage());}
}
public static ExampleClass1 getInstance() {
return instance;
}
}
์์ ๊ฐ์ด static ๋ธ๋ญ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ํด๋์ค๊ฐ ๋ก๋ฉ๋ ๋ ํ๋ฒ๋ง ์คํ์ ํ๊ฒ๋๋ ํน์ฑ์ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋๋ ์์ ์ด ์๋ ํด๋์ค ๋ก๋ฉ ์์ ์ ์คํ๋๋ค.
๐ก lazy init
์ static ๋ฐฉ๋ฒ์์ ๊ฐ์ ํ์ฌ ํด๋์ค ๋ก๋ฉ ์์ ์ด ์๋ ์ธ์คํด์ค๊ฐ ํ์ํ์ฌ ์์ฒญํ ๋ ์์ฑ๋๋ ํํ๋ก ์์ฑํ์๋ค.
๐ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ private๋ก ์์ฑํ์ฌ ์ธ๋ถ์์ ์ธ์คํด์ค ์์ฑ์ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๊ณ , getInstance๋ฅผ ํตํด์๋ง ์์ฑ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค.
๐ getInstance๋ ๋ด๋ถ์ ์ผ๋ก ์์ฑ๋์ง ์์๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด์ ์์ฑ๋ ๊ฐ์ด ์กด์ฌํ๋ฉด ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๋ ํํ๋ก ํ๋ก๊ทธ๋จ ์ ๋ฐ์ ๊ฑธ์ณ ํ๋์ ์ธ์คํด์ค๋ฅผ ์ ์งํ๋ค.
๐ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ๋ฉ์๋์ ์ธ์คํด์ค ๋ณ์๋ ๋ชจ๋ Static์ผ๋ก ์ ์ธ๋ ์ ์ ๋ณ์ ๋ฐ ๋ฉ์๋์ด๋ค.
๐ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํตํด ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ์ธ์คํด์ค์ ์ ๊ทผํ๋ ค๋ฉด ๋น์ฐํ ํด๋์ค ๋ณ์ ๋ฐ ๋ฉ์๋์ ์ ๊ทผ์ ํ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฉ์๋๋ ์ ์ ํ์ ์ผ๋ก ์ ์ธ๋๋ค.
public class ExampleClass2 {
//Instance
private static ExampleClass2 instance;
//private construct
private ExampleClass2() {}
public static ExampleClass2 getInstance() {
if(instance == null) {instance = new ExampleClass2();}
return instance;
}
}
๐ ํ์ง๋ง ์ ํํ๋ก ๊ตฌ์ฑํ ๊ฒฝ์ฐ ๋ฉํฐ ์ฐ๋ ๋(Multi-Thread) ํ๊ฒฝ์์ ์ทจ์ฝํ๋ค.
์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๊ณต์ ๋๊ณ ์๋ ์ํฉ์์ ์กฐ๊ฑด๋ฌธ์ด ๋์์ ๋๋ฒ ๋ ์ ์๊ธฐ ๋๋ฌธ์
ํน์ ์ฐ๋ ๋๊ฐ ๋์์ getInstance() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ์ธ์คํด์ค๊ฐ ๋๋ฒ ์์ฑ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์๋์ ์ฝ๋์์ count ๊ฐ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฐ๋ ๋์์ ๊ณต์ ํ๊ณ ์๊ณ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ฒ๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์ผ๊ด๋์ง ์์ ์ ์๋ค.
public class ExampleClass5 {
//Instance
private static ExampleClass5 instance;
private int count = 0;
//private construct
private ExampleClass5() {}
public static ExampleClass5 getInstance() {
if(instance == null) {instance = new ExampleClass5();}
return instance;
}
public void print(String input) {
count++;
System.out.println(input + "count : " + count);
}
}
๐ก Thread safe + lazy (์ ์ ๋ณ์์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฐ๋ก ์ด๊ธฐํ ํ๋ ๋ฐฉ๋ฒ)
public class ExampleClass3 {
//Instance
private static ExampleClass3 instance;
//private construct
private ExampleClass3() {}
public static synchronized ExampleClass3 getInstance() {
if(instance == null) {instance = new ExampleClass3();}
return instance;
}
}
Lazy์์ ๋ณด์๋ getInstance() ๋ฉ์๋์ synchronized ํค์๋๋ฅผ ๋ถ์์ผ๋ก์จ ์ฐ๋ ๋์์ ๋์ ์ ๊ทผ์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
ํ์ง๋ง synchronized ํค์๋๋ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐ์์ํจ๋ค.
๐ก Holder
public class ExampleClass4 {
//private construct
private ExampleClass4() {}
private static class InnerInstanceClazz() {
private static final ExampleClass4 instance = new ExampleClass4();
}
public static ExampleClass4 getInstance() {
return InnerInstanceClazz.instance;
}
}
JVM์ ํด๋์ค ๋ก๋ ๋ฉ์ปค๋์ฆ๊ณผ ํด๋์ค์ ๋ก๋ ์์ ์ ์ด์ฉํ์ฌ ๋ด๋ถ ํด๋์ค๋ฅผ ํตํด ์์ฑ ์ํด์ผ๋ก์จ ์ฐ๋ ๋ ๊ฐ์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ ๋ฐฉ๋ฒ์ ํ์ฌ Java์์ ์ฑ๊ธํค ์์ฑ์์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
ํ์ฌ ๋ด๊ฐ ํ ์คํธ ํ ๋์๋ ์ ์ฝ๋์ ์ค๋ฅ๊ฐ ์์๋ค.
ํ์ฌ ์ง์์ผ๋ก๋ ์ค๋ฅ๋ฅผ ์ก์ง ๋ชปํ๋ค. ๊ทธ๋์ ๋์ค์ ์๊ฒ๋๋ฉด ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
๐ก ์ ๋ฆฌ
์ฑ๊ธํค ํจํด์ Spring framework ์์๋ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ์ด๋ค์์ผ๋ก ๊ตฌํํ๋์ง ์์๋๋ฉด ๋์์ด ๋๋ค.
์๋ฐ์ Spring ์์์ ์ฑ๊ธํค ์ฐจ์ด์ ์ด๋ผ๋ฉด, ์ฑ๊ธํค ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ค๋ฅด๋ค.
๋ํ ์๋ฐ์์ ๊ณต์ ๋ฒ์๋ Class loader ๊ธฐ์ค์ด์ง๋ง, Spring์์๋ ApplicationContext๊ฐ ๊ธฐ์ค์ด ๋๋ค.
๐ ์ฑ๊ธํค์ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ํ๋์ ๊ฐ์ฒด๋ง์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์์ ธ์ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๋ค.
๐ ์ฑ๊ธํค ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๋ชจ๋ ๊ฐ๋ค์ด ๋ณ๊ฒฝ๋์ด์ผ ํ๋ฏ๋ก, ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋์ฒ๊ฐ ์ด๋์ ๋ ๊ฐ๋ฅํ์ง๋ง, ๊ณ ๋ คํด์ผ ํ ์์๊ฐ ๋ง์ ์ฌ์ฉ์ด ์ด๋ ต๊ณ ํ๋ก๊ทธ๋จ ์ ๋ฐ์ ๊ฑธ์ณ์ ํ์ํ ๋ถ๋ถ์๋ง ์ฌ์ฉํ๋ค๋ฉด ์ฅ์ ์ด ์๋ค. (ํฌ์ธํธ๋ฅผ ์ก๊ธฐ ์ด๋ ต๊ธด ํ๋ค.)
๐ ์ ์ ํ ํํ๋ก ์ฑ๊ธํค์ ํ์ฉํ๋ฉด ์ข์ง๋ง ๋จ์ฉํ๊ฒ ๋ ์ฌ์ง๊ฐ ๋ง๋ค.
๐ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์์ ์ฑ๊ธํค
- Synchronized๋ฅผ ํตํด ๊ด๋ฆฌํ๋ฉด ๋๋ฉฐ, ๋ค์ํ ๋ณํ์ ๋์ํ๊ธฐ ์ํด ์ธํฐํ์ด์ค์ ํํ๋ก ๊ด๋ฆฌํ๋ฉด ์ข๋ค.
๐ ๋จ์ผ ์ฐ๋ ๋ ํ๊ฒฝ์์์ ์ฑ๊ธํค
- ์ ์ ํด๋์ค์ ํํ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค. (ํด๋์ค ๋ก๋ฉ๋จ๊ณ์์ ๋ฐ๋ก ์ด๊ธฐํ๋๋๋ก)
- ํ ์คํธ๋ฅผ ์ํ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํน์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ์ฑ๊ธํค์ ์ฌ์ฉํ๋ฏ์ด ์ฌ์ฉํ๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ
'BackEnd > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA DOC ๋ฌธ์ ์์ฑ (0) | 2021.03.17 |
---|---|
BoardManagement - ibatis ์ ์ฉ (0) | 2021.03.16 |
MAC / ORACLE / DOCKER / OJDBC / Eclipse ์ฐ๋ (0) | 2021.03.14 |
์ ๋๋ฆญ ์ดํด (0) | 2021.03.09 |
Enum(์ด๊ฑฐํ) (0) | 2021.03.08 |