티스토리 뷰
스프링의 탄생
기존의 자바 표준 기술인 EJB(Enterprise Java Beans) -> 이론적으로 좋았지만 어렵고 느렸던...
Rod Johnson이 책을 출간한 후 오픈소스 프로젝트를 진행하게 된다.
EJB라는 겨울을 넘어 새로운 시작이라는 뜻로 spring, 봄이라 지었다.
스프링
스프링 프레임워크
핵심 기술 : 스프링 DI 컨테이너, AOP, 이벤트
웹 기술 : 스프링 MVC, 스프링 WebFlux
데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원 ....
스프링 부트 - 스프링을 편리하게 사용할 수 있도록 지원, 최근은 Default
Tomcat 같은 웹 서버를 내장하여 별도의 웹 서버가 필요하지 않기에 단독으로 스프링 애플리케이션 생성 가능
starter 종속성 제공 ( 연관된 라이브러리를 같이 끌어온다. )
스프링과 3rd parth(외부) 라이브러리 자동 구성 - 외부 라이브러리의 버전을 관리해준다.
프로덕션 준비 기능 제공 - 모니터링을 도와준다.
스프링의 핵심
자바 언어 기반의 프레임워크 -> 객체 지향의 특징을 살릴 수 있는 프레임워크
즉, 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
객체 지향 프로그래밍 ( 좋은 )
-> 컴퓨터 프로그램을 객체( 독립된 단위 )들의 모임으로 파악하고자 함,
각각의 객체는 메세지를 주고받으며 데이터를 처리한다.
-> 프로그램을 유연하고 변경이 용이하게 만들어 대규모 소프트웨어 개발에 사용된다.
유연하고 변경이 용이? -> 부품 교체하듯, 컴포넌트를 쉽고 유연하게 변경하듯..
역할과 구현을 분리하라! (인터페이스와 구현 클래스)
클라이언트는 대상의 역할만 알면 되고, 구현 대상의 내부 구조를 알 필요 없다.
구현 대상의 내부 구조의 변경에도 영향을 받지 않으며, 구현 대상 자체가 바뀌어도 영향을 받지 않는다.
ex) 자동차라는 역할, 그리고 bmw 테슬라 쌍용과 같은 구현 대상
-> 우리는 bmw를 타다가 테슬라를 타도 영향을 받지 않는다~
자바 언어의 다형성 ( Polymorphism ) 을 활용하여 역할(인터페이스)과 구현(클래스, 구현 객체)로 분리할 수 있다.
역할을 부여하고( 인터페이스를 정의하고 ), 역햘을 수행하는 것을 구현한다.
다형성의 본질 - 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경 가능하게 한다.
-> 인터페이스를 안정적으로 설계하는 것이 중요하다.
객체 지향 설계 원칙 SOLID
SRP( Single Resopnsibility Principle, 단일 책임 원칙 )
하나의 클래스는 하나의 책임만 가져야 한다.
변경이 있을 때 파급 효과가 적다면 단일 책임 원칙을 잘 따른 것
OCP ( Open-Closed Principle, 개방 폐쇄 원칙 )
확장에는 열려있고, 변경에는 닫혀있어야 한다.
다형성을 생각해보자. 역할과 구현을 구분한다면 구현을 통한 확장을 하고, 변경을 지양할 수 있다.
문제점) 다형성을 활용하고 적용하면 OCP원칙을 지킬 수 없는 경우가 발생. -> 별도의 조립, 설정자가 필요함
LSP ( Liskov Substitution Principle, 리스코프 치환 원칙 )
다형성에서 하위 클래스는 인터페이스 규약을 지켜야 한다.
ISP ( Interface Segregation Principle, 인터페이스 분리 원칙 )
범용 인터페이스를 여러 개의 인터페이스로 분리한다.
->( 컴퓨터 주변기기 인터페이스 -> 마우스 인터페이스, 키보드 인터페이스 ... )
인터페이스가 명확해지고, 대체 가능성이 높아진다.
DIP ( Dependency Inversion Principle, 의존관계 역전 원칙 )
구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻 ( 인터페이스에 집중하라, 역할에 의존하라 )
-> 객체 지향의 핵심은 다형성이지만, 다형성만으로는 OCP, DIP를 지킬 수 없다.
-> why? 구현 객체를 변경할 때 클라이언트 코드도 함께 변경되기 때문에..
객체 지향 설계와 스프링
스프링은 다형성 + OCP, ICP를 가능하게 지원해준다.
DI( Dependency Injection, 의존성, 의존관계 주입 )
DI 컨테이너 제공
클라이언트 코드의 변경 없이 기능을 확장할 수 있게 해준다.
본 포스팅은 인프런 강의 중 김영한님의
[ 스프링 핵심 원리 - 기본편 ] 을 수강하며 작성한 내용입니다.