- Spring 은 SOLID 원칙을 잘 지키도록 도와준다.2023년 11월 14일
- starryeye
- 작성자
- 2023.11.14.오후10:18
반응형이번 포스팅 주제는 개인적으로 생각하는 Spring 의 철학입니다.
들어가기 앞서 SOLID 원칙에 대해 살짝 알아보고 가봅시다.
SRP (Single Responsibility Principle)
단일 책임 원칙입니다.
하나의 클래스는 하나의 책임만 가져야 한다.
다른 말로는
클래스가 변경되는 이유는 한가지여야 한다
입니다.
OCP (Open / Close Principle)
개방 폐쇄 원칙입니다.
풀어서 보면,
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
입니다.
좀더 쉽게 보자면,
확장에는 열려있다.
-> 애플리케이션의 요구 사항이 변경될 때, 이 변경에 맞게 새로운 동작을 추가해 모듈을 확장할 수 있다.
수정에 닫혀있다.
-> 기존의 소스 코드를 수정하지 않아도 모듈의 기능을 확장하거나 변경할 수 있다.
입니다.
LSP (Liskov substitution principle)
리스코프 치환 원칙입니다.
자료형 S가 자료형 T의 서브타입라면
자료형 T의 객체를 자료형 S의 객체로 교체(치환)할 수 있어야 한다는 원칙입니다.
정확하게 말하자면,
"탈것" 이라는 부모 클래스가 있고 "전진" 이라는 메서드가 있는데..
"자동차" 라는 자식 클래스에서 "전진" 이라는 메서드를 후진하는 동작으로 오버라이딩 하여
혼란을 주지 말자 라는 원칙입니다.
ISP (Interface segregation principle)
인터페이스 분리 원칙입니다.
클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙입니다.
즉, 인터페이스 분리 원칙은
큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써
클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 하는 것입니다.
DIP (Dependency Inversion Principle)
의존 관계 역전 원칙입니다.
구현체에 의존하지말고 추상화에 의존하라라는 말입니다.
-> 이 말은 인터페이스와 구체 클래스가 있다면, 의존할 것이라면 인터페이스에 의존하라는 말입니다.
또 다르게는..
상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써
상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.
-> 이 말은 비즈니스 계층(고 수준)이 IO 관련 계층(저 수준)을 의존하지 말고
저 수준 모듈이 고 수준 모듈을 의존하라 라는 의미도 됩니다.
이제 SOLID 에 대해 알아 봤으니..본격적으로 주제에 대해 알아보겠습니다.
우선 다른 프레임워크를 사용하지 않고 Java 만을 사용해 봅시다. (IoC/DI 개념 X)
위와 같이 A 는 B 에 의존을 하고 있습니다.
A Class 내에는
private final B b = new B'(); 라는 코드가 존재합니다.
객체 지향의 다형성을 사용하여
A Class 에는 B 라는 타입을 가진 b 변수를 사용 하기 때문에
B 에 의존한다고 생각 할 수 도 있지만,
사실 A 는 B' 에 의존하는 것입니다.
new B'() 라는 코드 때문입니다.
따라서, DIP 위반입니다.
또한,
요구사항이 변경되어 B' 가 아니라 B'' 를 사용해야 한다고 치면,
A Class 에 코드 수정이 필요합니다.
new B'() 라는 코드 때문입니다.
따라서, OCP 위반입니다.
또한,
A 의 책임은 A 가 가지고 있는 기능에 있습니다.
요구 사항 변경에 의하여 B 가 변경되었는데 A 코드가 변경 될 이유는 없습니다.
따라서, SRP 위반입니다.
이제 Spring 을 사용해보겠습니다.
Spring Container 에 A 타입의 Spring Bean 과
B 타입의 Spring Bean (구현체는 B') 을 등록한 상황입니다.
A Class 내부에는
private final B b; 라는 코드가 존재합니다.
new B'(); 코드가 사라졌습니다.
따라서, A 는 인터페이스인 B 에 의존하는것이 되었습니다.
-> DIP 만족
요구사항이 변경되어 B' 에서 B'' 으로 기능 확장이 필요하면
스프링 빈 등록을 B' 로 하는 것이 아닌 B'' 로 하면 됩니다.
그에 따른 A 의 코드는 변경이 필요 없습니다.
-> OCP 만족
그리고,
A 는 사실 B 를 사용할 뿐 생성할 책임은 없었습니다.
Spring 을 사용함으로써 A 가 B 를 생성하지 않아도 됩니다.
-> SRP 만족
참고
A 가 B' 를 직접 생성 하던 것을
Spring Container 가 대신 생성하여
A 에 B' 을 의존성 주입 (Dependency Injection) 을 하였습니다.
즉, A 가 직접 B' 를 생성하고 의존성 까지 맺었었는데 (제어)
이제는 Spring Container 가 대신 제어를 하게 된 것입니다.
이를 제어의 역전 (IOC, Inversion of Control) 이라 부릅니다.
결론
Spring 은 SOLID 원칙을 잘 지키도록 도와준다.
반응형'Spring > Core' 카테고리의 다른 글
@Configuration 와 싱글톤 (0) 2023.07.13 @Async, TaskExecutor, CompletableFuture (0) 2023.06.17 Spring AOP 정의 (0) 2022.11.29 Spring에서 프록시 사용 6 (0) 2022.11.29 Spring에서 프록시 사용 5 (0) 2022.11.20 다음글이전글이전 글이 없습니다.댓글