7 min read

[Spring 곡뢀] Spring 핡심 원리 - 1

Table of Contents

Spring에 λŒ€ν•΄ 처음 κ³΅λΆ€ν•˜λŠ” μ‚¬λžŒμ΄ 정리λ₯Ό λͺ©μ μœΌλ‘œ μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€. μ˜€κ°œλ… λ“± 잘λͺ»λœ 뢀뢄이 μžˆμ„ 경우 λŒ“κΈ€λ‘œ 가감없이 μ§€μ ν•΄μ£Όμ„Έμš”! ν™•μΈν•˜λŠ” λŒ€λ‘œ μ •ν™•ν•œ 정보λ₯Ό κΈ°λ°˜ν•΄ λΉ λ₯΄κ²Œ μˆ˜μ •ν•  수 μžˆλ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ°œμš”

이번 Spring Boot μŠ€ν„°λ””λŠ” λ°°λ‹¬μ˜ 민쑱의 κΉ€μ˜ν•œλ‹˜κ»˜μ„œ μΈν”„λŸ°μ— μ˜¬λ €μ£Όμ‹œλŠ” μžλ°” μŠ€ν”„λ§ μ™„μ „ 정볡 μ‹œλ¦¬μ¦ˆλ₯Ό 기반으둜 μ§„ν–‰ν•œλ‹€. κ·Έ μ‹œλ¦¬μ¦ˆμ˜ κ°€μž₯ 첫 κ°•μ˜μΈ μŠ€ν”„λ§ μž…λ¬Έ - μ½”λ“œλ‘œ λ°°μš°λŠ” μŠ€ν”„λ§ λΆ€νŠΈ, μ›Ή MVC, DB μ ‘κ·Ό κΈ°μˆ μ„ 끝내고, λ‹€μŒ κ°•μ˜μΈ μŠ€ν”„λ§ 핡심 원리 - κΈ°λ³ΈνŽΈμ„ 정리해보렀 ν•œλ‹€.

이번 ν¬μŠ€νŠΈμ—μ„œλŠ” κ°•μ˜ μ΄ˆλ°˜λΆ€μ˜ λ‚΄μš©μ΄μž, 개인적으둜 큰 감λͺ…을 받은, 그리고 ν•™κ΅μ—μ„œ λ°°μš°μ§€ λͺ»ν•œ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점 쀑 ν•˜λ‚˜μΈ λ‹€ν˜•μ„±μ— λŒ€ν•œ 이야기λ₯Ό 해보렀 ν•œλ‹€.

λ‹€ν˜•μ„±

μ—¬λŸ¬λΆ„λ“€μ€ λ‹€ν˜•μ„±μ΄ 뭐라고 μ•Œκ³  κ³„μ‹ κ°€μš”?

이 λ‹€ν˜•μ„±μ΄λΌλŠ” κ°œλ…μ€ μ–΄λ””μ„ κ°€ μžλ°”λ₯Ό λ°°μ›Œλ³Έ κ²½ν—˜μ΄ μžˆλŠ” μ‚¬λžŒμ΄λΌλ©΄ κΌ­ ν•œλ²ˆμ”© μžλ°”μ˜ νŠΉμ§•, 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μœΌλ‘œ λ°°μ›Œλ³Έ κ²½ν—˜μ΄ μžˆμ„ 것이닀. λ‚˜μ˜ 경우 μ§€κΈˆκΉŒμ§€ μ΄ν•΄ν•˜κΈ°λ₯Ό λŒ€μΆ© λΆ€λͺ¨ νƒ€μž…μ— μžμ‹ νƒ€μž…μ„ λΌμ›Œλ„£μ„ 수 μžˆλ‹€ μ •λ„λ‘œ μ•Œκ³  μžˆμ—ˆλ‹€.

이λ₯Ό 처음 배울 λ•Œ μ—¬λŠ μ‚¬λžŒλ“€κ³Ό 같이 μ§μ‚¬κ°ν˜• - μ •μ‚¬κ°ν˜•μ΄λΌλŠ” μ˜ˆμ‹œλ‘œ λ°°μ› μ—ˆλ‹€. 이λ₯Όν…Œλ©΄ μ½”λ“œλ‘œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό 같을 것이닀.

public class Rectangle {
    private int width;
    private int height;

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }
}

