Skip to content

Latest commit

ย 

History

History
169 lines (105 loc) ยท 9.55 KB

File metadata and controls

169 lines (105 loc) ยท 9.55 KB
description ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ์€ ๋ฌด์—‡์ธ๊ฐ€?

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ์€ ๋ฌด์—‡์ธ๊ฐ€

์Šคํ”„๋ง์ด๋ž€?

๐Ÿ”— ์ถœ์ฒ˜ : https://dev-coco.tistory.com/80
๐Ÿ”— ๊ฐ•์˜ ์ถœ์ฒ˜ :https://www.inflearn.com/course/์Šคํ”„๋ง๋ถ€ํŠธ-๊ฐœ๋…์ •๋ฆฌ

๐Ÿ’ ์Šคํ”„๋ง์€ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

Framework : ํ‹€์•ˆ์—์„œ ๋™์ž‘ํ•˜๋‹ค.

๊ตฌ์Šฌ์€ ํ‹€์•ˆ์—์„œ ์›€์ง์ž„๊ณผ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. ํ‹€ ์•ˆ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ๋ง๋ผ๋Š” ๋œป์œผ๋กœ ํ‹€์„ ์ œ๊ณตํ•ด์ค„ ํ…Œ๋‹ˆ ์ด ํ‹€์— ๋งž์ถฐ์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ผ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ข‹์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ ์Šคํ”„๋ง์€ ์˜คํ”ˆ ์†Œ์Šค์ด๋‹ค.

  • ์Šคํ”„๋ง์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š” ์ง€ ๋‚ด๋ถ€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๋‚ด๋ถ€๋ฅผ ๋œฏ์–ด๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค.
  • ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๊ณต๊ฐœ! ์˜คํ”ˆ ์†Œ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํŽธํ•œ ๋ถ€๋ถ„์„ ๊ณ ์ณ์„œ ๊ธฐ์—ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ’ ์Šคํ”„๋ง์€ IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง„๋‹ค.(Inversion Of Control)

class๋Š” ์„ค๊ณ„๋„์ด๋ฉฐ, object๋Š” ์‹ค์ฒดํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋ฉฐ(๋กค ์บ๋ฆญํ„ฐ ์ค‘ ๋ˆ„๋ˆ„๋Š” class์ด๋‚˜ ์บ๋ฆญํ„ฐ๋Š” ์ถ”์ƒ์ ์ธ ์˜๋ฏธ์˜ ์ถ”์ƒ ํด๋ž˜์Šค), instance๋Š” ์‹ค์ฒดํ™” ๋œ ๊ฒƒ์ด๋‹ค.

object๋ฅผ ์˜์ž s = new ์˜์ž();๋กœ heap์— ์˜ฌ๋ฆฌ๋ฉด ์ด s๋Š” ๋งŒ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๊ด€๋ฆฌํ•จ ๋‹จ์ ์€ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋‚˜์ค‘์— ๊ณต์œ ํ•  ๋•Œ ํž˜๋“ค์–ด์ง„๋‹ค.

โญ IoC(์—ญ์ „์˜ ์ œ์–ด) โ‡’ ์ฃผ๋กœ ์ฃผ๋„๊ถŒ ์Šคํ”„๋ง

๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๊ด€๋ฆฌ๊นŒ์ง€ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ

์ปดํฌ๋„ŒํŠธ ์˜์กด๊ด€๊ณ„ ์„ค์ •(Component dependency resoulution), ์„ค์ •(Configuration) ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ(LifeCycle)์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด(Design Pattern)์ด๋‹ค.

  • ์Šคํ”„๋ง์ด ์ง์ ‘ ๋งŒ๋“ ๋‹ค. ์Šค์บ”ํ•˜์—ฌ heap ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค์ฃผ๊ณ  ์Šคํ”„๋ง์ด ์ง์ ‘ ๊ด€๋ฆฌ

โญ IoC ์ปจํ…Œ์ด๋„ˆ

์ปจํ…Œ์ด๋„ˆ?๋ž€

