스프링부트를 공부하면서 스프링이 객체지향언어인 자바의 SOLID원칙 중 OCP와 DIP를 잘 지켜주게 하는 도구라는 것을 알게 되었다. 이에 짧게 내가 이해한 대로 SOLID원칙을 정리하고자 한다. 정말 내가 보고 한번에 다시 상기할 수 있도록 정리했기에 예시코드 없이 친절하게 설명이 되어있지 않은점 양해 부탁한다.
1. SRP (단일 책임 원칙)
🚫 클래스는 단 하나의 책임만 져야한다 → 하나의 기능만 가져야 한다.
- 왜 지켜야 하는가?
- 나중에 수정해야 할 때 만약 하나의 클래스안에 여러 책임(기능)이 있다.
→ A를 고쳤더니 B를 고쳐야 하고 B를 고쳐야 하니 C를 고쳐야 하는 연쇄작용 발생.
- 이러한 연쇄작용을 극복, 가독성 향상, 유지보수 용이
- 또한 SRP원칙이 다른 원칙을 적용하는 기초임
- 다만 책임의 범위가 정해져 있지 않아 알잘딱깔센 하게 해야함. 무조건 다 나눈다고 좋은게 아님.
- 뭔가를 변경했을때 파급효과가 적으면 잘 지킨것!
2. OCP (개방폐쇄의 원칙)
🚫 확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다.
- 객체지향을 가장 잘 활용하기 위한 제일 중요한 법칙.
- 확장에 대해 열려있다. → 요구사항이 변경 될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다.
- 수정에 대해 닫혀있다. → 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.
- 단순하게 생각하면 인터페이스를 구현한 클래스를 사용해라 라는 말.
3. LSP (리스코프 치환 법칙)
🚫 서브타입은 언제나 기반(부모) 타입으로 교체 가능해야 한다.
- 하위 클래스가 인터페이스 규약을 다 지켜야 한다는 말.
- 상위 클래스 타입으로 객체 선언하고 하위가 그 인스턴스를 받으면 그 하위 클래스가 업캐스팅 된 상태로 부모 메서드 사용해도 의도대로 동작이 되어야 한다.
- 자동차 인터페이스의 엑셀은 앞으로 가라는 의미지만 이를 상속받은 하위 클래스가 엑셀을 뒤로가는 의미로 사용하면 안된다.
4. ISP (인터페이스 분리 원칙)
🚫 인터페이스를 각각 사용에 맞게 잘 분리해야 한다.
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 기능이 많은 하나의 인터페이스 보다 여러개로 나눈 인터페이스가 더 좋다
→ 인터페이스가 명확해지고, 대체 가능성 높아진다.
5. DIP (의존 역전 원칙)
🚫 어떤 Class를 참조해야 한다면 그 Class를 직접 참조하지 않고 대상의 상위요소(추상 클래스, 인터페이스)로 참조해라.
- 그냥 뭐 말그대로 변화가 없는 인터페이스와 추상클래스 의존해라.