public class Square extends Rectangle {

    @Override
    public void setWidth(final int width) {
        super.setWidth(width);
        super.setHeight(width);
    }

    @Override
    public void setHeight(final int height) {
        super.setWidth(height);
        super.setHeight(height);
    }
}

μ •μ‚¬κ°ν˜•μ€ μ§μ‚¬κ°ν˜•μ΄λ‹ˆ 이λ₯Ό μ½”λ“œλ‘œ ν‘œν˜„ν•˜λ©΄ μœ„μ™€ 같이 되고, Rectangle μ΄λž€ νƒ€μž…μ— Square 객체λ₯Ό λΌμ›Œλ„£μ„ 수 μžˆλ‹€λŠ” μ •λ„λ‘œ λ‚˜λŠ” λ‹€ν˜•μ„±μ„ μ΄ν•΄ν•˜κ³  μžˆμ—ˆλ‹€. 그리고 쑰금 더 μ‹œκ°„μ΄ μ§€λ‚˜μ„œ μ–΄λ””μ„ κ°€ SOLID λΌλŠ” 것을 쀏어 λ“€μ—ˆμ„ λ•Œ, μœ„μ˜ μ˜ˆμ‹œκ°€ 객체 μ§€ν–₯ μ„€κ³„μ˜ 원칙 κ·Έ μ€‘μ—μ„œλ„ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙(LSP)λ₯Ό μ§€ν‚€μ§€ μ•Šκ³  μžˆλ‹€λŠ” 사싀을 μ•Œκ²Œ λ˜μ—ˆλ‹€. (κ·Έ μ΄μœ μ— λŒ€ν•΄μ„  이 글이 도움이 많이 λ˜μ—ˆλ‹€.)

μ•ŒμŒμ•ŒμŒ 자투리 지식을 μŠ΅λ“ν• μˆ˜λ‘, λ‚˜μ—κ² 확신보단 ν˜Όλž€λ§Œμ΄ κ°€μ€‘λ˜μ—ˆλ‹€. β€œκ·Έλž˜μ„œ 이 SOLID λΌλŠ” 원칙을 λ‹€ μ§€ν‚€λŠ”κ²Œ ν˜„μ‹€μ μœΌλ‘œ κ°€λŠ₯ν•œκ±΄κ°€? 이러면 상속이고 μ»΄ν¬μ§€μ…˜μ΄κ³  λ­”κ°€ μ œλŒ€λ‘œ μ“°κΈ° λ„ˆλ¬΄ νž˜λ“€ 것 같은데?” λΌλŠ” μƒκ°λ§Œ κ°€μ§€κ²Œ λ˜μ—ˆλ‹€. κ·Έ μ΄ν›„λ‘œλŠ” μ •μ œλœ 객체 μ§€ν–₯ 섀계에 μ˜ν•œ μ½”λ“œλ³΄λ‹€λŠ” ν”νžˆλ“€ λ§ν•˜λŠ” Best Practice의 λͺ¨μ–‘을 λ”°λΌν•˜κΈ°μ— κΈ‰κΈ‰ν–ˆλ˜ 것 κ°™λ‹€. μ λ‹Ήνžˆ λ”°λΌν•˜λ‹ˆκΉŒ μ λ‹Ήνžˆ 이쁘고 μ λ‹Ήνžˆ ν΄λ¦°ν•˜κ³  μœ μ§€λ³΄μˆ˜λ„ μ λ‹Ήνžˆ 되고(λ¬Όλ‘  아무도 μ•žμ˜ λ‚΄μš©μ„ μΈμ •ν•œ 적은 μ—†μŒγ…‹γ…‹) 또 μ λ‹Ήνžˆ λŒμ•„κ°€λ‹ˆκΉŒ 점점 μ½”λ“œλ ˆλ²¨μ˜ μ •λ°€ν•œ 섀계와 νŒ¨ν„΄μ—λŠ” 관심이 μ—†μ–΄μ§€κ³ , μ•„ν‚€ν…μ²˜λ‚˜ 인프라적인 λΆ€λΆ„μ—μ„œμ˜ μ„€κ³„μ—λ§Œ 관심을 κ°€μ‘Œλ˜ 것 κ°™λ‹€.

