์ฑ๊ธํค ์ปจํ ์ด๋
๐ก ์ฑ๊ธํค ํจํด
- ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด์ด๋ค
-> ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ 2๊ฐ ์ด์ ์์ฑํ์ง ๋ชปํ๋๋ก ๋ง์์ผํ๋ค
=> private ์์ฑ์๋ฅผ ์ฌ์ฉํด ์ธ๋ถ์์ ์์๋ก new ํค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ๋ง์์ผ ํ๋ค
public class SingletonService {
// 1. static ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋ฑ 1๊ฐ๋ง ์์ฑํด๋๋ค.
private static final SingletonService instance = new SingletonService();
// 2. public์ผ๋ก ์ด์ด์ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ํ์ํ๋ฉด ์ด static ๋ฉ์๋๋ฅผ ํตํด์๋ง ์กฐํํ๋๋ก ํ์ฉํ๋ค
public static SingletonService getInstance() {
return instance;
}
// 3. ์์ฑ์๋ฅผ private์ผ๋ก ์ ์ธํด ์ธ๋ถ์์ new ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์์ฑ์ ๋ชปํ๊ฒ ๋ง๋๋ค
private SingletonService() {
}
public void logic() {
System.out.println("์ฑ๊ธํค ๊ฐ์ฒด ๋ก์ง ํธ์ถ");
}
}
* getInstance() ๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์กฐํํ ์ ์๋ค + ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค
* 1๊ฐ์ ๊ฐ์ฒด ์์ฑ -> ํด๋น ๊ฐ์ฒด ๋ฉ์๋ ์์ ์ง์ด๋ฃ๊ธฐ -> ์์ฑ์ Private๋ก ๋ง๊ธฐ
โ๏ธ ์ฑ๊ธํค ํจํด ๋ฌธ์ ์
- ์ฑ๊ธํค ํจํด์ผ ๊ตฌํํ๋ ์ฝ๋ ์์ฒด๊ฐ ๋ง์ด ๋ค์ด๊ฐ๋ค
- ์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๋ค => DIP ์๋ฐ
- ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํด์ OCP ์์น์ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค
- private ์์ฑ์๋ก ์์ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค ๋ฑ ์ฌ๋ฌ ๋ฌธ์ ์ ์ด ์๋ค
๐ก ์ฑ๊ธํค ์ปจํ ์ด๋
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑํดํค ํจํด์ ์ ์ฉํ์ง ์์๋, ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑํดํค์ผ๋ก ๊ด๋ฆฌํ๋ค
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ์ปจํ ์ด๋ ์ญํ ์ ํ๋ค.
์ด๋ ๊ฒ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ผ ํ๋ค
* ๊ณ ๊ฐ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ,
์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ๋ค
* ์คํ๋ง์ ๊ธฐ๋ณธ ๋น ๋ฑ๋ก ๋ฐฉ์์ ์ฑ๊ธํค์ด์ง๋ง ๊ผญ ์ฑ๊ธํค ๋ฐฉ์๋ง ์ง์ํ๋๊ฒ์ ์๋๋ค.
-> ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค
โ๏ธ ์ฑ๊ธํค ๋ฐฉ์์ ์ฃผ์์
- ํ๋์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์,
์ฑ๊ธํค ๊ฐ์ฒด๋ ์ํ๋ฅผ ์ ์ง(stateful)ํ๊ฒ ์ค๊ณํ๋ฉด ์๋๋ค
- ๋ฌด์ํ(stateless)๋ก ์ค๊ณํด์ผ ํ๋ค
: ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค
: ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค
: ๊ฐ๊ธ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผ ํ๋ค
: ํ๋ ๋์ ์ ์๋ฐ์์ ๊ณต์ ๋์ง ์๋, ์ง์ญ๋ณ์, ํ๋ผ๋ฏธํฐ, ThreadLocal ๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค
- ์คํ๋ง ๋น์ ํ๋์ ๊ณต์ ๊ฐ์ ์ค์ ํ๋ฉด ์๋๋ค
* ์คํ๋ง ๋น์ ํญ์ ๋ฌด์ํ(stateless)๋ก ์ค๊ณํ์
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
* AnnotationConfigApplicationContext์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฐ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค
-> AppConfig๋ ์คํ๋ง ๋น์ด ๋๋ค
* @Bean์ด ๋ถ์ ๋ฉ์๋๋ง๋ค ์ด๋ฏธ ์คํ๋ง ๋น์ด ์กด์ฌํ๋ฉด ์กด์ฌํ๋ ๋น์ ๋ฐํํ๊ณ ,
์คํ๋ง ๋น์ด ์์ผ๋ฉด ์์ฑํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ๋ฐํํ๋ ์ฝ๋๊ฐ ๋์ ์ผ๋ก ๋ง๋ค์ด์ง๋ค
=> ์ฑ๊ธํค ๋ณด์ฅ
๐ ์ ๋ฆฌ
- @Bean๋ง ์ฌ์ฉํด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ง๋ง, ์ฑ๊ธํค์ ๋ณด์ฅํ์ง ์๋๋ค
: memberRepository() ์ฒ๋ผ ์์กด๊ด๊ณ ์ฃผ์ ์ด ํ์ํด์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ๋ ์ฑ๊ธํค์ ๋ณด์ฅํ์ง ์๋๋ค
- ๊ทธ๋ฅ ์คํ๋ง ์ค์ ์ ๋ณด๋ ํญ์ @Configuration์ ์ฌ์ฉํ์