스프링 등장 배경, 객체지향 보충자료
1. OCP(Open/Closed Principle, 개방-폐쇄 원칙)
1.1 OCP란?
소프트웨어 요소는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다는 원칙입니다.
즉, 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 합니다.
이 원칙은 코드의 유지보수성을 높이고, 시스템의 유연성을 증가시킵니다.
1.2 OCP와 다형성
OCP를 구현하는 데 중요한 개념이 **다형성(Polymorphism)**입니다.
예를 들어, 붕어빵 틀을 생각해봅시다.
붕어빵 틀(기본 구조)은 그대로 두되, 안에 넣는 재료만 바꿔도 다른 맛의 붕어빵을 만들 수 있습니다.
역할과 구현을 분리해 놓으면, 새로운 재료(새로운 클래스)를 추가하더라도 기존 코드를 수정할 필요가 없습니다.
예제: 인터페이스를 활용한 설계
1.3 OCP 구현 시 주의점
확장성을 확보하려면 새로운 클래스(예: 새로운 재료)만 추가하고, 기존 코드는 건드리지 않도록 설계해야 합니다.
객체 생성 및 연관 관계 설정은 별도의 설정자(조립자)가 필요합니다.
예: 스프링 프레임워크가 이 역할을 수행합니다.
3. DIP(Dependency Inversion Principle, 의존성 역전 원칙)
3.1 DIP란?
고수준 모듈은 저수준 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 한다는 원칙입니다.
의존성은 항상 **구체화(Concrete)**가 아닌 **추상화(Abstract)**에 맞춰야 합니다.
즉, 구현 클래스가 아닌 인터페이스에 의존하도록 설계해야 합니다.
3.2 DIP와 의존성 주입(DI)
DIP는 객체 간 의존성을 인터페이스로 분리하는 설계를 요구합니다.
**의존성 주입(DI)**은 DIP를 구현하는 데 사용되는 방법 중 하나입니다.
의존성을 외부에서 주입받아, 구체 클래스가 아닌 인터페이스에 의존하도록 만듭니다.
DIP를 준수하지 않은 설계
DIP를 준수한 설계
3.3 DIP와 스프링
스프링은 **의존성 주입(DI)**을 통해 DIP를 구현합니다.
개발자는 인터페이스를 정의하고, 실제 구현체는 스프링 컨테이너가 주입해줍니다.
Last updated