ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬(Spring Framework)와 λ‹€ν˜•μ„±(Polymorphism)(1)
    개발/Spring Boot 2022. 2. 8. 00:00

     

     

    Spring Frameworkλ₯Ό κ³΅λΆ€ν•˜λ©΄, λ°˜λ“œμ‹œ μ•Œμ•„μ•Ό ν•  κ°œλ…μ΄ μžˆμŠ΅λ‹ˆλ‹€.

     

    λ°”λ‘œ, λ‹€ν˜•μ„±(Polymorphism)μΈλ°μš”.

    이번 μ‹œκ°„μ—λŠ” μŠ€ν”„λ§ ν”„λ ˆμž„ μ›Œν¬μ™€ λ‹€ν˜•μ„±μ— λŒ€ν•œ λ‹€μ–‘ν•œ 이야기λ₯Ό ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

     

    p.s) ν•΄λ‹Ή 글은 κΉ€μ˜ν•œλ‹˜μ˜ Spring κ°•μ˜ λ‚΄μš©μ„ ν† λŒ€λ‘œ 개인이 μ •λ¦¬ν•œκ²ƒμ„ κΈ°λ‘ν•©λ‹ˆλ‹€.

    μ‹œκ°„μ΄ λ‚˜μ‹ λ‹€λ©΄ ν•΄λ‹Ή κ°•μ˜ λ˜ν•œ κΌ­ 듀어보싀 것을 μΆ”μ²œν•©λ‹ˆλ‹€ :)

     

     

    객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°


    λ‹€ν˜•μ„±μ„ λ§ν•˜κΈ° 전에, λ¨Όμ € μŠ€ν”„λ§μ˜ νŠΉμ§•μ— λŒ€ν•΄μ„œ μ΄μ•ΌκΈ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    μŠ€ν”„λ§μ€ μžλ°” μ–Έμ–΄ 기반의 ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μžλ°” μ–Έμ–΄μ˜ κ°€μž₯ 큰 νŠΉμ§•μ€ λ¬΄μ—‡μΌκΉŒμš”? λ„€, λ§žμŠ΅λ‹ˆλ‹€. '객체 지ν–₯ μ–Έμ–΄' λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. μš°λ¦¬κ°€ μ•Œκ³ μž ν•˜λŠ” μŠ€ν”„λ§μ€ 이 객체 지ν–₯ μ–Έμ–΄κ°€ 가진 κ°•λ ₯ν•œ νŠΉμ§•μ„ μ‚΄λ €λ‚΄λŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. 즉, μŠ€ν”„λ§μ€ 쒋은 객체 지ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬μΈ κ²ƒμž…λ‹ˆλ‹€.

     

    κ·Έλ ‡λ‹€λ©΄, 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ λ¬΄μ—‡μΌκΉŒμš”?

    - 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ λͺ…λ Ήμ–΄μ˜ λͺ©λ‘μœΌλ‘œ λ³΄λŠ” μ‹œκ°μ—μ„œ λ²—μ–΄λ‚˜ μ—¬λŸ¬κ°œμ˜ λ…λ¦½λœ λ‹¨μœ„, 즉 "객체"λ“€μ˜ λͺ¨μž„μœΌλ‘œ νŒŒμ•…ν•˜κ³ μž ν•˜λŠ” 것이닀. 각각의 κ°μ²΄λŠ” 메세지λ₯Ό μ£Όκ³ λ°›κ³ , 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€. (ν˜‘λ ₯)
    - 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž¨μ„ μœ μ—°ν•˜κ³  변경이 μš©μ΄ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— 많이 μ‚¬μš©λœλ‹€.

     

     

    μœ„μ˜ μ •μ˜μ— λŒ€ν•΄μ„œλŠ” λ°‘μœΌλ‘œ λ‚΄λ €κ°€λ©΄μ„œ, 차근차근히 이해λ₯Ό ν•  수 μžˆλ„λ‘ ν’€μ–΄λ‚˜κ°€κ² μŠ΅λ‹ˆλ‹€. κ°μ²΄ 지ν–₯은 λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. 

    - 좔상화
    - μΊ‘μŠν™”
    - 상속
    - λ‹€ν˜•μ„±

     

    μ΄λŸ¬ν•œ 객체 지ν–₯의 νŠΉμ§• 쀑 ν•˜λ‚˜λ₯Ό λ‹€ν˜•μ„±μ΄λΌκ³  ν•  수 μžˆλŠ”λ°, 그럼 이제 본격적으둜 λ‹€ν˜•μ„±μ— λŒ€ν•΄ 이야기해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. (μ΄λ²ˆμ‹œκ°„μ€ λ‹€ν˜•μ„±μ— λŒ€ν•œ μ΄μ•ΌκΈ°λ§Œ μ§‘μ€‘μ μœΌλ‘œ λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.)

     

     

    λ‹€ν˜•μ„±(Polymorphsim)μ΄λž€?


    λ‹€ν˜•μ„±μ΄λž€ ν”„λ‘œκ·Έλž¨ μ–Έμ–΄ 각 μš”μ†Œλ“€(μƒμˆ˜, λ³€μˆ˜, 식, 객체, λ©”μ†Œλ“œ λ“±)이
    λ‹€μ–‘ν•œ μžλ£Œν˜•(type)에 μ†ν•˜λŠ” 것이 ν—ˆκ°€λ˜λŠ” μ„±μ§ˆ
    - wikipedia -

     

     

    μœ„ν‚€ν”Όλ””μ•„μ—μ„œλŠ” μœ„μ˜ λ‚΄μš©κ³Ό 같이 μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ μ„€λͺ…μœΌλ‘œ λ‹€ν˜•μ„±μ˜ κ°œλ…μ΄ 잘 와닿지 μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ‹€μŒκ³Ό 같은 λΉ„μœ λ‘œ ν•œλ²ˆ 이해해보면 μ–΄λ–¨κΉŒμš”? λ¨Όμ €, 100% 싀세계와 객체 지ν–₯을 1:1둜 λ§€μΉ˜ν•˜κΈ°λŠ” μ–΄λ ΅κ² μ§€λ§Œ, μ‰½κ²Œ 'μ—­ν• 'κ³Ό 'κ΅¬ν˜„'으둜 세상을 κ΅¬λΆ„ν•œλ‹€κ³  μƒκ°ν•΄λ΄…μ‹œλ‹€. 

     

     

     

    μš΄μ „μžμ™€ μžλ™μ°¨


    λ‹€ν˜•μ„±μ˜ λΉ„μœ _(1)μš΄μ „μžμ™€ μžλ™μ°¨

     

    μš΄μ „μžλŠ” μš΄μ „μ„ ν•  λ•Œ μžλ™μ°¨λ‘œ 승용차, 슀포츠카, λ²„μŠ€ 쀑 μ–΄λ–€ 것을 μš΄μ „ν•˜λ”λΌλ„ μžλ™μ°¨λ₯Ό μš΄μ „ν•œλ‹€λŠ” 점에 μžˆμ–΄μ„œ λ³€ν•˜λŠ” 점은 μ—†μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ 승용차, 슀포츠카, λ²„μŠ€λŠ” μžλ™μ°¨μ˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” μˆ˜λ‹¨μΌ λΏμž…λ‹ˆλ‹€. 즉, μžλ™μ°¨κ°€ λ°”λ€Œμ–΄λ„ μš΄μ „μžμ—κ²ŒλŠ” 큰 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€. 이처럼 'μš΄μ „μž = ν΄λΌμ΄μ–ΈνŠΈ' 라고 μƒκ°ν•΄λ³΄μ•˜μ„ λ•Œ, ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 영ν–₯을 주지 μ•Šκ³ λ„ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ΄ λ°”λ‘œ 'λ‹€ν˜•μ„±'μž…λ‹ˆλ‹€.

     

     

    λ‘œλ―Έμ˜€μ™€ λ‚¨μžλ°°μš°


    λ‹€ν˜•μ„±μ˜ λΉ„μœ _(2)λ‘œλ―Έμ˜€μ™€ λ‚¨μžλ°°μš°

     

     

    μ΄λ²ˆμ—λŠ” λ‘œλ―Έμ˜€μ™€ λ‚¨μžλ°°μš°λ‘œ 예λ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ˜ν™”μ—μ„œ λ‘œλ―Έμ˜€λΌλŠ” 역할은 배우 μ΅œμš°μ‹μ”¨κ°€ 해도, ν˜Ήμ€ λ””μΉ΄ν”„λ¦¬μ˜€κ°€ 해도 (μ œκ°€ μ’‹μ•„ν•˜λŠ” λ°°μš°λ“€μž…λ‹ˆλ‹€ :D, μ΄λŸ΄λ•Œ 사심 νˆ¬μ²™ 살짝 ν•΄λ΄…λ‹ˆλ‹€^^) κ·Ή μ€‘μ—μ„œ 둜미였의 역할이 λ‹¬λΌμ§€λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 이 μ—­μ‹œ '둜미였 = ν΄λΌμ΄μ–ΈνŠΈ' 라고 κ°€μ •ν•  μ‹œμ— ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 영ν–₯을 μ£Όμ§€μ•Šκ³ λ„ κΈ°λŠ₯을 'κ΅¬ν˜„ = μ΅œμš°μ‹, λ””μΉ΄ν”„λ¦¬μ˜€' ν•œλ‹€κ³  λ³Ό 수 μžˆκ² μŠ΅λ‹ˆλ‹€.  

     

    λ‹€μ‹œν•œλ²ˆ λ§μ”€λ“œλ¦¬μ§€λ§Œ, μ΄λŸ¬ν•œ μ˜ˆμ‹œκ°€ 1:1둜 100% λŒ€μ‘λ˜κΈ°λŠ” μ–΄λ ΅μ§€λ§Œ, λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ μ΄ν•΄ν•΄μ£Όμ‹œλ©΄ λ˜κ² μŠ΅λ‹ˆλ‹€ :)

     

     

    μ—­ν• κ³Ό κ΅¬ν˜„μ„ 뢄리


    μ§€κΈˆκΉŒμ§€ 두가지 μ˜ˆμ‹œλ‘œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ κ΅¬λΆ„ν•˜μ—¬ μƒκ°ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μš΄μ „μžκ°€ μžλ™μ°¨λ₯Ό μš΄μ „μ„ ν•˜λŠ” 것에 μžˆμ–΄μ„œ, μ–΄λ– ν•œ μƒˆλ‘œμš΄ μ’…λ₯˜μ˜ μ°¨κ°€ λ‚˜μ˜€λ”λΌλ„ 단지 차만 λ°”κΎΈμ–΄ μ£Όλ©΄ λ˜λ‹ˆ μœ μ—°ν•΄μ§€κ³  변경도 μš©μ΄ν•΄μ§€κ²Œ λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ¬Όλ‘  μš΄μ „μžλŠ” 승용차, 슀포츠카, λ²„μŠ€ μ΄λŸ¬ν•œ μ°¨κ°€ μ–΄λ–»κ²Œ κ΅¬μ‘°ν™”λ˜μ–΄ λ§Œλ“€μ–΄μ‘ŒλŠ”μ§€μ— λŒ€ν•΄ 깊이 μ•Œ ν•„μš”λ„ μ—†μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ λŒ€μž…ν•΄ λ³Έλ‹€λ©΄, μ—¬λŸ¬κ°€μ§€ μž₯점이 λ‚˜μ˜¬ 수 μžˆκ² μŠ΅λ‹ˆλ‹€.

    - ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒμ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄ λœλ‹€.
    - ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό λͺ°λΌλ„ λœλ‹€.
    - ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰가 λ³€κ²½λ˜μ–΄λ„ 영ν–₯을 받지 μ•ŠλŠ”λ‹€.
    - ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒ 자체λ₯Ό λ³€κ²½ 해도 영ν–₯을 받지 μ•ŠλŠ”λ‹€.

     

    κ·Έλ ‡λ‹€λ©΄, λ‹€μ‹œ 본둠으둜 λŒμ•„κ°€λ³΄κ² μŠ΅λ‹ˆλ‹€. μžλ°” μ–Έμ–΄μ—μ„œλ„ μ΄λŸ¬ν•œ λ‹€ν˜•μ„±μ„ ν™œμš©ν•œ κ²ƒμž…λ‹ˆλ‹€. 즉, μ—­ν•  = μΈν„°νŽ˜μ΄μŠ€κ΅¬ν˜„ = μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀(ν˜Ήμ€ 객체) 둜 생각해보면 λ©λ‹ˆλ‹€. 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 역할을 λ¨Όμ € λΆ€μ—¬ν•˜κ³ , κ·Έ 역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체λ₯Ό λ§Œλ“€λ„λ‘ ν•˜λŠ”κ²ƒμž…λ‹ˆλ‹€.

     

    μžλ°”μ–Έμ–΄μ—μ„œ λ‹€ν˜•μ„±μ€ μ–΄λ””μ„œ λ³Ό 수 μžˆμ„κΉŒμš”? μ˜€λ²„λΌμ΄λ”©μ„ λ– μ˜¬λ €λ³΄λ©΄ λ©λ‹ˆλ‹€. μ„œλΉ„μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή κΈ°λŠ₯을 κ΅¬ν˜„ν•œ μ˜€λ²„λΌμ΄λ”© 된 λ©”μ„œλ“œκ°€ 싀행이 λ©λ‹ˆλ‹€. 이것은 λ‹€ν˜•μ„±μœΌλ‘œ 인해 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체λ₯Ό μ‹€ν–‰ μ‹œμ μ— μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

     

     

    μ •λ¦¬ν•˜κΈ°


    - μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ μ‹œμ μ— μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.
    - λ‹€ν˜•μ„±μ˜ λ³Έμ§ˆμ„ μ΄ν•΄ν•˜λ €λ©΄ ν˜‘λ ₯μ΄λΌλŠ” κ°μ²΄μ‚¬μ΄μ˜ κ΄€κ³„μ—μ„œ μ‹œμž‘ν•΄μ•Όν•œλ‹€.
    - ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , μ„œλ²„μ˜ κ΅¬ν˜„ κΈ°λŠ₯을 μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.

    μ΄λ ‡κ²Œ μ§€κΈˆκΉŒμ§€ λ³΄μ•˜λ˜ μ—­ν• κ³Ό κ΅¬ν˜„μ΄λΌλŠ” νŽΈλ¦¬ν•œ 컨셉을 λ‹€ν˜•μ„±μ„ 톡해 객체 μ„ΈμƒμœΌλ‘œ κ°€μ Έμ˜€κ²Œλ˜λ©΄, μœ μ—°ν•˜κ³  변경이 μš©μ΄ν•˜λ©°, ν™•μž₯ κ°€λŠ₯ν•œ 섀계가 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 주지 μ•Šκ²Œ 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ•ˆμ •μ μœΌλ‘œ 잘 μ„€κ³„ν•˜λŠ” 것이 맀우 μ€‘μš”ν•΄μ§€κ² μŠ΅λ‹ˆλ‹€. λ§Œμ•½, μΈν„°νŽ˜μ΄μŠ€(μ—­ν• ) μžμ²΄κ°€ λ³€ν•˜λ©΄, ν΄λΌμ΄μ–ΈνŠΈλ‚˜ μ„œλ²„ λͺ¨λ‘μ— 큰 변경이 λ°œμƒν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 

     

    μš°λ¦¬κ°€ μ•žμœΌλ‘œ μ‚¬μš©ν•  μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λŠ” μ΄λŸ¬ν•œ λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•΄μ„œ μ΄μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. μ œμ–΄μ˜ μ—­μ „(IoC), μ˜μ‘΄κ΄€κ³„ μ£Όμž…(DI)은 λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄ μ—­ν• κ³Ό κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€. 즉, μŠ€ν”„λ§μ„ μ‚¬μš©ν•˜λ©΄ 마치 레고 λΈ”λŸ­ μ‘°λ¦½ν•˜λ“―μ΄, ν˜Ήμ€ 곡연 λ¬΄λŒ€μ˜ 배우λ₯Ό μ„ νƒν•˜λ“―μ΄ κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ³€κ²½ν•  수 있게 λ©λ‹ˆλ‹€.

     

     

    λ‹€μŒμ΄μ•ΌκΈ°


    μžλ°”λŠ” 객체 지ν–₯ μ–Έμ–΄μž…λ‹ˆλ‹€. 객체 지ν–₯의 핡심은 λ‹€ν˜•μ„±μ΄κ³ , κ·Έ λ‹€ν˜•μ„±μ— λŒ€ν•΄μ„œ (=λ‹€ν˜•μ„±μ΄ μ΄λ ‡κ²Œλ‚˜ μ’‹λ‹€!) 이번 μ‹œκ°„μ— μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 쒋은 객체 지ν–₯ μ„€κ³„μ—λŠ” 5가지 원칙이 μžˆλŠ”λ°, 이 λ‹€ν˜•μ„±λ§ŒμœΌλ‘œλŠ” 이것을 λͺ¨λ‘ μΆ©μ‘±μ‹œν‚€κΈ°λŠ” μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 결둠을 λ§ν•˜μžλ©΄, κ·Έλž˜μ„œ Spring Frameworkκ°€ ν•„μš”ν•˜κ²Œ 된 κ²ƒμ΄μ§€μš”. κ·ΈλŸ¬ν•œ 이야기λ₯Ό λ‹€μŒκΈ€μ— ν¬μŠ€νŒ…ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€ :)

     

     

     

     

     

     

    λŒ“κΈ€

Designed by Tistory.