์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌ, ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋“ค์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ณ  ์ฑ…์ž„์ง€๊ณ  ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋Š”๋ฐ,๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ IoC ์ปจํ…Œ์ด๋„ˆ(=์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ)

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋ถ€ํ„ฐ ์†Œ๋ฉธ๊นŒ์ง€์˜ ์ธ์Šคํ„ด์Šค ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ๊ด€๋ฆฌ ์ฃผ์ฒด๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ(Container)๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

  • IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ฑ…์ž„์ง€๊ณ , ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • POJO์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ์„œ๋น„์Šค, ์†Œ๋ฉธ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ POJO๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋งก๊ธด๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ TDD๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

POJO(Plain Old Java Object)๋ž€? ์ฃผ๋กœ ํŠน์ • ์ž๋ฐ” ๋ชจ๋ธ์ด๋‚˜ ๊ธฐ๋Šฅ, ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” Java Object๋ฅผ ์ง€์นญํ•œ๋‹ค. Java Bean ๊ฐ์ฒด๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ getter / setter๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ’ ์Šคํ”„๋ง์€ DI๋ฅผ ์ง€์›ํ•œ๋‹ค.

โญ IoC์˜ ๋ถ„๋ฅ˜ : DL(Dependency Lookup) ๊ณผ DI (Dependency Injection)

  • DL : ์ €์žฅ์†Œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” Bean์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ด์šฉํ•˜์—ฌ Bean์„ Lockupํ•˜๋Š” ๊ฒƒ
  • DI : ๊ฐ ํด๋ž˜์Šค๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ๋นˆ ์„ค์ •(Bean Definition) ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ
    • Setter Injection (์ˆ˜์ •์ž ์ฃผ์ž…)
    • Constructor Injection (์ƒ์„ฑ์ž ์ฃผ์ž…)
    • Method Injection (ํ•„๋“œ ์ฃผ์ž…)
  • DL ์‚ฌ์šฉ์‹œ ์ปจํ…Œ์ด๋„ˆ ์ข…์†์ด ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ DI๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. DI๋กœ ์ธํ•ด ์Šคํ”„๋ง์ด ๋งŒ๋“  ๊ฒƒ๋“ค์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ”— ์ถœ์ฒ˜ : https://dog-developers.tistory.com/12

โญ DI(Dependency Injection)๋ž€?

{% content-ref url="component-bean.md" %} component-bean.md {% endcontent-ref %}

{% content-ref url="3-field-setter.md" %} 3-field-setter.md {% endcontent-ref %}

โญ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ (= IoC ์ปจํ…Œ์ด๋„ˆ)์˜ ์ข…๋ฅ˜

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋นˆ(Bean)์ด๋ผ๊ณ  ํ•˜๊ณ ,์ด ๋นˆ๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นˆ ํŒฉํ† ๋ฆฌ(BeanFactory) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๋Ÿฐํƒ€์ž„ ๊ด€๊ณ„๋ฅผ DI ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ BeanFactory๋ผ๊ณ  ํ•œ๋‹ค.
  • BeanFactory์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ปจํ…์ŠคํŠธ(ApplicationContext)๊ฐ€ ์žˆ๋‹ค.

โญ BeanFactory์™€ ApplicationContext

1. BeanFactory

  • BeanFactory ๊ณ„์—ด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  DI๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•œ๋‹ค.
  • Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ํŒฉํ† ๋ฆฌ ๋””์ž์ธ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ BeanFactory๋Š” ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ถ„๋ฐฐํ•˜๋Š” ์ฑ…์ž„์„ ์ง€๋Š” ํด๋ž˜์Šค์ด๋‹ค.
  • Bean์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” getBean() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
  • ๋ณดํ†ต์€ BeanFactory๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ด๋ฅผ ํ™•์žฅํ•œ ApplicationContext๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

