객체지향 설계와 스프링
업데이트:
스프링의 핵심
- 자바 언어 기반의 프레임 워크로 객체지향의 언어가 가진 특징을 살려낸다.
- 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와준다.
- 다형성을 극대화 하여 사용한다.
- 제어의 역전, 의존관계 주입은 다형성을 활용하여 역활, 구현을 편리하게 다룰 수 있도록 지원한다.
객체 지향 특징
객체들의 모임으로 객체는 메시지를 주고 받고, 데이터를 처리할 수 있고 유연하고 변경이 쉽다.
다형성
- 역할(인터페이스)과 구현(인터페이스 구현체)으로 세상을 구분
- 클라이언트는 역활에 의존하고 있어 실제 구현체를 몰라도 된다.
- 구현체가 변경되도 역할의 기능은 그대로 사용하기 때문에 무한하게 확장이 가능하다.
- ex) 역할(운전자) -> 역할(자동차)-구현체(현대, 테슬라)
- 객체 설계시 역할과 구현을 명확하게 구분하고 역활을 먼저 설계한다.
- 객체의 협력 관계
- 클라이언트 : 요청, 서버 : 응답
- 많은 객체와 클라이언트는 협력 관계를 가진다.
- 클라이언트는 서버에 요청, 클라이언트도 서버가 될수 있어 다른 서버에게 요청이 가능하다.
- 인터페이스 구현 객체를 실행 시점에 유연하게 변경 가능하다.
역할과 구현 분리의 한계
- 역할이 변하면 클라이언트, 서버 모두 변경이 발생한다.
SOLID
SRP:단일 책임 원칙
- 클래스 하나는 하나의 책임만을 가진다.
- 하나의 책임이라는 것은 모호하며 크거나 작을 수 있다.
- 문맥과 상황에 따라 다르다.
- 중요한 기준은 변경이다.
- 변경이 있을떄 파급 효과가 적으면 원칙을 잘 따른것이라고 할 수 있다.
- 하나의 클래스에서 여러개의 기능이 존재하는 경우 원칙에 위반된다.
OCP:개방-폐쇄 원칙
- 확장에는 열려있으나 변경에는 닫혀 있어야 한다.
- 인터페이스의 구현체(확장)은 열려 있으나 인터페이스 자체의 변경(변경)에는 닫혀 있다고 할수 있다.
- 클라이언트에 직접 new를 사용하여 구현 객체를 선택하면 원칙에 위반된다.
- 인터페이스 구현체를 만들어서 새로운 기능 구현
- 기능을 변경한것은 아님
LSP:리스코프 치환 원칙
- 프로그램의 정확성을 깨뜨리지 않으면서 하위타입의 인스턴스를 바꿀 수 있어야 한다.
- 구현 기능의 규약이 있는 경우 그 기능만을 사용하도록 해야 한다.
- 자동차의 엑셀기능은 앞으로만 가야되는 규약이 있는 경우 뒤로 가도록 구션시 원칙에 위반된다.
ISP:인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 하나의 큰 기능이 아닌 여러 기능으로 분리한다.
- 하나의 기능이 변해도 다른기능에는 영향을 주지 않는다.
- 인터페이스가 명확해지며 대체 가능성이 높아진다.
DIP:의존관계 역전 원칙
- 프로그래머는 추상화에 의존해야하지, 구체화에 의존하면 안된다.
- 클래스가 아닌 인터페이스에 의존한다.
- 구현체에 의존하게 되면 변경이 어려워진다.
다형성만으로는 구현 객체를 변경할떄 클라이언트도 함께 변경된다.
다형상만으로는 DIP, OCP를 위반한다.
스프링과 객체 지향
- 스프링은 다향성 + OCP, DIP를 가능하게 한다.
- DI : 의존관계, 의존성 주입
- DI 컨테이너 제공
- 클라이언트 변경 없이 기능 확장이 가능하다
- 부품을 교체하듯이 개발
정리
- 모든 설계에 역활과 구현을 분리
- 애플리케이션 설계는 유연하게 변경 할 수 있도록 만드는 것이 좋은 객체 지향이다.
- 이상적으로는 모든 설계에 인터페이스를 부여해야 한다.
- 인터페이스를 도입하면 추상화라는 비용이 발생한다.
- 코드의 추상화로 한번씩 더 코드를 확인해야 한다.
- 기능 확장 가능성이 없다면 구체 클래스를 직접 사용, 향후 꼭 필요할때 리팩터링 해서 인터페이스를 도입한다.
댓글남기기