코딩조각

[java] IoC란? DI란? 객체지향 프로그래밍이란?(정리)

밍튜 2022. 11. 24. 18:22

목표

  • Spring IoC, DI가 무엇인지 이해한다
  • Spring DI의 장단점을 이해한다
  • Bean이란 무엇이고 container에서 어떻게 관리되고 생명주기는 어떻게 되는지 이해한다

 

IoC(Inversion of Control)란 무엇인가

 

  • 문자 그대로 해석하면 ‘제어의 역전’이라는 뜻
  • 개발자가 직접 객체를 관리하지 않고 스프링 컨테이너에서 직접 객체를 생성하여 해당 객체에 주입 시켜주는것.
  • 개발자가 직접 의존성을 제어하던것을 어떤 매개체에게 의존성의 주체를 일임하여 제어의 역전이 발생. 여기서 매개체를 IoC container라고 한다.
  • IoC contatiner : 제어권을 사용하여 의존성을 관리, 인스턴스를 생성하여 주입, 메모리를 해제하는 역할까지 함

DI(Dependency Injection)이란?

 

  • 의존성 주입이란 ioc container라는 매개체를 두고 필요한 모듈을 등록해둠(Bean)
  • 그리고 사용처에서 직접 생성하는것이 아니라 필요할때마다 컨테이너에서 의존성이있는 모듈들을 주입해줌
  • 의존하는 모듈들의 생성과 해제, 일련의 제어과정을 ioc container기능을 포함하는 프레임워크에게 일임함으로써 제어의역전이 발생함

 

DI의 장점
  • 의존성 감소
  • 코드의 양 감소
  • 테스트 용이

 

 

객체지향 프로그래밍이란?

 

  • 프로그램을 상태(state)와 행위(behave)로 이루어진 객체라는 기본단위로 나누고, 이 객체들간의 상호작용을 통해 프로그램을 설계하고 개발하는것
  • 절차지향: 어떤기능을 어떤 순서로 처리하는가에 초점을 맞춘 모델링
  • 객체지향: 객체를 도출하고 각각의 역할을 정의해 나가는것에 초점을 맞춤
  • 재사용이 용이하고, 생산성이 높으며, 유지보수가 용이한 장점
  • 설계에 시간이 오래걸리고 실행속도가 느린 단점

 

객체 지향 프로그래밍의 특징

 

  1. 추상화(Abstraction)
    - 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
    - 객체지향적 관점에서는 '클래스를 정의하는것'을 추상화라고 할 수 있다.
  2. 캡슐화(Encapsulation)
    - 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 숨길 수 있다.
    - 객체가 독립적으로 역할을 할 수 있도록 속성과 기능을 하나로 하나로 묶어 관리하는 것.
    - 외부와 상호작용시 상태를 메소드를 이용하여 통신을 한다.
  3. 상속성(Inheritance)
    - 하나의 클래스가 가진 특징(메소드, 데이터)를 다른 클래스가 그대로 물려받는것.
    - 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는것.
    - 기존 코드를 재활용해서 사용함으로 객체지향 방법의 중요 기능중 하나
  4. 다형성(Polymorphism)
    - 역할(interface)과 구현(implements)를 분리하여 오버라이딩(overrideing)을 통해 서비스의 구현 기능을 유연하게 변경, 확장이 가능
    - 하나의 변수 또는 함수가 상황에 따라 다른 의미로 응답하는 것.
    - 스프링같은 DI컨테이너를 이용하면 다형성을 극대화 하여 OCP, DIP 설계원칙을 잘 지키면서도 구현체를 편리하게 변경, 확장이 가능하다.

 

SOLID 객체지향 5원칙이란?

 

  1. Single Responsibility P : 하나의 모듈은 한가지 책임을 가져야한다.

  2. Open Close P : 확장에는 Open되어있고 수정에는 Close되어야 함. 요구사항이 변경될때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할수 있어야하며, 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할수 있어야함.
  3. Liskov Substitution P :하위 클래스는 상위 클래스를 대체할수 있어야함. 상위타입의 퍼블릭 인터페이스를 통해 서브클래스를 사용할수 있어야한다는 원칙.

  4. Interface Segregation P : 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는것. 인터페이스는 세분화하여 클라이언트의 목적에 맞는 인터페이스만 제공해야함

  5. Dependency Inversion P : 변하기 쉬운것에 의존하기 보다는 추상화된 인터페이스나 상위클래스에 의존하여 객체의 변화에 영향을 받지않게 . 상위클래스, 인터페이스, 추상클래스는 변할 확률이 적기때문에 이런것에 의존해야한다는 원칙.