이 글은 김영한 강사님의 강의와 자료를 학습한 뒤 정리하는 글입니다
객체지향 설계 원칙으로 유명한 SOLID에 대해 알아보자.
S - single responsiblity principle : 단일 책임 원칙
O - open / closed principle : 개방 폐쇄 원칙
L - Liskov substituion principle : 리스코프 치환 원칙
I - Interface segregatino principle : 인터페이스 분리 원칙
D - Dependency inversion principle : 의존관계 역전 원칙
설명 참고 코드
MemberRepository m = new MemoryMemberRepository()
SRP
한 클래스는 하나의 책임만 가져야 한다 -> 하나의 기능만 수행하게 만들어라
OCP
확장에는 열려 있고 변경에는 닫혀 있어야 한다.
인터페이스를 통해 역할과 구현을 분리해주면 확장에 열려있게 해줄 수 있다.
위 코드처럼 클라이언트에서 구현체를 갈아끼워야 한다면 변경에 열려 있는 것이다.
변경에 닫혀있게 하기 위해( = 클라이언트 코드의 변경이 일어나지 않게 하기 위해) 스프링의 의존관계 주입을 사용한다.
LSP
하위 타입의 인스턴스로 바꿀 때 프로그램의 정확성이 깨지지 않아야 한다.
인터페이스 구현체가 인터페이스에서 기대한 대로 구현을 해야한다는 것이다.
가령 자동차 인터페이스가 있고 액셀 밟았을 때 작동하는 메소드가 있는데 이 메소드를 뒤로 가거나 자동차가 빙빙 회전하게 구현하면 LSP를 위반한 것이다.
ISP
인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
-> 인터페이스를 논리적으로 쪼갤 수 있으면 쪼개는 게 유지보수가 좋다
DIP
구체화에 의존하지 말고 추상화에 의존하라.
= 구현 클래스에 의존하지 말고 인터페이스에 의존해라
위 코드는 구현 클래스에 의존하고 있으므로 DIP를 위반한 것이다. 이 또한 의존관계 주입을 통해 해결된다.
다형성만으로는 OCP, DIP를 지킬 수가 없다. 의존관계 주입을 써야 한다.
'스프링' 카테고리의 다른 글
의존관계 주입(DI)을 통해 DIP, OCP 문제를 해결하자 (0) | 2022.02.03 |
---|---|
객체 지향이란 (0) | 2022.01.25 |
스프링 부트를 사용하는 이유 (0) | 2022.01.25 |
스프링의 역사 (0) | 2022.01.25 |