Singleton pattern

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด(Singleton pattern)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ตœ์ดˆ ํ•œ๋ฒˆ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด.

๊ฐ์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋ฉด ์ปดํ“จํ„ฐ ์ž์›์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์˜ ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

-> ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธด๋‹ค.

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์ตœ๋Œ€ N๊ฐœ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ œํ•œํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์ด ๋•Œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์š”์ฒญํ•˜๋Š” ์ชฝ์—์„œ๋Š” ์ผ์ผ์ด ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์‹ฑ๊ธ€ํ„ด ์žฅ์ 

  1. ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์–ป์œผ๋ฉด์„œ ํ•œ๋ฒˆ์˜ new๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ.

  2. ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์‰ฝ๋‹ค.

    ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ „์—ญ ์ธ์Šคํ„ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ.

  3. ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ๋ถ€ํ„ฐ๋Š” ๊ฐ์ฒด ๋กœ๋”ฉ์‹œ๊ฐ„์ด ํ˜„์ €ํ•˜๊ฒŒ ์ค„์–ด ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค.

์‹ฑ๊ธ€ํ„ด ๋‹จ์ 

  • ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์— ์–ด๊ธ‹๋‚˜๋ฉฐ ์ˆ˜์ •๊ณผ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.

    ์‹ฑ๊ธ€ํ„ด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ์‹œํ‚ฌ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค ๊ฐ„์— ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ ธ '๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™'์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋œ๋‹ค.

  • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™”์ฒ˜๋ฆฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด ํ™œ์šฉ๋  ์ƒํ™ฉ ๋ฐ ์˜ˆ์‹œ

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํ’€

  • ๋กœ๊ทธ ๋ผ์ดํ„ฐ

๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์‚ฌ์šด๋“œ ๋งค๋‹ˆ์ €

  • ์Šค์ฝ”์–ด ๋งค๋‹ˆ์ €

์‹ฑ๊ธ€ํ„ด ๊ตฌํ˜„

์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋กœ ์‹ฑ๊ธ€ํ„ด์„ ๊ตฌํ˜„ํ•˜์ž. ์ด ๋•Œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ ์™ธ์— ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ private๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

   public static Database getInstance(String name) {
        if (singleton == null) {
            singleton = new Database(name);
        }
        return singleton;
    }

๋ฌธ์ œ๋Š” ์œ„์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์“ฐ๋ ˆ๋“œ๊ฐ€ singleton ๊ฐ์ฒด๊ฐ€ null์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ๊ฑฐ์˜ ๋™์‹œ์— ์ด๋ค„์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ์ทจ์•ฝ์ ์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ?

   public synchronized static Database getInstance(String name) {
        if (singleton == null) {
            singleton = new Database(name);
        }
        return singleton;
    }

์œ„์ฒ˜๋Ÿผ synchronized๋ฅผ ์˜ˆ์•ฝ์–ด๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฑด ์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ธ ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • ์ตœ์ดˆ์— singleton์ด null์ธ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์™€์˜ ๊ฒฝํ•ฉ์„ ๋ง‰์œผ๋ฉด ์ถฉ๋ถ„ํ•œ๋ฐ, synchronized๋ฅผ ์˜ˆ์•ฝ์–ด๋ฅผ ๋„ฃ์œผ๋ฉด ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒํ•˜์—ฌ ๋ณ‘๋ชฉํ˜„์ƒ์ด ์ผ์–ด๋‚œ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ตœ์ดˆ์— ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๋„๋ก ํ•ด์„œ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

public class Database {
โ€‹
    private static Database singleton = new Database("product");
    private String name;
โ€‹
    private Database(String name) {
        try {
            Thread.sleep(100);
            this.name = name;
        } catch (Exception e) {
        }
    }
โ€‹
    public static Database getInstance(String name) {
        return singleton;
    }

์•„๋ž˜์ฒ˜๋Ÿผ lazy holder์— ์˜ํ•ด ์ดˆ๊ธฐํ™”๋ฅผ ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

public class Database {
โ€‹
    private Database(String name) {
        try {
            Thread.sleep(100);
            this.name = name;
        } catch (Exception e) {
        }
    }
    
    private static class LazyHolder {
        public static final Database singleton = new Database("product");
    }
    
    public static Database getInstance() {
        return LazyHolder.INSTANCE;
    }
}

์ด ๋ฐฉ๋ฒ•์€ JVM์˜ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ๋ณด์žฅ๋˜๋Š” ์›์ž์  ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์‹ฑ๊ธ€ํ„ด์˜ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ JVM์— ๋– ๋„˜๊ธด๋‹ค.

holder ์•ˆ์— ์„ ์–ธ๋œ instance๊ฐ€ static์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๋กœ๋”ฉ์‹œ์ ์— ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋  ๊ฒƒ์ด๋ฉฐ, final์„ ์‚ฌ์šฉํ•ด ๋‹ค์‹œ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š๋„๋ก ๋งŒ๋“  ๋ฐฉ๋ฒ•์ด๋‹ค.

Last updated