Spring 핵심 원리 기본편을 시작하면서, 강사님께서 강조하신 부분은 이 강의는 Spring의 기능을 설명하는 강의가 아닌, Spring이 제공하는 기능이 왜 만들어졌는지, 왜 필요한지 그리고 어떤 부분에서 활용되는지에 대해 설명하는 강의라고 하셨다.
강의를 들으면서, Spring이 제공하는 기능 뿐만 아니라 Spring이 필요한 이유에 대해 찾으면서 Spring에 대한 재미를 찾을 예정이다.
구성
스프링 프레임 워크
스프링 부트
스프링을 편리하게 사용할 수 있도록 스프링 프레임워크를 사용하여서 지원
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크이다.
역할과 구현을 분리한다.
다형성의 본질
단일 책임 원칙 : 한 클래스는 하나의 책임만 가져야 한다.
중요한 기준은 변경으로, 변경이 있을 때 파급 효과가 적으면, 원칙을 잘 따른 것이다.
개방-폐쇄 원칙 : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
public class MemberService{
//private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
구현 객체를 변경하려면, 클라이언트 코드를 변경해야 한다. 즉, 다형성을 사용했지만 OCP 원칙을 지킬 수 없다.
-> 객체를 생성하고, 연관 관계를 맺어주는 별도의 조립, 설정자가 필요하다.
-> 이를 스프링 컨테이너가 해준다.
리스코프 치환 원칙 : 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다. 인터페이스를 구현한 구현체를 믿고 사용하기 위함이다.
인터페이스 분리 법칙 : 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
인터페이스가 명확해지고, 대체 가능성이 높아진다.
의존 관계 역전 원칙 : 추상화에 의존해야 하지, 구체화에 의존하면 안된다.
예시에 대입하면, MemberService가 MemberRepository 인터페이스에만 의존해야 한다. 그런데, MemberService 클라이언트가 구현 클래스를 직접 선택한다.
MemberRepository m = new MemoryMemberRepository();
이는 DIP에 위반한다.
객체 지향의 설계는 다향성이었다. 하지만, 다형성만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경되었으며, OCP/DIP 를 지킬 수 없음을 알 수 있었다.
이는 스프링 프레임워크에서 제공하는 DI(Dependency Injection)으로 해결할 수 있다.
인터페이스를 도입하면, 추상화라는 비용이 발생하는데 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터링해서 인터페이스를 도입하는 것도 방법이라고 제시해주셨다.
다음 글은 인프런 김영한 강사님의 스프링 강의 복습용입니다 :)