쑰금의 μ‹œκ°„μ΄ 흘러 이 κ°•μ˜λ₯Ό λ§Œλ‚˜κ³ μ„œμ•Ό SOLID에 λŒ€ν•œ 의문, λ‹€ν˜•μ„±μ— λŒ€ν•œ μ˜λ¬Έμ„ 거의 μ™„λ²½ν•˜κ²Œ ν’€ 수 μžˆμ—ˆλ˜ 것 κ°™λ‹€. 또, 이 κ°•μ˜ 덕뢄에 λ‹€μ‹œ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ— 관심도 생기고 ν•™μŠ΅μ— λŒ€ν•œ μ˜μ§€λ„ 생겼닀.

사섀이 κΈΈμ—ˆλ‹€. 이 κ°•μ˜μ—μ„œλŠ” μ§μ‚¬κ°ν˜• - μ •μ‚¬κ°ν˜• 예제처럼 μ‹€μƒν™œμ˜ 상황을 λΉ—λŒ€μ–΄μ„œ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°, 특히 λ‹€ν˜•μ„±μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ€€λ‹€. 천천히 μ‚΄νŽ΄λ³΄μž.

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

λ‹€ν˜•μ„±μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄μ„œ κ°€μž₯ μ€‘μš”ν•œ κ°œλ…μ€ μ—­ν• κ³Ό κ΅¬ν˜„μ΄λ‹€. 예λ₯Ό λ“€μ–΄ μš΄μ „μžμ™€ μžλ™μ°¨λ‘œ μƒκ°ν•΄λ³΄μž.

driver-car.png

μ–΄λ–€ μš΄μ „μž 역할을 맑은 μ‚¬λžŒμ΄ μžλ™μ°¨ 역할을 μ‚¬μš©ν•œλ‹€κ³  생각할 수 μžˆλ‹€. 그리고 μ € μš΄μ „μž μ—­ν• μ—λŠ” κ΅¬ν˜„μœΌλ‘œμ¨ λ‚΄κ°€ λ“€μ–΄κ°ˆ μˆ˜λ„, μ•„λ‹ˆλ©΄ λ‹€λ₯Έ λˆ„κ΅°κ°€κ°€ λ“€μ–΄κ°ˆ μˆ˜λ„ μžˆλ‹€. λ™μΌν•˜κ²Œ μžλ™μ°¨ μ—­ν• μ—λŠ” κ΅¬ν˜„μœΌλ‘œμ¨ μ†Œλ‚˜νƒ€κ°€ λ“€μ–΄κ°ˆ μˆ˜λ„, μ•„λ‹ˆλ©΄ 운만 μ’‹μœΌλ©΄ ν…ŒμŠ¬λΌ λͺ¨λΈ 3 ν˜Ήμ€ λ²€μΈ  C ν΄λž˜μŠ€κ°€ λ“€μ–΄κ°ˆ μˆ˜λ„ μžˆλ‹€.

μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜λŠ” 것은 κ·Έλƒ₯ μš΄μ „μž κ΅¬ν˜„κ³Ό μžλ™μ°¨ κ΅¬ν˜„λ§Œμ„ κ°–λŠ” 것에 λΉ„ν•΄μ„œ λ§Žμ€ μž₯점을 κ°€μ§„λ‹€.

μ–΄λ–€ μž₯점을 κ°€μ§€λŠ”λ°?

보톡 μ΄λŸ¬ν•œ νŒ¨ν„΄ ν˜Ήμ€ λͺ¨λΈμ—μ„œ 무언가λ₯Ό μ‚¬μš©ν•˜λŠ” 츑을 ν΄λΌμ΄μ–ΈνŠΈ(Client)라 ν•œλ‹€. μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” μš΄μ „μžκ°€ ν΄λΌμ΄μ–ΈνŠΈκ°€ λœλ‹€.

μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜λ©΄ λ‹€μŒμ˜ μž₯점을 κ°€μ§€κ²Œ λœλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒ(μžλ™μ°¨)의 μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄ λœλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒ(μžλ™μ°¨)의 λ‚΄λΆ€ κ΅¬μ‘°λ‚˜ ꡬ체적인 λ‚΄λΆ€ κ΅¬ν˜„μ„ λͺ°λΌλ„ λœλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒ(μžλ™μ°¨)의 λ‚΄λΆ€ κ΅¬μ‘°λ‚˜ ꡬ체적 λ‚΄λΆ€ κ΅¬ν˜„μ΄ λ³€κ²½λ˜μ–΄λ„ 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒ(μžλ™μ°¨)의 κ΅¬ν˜„ 자체λ₯Ό 변경해도(μžλ™μ°¨λ₯Ό 바꿔도) 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.

