JiwonDev

ํ† ๋น„์˜์Šคํ”„๋ง#2 ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์™€ ์˜ค๋ธŒ์ ํŠธ ์Šค์ฝ”ํ”„

by JiwonDev

2021.08.14 - [Backend/Spring Core] - ํ† ๋น„์˜ ์Šคํ”„๋ง#1 ์˜ค๋ธŒ์ ํŠธ์™€ ์˜์กด๊ด€๊ณ„

 

์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์ด ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

 


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

'์ž๋ฐ”์—์„œ ๋‘ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ™์€๊ฐ€?' ๋ผ๋Š” ๋ง์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ๋™์ผ์„ฑ(Identity)์™€ ๋™๋“ฑ์„ฑ(Equality)์˜ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๋™์ผ์„ฑ ๋น„๊ต(==, Identity)๋Š” ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋Š” ๋ง์ด๋‹ค.
  • ๋™๋“ฑ์„ฑ ๋น„๊ต(.equal() .hashtag(), Equality)๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๊ฐ’, ์ •๋ณด๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ๋ง์ด๋‹ค.

์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋™์ผํ•˜๋ฉด ๋™๋“ฑ์„ฑ์„ ๋งŒ์กฑํ•˜์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ๋™๋“ฑํ•˜๋‹ค๊ณ  ํ•ด์„œ ๋™์ผํ•œ ๊ฐ์ฒด์ž„์„ ๋ณด์žฅํ•  ์ˆœ ์—†๋‹ค. ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉด ์•„๋ž˜๊ธ€์„ ์ฐธ๊ณ ํ•ด๋ณด์ž. 2021.07.27 - [๊ธฐ๋ณธ ์ง€์‹/Java ๊ธฐ๋ณธ์ง€์‹] - .equals์™€ .hashCode()๋Š” ํ•ญ์ƒ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผํ•œ๋‹ค.

 

.equals์™€ .hashCode()๋Š” ํ•ญ์ƒ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผํ•œ๋‹ค.

Object ๋ฉ”์„œ๋“œ์— ์žˆ๋Š” .hashCode() ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด๋งŒ์˜ ๊ณ ์œ ํ•œ ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ hashCode()๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋„๋ก ํ•จ๊ป˜ ์˜ค

jiwondev.tistory.com

 


# ์Šคํ”„๋ง์—์„œ์˜ ๋นˆ ๊ฐ์ฒด

์ปจํ…Œ์ด๋„ˆ (Object Factory)์—์„œ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๊ฐ’์€ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋‹ค. ์ฆ‰ '๋™๋“ฑ์„ฑ'์€ ๋งŒ์กฑํ•˜๋‚˜ '๋™์ผ์„ฑ'์€ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ๋งˆ๋‹ค ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค๊ฒŒ๋œ๋‹ค.

DaoFactory factory = new DaoFactory(); // AppConfig ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

// ์ด ๋‘ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅด๋‹ค.
UserDao dao1 = factory.userDao();
UserDao dao2 = factory.userDao();

// my.package.UserDao@118f375
// my.package.UserDao@117A8bd
System.out.println(dao1 + "\n" + dao2);

 

์Šคํ”„๋ง์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ค‘๋ณต(๋‚ญ๋น„)๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

// Object Factory ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ๋กœ ๋„˜๊ฒจ์ฃผ์–ด, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

// ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋‘ ๊ฐ์ฒด๋„ ๋™์ผ์„ฑ์€ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฑธ๊นŒ?
UserDao dao1 = context.getBean("userDao", UserDao.class);
UserDao dao2 = context.getBean("userDao", UserDao.class);

// ๋†€๋ž๊ฒŒ๋„ ๋™์ผ์„ฑ์„ ๋งŒ์กฑํ•œ๋‹ค. ๋ช‡ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๋˜ ๋™์ผํ•œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ•˜๊ณ , ์ฐธ์กฐํ•œ๋‹ค.(์‹ฑ๊ธ€ํ†ค)
// my.package.UserDao@ee22f7
// my.package.UserDao@ee22f7
System.out.println(dao1 + "\n" + dao2);

 


# ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ์„œ ApplicationContext

์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ, Application Context๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•ž์—์„œ ๋งŒ๋“ค์—ˆ๋˜ Object Factory์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด์™€ ๋™์‹œ์— ์‹ฑ๊ธ€ํ†ค์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(singleton registry) ์ด๊ธฐ๋„ ํ•˜๋‹ค.

 

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

 


@ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ ์‹ฑ๊ธ€ํ†ค์˜ ํ•œ๊ณ„

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด์„œ๊นŒ์ง€ ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ทธ ์ด์œ ๋Š” ์Šคํ”„๋ง์€ ํƒœ์ƒ์ ์œผ๋กœ ์„œ๋ฒ„(์›น ์„œ๋ฒ„)์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์Šคํ”„๋ง์ด ์ฒ˜์Œ ์„ค๊ณ„๋˜์—ˆ๋˜ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„ํ™˜๊ฒฝ์€ ์ดˆ๋‹น ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ๋ฒˆ์— ์ด๋ฅด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด [๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค(DB) ๊ฐ์ฒด, ์„œ๋น„์Šค ๊ฐ์ฒด, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐ์ฒด]๋“ฑ ์ˆ˜๋งŽ์€ ๊ฐ์ฒด๋“ค์ด ์ฐธ์—ฌํ•˜๋Š” ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”๊ฒŒ ๋Œ€๋ถ€๋ถ„์ด๋‹ค. 

 

