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
- 한 클래스는 하나의 책임만 가져야 한다.
- 하나의 책임이라는 것은 모호하다.
- 클 수도 있고, 작을 수도 있음
- 문맥과 상황에 따라 다르다
- 중요한 기준은 변경이다. 특정 기능이 변경될 때 코드에서 파급효과가 적으면 단일 책임 원칙을 잘 따랐다고 할 수 있다.
- SRP 를 지키지 못한 예시
- UI 하나 고치는데 쿼리문, 어플리케이션 코드 등등을 전부 고쳐야 함.
OCP 개방-폐쇄 원칙 (가장 중요함 !!)
OPEN - CLOSED PRINCIPLE
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야 한다.
- 예시: 다형성 활용
- 인터페이스의 새로운 구현체를 만드는 것은 인터페이스가 바라보는 구현체를 교체해줘야하기 때문에 기존 코드를 변경해줘야한다. 즉, 확장에는 열려있지만 변경도 발생한다. (다형성을 활용했지만 OCP 를 지킬 수 없음)
- 이 때, 객체를 생성하고 연관관계를 맺어주는 외부 조립, 설정자가 필요함. 이 역할을 Spring 이 해줄 수 있다.
LSP 리스코프 치환 원칙
LISKOV SUBSTITUTION PRINCIPLE
- 객체는 프로그램의 정확성을 지키면서 하위 타입 인스턴스로 바꿀 수 있어야한다.
- 다형성에서 하위 클래스는 인터페이스 규약을 전부 지켜야한다는 의미. 인터페이스를 구현한 구현체를 믿고 사용하려면 이 원칙이 반드시 지켜져야한다.
- 컴파일에 성공하는 것을 넘어서 기능적 원칙도 준수해야함.
- 예를 들어, 자동차를 만든다면 액셀을 밟으면 느리더라도 앞으로 가야한다는 원칙을 지켜야한다.
ISP 인터페이스 분리 원칙
INTERFACE SEGREGATION PRINCIPLE
- 특정 클라이언트를 위한 전문화된 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 자동차 인터페이스를 -> 운전자 인터페이스, 정비 인터페이스로 분리
- 사용자 클라이언트를 -> 운전자 클라이언트, 정비사 클라이언트로 분리시킬 수 있음
- 하나의 인터페이스가 변하더라도 관련 없는 클라이언트는 영향을 받지 않음
- 인터페이스의 역할이 명확해지고 대체 가능성이 높아진다.
DIP 의존관계 역전 원칙 (가장 중요함 !! 2)
DEPENDENCY INVERSION PRINCIPLE
- "프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다."
- 의존성 주입(DEPENDENCY INJECTION)은 이 원칙을 따르는 방법 중 하나다.
- 구현 클래스에 의존하지 말고 인터페이스에 의존하라.
- OOP 관점에서 : 역할(ROLE) 에 의존하게 만들어야한다. 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경며 사용할 수 있다. 구현체에 의존한다면 변경이 아주 어려워진다.
- 하지만, 인터페이스에 의존하는 코드가 구현체를 변경하려면 구현체에도 의존할 수 밖에 없다.
- EX) MemberRepository mr = new MemoryMemberRepository();
- MemoryMemberRepository 구현체를 변경하려면 의존할 수 밖에 없다.