μš°λ¦¬κ°€ μžλ™μ°¨λ₯Ό μš΄μ „ν•œλ‹€κ³  ν•˜μž.

  • λ©΄ν—ˆλ§Œ μ†Œμ§€ν•˜κ³  μžˆλ‹€λ©΄ λŒ€μΆ© 가속 νŽ˜λ‹¬μ„ 밟으면 μ•žμœΌλ‘œ κ°€κ³ , 브레이크λ₯Ό 밟으면 λ©ˆμΆ”λŠ” μžλ™μ°¨μ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)λ₯Ό μˆ™μ§€ν•˜κ³  있기 λ•Œλ¬Έμ— μžλ™μ°¨μ˜ μ’…λ₯˜(ꡬ체적 κ΅¬ν˜„)에 λŒ€ν•΄μ„œλŠ” λͺ¨λ₯΄λ”라도 μš΄μ „μ„ ν•  수 μžˆλ‹€.
  • μ†Œλ‚˜νƒ€μ˜ μ—”μ§„ μ’…λ₯˜κ°€ 무엇이고 νƒ€μ΄μ–΄λŠ” 무엇을 μ“°λ©° λ°°κΈ°λŸ‰μ΄ λͺ‡μΈμ§€μ— λŒ€ν•΄ μ „ν˜€ μ•Œ ν•„μš”κ°€ μ—†λ‹€.
  • λ§Œμ•½ μ •λΉ„λ₯Ό λ°›μœΌλŸ¬ κ°€μ„œ 브레이크λ₯Ό μ‹ ν˜•μœΌλ‘œ λ°”κΎΈκ±°λ‚˜, 배터리λ₯Ό 바꾸더라도 μš΄μ „ν•˜λŠ” κΈ°λ³Έ κΈ°λŠ₯ μžμ²΄μ—λŠ” 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.
  • 쑰금 κ·Ήλ‹¨μ μœΌλ‘œ μ†Œλ‚˜νƒ€λ₯Ό ν…ŒμŠ¬λΌ λͺ¨λΈ 3둜 변경을 ν•˜λ”λΌλ„, μš°λ¦¬λŠ” μš΄μ „μ„ ν•  수 μžˆλ‹€.

이와 같이 μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜λ©΄ ꡉμž₯히 μœ μ—°ν•΄μ§€κ³  변경도 νŽΈλ¦¬ν•΄μ§„λ‹€.

μžλ°”μ—μ„œλŠ” μ–΄λ–»κ²Œ ν•΄?

μžλ°”μ—μ„œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜κΈ° μœ„ν•΄, μžλ°” μ–Έμ–΄κ°€ μ§€μ›ν•˜λŠ” λ‹€ν˜•μ„±μ„ ν™œμš©ν•œλ‹€.

역할은 μΈν„°νŽ˜μ΄μŠ€λ‘œ, κ΅¬ν˜„μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀둜 μž‘μ„±ν•  수 μžˆλ‹€.

λ”°λΌμ„œ 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ 섀계 λ‹¨κ³„μ—μ„œλΆ€ν„° λͺ…ν™•νžˆ 뢄리해야 ν•œλ‹€. 그리고 λ‹Ήμ—°νžˆ **μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)**λ₯Ό λ¨Όμ € λΆ€μ—¬ν•˜κ³ , κ·Έ 역할을 μˆ˜ν–‰ν•  수 μžˆλŠ” ꡬ체적인 κ΅¬ν˜„μ„ μž‘μ„±ν•˜λŠ” 편이 λ‚˜μ„ 것이닀.

그리고 λ‹Ήμ—°ν•˜κ²Œ, μΈν„°νŽ˜μ΄μŠ€μ— 변경이 μΌμ–΄λ‚˜λŠ” μˆœκ°„ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λ“€μ˜ κ΅¬ν˜„μ„ λͺ¨λ‘ μˆ˜μ •ν•΄μ•Όν•  κ²ƒμ΄λ‹ˆ 섀계 λ‹¨κ³„μ—μ„œλΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ•ˆμ •μ μœΌλ‘œ 잘 섀계해야 ν•  것이닀.

