1. 스프링과 객체지향
스프링 존재 이유?
스프링은 객체 지향적으로 프로그래밍을 할 수 있도록 도와주는 프레임워크
- 스프링은 객체 지향 프로그래밍을 도와준다.
- 그중에서도 OCP, DIP를 잘 지키게 도와준다.
- 객체 지향 프로그래밍에서 인터페이스는 매우 중요하다.
객체 지향 프로그래밍 중에서 중요한 SOLID 5대 원칙
- SRP(Single Responsibility Principle): 단일 책임
- OCP(Open Closed Principle): 개방 폐쇄 원칙
- LSP(Liskov Substitution Principle): 리스코프 치환 원칙
- ISP(Interface Segregation Principle): 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle): 의존성 역전 원칙
SRP 단일 책임
한 클래스가 맡은 일은 한가지 여야한다.
한 클래스내에 너무 많은 코드가 들어가 유지 보수가 어려워지는것을 막는다.
OCP 개방 폐쇄 원칙
클래스는 확장에 대해서 열려있고, 변경에 대해서는 닫혀 있어야 한다.
이게 무슨 말이야?
인터페이스를 통해 실제 내부 로직 변화와 상관 없이 정상 작동 되어야한다. 아마도 사용하는 입장에서는 추상적으로 wrapping 되어 있어서 변경 하지않고, 코드 내부는 유연하게 변경 해야하는것 같다.
- 근데 이게 맘처럼 쉽게 되지는 않는다. 인자가 더 필요하게 되면 사용하는 쪽 코드도 변경되기도 하는데… 이래서 interface 설계를 잘해야하나보다. 또는 디자인 패턴을 잘활용 해야하나보다.
LSP 리스코프 치환 원칙 이름이 어렵다
상위 타입 객체를 하위 타입 객체로 변경해도 정상 작동 되어야한다.
아마도 이것도 추상화 관련되서 이야기 하는것일거다.
냉장고라는 인터페이스에 김치 냉장고로 구현이 되었건, 일반 냉장고로 구현이 되었건 둘다 정상적으로 냉장 기능을 해야하는것과 같은 말이다.
ISP 인터페이스 분리 원칙
클라이언트는 자신이 사용하는 메소드에만 의존해야한다..?
실제 구현체가 여러 기능을 가지고 있을 지언정 사용하는 입장에서는 특정인터페이스만 관심 있으면 된다.
DIP 의존성 역전 원칙 아 이건또 뭐야
고차원 모듈에 의존 하지말고 저차원 모듈에 의존해라. 저차원 모듈이란 추상화 된것이고, 고차원 모듈이란 구현체를 의미한다.
아 그러니깐 이것도 인터페이스를 사용하란거지?
실제 구현체를 직접 가르켜 사용하다보면 변경이 어렵다. 인터페이스를 사용해서 쉽게 변경하도록 하자.
스프링이 그래서 뭐 해준다고?
SRP, OCP랑 DIP를 도와주지!
어떻게?
- Spring에서는 생성자 주입을 통해서 실제 구현체를 주입받는다. 생성자로 받을 인자는 인터페이스로 해당 인터페이스 구현체를 집어 넣어준다. -> DIP, OCP를 도와준다.
- 어노테이션으로 어떤 구현체를 사용할지 정할 수 있어서 손쉽게 변경 가능하다.
- 만드는 놈 따로 사용하는 놈 따로