πŸ“– [Spring] πŸ’» μŠ€ν”„λ§ 핡심원리 - 1. 객체 지ν–₯ 섀계와 μŠ€ν”„λ§

πŸ’» [Spring] μŠ€ν”„λ§ 핡심원리 - 객체 지ν–₯ 섀계와 μŠ€ν”„λ§

μ•ˆλ…•ν•˜μ„Έμš”. πŸ‘‹

μŠ€ν”„λ§μœΌλ‘œ μ—¬λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό κ°œλ°œν–ˆμ—ˆλŠ”λ° 

문득 μŠ€ν”„λ§ 자체 핡심 원리에 λŒ€ν•œ 볡슡이 ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ κΉ€μ˜ν•œλ‹˜μ˜ μŠ€ν”„λ§ 핡심원리 κ°•μ˜λ₯Ό λ“€μœΌλ©° 

μŠ€ν”„λ§μ„ μ™œ μ‚¬μš©ν•΄μ•Όν•˜λŠ”μ§€μ™€

μŠ€ν”„λ§ 핡심원리에 λŒ€ν•΄ ν•™μŠ΅ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 

첫번째 μ‹œκ°„μž…λ‹ˆλ‹€.

1. μŠ€ν”„λ§ 역사

  • μžλ°” ν‘œμ€€ 기술둜 EJB λΌλŠ” 것이 μžˆμ—ˆμŒ 이둠도 μ’‹κ³  μ—¬λŸ¬κ°€μ§€ μ§€μ›λ˜λŠ” 것이 μƒλ‹Ήνžˆ λ§Žμ•˜μœΌλ‚˜ λΉ„μš©μ΄ μƒλ‹Ήνžˆ λΉ„μ‹Έκ³  무엇보닀도 μ–΄λ ΅κ³  λ³΅μž‘ν•˜κ³  λŠλ ΈμŠ΅λ‹ˆλ‹€.

  • 두 λͺ…μ˜ 개발자(Gavin King, Road Johnson)κ°€ EJBλ₯Ό λΉ„νŒν•˜λ©΄μ„œ λ§Œλ“  것이 각각 ν•˜μ΄λ²„λ„€μ΄νŠΈμ™€ μŠ€ν”„λ§μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

  • λ‘œλ“œ 쑴슨이 3λ§Œμ€„μ˜ μŠ€ν”„λ§ κΈ°λ°˜μ½”λ“œμ™€ ν•¨κ»˜ EJBλ₯Ό λΉ„νŒν•˜λŠ” 책을 집필함 이 기반 μ½”λ“œλ₯Ό 톡해 μŠ€ν”„λ§μ΄ μ„ΈμƒμœΌλ‘œ λ‚˜μ˜€κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • μŠ€ν”„λ§μ˜ 어원은 J2EE(EJB)λΌλŠ” κ²¨μšΈμ„ λ„˜μ–΄ λ΄„! μƒˆλ‘œμš΄ μ‹œμž‘μ΄λΌλŠ” 뜻으둜 μ§€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.


2. μŠ€ν”„λ§ μ΄λž€?

μŠ€ν”„λ§μ€ 객체 지ν–₯ 언어인 μžλ°” μ–Έμ–΄ 기반의 ν”„λ ˆμž„μ›Œν¬ μž…λ‹ˆλ‹€. 객체 지ν–₯이 가진 νŠΉμ§•μ„ κ°€μž₯ 크게 살릴 수 μžˆλŠ” 것이 μŠ€ν”„λ§μž…λ‹ˆλ‹€. 쒋은 객체 지ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. 이것이 μŠ€ν”„λ§μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.

