ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿค”
๊ณผ์—ฐ DaoFactory์˜ userDao()๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๋™์ผํ•œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋Œ์•„์˜ฌ๊นŒ?

 

“๋™์ผํ•œ”์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์ž.

 

์˜ค๋ธŒ์ ํŠธ์˜ ๋™์ผ์„ฑ๊ณผ ๋™๋“ฑ์„ฑ

์ž๋ฐ”์—์„œ ๋‘ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ™์€๊ฐ€๋ผ๋Š” ๋ง์€ ์ฃผ์˜ํ•ด์„œ ์จ์•ผ ํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” “๊ฐ™๋‹ค"๋ผ๋Š” ํ‘œํ˜„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์˜๋ฏธ๊ฐ€ ๋‹ด๊ธด๋‹ค. ๋™์ผ์„ฑ(identical) ๋‘ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์™„์ „ํžˆ ๊ฐ™๋‹ค๋Š” ์˜

kkoon9.tistory.com

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

DaoFactory factory = new DaoFactory();
UserDao dao1 = factory.userDao();
UserDao dao2 = factory.userDao();

System.out.println(dao1);
System.out.println(dao2);

dao1๊ณผ dao2์˜ ์ถœ๋ ฅ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•œ ์˜ค๋ธŒ์ ํŠธ๋‹ค.

ํ•˜์ง€๋งŒ, ์ถœ๋ ฅ๋˜๋Š” ๊ฐ’์€ ๋งค๋ฒˆ ๋‹ค๋ฅด๋‹ค.

๋‘ ๊ฐœ๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง„ ๋™์ผํ•˜์ง€ ์•Š์€ ์˜ค๋ธŒ์ ํŠธ๋‹ค.

์ฆ‰, ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‘ ๊ฐœ๊ฐ€ ์ƒ๊ฒผ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

ApplicationContext context = new
        AnnotationConfigApplicationContext(DaoFactory.class);

UserDao dao3 = context.getBean("userDao", UserDao.class);
UserDao dao4 = context.getBean("userDao", UserDao.class);

System.out.println(dao3);
System.out.println(dao4);

์œ„ ์ฝ”๋“œ๋Š” ์Šคํ”„๋ง์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— DaoFactory๋ฅผ ์„ค์ •์ •๋ณด๋กœ ๋“ฑ๋กํ•œ ๋’ค, getBean()์„ ์ด์šฉํ•ด userDao๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋ก๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋‘ ์ถœ๋ ฅ๊ฐ’์ด ๊ฐ™์€๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค”
๋„๋Œ€์ฒด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚œ๊ฑธ๊นŒ?

 

๋‘ ์ฝ”๋“œ์˜ ์ฐจ์ด์ ์€ ์˜ค๋ธŒ์ ํŠธ ํŒฉํ† ๋ฆฌ์™€ ์Šคํ”„๋ง์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์˜ ๋™์ž‘๋ฐฉ์‹์— ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

์Šคํ”„๋ง์€ ์—ฌ๋Ÿฌ ๋ฒˆ์— ๊ฑธ์ณ ๋นˆ์„ ์š”์ฒญํ•˜๋”๋ผ๋„ ๋งค๋ฒˆ ๋™์ผํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Œ๋ ค์ค€๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ getBean()์„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค userDao() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋งค๋ฒˆ new์— ์˜ํ•ด ์ƒˆ๋กœ์šด UserDao๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ์„œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” IoC ์ปจํ…Œ์ด๋„ˆ์ธ ๋™์‹œ์— ์‹ฑ๊ธ€ํ†ค์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ด๊ธฐ๋„ ํ•˜๋‹ค.

์Šคํ”„๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•˜๋Š” ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ชจ๋‘ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ ๋‹ค.

์—ฌ๊ธฐ์„œ ์‹ฑ๊ธ€ํ†ค์ด๋ผ๋Š” ๊ฒƒ์€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด๊ณผ ๊ฐœ๋…์€ ๋น„์Šทํ•˜๋‚˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค.

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์ž.

 

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

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ๋ณดํ†ต์€ ๋งŽ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด์„ ํ‘œ์‹œํ•˜๋Š” java.lang.String ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฌธ์ž์—ด 1๊ฐœ์— ๋Œ€ํ•ด์„œ 1๊ฐœ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์ด 1,000๊ฐœ

kkoon9.tistory.com

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‹ฑ๊ธ€ํ†ค

๐Ÿค”
์™œ ์Šคํ”„๋ง์€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋นˆ์„ ๋งŒ๋“œ๋Š” ๊ฑธ๊นŒ?

 

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

