Spring/Spring ๊ธฐ๋ณธ

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 25. ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„ / Provider

hello_u 2023. 2. 9. 17:17

 

ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„ - ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์‹œ ๋ฌธ์ œ์ 

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์š”์ฒญํ•˜๋ฉด ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

์˜ˆ์ œ

 

clientBean ์ด๋ผ๋Š” ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ํ†ตํ•ด์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์ž.

 

  

์‹ฑ๊ธ€ํ†ค์—์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์‚ฌ์šฉ 1

 

void prototypeFind() {
    AnnotationConfigApplicationContext ac =
            new AnnotationConfigApplicationContext(PrototypeBean.class, ClientBean.class);

 

clientBean ์€ ์‹ฑ๊ธ€ํ†ค์ด๋ฏ€๋กœ, ๋ณดํ†ต ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ์ ์— ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๊ณ , ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๋„ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

static class ClientBean {

    private final PrototypeBean prototypeBean;

    @Autowired
    public ClientBean(PrototypeBean prototypeBean) {
        this.prototypeBean = prototypeBean;
    }

 

clientBean ์€ ์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฃผ์ž… ์‹œ์ ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์š”์ฒญํ•œ๋‹ค.

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒ์„ฑํ•ด์„œ clientBean ์— ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ count ํ•„๋“œ ๊ฐ’์€ 0์ด๋‹ค.


์ด์ œ clientBean ์€ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋‚ด๋ถ€ ํ•„๋“œ์— ๋ณด๊ด€ํ•œ๋‹ค. (์ •ํ™•ํžˆ๋Š” ์ฐธ์กฐ๊ฐ’์„ ๋ณด๊ด€ํ•œ๋‹ค.)

 

 

 

์‹ฑ๊ธ€ํ†ค์—์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์‚ฌ์šฉ 2

 

 

ClientBean clientBean1 = ac.getBean(ClientBean.class);

 

ํด๋ผ์ด์–ธํŠธ A๋Š” clientBean ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•ด์„œ ๋ฐ›๋Š”๋‹ค.์‹ฑ๊ธ€ํ†ค์ด๋ฏ€๋กœ ํ•ญ์ƒ ๊ฐ™์€ clientBean ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

 

public int logic() {
    prototypeBean.addCount();
    int count = prototypeBean.getCount();
    return count;
}
int count1 = clientBean1.logic();


ํด๋ผ์ด์–ธํŠธ A๋Š” clientBean.logic() ์„ ํ˜ธ์ถœํ•œ๋‹ค.

 

 clientBean ์€ prototypeBean์˜ addCount() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ count๋ฅผ ์ฆ๊ฐ€ํ•œ๋‹ค. count๊ฐ’์ด 1์ด ๋œ๋‹ค.

 

 

 

์‹ฑ๊ธ€ํ†ค์—์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์‚ฌ์šฉ 3

 

ClientBean clientBean2 = ac.getBean(ClientBean.class);

 

ํด๋ผ์ด์–ธํŠธ B๋Š” clientBean ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•ด์„œ ๋ฐ›๋Š”๋‹ค.์‹ฑ๊ธ€ํ†ค์ด๋ฏ€๋กœ ํ•ญ์ƒ ๊ฐ™์€ clientBean ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.


์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์ด ์žˆ๋Š”๋ฐ, clientBean์ด ๋‚ด๋ถ€์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์ด๋ฏธ ๊ณผ๊ฑฐ์— ์ฃผ์ž…์ด ๋๋‚œ ๋นˆ์ด๋‹ค.

 

์ฃผ์ž… ์‹œ์ ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•ด์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒˆ๋กœ ์ƒ์„ฑ์ด ๋œ ๊ฒƒ์ด์ง€, ์‚ฌ์šฉ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค!

 

 

 

int count2 = clientBean2.logic();


ํด๋ผ์ด์–ธํŠธ B๋Š” clientBean.logic() ์„ ํ˜ธ์ถœํ•œ๋‹ค.


clientBean ์€ prototypeBean์˜ addCount() ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ count๋ฅผ ์ฆ๊ฐ€ํ•œ๋‹ค.

 

 

 

์›๋ž˜ count ๊ฐ’์ด 1์ด์—ˆ์œผ๋ฏ€๋กœ 2๊ฐ€ ๋œ๋‹ค.

 

 

 

์ •๋ฆฌ 

 

์Šคํ”„๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ์„ฑ ์‹œ์ ์—๋งŒ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—,

 

ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ๊ณ„์† ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋‹ค.

 

์•„๋งˆ ์›ํ•˜๋Š” ๊ฒƒ์ด ์ด๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ ๊ฒƒ์ด๋‹ค.

 

ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ฃผ์ž… ์‹œ์ ์—๋งŒ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›ํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

 

ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„ - ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์‹œ Provider๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ

 

์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ,

 

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

 

ObjectFactory, ObjectProvider

 

์ง€์ •ํ•œ ๋นˆ์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋Œ€์‹  ์ฐพ์•„์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ObjectProvider ์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ ๊ณผ๊ฑฐ์—๋Š” ObjectFactory ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์— ํŽธ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์„œ ObjectProvider ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

 

 

 

  • ObjectFactory: ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœ, ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š” ์—†์Œ, ์Šคํ”„๋ง์— ์˜์กด

 

  • ObjectProvider: ObjectFactory ์ƒ์†, ์˜ต์…˜, ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋“ฑ ํŽธ์˜ ๊ธฐ๋Šฅ์ด ๋งŽ๊ณ , ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š” ์—†์Œ, ์Šคํ”„๋ง์— ์˜์กด

 

 

@Scope("singleton")
static class ClientBean {

    @Autowired
  private ObjectProvider<PrototypeBean> prototypeBeanProvider;

    public int logic() {
        PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
        prototypeBean.addCount();
        int count = prototypeBean.getCount();
        return count;
    }

 

 

์‹คํ–‰ํ•ด๋ณด๋ฉด prototypeBeanProvider.getObject() ์„ ํ†ตํ•ด์„œ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ObjectProvider ์˜ getObject() ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋นˆ์„ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;

 

 

@Autowired ์˜ ๋™์ž‘์ด getBean ๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ์ด ๋•Œ ProtoTypeBean ์„ ์š”์ฒญํ•œ๋‹ค

 

 

ํ”„๋กœํ†  ํƒ€์ž…์ธ bean๋“ค์€ getbean์„ ํ•˜๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ธ๊ฐ€์š”??    -> ๋„ค ๋งž์Šต๋‹ˆ๋‹ค.

 

 

 

JSR-330 Provider

 

๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์€ javax.inject.Provider ๋ผ๋Š” JSR-330 ์ž๋ฐ” ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

javax.inject:javax.inject:1 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ gradle์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

 

@Autowired
private Provider<PrototypeBean> provider;

  public int logic() {
      PrototypeBean prototypeBean = provider.get();

 

์‹คํ–‰ํ•ด๋ณด๋ฉด provider.get() ์„ ํ†ตํ•ด์„œ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

provider ์˜ get() ์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋นˆ์„ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (DL)

 

์ž๋ฐ” ํ‘œ์ค€์ด๊ณ , ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœํ•˜๋ฏ€๋กœ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ mock ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋Š” ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค.

 

Provider ๋Š” ์ง€๊ธˆ ๋”ฑ ํ•„์š”ํ•œ DL ์ •๋„์˜ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•œ๋‹ค.

 

get() ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋กœ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ๋‹จ์ˆœํ•˜๋‹ค.


๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.


์ž๋ฐ” ํ‘œ์ค€์ด๋ฏ€๋กœ ์Šคํ”„๋ง์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

์ •๋ฆฌ

 

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

 

๋งค๋ฒˆ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

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

 

 

ObjectProvider , JSR330 Provider ๋“ฑ์€ ํ”„๋กœํ† ํƒ€์ž… ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ DL์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ์–ธ์ œ๋“ ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

> ์ฐธ๊ณ :

๋”๋ณด๊ธฐ

 

์‹ค๋ฌด์—์„œ ์ž๋ฐ” ํ‘œ์ค€์ธ JSR-330 Provider๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€,

 

์•„๋‹ˆ๋ฉด ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ObjectProvider๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

ObjectProvider๋Š” DL์„ ์œ„ํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ๋งŽ์ด ์ œ๊ณตํ•ด์ฃผ๊ณ  ์Šคํ”„๋ง ์™ธ์— ๋ณ„๋„์˜ ์˜์กด๊ด€๊ณ„ ์ถ”๊ฐ€๊ฐ€ ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๋‹ค.

 

๋งŒ์•ฝ ์ฝ”๋“œ๋ฅผ ์Šคํ”„๋ง์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋ฉด JSR-330 Provider๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 


์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ด ๊ธฐ๋Šฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค๋„ ์ž๋ฐ” ํ‘œ์ค€๊ณผ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๊ฒน์น ๋•Œ๊ฐ€ ๋งŽ์ด ์žˆ๋‹ค.

 

๋Œ€๋ถ€๋ถ„ ์Šคํ”„๋ง์ด ๋” ๋‹ค์–‘ํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ํŠน๋ณ„ํžˆ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๋‹ค๋ฉด,

 

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com