/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., ์คํ๋ง ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์ฑ์ฅํ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ณด์ธ์! ๐ข
www.inflearn.com
์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฑ๊ธํค
1. ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฑ๊ธํค
โ ์คํ๋ง์ ๊ธฐ์ ์ฉ ์จ๋ผ์ธ ์๋น์ค ๊ธฐ์ ์ ์ง์ํ๊ธฐ ์ํด ํ์ํ์.
โ ๋๋ถ๋ถ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์(๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๋ ๊ฐ๋ฅํ๊ธด ํจ)
โ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต ์ฌ๋ฌ ๊ณ ๊ฐ์ด ๋์์ ์์ฒญ์ ํจ(์ ๊ทธ๋ฆผ ์ฐธ์กฐ)
โ ์ด๋ ๊ฒ ์์ฒญ์ ํ ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ฉด..? ์๋์์ ํ์ธํด๋ณด์.
2. ์คํ๋ง ์๋ ์์ํ DI ์ปจํ ์ด๋ ํ ์คํธ
SingletonTest
public class SingletonTest {
@Test
@DisplayName("์คํ๋ง ์๋ ์์ํ DI ์ปจํ
์ด๋")
void pureContainer() {
AppConfig appConfig = new AppConfig();
// ํธ์ถํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋์ง ํ์ธ
MemberService memberService1 = appConfig.memberService();
MemberService memberService2 = appConfig.memberService();
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
Assertions.assertThat(memberService1).isNotSameAs(memberService2);
}
}
โ ์ ์ฝ๋์ ์ฝ์์ฐฝ์ ๋ณด๋ฉด MemberService๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
โ ๋ง์ฝ ์ด๋ ๊ฒ ์ค๊ณ๋๋ค๋ฉด ๊ณ ๊ฐ ํธ๋ํฝ์ด ์ด๋น 100์ด ๋์ค๋ฉด ์ด๋น 100๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์๋ฉธ๋ ๊ฒ์ด๋ค(๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ฌํจ)
โ ํด๊ฒฐ๋ฐฉ์์ ํด๋น ๊ฐ์ฒด๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋๋ก ์ค๊ณํ๋ฉด ๋จ
โ ์ด๊ฒ์ด ์ฑ๊ธํค ํจํด!
3. ์ฑ๊ธํค ํจํด
โ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด.
โ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ 2๊ฐ ์ด์ ์์ฑ๋์ง ๋ชปํ๋๋ก ๋ง์์ผ ํจ.
(private ์์ฑ์๋ฅผ ์ฌ์ฉํด์ ์ธ๋ถ์์ ์์๋ก new ํค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ๋ง์์ผ ํ๋ค.)
SingletonService
public class SingletonService {
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance(){
return instance;
}
private SingletonService(){
}
public void logic() {
System.out.println("์ฑ๊ธํค ๊ฐ์ฒด ๋ก์ง ํธ์ถ");
}
}
โพ 1. static ์์ญ์ ๊ฐ์ฒด instance๋ฅผ ๋ฏธ๋ฆฌ ํ๋ ์์ฑํด์ ์ฌ๋ ค๋๋ค.
โพ 2. ์ด ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ํ์ํ๋ฉด ์ค์ง `getInstance()` ๋ฉ์๋๋ฅผ ํตํด์๋ง ์กฐํํ ์ ์์ผ๋ฉฐ, ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
โพ 3. ๋ฑ ํ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ง ์กด์ฌํด์ผ ํ๋ฏ๋ก, ์์ฑ์๋ฅผ private๋ก ๋ง์์ ์ธ๋ถ์์ new ํค์๋๋ก ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ง๋๋ค.
SingletonTest
@Test
@DisplayName("์ฑ๊ธํค ํจํด์ ์ ์ฉํ ๊ฐ์ฒด ์ฌ์ฉ")
void singletonServiceTest() {
SingletonService instance1 = SingletonService.getInstance();
SingletonService instance2 = SingletonService.getInstance();
System.out.println("instance1 = " + instance1);
System.out.println("instance2 = " + instance2);
Assertions.assertThat(instance1).isSameAs(instance2);
}
โ ํ ์คํธ๋ฅผ ํ๋ฉด ์๋ฐ๊ฐ ์คํ๋ ๋ ์์ฑํด๋์ SingletonService ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋๊ฑฐ๋ผ ๊ฐ์ ์ธ์คํด์ค ๊ฐ์ด ๋์จ๋ค.
๐ก ๊ถ๊ธ์ฆ1
: isSameAs ๋ isEqualTo์ ์ฐจ์ด์ ?
โพ isSameAs
โ ' == '์ ๊ฐ์ ์๋ฏธ๋ก ๋ ๊ฐ์ ๊ฐ์ฒด ์ฐธ์กฐ(๋ฉ๋ชจ๋ฆฌ์ฃผ์)๊ฐ ๋์ผํ์ง ํ์ธํ๋ค.
โ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋น๊ตํ์ง ์๊ณ , ์ฐธ์กฐ๊ฐ๋ง ํ์ธํ๋ฏ๋ก ๊ฐ์ฒด์ ๋์ผ์ฑ์ ํ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ค.
โพ isEqualTo
โ ๋ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๋์ผํ์ง ํ์ธํ๋ค.
โ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๊ณ ๋ คํ์ง ์๊ณ ๋ฉ์๋์ ์ํด ์ ์๋ ๋๋ฑ์ฑ์ ํ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ค.
4. ์ฑ๊ธํค ํจํด์ ๋ฌธ์ ์
โ ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ์ฝ๋ ์์ฒด๊ฐ ๋ง์ด ๋ค์ด๊ฐ๋ค.
โ ์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๋ค โ DIP๋ฅผ ์๋ฐํ๋ค.
โ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํด์ OCP ์์น์ ์๋ฐํ๋ค.
โ ํ ์คํธํ๊ธฐ ์ด๋ ต๋ค.
โ ๋ด๋ถ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ด๊ธฐํํ๊ธฐ ์ด๋ ต๋ค.
โ private ์์ฑ์๋ก ์์ ํด๋์ค ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
โ ๊ฒฐ๋ก ์ ์ผ๋ก ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ฉฐ ์ํฐํจํด์ผ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.