[스프링 핵심 원리] 객체 지향 설계와 스프링
객체 지향 설계와 스프링은 어떤 관계가 있는가
[스프링 핵심 원리] 객체 지향 설계와 스프링
✏️ SOLID
SOLID란 로버트 마틴이 정의한, 좋은 객체 지향 설계의 5가지 원칙이다.
SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open/Closed Principle): 개방-폐쇄 원칙 LSP(Liskov substitution Principle): 리스코프 치환 원칙 ISP(Interface segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존관계 역전 원칙
■ SRP(Single Responsibility Principle)
- 단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다.
■ OCP(Open/Closed Principle)
- 개방-폐쇄 원칙
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 클라이언트의 코드를 변경하지 않고, 서버의 코드를 확장하여 문제를 해결
■ LSP(Liskov substitution Principle)
- 리스코프 치환 원칙
- 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- ex) 액셀 인터페이스의 기능은 “앞으로 전진”이다. 후진하면 프로그램의 정확성을 깨뜨리므로 LSP 위반이다.
■ ISP(Interface segregation Principle)
- 인터페이스 분리 원칙
- 하나의 범용 인터페이스를 설계하기 보다는, 특정 클라이언트를 위한 인터페이스 여러개를 설계해야 한다.
■ DIP(Dependency Inversion Principle)
- 의존관계 역전 원칙
- 구체화에 의존하지 말고, 추상화에 의존하라
- 의존한다 == 코드에서 사용된다
✏️ 다형성의 한계
다형성만으로는 OCP, DIP를 지킬 수 없다.
다음의 예시를 보자.
1
2
3
public class Service{
private Repository repository = new MemoryRepository();
}
Service 클래스는 Repository 인터페이스와 MemoryRepository 구현객체에 의존하고 있다. ➜ DIP 위반
현재는 MemoryRepository를 저장공간으로 사용하고 있다. DataBaseRepository로 바꾸려면 다음의 과정을 거쳐야 한다.
1
2
3
public class Service{
private Repository repository = new DataBaseRepository();
}
클라이언트인 Service 클래스의 코드를 변경했다. ➜ OCP 위반
그럼 OCP, DIP를 지키려면 어떻게 해야하는가?
✏️ Spring과 객체 지향
Spring은 다음 기술로 위의 문제를 해결한다.
- DI(Dependency Injection): 의존관계, 의존성 주입
- DI 컨테이너 제공
다음 포스트에서는 실제 자바 코드를 통해 왜 Spring이 필요한지 알아보겠다.
REFERENCE
This post is licensed under
CC BY 4.0
by the author.