๊ด€๋ฆฌ ๋ฉ”๋‰ด

Tech Log ๐Ÿ› ๏ธ

[๋””์ž์ธ ํŒจํ„ด] ์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด ๋ณธ๋ฌธ

๋””์ž์ธ ํŒจํ„ด

[๋””์ž์ธ ํŒจํ„ด] ์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด

sehaan 2023. 6. 23. 00:20

์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด 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 ๋“ฑ์„ ์‚ฌ์šฉํ–์—ฌํ•œ๋‹ค.