2. ApplicationContext

  • Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์€ BeanFactory์™€ ๊ฐ™๋‹ค.

  • ์Šคํ”„๋ง์˜ ๊ฐ์ข… ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•œ๋‹ค.

  • BeanFactory ๋ณด๋‹ค ๋” ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

    • ๊ตญ์ œํ™”๊ฐ€ ์ง€์›๋˜๋Š” ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ด€๋ฆฌ ํ•ด์ค€๋‹ค.
    • ์ด๋ฏธ์ง€๊ฐ™์€ ํŒŒ์ผ ์ž์›์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ด„์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์ค€๋‹ค.
    • ๋ฆฌ์Šค๋„ˆ๋กœ ๋“ฑ๋ก๋œ ๋นˆ์—๊ฒŒ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์•Œ๋ ค์ค€๋‹ค.
    <figure><img src="../../.gitbook/assets/image (5) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
    

๐Ÿ”— ์ถœ์ฒ˜ : https://dog-developers.tistory.com/12

๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋นˆํŒฉํ† ๋ฆฌ ๋ณด๋‹ค๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ฝ˜ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค.

๐Ÿ’ ์Šคํ”„๋ง์€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ํ•„ํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ•„ํ„ฐ๋ž€?

๋ฌธ์ง€๊ธฐ์™€ ๊ฐ™์Œ.. ์ž„๋ฌด๋ฅผ ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ๋ชป๋“ค์–ด ์˜ค๊ฒŒ ๋ง‰๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋งํ•œ๋‹ค.

A๋‚˜๋ผ์˜ ์„ฑ์„ tomcat์ด๋ผ๊ณ  ๋ณด๊ณ  ์™•์˜ ์ง‘์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ

ํ†ฐ์ผ“ ์ชฝ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํ•„ํ„ฐ๋Š” ์‹ค์ œ filter๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, web.xml์„ ๊ฐ€์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋กœ ๋“ค์–ด๊ฐ€๋Š” ํ•„ํ„ฐ๋Š” Interceptor(AOP)๋กœ ๊ถŒํ•œ์ฒดํฌ๋ฅผ ํ•ด์คŒ

๐Ÿ’ ์Šคํ”„๋ง์€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค(๋ฆฌํ”Œ๋ ‰์…˜, ์ปดํŒŒ์ผ์ฒดํ‚น)

๋ฆฌํ”Œ๋ ‰์…˜(Reflection)

https://velog.io/@prettylee620/Reflection

์ปดํŒŒ์ผ์ฒดํ‚น

  1. ์–ด๋…ธํ…Œ์ด์…˜ (์ฃผ์„ + hint) : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์‹œํ•˜์ง€ ์•Š์Œ โ‡’ ๋งˆ์น˜ @Override

  • ์Šคํ”„๋ง์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

    • @Compont : ํด๋ž˜์Šค ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ, ์ฆ‰ IoC๊ฐ€ ์Šค์บ” ์ฝ์–ด์„œ heap์— ์ž๋™์œผ๋กœ ์˜ฌ๋ ค์คŒ
    • @Autowired : ๋กœ๋”ฉ๋œ ๊ฐ์ฒด ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ง‘์–ด ๋„ฃ๊ธฐ, ๋™์ผํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ํ›„ ์žˆ๋‹ค๋ฉด ํƒ€์ž…(A)์„ ํ†ตํ•ด ์ฐพ์Œ ์žˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ ์ฆ‰, DI ํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค. ์—†๋‹ค๋ฉด null์ด ๋“ค์–ด๊ฐ
    class B{
    A a = new A();
    }

    ๋ผ๋ฉด, ์ƒˆ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋˜ ๋‹ค๋ฅธ A ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ณต๊ฐ„์— ์ƒ์„ฑ๋˜๊ฒŒ ๋จ

    class B{
    @Autowired
    A a 
    }

    ๋ผ๋ฉด, B ํด๋ž˜์Šค ์Šค์บ” ์‹œ ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์‹œ ๋ถ„์„ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ฆฌํ”Œ๋ ‰์…˜์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋ถ„์„ ์‹œ ๋ฉ”์„œ๋“œ, ํ•„๋“œ, ์–ด๋…ธํ…Œ์ด์…˜์ด ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”์ง€์™€ ๋ฌด์—‡์ธ๊ฐ€ ํ•ด๋ผ๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. // ์ฃผ์„ : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์‹œ