λ‹€ν˜•μ„±μ˜ λ³Έμ§ˆμ€?

κ·Έλ ‡λ‹€λ©΄ 이 λ‹€ν˜•μ„±μ˜ λ³Έμ§ˆμ€ 무엇이라고 ν•  수 μžˆμ„κΉŒ? μ•„λ¬΄λž˜λ„,

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ μ‹œμ μ—μ„œ μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€κ°€ μ†Œλ‚˜νƒ€, κ·Έλžœμ €, λ§ˆν‹°μ¦ˆκ°€ μžˆλ‹€κ³  ν•  λ•Œ, μ‹€ν–‰ μ‹œμ μ— μ›ν•˜λŠ” λŒ€λ‘œ 차쒅을 κ³ λ₯Ό 수 μžˆλ‹€.
  • μ„œλ‘œ ν΄λΌμ΄μ–ΈνŠΈ - μ„œλ²„κ°€ λ˜λŠ” κ°μ²΄κ°„μ˜ ν˜‘λ ₯ κ΄€κ³„μ—μ„œ, ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ˜ ꡬ체적인 κ΅¬ν˜„μ΄ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ μ˜μ‘΄ν•˜κ²Œ 되기 λ•Œλ¬Έμ— μ„œλ²„μ˜ λ‚΄λΆ€ κ΅¬ν˜„μ„ μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.

μ •λ„λ‘œ 정리할 수 μžˆμ„ 것 κ°™λ‹€.

그럼 λ‹€ν˜•μ„±λ§Œ 있으면 SOLID μ§€ν‚€κΈ° γ„±γ„΄?

ν•œλ§ˆλ””λ‘œ μ΄μ•ΌκΈ°ν•˜λ©΄ γ…‚γ„±γ„΄ γ…‹γ…‹

λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜λ”λΌλ„ 개방-폐쇄 원칙(OCP)와 의쑴 관계 μ—­μ „ 원칙(DIP)λ₯Ό 지킬 수 μ—†λ‹€.

예λ₯Ό λ“€μ–΄ μš΄μ „μž μ—­ν• μ˜ κ΅¬ν˜„μœΌλ‘œ DriverA κ°€ 있고, μžλ™μ°¨ μ—­ν• μ˜ κ΅¬ν˜„μœΌλ‘œλŠ” μœ„μ˜ 3κ°€μ§€λ₯Ό κ·ΈλŒ€λ‘œ ν™œμš©ν•œλ‹€κ³  ν•˜μž. 그러면 DriverA λ‚΄λΆ€μ—μ„œλŠ” μžλ™μ°¨λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•  것이닀. 자, μ›λž˜ μžλ™μ°¨λ‘œ μ†Œλ‚˜νƒ€λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ‹€κ³  ν•˜μž.

public class DriverA implements Driver {
    private Car driverACar = new Sonata();
}

그리고 이 μ°¨λ₯Ό ν…ŒμŠ¬λΌ λͺ¨λΈ 3둜 λ³€κ²½ν•˜κ³  μ‹Άλ‹€κ³  ν•˜μž. μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

μ–΄μ©” 수 μ—†λ‹€. ν΄λΌμ΄μ–ΈνŠΈμΈ DriverA λ‚΄λΆ€μ—μ„œ νƒˆ μžλ™μ°¨λ₯Ό 직접 λ°”κΏ”μ£Όμ–΄μ•Ό ν•œλ‹€.

public class DriverA implements Driver {
    // private Car driverACar = new Sonata();
    private Car driverACar = new TeslaModel3();
}

μ‚¬μš©ν•˜λŠ” κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜κΈ° μœ„ν•΄ ν΄λΌμ΄μ–ΈνŠΈμΈ DriverA 의 μ½”λ“œλ„ λ³€κ²½ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³  λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Ό ν•œλ‹€λŠ” OCPλ₯Ό μ§€ν‚€μ§€ λͺ»ν•œλ‹€. λ˜ν•œ, DriverA λŠ” CarλΌλŠ” μΈν„°νŽ˜μ΄μŠ€μ—λ„ μ˜μ‘΄ν•˜μ§€λ§Œ λ™μ‹œμ— Sonata 와 TeslaModel3 에도 λ™μ‹œμ— μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— DIPλ§ˆμ € μœ„λ°˜ν•œλ‹€.