์Šคํ”„๋ง์ด ์ฒ˜์Œ ์„ค๊ณ„๋๋˜ ๋Œ€๊ทœ๋ชจ์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์„œ๋ฒ„ํ™˜๊ฒฝ์€ ์„œ๋ฒ„ ํ•˜๋‚˜๋‹น ์ตœ๋Œ€๋กœ ์ดˆ๋‹น ์ˆ˜์‹ญ์—์„œ ์ˆ˜๋ฐฑ ๋ฒˆ์”ฉ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์—ฌํƒ€ ์‹œ์Šคํ…œ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์€ ์„ฑ๋Šฅ์ด ์š”๊ตฌ๋˜๋Š” ํ™˜๊ฒฝ์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งค๋ฒˆ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๋งˆ๋‹ค ๊ฐ ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

์•„๋ฌด๋ฆฌ ์ž๋ฐ”์˜ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ๊ณผ GC์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์กŒ๋‹ค๊ณ  ํ•œ๋“ค ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ์„œ๋ฒ„๊ฐ€ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

๊ทธ๋ž˜์„œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ถ„์•ผ์—์„œ๋Š” ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ผ๋Š” ๊ฐœ๋…์„ ์ผ์ฐ๋ถ€ํ„ฐ ์ƒ์š”ํ•ด์™”๋‹ค.

์„œ๋ธ”๋ฆฟ์€ ์ž๋ฐ” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ธฐ์ˆ ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ŠคํŽ™์—์„œ ๊ฐ•์ œํ•˜์ง„ ์•Š์ง€๋งŒ, ์„œ๋ธ”๋ฆฟ์€ ๋Œ€๋ถ€๋ถ„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋งŒ ๋งŒ๋“ค์–ด๋‘๊ณ , ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋‹ด๋‹นํ•˜๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ณต์œ ํ•ด ๋™์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์— ์ œํ•œ๋œ ์ˆ˜, ๋Œ€๊ฐœ ํ•œ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๋งŒ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ์›๋ฆฌ๋‹ค.

ํ•˜์ง€๋งŒ ๋””์ž์ธ ํŒจํ„ด์— ์†Œ๊ฐœ๋œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ๊ณ  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์–ด์„œ ์•ˆํ‹ฐํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ํ•œ๊ณ„

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ ์šฉํ•œ ์ฝ”๋“œ์ด๋‹ค.

public class UserDao {
    private static UserDao INSTANCE;
    // ...

    private UserDao(ConnectionMaker connectionMaker) {
        this.connectionMaker = connectionMaker;
    }

    public static synchronized UserDao getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new UserDao(???);
        }
        return INSTANCE;
    }

    // ...
}

์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๊ตฌํ˜„ ๋ฐฉ์‹์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ์  [1]. private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์žฅ์ ์ธ ์ƒ์†๊ณผ ์ด๋ฅผ ์ด์šฉํ•œ ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ธฐ์ˆ ์ ์ธ ์„œ๋น„์Šค๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์ƒ๊ด€์—†๊ฒ ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ผ๋ฐ˜ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฝ์šฐ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„์˜ ์žฅ์ ์„ ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๊ฑด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋‹ค.

๋˜ํ•œ ์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํŠน์ง•์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์Šคํƒœํ‹ฑ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์—ญ์‹œ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ์  [2]. ์‹ฑ๊ธ€ํ†ค์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค.

์‹ฑ๊ธ€ํ†ค์€ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฐฉ์‹์ด ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ mock ์˜ค๋ธŒ์ ํŠธ ๋“ฑ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค.

ํ…Œ์ŠคํŠธ๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ธ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์ง€์žฅ์ด ์žˆ๋‹ค๋Š” ๊ฑด ํฐ ๋‹จ์ ์ด๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ์  [3]. ์„œ๋ฒ„ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์ด ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์„œ๋ฒ„์—์„œ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค์ž„์—๋„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ž๋ฐ” ์–ธ์–ด๋ฅผ ์ด์šฉํ•œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๊ธฐ๋ฒ•์€ ์„œ๋ฒ„ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์ด ๊ผญ ๋ณด์žฅ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์—†๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ์  [4]. ์‹ฑ๊ธ€ํ†ค์˜ ์‚ฌ์šฉ์€ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค.

์‹ฑ๊ธ€ํ†ค์€ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค.

์‹ฑ๊ธ€ํ†ค์˜ ์Šคํƒœํ‹ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์–ธ์ œ๋“ ์ง€ ์‹ฑ๊ธ€ํ†ค์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ด๋””์„œ๋“ ์ง€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ „์—ญ ์ƒํƒœ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ์‰ฝ๋‹ค.

์ „์—ญ ์ƒํƒœ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์ด๋‹ค.

