글 소개
김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 정리!
스프링의 핵심 가치
스프링의 핵심 가치는 객체 지향에 있다.
이야기 - 자바 진영의 추운 겨울과 스프링의 탄생
- 옛날 옛적에... 자바 진영의 표준 기술인 EJB(Enterprise Java Beans) 등장
- EJB는 한 마디로 자바 종합 선물 세트
- 하지만 EJB 지옥이 열림
- 이론 자체는 좋지만, 가격이 비싸고 사용하기 어렵고 느림
- EJB에 의존적으로 개발하게 됨
- 순수했던 과거인 POJO로 돌아가자!
POJO(Plain Old Java Object): 오래된 방식의 간단한 자바 오브젝트, 프레임워크에 종속된 무거운 객체를 만들게 된 것에 반발해서 사용하게 된 용어
- 로드 존슨 - 스프링을 만듦
- 개빈 킹 - 하이버네이트 만듦
- 이 2가지가 메인 기술로 자리 잡음
스프링 역사
- 로드 존슨이 EJB 없이도 좋은 애플리케이션을 개발할 수 있음을 보여줌
- 유겐 휠러, 얀 카로프가 로드 존슨에게 오픈소스 프로젝트를 제안
- 스프링의 핵심 코드의 상당수는 유겐 휠러가 지금도 개발
- 스프링은 EJB라는 겨울을 넘어 새로운 봄이 온다라는 뜻으로 지음
스프링 부트
- 스프링에서 자주 사용되는 조합을 미리 만들어 놔서, 쉽고 간편하게 프로젝트를 구성
- 각종 starter dependency로 손쉬운 빌드 구성
- 내장 Tomcat 제공으로 별도로 웹 서버를 설치하지 않아도 됨
스프링 왜 만들었을까?
- 핵심 컨셉을 이해하는 것이 중요 🌟🌟🌟
- 자바는 객체 지향 언어
- 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
- 즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
다형성의 본질
인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경 가능
좋은 객체 지향 프로그래밍이란?
- 객체 지향의 핵심은 다형성
- ex) 운전자 - 자동차
- 운전자는 자동차의 종류 바뀌어도 운전하는 데 문제가 없음
- ex) 공연 무대 - 로미오와 줄리엣
- 로미오 역할의 배우는 줄리엣 역할의 배우가 바뀌어도 문제가 없음
- 즉, 클라이언트는 인터페이스만 알면 됨
- 클라이언트는 구현 대상의 내부 구조를 몰라도 됨
- 역할(인터페이스)과 구현(구현 클래스)을 명확히 분리하면 유연해지며 변경도 편리해짐
스프링과 객체 지향
- 스프링에서 다형성이 가장 중요!
- 스프링의 의존성 주입(DI), 제어권 역전(IoC)은 다형성을 활용해 역할과 구현을 편리하게 분리하도록 도와줌
- 즉, 스프링을 사용하면 마치 레고를 조립하듯 구현을 편리하게 변경할 수 있음
좋은 객체 지향 설계의 5가지 원칙(SOLID)
SRP(단일 책임 원칙)
- 하나의 클래스는 하나의 책임만 가짐
- 하지만 하나의 책임이라는 것이 실세계에서는 모호함
- 중요한 기준은 변경 - 변경이 있을 때 파급 효과가 적으면 SRP를 잘 따른 것
OCP(개방 폐쇄 원칙) 🌟
- 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 함
- 확장을 하려면 변경을 하게 될텐데?
- 다형성을 사용해도 OCP를 지킬 수 없음
LSP(리스코프 치환 원칙)
- 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 교체 가능해야 함
- ex) 자동자 인터페이스
- 엑셀을 밟으면 앞으로 가는 것이 원칙이라고 하면, 뒤로 가는 구현 클래스를 만드는 것은 LSP 위배
ISP(인터페이스 분리 원칙)
- 인터페이스 여러 개가 범용 인터페이스 하나보다 좋음
- 인터페이스가 명확해지고 대체 가능성이 높아짐
DIP(의존관계 역전 원칙) 🌟
- 구체화가 아닌 추상화에 의존해야 함
- 즉, 역할에 의존해야 함
=> 다형성만으로는 OCP, DIP를 지킬 수 없다
객체 지향 설계와 스프링
- 스프링의 핵심 가치는 객체 지향
- 스프링은 DI, DI 컨테이너 제공으로 다형성과 OCP, DIP를 가능하게 함
- 즉, 쉽게 부품을 교체하듯이 개발 가능하게 함