※ 본 포스팅은 Inflearn - 김영한 강사님의 '스프링 핵심 원리 - 기본편' 을 참고,공부하여 만들었습니다.
1. 단일 책임 원칙( Single Responsibility Principle )
한 클래스는 하나의 책임만 가져야 한다.
한 클래스가 하나의 책임만 가져야 한다는게 무슨뜻일까?
하나의 클래스(이하 A클래스)가 작동하기 위해서 필요한 객체를 A클래스에서 직접 생성하여 연결시키고
자기 자신을 실행시키는것들 이것들 각각이 하나의 책임이다(생성, 연결, 실행)
이 책임들을 덜어주어서 A클래스는 자기가 맡은 일만 실행할수 있도록 해주기 위한 원칙이 SRP이고
우리는 AppConfig라는 설정과 구성을 관장하는 클래스를 만들어 이를 해결해주었다.
2. 의존관계 역전 원칙 ( Dependency Inversion Principle )
프로그래머는 추상화에 의존해야지, 구체화에 의존해서는 안된다.
어렵게 생각하지말고 추상화에 의존 , 구체화에 의존한다는게 무슨의미일까?
추상화에 의존한다는것은 한껏 추상화한 인터페이스에 의존한다는 의미이고 ,
구체화에 의존한다는것은 이러한 인터페이스를 구현한 클래스에 의존한다는 의미이다.
다음 코드를 살펴보면서 이해해보자
public class MemberServiceImpl implements MemberService {
//구현체가 하나밖에 없을경우 Impl을 붙이는게 관례
private final MemberRepository memberRepository = new MemoryMemberRepository();
// ... 생략 ...
}
위의 코드는 MemberRepository에 의존한것같은 알맞은 코드같아 보이지만 ,
new MemoryMemberRepository 구현체에 의존하고 있는 코드이다.
우리는 이렇게 코드 스스로 객체를 구현 생성 하는 과정을 AppConfig에 책임을 위임함으로써
AppConfig가 MemoryMemberRepository 객체 인스턴스를 클라이언트 코드 대신 생성해서
클라이언트 코드 에 의존관계를 주입했다. 이렇게해서 DIP 원칙을 따르면서 문제도 해결했다.
3.개방 폐쇄의 원칙 ( Open-Closed Principle )
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다
위에서 했던 이야기들의 반복이지만 , AppConfig를 사용하여 구성과 설정을 담당하는 클래스를 따로 생성하였다.
따라서 MemoryMemberRepository로 사용하던 저장소를 다른 데이터베이스로 바꾸더라도
클라이언트 객체(MemberServiceImpl)의 코드는 수정할 필요없다.
수정할 필요는 없지만 새로운요소를 도입, 새롭게 확장이 가능하다는 의미이다.
'Spring > Spring Study' 카테고리의 다른 글
[Inflearn] 스프링 컨테이너와 빈 (0) | 2021.07.01 |
---|---|
[Inflearn] AppConfig 리팩터 + (7월7일 내용 수정 및 보강) (0) | 2021.06.30 |
[Inflearn] AppConfig (0) | 2021.06.28 |
[Inflearn] 스프링 핵심 원리 - 기본편 , 중간정리 (7월7일 내용수정) (0) | 2021.06.28 |
스프링의 핵심 개념, 컨셉은 무엇인가? (0) | 2021.06.02 |