유연하고, 변경에 좋다.
- 컴퓨터를 부품 끼우는 것처럼 사용하는 것(다형성)
다형성
- 세상을 역할(인터페이스)과 구현(인테페이스를 구현한 객체)로 구분
실세계에 비유
- 자동차를 바꿔도 운전자에게 영향을 주지않는다. (자동차를 k3 -> 테슬라로 변경할때)
- 운전자는 자동차의 역할, 자동차 인터페이스에대해서만 의존
- 자동차역할만 구현하면 어떠한 자동차를 만들 수 있다 (역할과 구현을 구분, 새로운 자동차가 나와도 클라이언트를 변경할 필요가 없다)
- 클라이언트는 대상의 인터페이스만 알면된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
객체는 협력이다.
- 혼자 있는 개체는 없다,왜냐? 수많은 클라이언트가 서버가 서로 왔다갔다한다.
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행시점에 유연하게 변경할 수 있다.
- 다형성은 협력이다, 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경가능..
SOLID
좋은 객체 지향설계의 원칙
SRP 단일 책임 원칙(Single responsibility principle)
- 한 클래스는 하나의 책임만 가져야한다.
- 중요한 기준은 변경이다. 변경이 있을때 파급 효과가 적으면 단일 책임 원칙을 따른 것이다..
- 변경이 있을때 하나의 지점에 하나만 고칠 수 있는 것
OCP 개방 - 폐쇄 원칙
- 확장에는 열려 있으나 변경에는 닫혀있다
- 자동차 다형성 예를 생각해보자 -> 자동차를 만들면 아반떼 , K3, ... 확장 할 수 있다 그러나 인터페이스 자체의 변경에는 닫혀있다.
- 인터페이스를 구현한 새로운 클래스를 하나 만드는 것은 !! 기존 코드를 변경하는 것은 아니다(확장) !!,
- 예를 들어보자
MemberRepository m = new MemoryMemberRepository(); // 기존 코드
MemberRepository m = new JdbcMemberRepository(); // 변경 코드
구격 객체를 변경할려면 코드를 변경해야한다,,, 이렇게 되면 ocp를 지키지 않는 것이 아닌가? 이걸 위해서 스프링이 존재하는 것이다.
스프링에서는 생성자로 MemberRepository를 주입만 받고 어떤 MemberRepository를 지정할 것인지 정하는 것은 AppConfig가 하는 것으로 해서 확장에서는 열여있으며 변경에는 닫혀있다~
LSP 리스코프 치환 원칙
- 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다..
- 자동차 인터페이스에서 엑셀은 앞으로 가라는 기능이있다, 근데 뒤로 가게 구현하면 그것은 LSP를 위반한 것이다.
ISP 인터페이스 분리 원칙(interface segregation principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
- 자동차 인터페이스를 -> 운전 인터페이스, 정비 인터페이스로 분리
- 분리하면 정비 인터페이스가 변경이 일어나도 운전 인터페이스에는 영향을 주지 않느다..
- 인터페이스는 명확해지고 대체 가능성이 높아진다..
DIP 의존관계 역전 원칙
- 의존성 주입의 원칙에서는 -> 프로그래머는 추상화에 의존해야하고, 구체화에 의존하면 안된다가 있다..
- 역할에 의존하게 해야한다는 것과 같다. 객체지향에서는 클라이언트는 인터페이스에 의존해야지 유연하게 구현체를 변경하면서 조립이 가능하기 때문이다.
- ex :
MemberRepository m = new MemoryMemberRepository(); // 기존 코드 MemberRepository m = new JdbcMemberRepository(); // 변경 코드
- 위의 코드를 다시보면 MemberRepository라는 인터페이스에도 의존하고 있고, MemoryMemberRepository라는 구현체에도 의존하고 있다. 이렇게 되면 인터페이스 의존하지만, 구현 클래스도 동시에 의존하고 있는 것이다.
- DIP 위반.
결론
- 다형성만으로는 OCP, DIP를 지킬 수없다.
- 이런 것들을 위해서 spring이 존재한다...!
'spring' 카테고리의 다른 글
spring,... intellij 디버그 (2) | 2021.11.30 |
---|---|
DisplayName관련 오류 (0) | 2021.10.27 |
srpingboot jpa domain 작성 (0) | 2021.08.14 |
springboot, mysql연결 (0) | 2021.08.14 |
스프링 h2-console 설정 에러와 해결.. (0) | 2021.08.08 |