๊ทธ๋Ÿผ์—๋„ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฐ ์œ ํ˜น์— ๋น ์ง€๊ธฐ ์‰ฝ๋‹ค.

๊ทธ๋Ÿด ๋ฐ”์—๋Š” ์•„์˜ˆ ์Šคํƒœํ‹ฑ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ

๐Ÿค”
๊ทธ๋Ÿผ ์‹ฑ๊ธ€ํ†ค์„ ์“ฐ๋ผ๋Š”๊ฑธ๊นŒ ๋ง๋ผ๋Š”๊ฑธ๊นŒ?

 

์ผ๋‹จ, ์Šคํ”„๋ง์€ ์„œ๋ฒ„ํ™˜๊ฒฝ์—์„œ ์‹ฑ๊ธ€ํ†ค์ด ๋งŒ๋“ค์–ด์ ธ์„œ ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์ ๊ทน ์ง€์ง€ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ž๋ฐ”์—์„œ์˜ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์€ ์ง์ ‘ ์‹ฑ๊ธ€ํ†ค ํ˜•ํƒœ์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(singleton registry)๋‹ค.

์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์žฅ์ ์€ ์Šคํƒœํ‹ฑ ๋ฉ”์„œ๋“œ์™€ private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋น„์ •์ƒ์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ‰๋ฒ”ํ•œ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ™œ์šฉํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์— ๊ด€ํ•œ ๋ชจ๋“  ๊ถŒํ•œ์€ IoC ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์—๊ฒŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šคํ”„๋ง์€ IoC ์ปจํ…Œ์ด๋„ˆ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ณ ์ „์ ์ธ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋Œ€์‹ ํ•ด์„œ ์‹ฑ๊ธ€ํ†ค์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•ด๋‘์ž.

๋‹ค์Œ์€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

์‹ฑ๊ธ€ํ†ค๊ณผ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ

์‹ฑ๊ธ€ํ†ค์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ํ˜•ํƒœ์˜ ์˜ค๋ธŒ์ ํŠธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒํƒœ์ •๋ณด๋ฅผ ๋‚ด๋ถ€์— ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ๋ฌด์ƒํƒœ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ์ž ํ˜ผ์ž์„œ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ์„œ๋ฒ„์— ๋ฐฐํฌ๋˜๊ณ  ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์ ‘์†ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์—‰๋ง์ด ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๋“ฑ์˜ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  ์ฝ๊ธฐ์ „์šฉ์˜ ๊ฐ’์ด๋ผ๋ฉด ์ดˆ๊ธฐํ™” ์‹œ์ ์—์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ €์žฅํ•ด๋‘๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

๐Ÿค”
๊ทธ๋Ÿผ ์ƒํƒœ๊ฐ€ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—
๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๋‚˜, DB, ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑํ•œ ์ •๋ณด๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ค„์•ผ ํ• ๊นŒ?

 

์ด๋•Œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋กœ์ปฌ ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

์œ„์— ๊ฐ’๋“ค์€ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ €์žฅํ•  ๋…๋ฆฝ์ ์ธ ๊ณต๊ฐ„์ด ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค์ด๋ผ๊ณ  ํ•ด๋„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฎ์–ด์“ธ ์ผ์€ ์—†๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

public class UserDao {
    // ์ดˆ๊ธฐ์— ์„ค์ •ํ•˜๋ฉด ์‚ฌ์šฉ ์ค‘์—๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ฝ๊ธฐ์ „์šฉ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜
    private ConnectionMaker connectionMaker;

    // ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ๋Š” ์ •๋ณด๋ฅผ ๋‹ด์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜. (์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ)
    private Connection c;
    private User user;

    private UserDao(ConnectionMaker connectionMaker) {
        this.connectionMaker = connectionMaker;
    }

    public User get(String id) throws ClassNotFoundException, SQLException {
        this.c = connectionMaker.makeConnection();
        this.user = new User();
        this.user.setId(rs.getString("id"));
        this.user.setName(rs.getString("name"));
        return this.user;
    }
}

๊ธฐ์กด UserDao์™€ ๋‹ค๋ฅธ ์ ์€ ๊ธฐ์กด์— ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ–ˆ๋˜ Connection๊ณผ User๋ฅผ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋กœ ์„ ์–ธํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํ”„๋ง์˜ ์‹ฑ๊ธ€ํ†ค ๋นˆ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ์—๋Š” ๊ธฐ์กด์˜ UserDao์ฒ˜๋Ÿผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฐ”๋€Œ๋Š” ์ •๋ณด๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

ConnectionMaker๋Š” ์ฝ๊ธฐ์ „์šฉ์˜ ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์žˆ์–ด๋„ ์ƒ๊ด€์—†๋‹ค.

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/12   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