2-1 μŠ€ν”„λ§ λΆ€νŠΈλž€?

  • μŠ€ν”„λ§μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 지원, μ΅œκ·Όμ—λŠ” 기본으둜 μ‚¬μš©
  • β€» λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ 생성
  • β€» Tomcat 같은 μ›Ή μ„œλ²„λ₯Ό λ‚΄μž₯ν•΄μ„œ λ³„λ„μ˜ μ›Ή μ„œλ²„λ₯Ό μ„€μΉ˜ν•˜μ§€ μ•Šμ•„λ„ 됨
  • μ†μ‰¬μš΄ λΉŒλ“œ ꡬ성을 μœ„ν•œ starter 쒅속성 제곡
  • μŠ€ν”„λ§κ³Ό 3rd parth(μ™ΈλΆ€) 라이브러리 μžλ™ ꡬ성
  • λ©”νŠΈλ¦­, μƒνƒœν™•μΈ, μ™ΈλΆ€ ꡬ성 같은 ν”„λ‘œλ•μ…˜ μ€€λΉ„ κΈ°λŠ₯ 제곡
  • 관둀에 μ˜ν•œ κ°„κ²°ν•œ μ„€μ •

3. 쒋은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

3-1 객체 지ν–₯ νŠΉμ§•

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

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

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž¨μ„ β€»μœ μ—°ν•˜κ³  변경이 μš©μ΄ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— 많이 μ‚¬μš©λœλ‹€.

3-3 λ‹€ν˜•μ„±μ˜ μ€‘μš”λ„!

λ‹€ν˜•μ„±μ˜ 핡심은 세상을 μ—­ν• κ³Ό κ΅¬ν˜„μœΌλ‘œ λ‚˜λˆ„λŠ” 것이닀. ex) μ—­ν• - μžλ™μ°¨ κ΅¬ν˜„ - μ•„λ°˜λ–Ό , ν…ŒμŠ¬λΌ, k3 , 포λ₯΄μ‰ λ“±λ“± μ‹€μ œ κ΅¬ν˜„ μžλ™μ°¨κ°€ μ•„λ°˜λ–Όμ΄λ˜ ν…ŒμŠ¬λΌμ΄λ˜ k3이던 κ²°κ΅­ λ³Έ 역할은 μžλ™μ°¨ 역할이닀.

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 역할은 μΈν„°νŽ˜μ΄μŠ€, κ΅¬ν˜„μ€ κ΅¬ν˜„ 객체이닀.

  • 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리
  • 객체 μ„€κ³„μ‹œ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)을 λ¨Όμ € λΆ€μ—¬ν•˜κ³ , κ·Έ 역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체 λ§Œλ“€κΈ°

λ‹€ν˜•μ„±μ˜ 본질

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

단! μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ•ˆμ •μ μœΌλ‘œ 잘 μ„€κ³„ν•˜λŠ” 것이 μ€‘μš”!!!

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

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

