์ฃผ์ ๋์์ธ ํจํด 13๊ฐ์ง

1. ์์ฑ ํจํด
- ์ฑ๊ธํค ํจํด
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด
2. ํ๋ ํจํด
- ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด
- ์ฑ๊ธํค ํจํด
- ์ํ ํจํด
- ๋ฐ๋ณต์ ํจํด
- ์ ๋ต ํจํด
- ์ต์ ๋ฒ ํจํด
3. ๊ตฌ์กฐ ํจํด
- ๋ฐ์ฝ๋ ์ดํฐ ํจํด
- ํ๋ก์ ํจํด
- ์ปดํฌ์งํธ ํจํด
- ์ด๋ํฐ ํจํด
- ํผ์ฌ๋ ํจํด
์ฑ๊ธํค ํจํด์ด๋?
- ๊ฐ์ฒด๊ฐ ์ค์ง ํ๋๋ง ์์ฑ๋๋ ๋์์ธ ํจํด์ด๋ค.
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ ์ด์
์๋ฅผ ๋ค์ด์ ์ฌ๋ฌด์ค์ ํ๋ฆฐํธ๊ฐ ํ ๋๋ง ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ง์๋ค์ ์ด ํ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ ๋ ํ๋ฆฐํฐ ํ ๋๋ฅผ ๊ณต์ ํ๋ฉด์ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ์ง์๋ค์ด ํ๋ฆฐํฐ๊ฐ ํ์ํ ๋ ๋ง๋ค ํ๋ฆฐํฐ๋ฅผ ์๋ก ์ฃผ๋ฌธํ๋ค๊ณ ํ๋ฉด ์ด๋จ๊น ?
์ด๋ ๋งค์ฐ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค.
ํ๋ฆฐํฐ ํ๋๋ฅผ ์ง์๋ค๋ผ๋ฆฌ ๊ณต์ ํ๋ ๊ฒ์ '์ฑ๊ธํค'์ผ๋ก ๋น์ ํ ์ ์๋ค.

์ด๊ฒ์ ํ๋ก๊ทธ๋จ์์๋ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ฐ, ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋จ ํ๋ฒ๋ง ์์ฑํด์ ์ฌ๋ฌ ์ด์ ์ ๊ฐ์ง ์ ์๋ค.
์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ํ, ์ค๋ ๋ ํ , ์บ์ , ๋ก๊ทธ ๊ธฐ๋ก ๊ฐ์ฒด์์ ์ฌ์ฉํ๋ค.
1. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝ ํ ์ ์๋ค.
์์ฑ์๋ฅผ ํตํด์ ํ๋ฒ ์์ฑํ๊ณ ๊ทธ ๋ค๋ก ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ฆ, ํ๋ฒ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ค.
2. ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ค.
์ ์ญ์ผ๋ก ์ฌ์ฉ๋๋ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ค๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค.
ํ์ง๋ง ์ด ๊ฒฝ์ฐ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ๋๋ฌธ์ ์กฐ์ฌํด์ผํ๋ค.
์ฑ๊ธํค ํจํด ์ ์ฉ ๋ฐฉ๋ฒ
๊ตฌํ์ฝ๋
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// ์์ฑ์๋ ์ธ๋ถ์์ ํธ์ถ๋ชปํ๊ฒ private ์ผ๋ก ์ง์ ํด์ผ ํ๋ค.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("hi, there");
}
}
๋ฉ์๋์ ์ธ์คํด์ค ๋ณ์๊ฐ ๋ชจ๋ static์ผ๋ก ๋์ด์๋ค.
๊ธฐ๋ณธ ์์ฑ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณ์์ ๋ฉ์๋์ ์ ๊ทผ์ ํด์ฉํด์ผํ๋ค.
์ฑ๊ธํค ํจํด์ ๋จ์
1. ๊ตฌํ์ ๋ณต์ก์ฑ
์ฑ๊ธํค ์ฝ๋๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ ์ง ์์ ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ค.
์์ฑ์ ์ธ์๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด syncronized ๊ฐ์ ํค์๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํด์ผํ๋ค.
2. ํ ์คํธ์ ์ด๋ ค์
ํ ์คํธ๋ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ์งํ๋์ด์ผ ํ๋๋ฐ ์ฑ๊ธํค์ ์์์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ๋ ํ ์คํธ๊ฐ ์ด๋ ต๋ค.
์ฑ๊ธํค์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ๋ ค๋ฉด ๋งค๋ฒ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํ ์์ผ์ฃผ์ด์ผํ๋ค.
3. ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กด
์ฑ๊ธํค์ ์ํด ํด๋์ค ์์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฏ๋ก ์ด๋ DIP๋ฅผ ์๋ฐํ๋ค.๋ํ OCP ์์น๋ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์คํ๋ง์์์ ์ฑ๊ธํค ํจํด
- ์คํ๋ง ์ปจํ ์ด๋๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๋ค.(์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ)
- ์คํ๋ง์ ํตํด์ ์ฑ๊ธํค์ ์ ์งํ๋ฉด ๊ธฐ์กด ์ฑ๊ธํค์ ๋จ์ ์ ํด๊ฒฐํ ์ ์๋ค.
1. ๊ธฐ์กด์ ์ฑ๊ธํค์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ณต์กํ ์ฝ๋๊ฐ ๋ค์ด๊ฐ์ง๋ง ์คํ๋ง์์๋ ๋ณ๋์ ์ฝ๋๊ฐ ํ์์๋ค.
2. ํ ์คํธ, DIP , OCP , private ์์ฑ์๋ก๋ถํฐ ์์ ๋กญ๊ฒ ์ฑ๊ธํค์ ์ฌ์ฉํ ์ ์๋ค.
๊ตฌํ์ฝ๋
void springContainer() {
ApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
//1. ์กฐํ: ํธ์ถํ ๋ ๋ง๋ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
MemberService memberService1 = ac.getBean("memberService",
MemberService.class);
//2. ์กฐํ: ํธ์ถํ ๋ ๋ง๋ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํMemberService memberService2 = ac.getBean("memberService",
MemberService.class);
//์ฐธ์กฐ๊ฐ์ด ๊ฐ์ ๊ฒ์ ํ์ธ
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
//memberService1 == memberService2
assertThat(memberService1).isSameAs(memberService2);
}
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ ์ ์ฃผ์์ฌํญ
์ฑ๊ธํค ๊ฐ์ฒด๋ ์ํ๋ฅผ ์ ์งํ๊ฒ(stateful) ์ค๊ณํ์ง ๋ง์!
์ฑ๊ธํค ๊ฐ์ฒด๋ ๋ฌด์ํ(stateless) ํด์ผํ๋ค !
1. ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
- ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋จ
2. ๊ฐ๊ธ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผํ๋ค.
3. ์๋ฐ์์ ๊ณต์ ๋์ง ์๋ ์ง์ญ๋ณ์ , ํ๋ผ๋ฏธํฐ , ThreadLocal ๋ฑ์ ์ฌ์ฉํ์ฌํ๋ค.