μ•„λ‹ˆ 그럼 어케함;;

λ‹€ν˜•μ„±λ§ŒμœΌλ‘  OCP와 DIPλ₯Ό 지킬 수 μ—†λ‹€λŠ” μŠ¬ν”ˆ 사싀을 ν™•μΈν–ˆλ‹€. SOLIDλ₯Ό μ§€ν‚€κΈ° μœ„ν•΄μ„  ν™•μ‹€νžˆ λ­”κ°€ 더 ν•„μš”ν•˜λ‹€.

μŠ€ν”„λ§κ³Ό 객체 μ§€ν–₯

μŠ€ν”„λ§κ³Ό 객체 μ§€ν–₯의 κ΄€κ³„μ—μ„œλ„ λ‹€ν˜•μ„±μ΄ κ°€μž₯ μ€‘μš”ν•œ ν‚€μ›Œλ“œμ΄λ‹€. μŠ€ν”„λ§μ€ λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•΄μ„œ μ΄μš©ν•  수 있게 ν”„λ ˆμž„μ›Œν¬λ‹¨μ—μ„œ 개발자λ₯Ό 도와쀀닀.

μŠ€ν”„λ§μ΄λΌ ν•˜λ©΄ ꡉμž₯히 유λͺ…ν•œ ν‚€μ›Œλ“œμΈ μ œμ–΄μ˜ μ—­μ „(IoC)λ‚˜ 의쑴 관계 μ£Όμž…(DI)λŠ” λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄μ„œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λΆ„λ¦¬ν•˜κ³ , λ‹€λ£° 수 μžˆλ„λ‘ 지원해쀀닀. 그리고 의쑴 관계 μ£Όμž…(DI)κ³Ό DI μ»¨ν…Œμ΄λ„ˆ μ œκ³΅μ„ 톡해 λ‹€ν˜•μ„± 뿐 μ•„λ‹ˆλΌ OCP, 그리고 DIP도 지킬 수 있게 도와쀀닀. 이 말인 μ¦‰μŠ¨ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ½”λ“œ λ³€κ²½ 없이 κΈ°λŠ₯을 ν™•μž₯ν•  수 있게 λœλ‹€λŠ” λœ»μ΄λ‹€. μ΄λ ‡κ²Œ μŠ€ν”„λ§μ„ μ“°λ©΄ 마치 λΆ€ν’ˆμ„ κ΅μ²΄ν•˜λ“―μ΄, μ‘°λ¦½ν•˜λ“―μ΄ κ°œλ°œμ„ ν•  수 μžˆλ‹€.

λ‹€μŒμ€

이 κ°•μ˜μ—μ„œλ„ μ‹€μŠ΅μ„ ν†΅ν•΄μ„œ κ°œλ…μ„ μ΄ν•΄ν•˜λŠ” λ‚΄μš©μ΄ λ°”λ‘œ λ”°λΌμ˜¨λ‹€. μ½”λ”©κ³Ό κ΄€λ ¨λœ 뢀뢄을 λ„ˆλ¬΄ μ°Έμ‘°ν•˜κΈ°μ—λŠ” ν¬μŠ€νŠΈκ°€ 길어지기도 ν•˜κ³ , λ„ˆλ¬΄ κ°•μ‚¬λΆ„μ˜ μ„€λͺ… λ…Έν•˜μš°λ₯Ό μœ μΆœν•˜λŠ” 죄책감이 μžˆμ–΄μ„œ 코딩을 ν•˜λŠ” νŒŒνŠΈλŠ” μ œμ™Έν•˜λ € ν•œλ‹€. (μ§„μ§œ λͺ…κ°•μ˜μ΄λ‹ˆ κΆκΈˆν•˜μ‹  뢄듀은 κΌ­ 듀어보길 λ°”λž€λ‹€.)

λ‹€μŒ ν¬μŠ€νŠΈμ—μ„œλŠ” IoC, DI, 그리고 μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•œ λ‚΄μš©μ„ 정리해 보도둝 ν•˜κ² λ‹€.

끝.