4. 쒋은 객체 지ν–₯ μ„€κ³„μ˜ 5가지 원칙(SOLID)

  • SRP: 단일 μ±…μž„ 원칙(single responsibility principle)

      -β€» ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•„ν•œλ‹€.
      -ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ μ±…μž„μ΄λΌλŠ” 것은 λͺ¨ν˜Έν•˜λ‹€. (클 μˆ˜λ„ 있고 μž‘μ„ μˆ˜λ„ 있기 λ•Œλ¬Έ)
      - κ²°κ΅­ μ€‘μš”ν•œ 기쀀은 변경이닀. 변경이 μžˆμ„λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ 것
    
  • β€» OCP: 개방-폐쇄 원칙 (Open/closed principle)

      -β€» μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Όν•œλ‹€.
      - λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄λ³΄μž
      - μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒˆλ‘œμš΄ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯ κ΅¬ν˜„ κ°€λŠ₯
        
      β€» 문제점
      순수 μžλ°”λ₯Ό μ΄μš©ν•΄ κ°œλ°œν•  λ•Œ κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό ν•œλ‹€.
      λΆ„λͺ…νžˆ λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆμ§€λ§Œ OCP 원칙을 지킬 수 μ—†λ‹€.!
       
      ex) MemberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½”λ“œ
          MemberRepository m = new JdbcMemberRepository(); //λ³€κ²½ μ½”λ“œ
            
      이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•˜λ‹€.
      => 이λ₯Ό ν•΄κ²°ν•΄μ£ΌλŠ” 것이 μŠ€ν”„λ§! (μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ , IoC, DI λ“±λ“±)
    
  • LSP: λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 (Liskov substitution principle)

      - β€»ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Όν•œλ‹€.
      - κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄ μΈν„°νŽ˜μ΄μŠ€(μ—­ν• )의 κ·œμ•½μ„ λ§žμΆ°μ€˜μ•Όν•œλ‹€.
    
  • ISP: μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (Interface segregation principle)

      - νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€
      - μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ -> μš΄μ „ μΈν„°νŽ˜μ΄μŠ€, μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 뢄리
      - μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ -> μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈ, 정비사 ν΄λΌμ΄μ–ΈνŠΈλ‘œ 뢄리
      - λΆ„λ¦¬ν•˜λ©΄ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄κ°€ 변해도 μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 주지 μ•ŠμŒ
      - μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…확해지고, λŒ€μ²΄ κ°€λŠ₯성이 높아진닀.
    
  • β€» DIP: μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙 (Dependency inversion principle)

      - ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” "좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€." μ˜μ‘΄μ„± μ£Όμž…μ€ 이원칙을 λ”°λ₯΄λŠ” 방법 쀑 ν•˜λ‚˜
      - β€»μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” 뜻
      - 역할에 의쑴 해야함
        
      β€» 문제점
      그런데 OCPμ—μ„œ μ„€λͺ…ν•œ MemberServiceλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€λ§Œ, κ΅¬ν˜„ ν΄λž˜μŠ€λ„
      λ™μ‹œμ— μ˜μ‘΄ν•œλ‹€.
      - MemberService ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬ν˜„ 클래슀λ₯Ό 직접 선택
      - MemberRepository m = new MemoryMemberRepository();
      - β€» DIP μœ„λ°˜
    

핡심 정리!

  • 객체 지ν–₯의 핡심은 λ‹€ν˜•μ„±
  • λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” μ‰½κ²Œ λΆ€ν’ˆμ„ κ°ˆμ•„ λΌμš°λ“―μ΄ κ°œλ°œν•  수 μ—†λ‹€.
  • λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ„ ν•¨κ»˜ λ³€κ²½λœλ‹€.
  • β€» λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP, DIP λ₯Ό 지킬 수 μ—†λ‹€.

5. 객체 지ν–₯ 섀계와 μŠ€ν”„λ§

객체 지ν–₯이 가진 νŠΉμ§•μ„ κ°€μž₯ 크게 살릴 수 μžˆλŠ” 것이 μŠ€ν”„λ§μž…λ‹ˆλ‹€. 쒋은 객체 지ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. 이것이 μŠ€ν”„λ§μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.

쒋은 객체 지ν–₯κ°œλ°œμ„ ν•˜κΈ° μœ„ν•΄μ„œ OCP, DIP 원칙을 μ§€μΌœμ•Όν•©λ‹ˆλ‹€.

β€» OCP, DIP μ›μΉ™κΉŒμ§€ 지킬 수 있게 μ§€μ›ν•΄μ£ΌλŠ” 것이 μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬ μž…λ‹ˆλ‹€.

μŠ€ν”„λ§ν”„λ ˆμž„μ›Œν¬μ—μ„œ DI(Dependency Injection): 의쑴 관계, μ˜μ‘΄μ„± μ£Όμž… DI μ»¨ν…Œμ΄λ„ˆ 제곡 등을 톡해 μ§€μ›ν•΄μ€λ‹ˆλ‹€.

끝

μŠ€ν”„λ§μ„ 더 μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ κΉ€μ˜ν•œλ‹˜μ˜ μŠ€ν”„λ§ 핡심 원리 κ°•μ˜λ₯Ό λ“€μœΌλ©° μ •λ¦¬ν•œ
첫번째 ν¬μŠ€νŠΈμ˜€μŠ΅λ‹ˆλ‹€.
κ°μ‚¬ν•©λ‹ˆλ‹€. πŸ™

Reference

κΉ€μ˜ν•œλ‹˜μ˜ μŠ€ν”„λ§ 핡심원리

Written on April 15, 2021