1. Spring의 핵심 개념
Spring은 Java기반의 프레임워크이고 Java는 객체지향 언어다. 그래서 Spring은 객체지향 언어가 가진 특징을 살려내는 프레임워크다. Spring은 객체지향 프로그래밍의 특징 중 하나인 '다형성'을 극대화해서 애플리케이션을 개발할 수 있도록 도와준다. 다형성의 본질은 클라이언트 객체를 수정하지 않고 서버 객체의 기능을 유연하게 변경하는 것이다. 역할(인터페이스)과 구현(구현 클래스)을 분리함으로써 유연한 애플리케이션을 개발할 수 있다. Spring의 특징인 제어의 역전(IoC)과 의존관계 주입(DI)은 결국 다형성을 편리하게 활용하도록 지원하는 기능이다.
2. 객체지향 설계의 5가지 원칙
단일 책임 원칙 (SPR - Single responsibility principle)
- 한 클래스는 하나의 책임(기능)만 가져야 한다.
- 만약 어떤 클래스가 여러 기능을 담당한다면 기능 변경이 있을 때 수정해야 할 코드가 많아질 것이다.
- 그래서 책임의 중요한 기준은 변경이다. 변경이 있을 때 파급효과가 적으면 SRP를 잘 지킨 것이다.
개방/폐쇄 원칙 (OCP - Open/closed principle)
- 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다.
- 확장은 기능 추가를 의미하고 변경은 기능 추가에 따른 코드 수정을 의미한다.
- 즉, 기능 추가는 유연하게 할 수 있으면서 그에 따른 코드 수정은 없어야 한다.
- 각 클래스들을 인터페이스로 연결하고 구현 클래스를 통해 기능을 추가하는 것이 OCP를 지키는 방법 중 하나다.
리스코프 치환 원칙 (LSP - Liskov substitution principle)
- 하위 타입의 객체는 상위 타입의 객체를 완전히 대체할 수 있어야 한다.
- 상위 클래스로부터 하위 클래스를 확장할 때, 하위 클래스는 상위 클래스의 의도를 온전히 따라야 한다는 의미이다.
- 예를 들어, Car 클래스의 drive 메서드가 직진 기능을 수행하지만 그 하위 클래스의 drive 메서드는 후진 기능을 하도록 오버라이딩 했다면 LSP를 위반한 것이다.
- 인터페이스도 마찬가지로 해당 인터페이스 설계 의도에 맞추어 구현 클래스를 정의해야 한다.
인터페이스 분리 원칙 (ISP - Interface segregation principle)
- 클라이언트는 자신이 이용하지 않는 메서드에 의존하지 않아야 한다.
- 여러 기능을 포함한 범용적인 인터페이스보다는 특정 클라이언트를 위한 인터페이스로 설계해야 한다는 의미이다.
- 만약 범용적인 인터페이스를 구현한 클래스가 있다면 그 클래스는 자신이 사용하지 않는 메서드도 오버라이딩해야 할 것이다.
의존성 역전 원칙 (DIP - Dependency inversion principle)
- 객체는 저수준 모듈보다 고수준 모듈에 의존해야 한다.
- 저수준 모듈은 구현 클래스고 고수준 모듈은 인터페이스 혹은 추상 클래스다.
- 즉, 객체들 간의 의존관계를 맺을 때 구현 클래스보다는 인터페이스를 활용해야 한다는 의미이다.
- 그렇지 않을 경우 하위 타입의 구현 클래스가 수정될 때마다 그 클래스에 의존하는 다른 클래스도 수정을 해야 하기 때문이다.
- 1에서 언급한 '역할과 구현을 분리한다.'와 같은 맥락이다.
3. 순수한 Java 애플리케이션
앞서 언급한 Spring의 특징과 객체지향 설계 원칙을 글로만 읽으면 잘 이해되지 않는다. 그래서 순수한 Java 애플리케이션을 개발한 후, Spring을 적용해 보며 Spring이 애플리케이션에서 어떤 역할을 하는지, 객체지향 설계원칙을 어떻게 준수할 수 있는지 확인한다. 회원 가입을 하고 상품을 주문하는 간단한 애플리케이션을 개발해 본다.
비즈니스 요구사항
회원 도메인
- 회원 가입과 회원 조회를 할 수 있다.
- 회원 등급은 'BASIC', 'VIP'로 구분한다.
- 회원 데이터는 메모리에 저장하고 추후 DB와 연동할 것을 고려한다.
주문 도메인
- 회원은 상품을 주문할 수 있다.
- 상품 주문 시 할인 정책을 적용한다.
- 주문 데이터는 메모리에 저장하고 추후 DB와 연동할 것을 고려한다.
할인 정책 도메인
- 회원 등급에 따라 할인 여부가 다르다.
- 할인 정책은 정액할인과 정률할인으로 나누어지고 추후 다른 할인 정책이 추가될 수 있다.
'Spring' 카테고리의 다른 글
| [Spring] Spring 핵심 원리 : 순수한 Java 애플리케이션 - Spring 적용 (0) | 2023.06.25 |
|---|---|
| [Spring] Spring 핵심 원리 : 순수한 Java 애플리케이션 - 관심사 분리 (0) | 2023.06.23 |
| [Spring] Spring 핵심 원리 : 순수한 Java 애플리케이션 - 주문 도메인 (0) | 2023.06.21 |
| [Spring] Spring 핵심 원리 : 순수한 Java 애플리케이션 - 회원 도메인 (0) | 2023.06.21 |
| [Spring] Spring 이란? (0) | 2023.04.10 |