๋งค๋ฒˆ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ฐ ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ดˆ๋‹น 500๊ฐœ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด 2500๊ฐœ์˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. 1๋ถ„์ด๋ฉด ์‹ญ๋งŒ๊ฐœ, ํ•œ์‹œ๊ฐ„์ด๋ฉด ์„œ๋ฒ„์— 900๋งŒ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค. ์•„๋ฌด๋ฆฌ JVM๊ณผ GC์˜ ๊ธฐ๋Šฅ์ด ์ข‹์•„์กŒ๋‹ค๊ณ  ํ•œ๋“ค, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์†Œ๋ฉธ์‹œํ‚ค๋Š” ๊ณผ์ •์€ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋น„์‹ผ ์ž‘์—…์ด๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•ด ๋Œ๋ ค์“ฐ๋„๋ก ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

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

public class DoubleLockSingleton {
    // ๋‹จ์ˆœํ•œ ์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
    private static final Singleton instance = new Singleton();
    
    // private ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ค‘๋ณต ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ.
    private Singleton(){}
 
    public static Singleton getInstance(){
        // ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์—์„œ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ์ƒ์„ฑ์˜ Thread-safety ๋ณด์žฅ
        if(instance == null){
            synchronized (Singleton.class) {
                if(instance == null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}
  • private ์ƒ์„ฑ์ž ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์—†๋‹ค. ์„œ๋น„์Šค ๊ฐ์ฒด์— ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํ…Œ์ŠคํŠธ์šฉ ๊ฐ์ฒด(mock)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์ฆ‰ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ๊ตฌ์„ฑ์ด ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ๋ถ„์‚ฐ๋œ ์„œ๋ฒ„ํ™˜๊ฒฝ์—์„œ ์‹ฑ๊ธ€ํ†ค์ด ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค. (์„œ๋ฒ„์™€ JVM์ด ์—ฌ๋Ÿฌ๊ฐœ์ด๋‹ค)
  • ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๊ฐ€ '์ „์—ญ ๋ณ€์ˆ˜'์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.  ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ side-effect๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

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

 

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

 


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

์‹ฑ๊ธ€ํ†ค์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ '๊ฐ์ฒด'๊ฐ€ ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” Stateless ๋ฐฉ์‹์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

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

 

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋˜๋ฉด, ๊ทธ ์˜ค๋ฅ˜๋ฅผ ์žก๋Š” ๊ฒƒ์€ ์ƒ์ƒ ์ด์ƒ์œผ๋กœ ์–ด๋ ต๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ–ˆ๋Š”๋ฐ ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์ด๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•ด์•ผํ• ๊นŒ ์ƒ์ƒํ•ด๋ณด์ž. ์ •๋ง ๋‹ต ์—†๋Š” ์ƒํ™ฉ์ด๊ณ , ์‹ค์ œ ํ˜„์—…์—์„œ๋„ ์ข…์ข… ๋ฐœ์ƒํ•˜๋Š” ์ผ์ด๊ธฐ๋„ ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ œ๋ฐœ ์Šคํ”„๋ง ๋นˆ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์ด ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์ž„์„ ์žŠ์ง€๋ง๊ณ  ์ฃผ์˜ํ•ด์„œ 'Stateless'ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

 

 

@ ์‹ฑ๊ธ€ํ†ค์ด ์•„๋‹Œ ๋นˆ ๊ฐ์ฒด

์Šคํ”„๋ง์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ, ์ฆ‰ ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ  ์กด์žฌํ•˜๊ณ  ์ ์šฉ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ์Šคํ”„๋ง์—์„œ๋Š” ๋นˆ์˜ ์Šค์ฝ”ํ”„(Scope)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์ธ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋˜๊ณ , ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์— ์†Œ๋ฉธ๋œ๋‹ค.

 

๋‹ค๋งŒ ํ•„์š”์— ๋”ฐ๋ผ์„œ๋Š” ์‹ฑ๊ธ€ํ†ค ์™ธ์˜ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

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

 

๋‹ค๋งŒ ์ด ๋‚ด์šฉ์€ ์Šคํ”„๋ง์— ๋Œ€ํ•œ ๊ธฐ์ดˆ์ง€์‹์ด ์žˆ์–ด์•ผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฏ€๋กœ, ๋‚˜์ค‘์— ์Šค์ฝ”ํ”„๋“ค์„ ๋”ฐ๋กœ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.

2021.08.03 - [Backend/Spring Core] - #11 ๋นˆ ์Šค์ฝ”ํ”„(+Provider, ํ”„๋ก์‹œ ๋ชจ๋“œ)

 

#11 ๋นˆ ์Šค์ฝ”ํ”„(+Provider, ํ”„๋ก์‹œ ๋ชจ๋“œ)

์•ž์—์„œ ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ง ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๊ณ , ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค๊ณ  ํ•™์Šตํ–ˆ๋‹ค. ์ด๋Š” ์Šคํ”„๋ง ๋นˆ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ '์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„'๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ

jiwondev.tistory.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