Spring의 역사
- spring은 최초 java의 web application 로직을 가지고 있는 server application인 EJB(Enterprise JavaBeans) 사용의 어려움때문에 EJB를 사용하지 않고 web project를 더 쉽게 만들 수 있도록 Rod Johnson이 3만줄 정도의 코드소스와 책으로 선보임. 그 후 Juergen Hoeller와 Yann Caroff가 Rod Johnson에게 오픈소스 프로젝트를 제안하여 지금의 Spring으로 개발을 지속해오는 중
Spring이란
- spring은 spring의 생태계를 의미할 수 있다.
- spring framework
spring framework이란 핵심 > DI, AOP, container 웹기술 > MVC, WebFlux 데이터 > transaction, jdbc, orm, xml
- spring boot
spring 생태계의 project들을 편리하게 사용할 수 있도록 지원
- spring data
- spring security
- spring batch
- spring cloud ... 등
Spring의 개념, 컨셉
- java 기반의 framework
- 객체 지향 언어인 java가 가진 특성을 살려내는 framework
- 좋은 객체 지향 application을 개발할 수 있게 도와주는 framework
- 객체 지향의 특징
- 추상화
- 캡슐화
- 상속
- 다형성
- 객체 지향의 특징 중에서도 다형성의 특징을 극대화하여 사용하는 framework
- 다형성이란
- 여러가지 형태를 가질 수 있는 특징
- spring에서의 다형성은 client에 영향을 주지 않고 web 기능을 제공하고 server의 구현 기능을 유연하게 변경이 가능함을 의미
- java의 다형성을 활용하여 spring은 역할과 구현으로 분리하여 생각
- 역할 : 인터페이스
- 구현 : 인터페이스를 구현한 클래스, 구현 객체
- spring에서의 다형성은 인터페이스를 활용한것이라 생각
- Spring에서 제공하는 IoC(역전제어), DI(의존관계 주입)은 다형성을 활용해서 역할과 구현을 편리하게 사용할 수 있도록 지원
Spring에서 지키고 싶어하는 SOLID
- SOLID란
- clean code 저자인 Robert Cecil Martin의 좋은 객체 지향 설계를 위한 5가지 원칙
- SRP(Single responsibility principle) 단일 책임 원칙
- OCP(open/closed principle) 개방/폐쇄 원칙
- LSP(Liskov substitution principle) 리스코프 치환 원칙
- ISP(Interface segregation principle) 인터페이스 분리 원칙
- DIP(Dependency inversion principle) 의존관계 역전 원칙
- SRP (단일 책임 원칙)
- 하나의 class는 하나의 책임(responsibility)을 가져야한다.
- 중요 기준은 변경으로 생각할 수 있다. class에 변경이 있을 때 그 변경으로 인한 파급효과가 적다면 단일 책임 원칙을 잘 따른것
- 자동차 project에서 engine class는 engine에 대한 책임만 가져야하지 다른 기능과 부품들에 대한 책임을 지어서는 안된다.
- OCP (개방/폐쇄 원칙)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야 한다.
- spring에서 OCP와 다형성을 모두 지키기 위해 DI와 IOC를 지원
- LSP (리스코프 치환 원칙)
- 프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입 인스턴스로 바꿀 수 있어야한다.
- 자동차 project에서 excel이란 기능은 무조건 앞으로만 가야함. 뒤로 간다는 것은 LSP 위반
- ISP (인터페이스 분리 원칙)
- 인터페이스 여러개가 범용 인터페이스 하나보다 낫기 때문에 인터페이스를 기능에 맞게 적당히 쪼개서 사용하여야한다.
- server의 기능을 수정했을 때 client에 영향이 가지 않도록 설계
- DIP (의존 관계 역전 원칙)
- 프로그래머는 추상화에 의존하여야하며 구체화에 의존하면 안된다.
- 자동차 project에서 engine class에 engine은 engine에 대한 역할에 대한 기능만 알고 있어야지 범퍼나 네이게이션의 기능들을 의존하게해서는 안된다.
- 여기서 의존이란 class에서 해당 코드를 불러와서 사용할 수 있다면 모두 의존 관계가 된다.
- Spring은 객체지향 원칙과 특성을 지키고 극대화를 위해 지원해주는 framework
- 하지만 위 5가지 원칙 중 OCP와 DIP를 지키가 어렵기 때문에 spring에서 지원
- DI
- DI Container
- client의 코드 변경 없이 기능을 확장 가능하게 해줌
- 부품을 교체하듯이 개발하는 환경을 만들어줌
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8