자바 엔터프라이즈 애플리케이션 개발에 사용되는 오픈소스 애플리케이션 프레임워크

웹 애프리케이션을 만들고, DB 접근을 편리하게 해주기 위해?
웹 서버를 자동으로 띄워줘서?
전자정부 프레임워크라서?
맞는 말이긴 하지만 결과물일뿐, 목적은 아니다.
스프링의 진짜 목적은 좋은 객체 지향 애플리케이션을 쉽게 개발할 수 있게 도와주는 것이다.
객체지향 프로그래밍은 여러개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것으로 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력)
객제 지향 프로그램은 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
유연하고 변경에 용이하다는 것은? 즉 다형성
레고 블록을 조립하듯이
키보드, 마우스 갈아끼우듯이
컴퓨터 부품 갈아까우듯이
컴포넌트를 기존의 것을 고치지 않고 변경하면서 개발할 수 있는 방법


| 5대 원칙 | 의미 | 설명 | 예시 |
|---|---|---|---|
| 단일 책임 원칙 (SRP)* Single Responsibility Principle | 한 클래스는 하나의 책임만 갖는다. | 중요한 기준은 변경이다. 변경이 있을 때 단일 책임 원칙을 따른다. | UI변경인 경우 UI클래스가 책임을 갖고 다른 클래스에 영향을 주지 않아야한다. |
| 개방-폐쇄 원칙 (OCP)* Open-Closed Principle | 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. | 기존의 코드를 변경하지 않고도 시스템의 기능을 확장할 수 있다. | 도형 추상 클래스가 있을때 구체적인 도형을 추가하더라도 시스템에 영향을 주지 않는다. |
| 리스코프 치환 원칙 (LSP)* Liskov Substitution Principle | 하위 클래스는 상위 클래스의 모든 계약과 행동을 준수한다. | 하위 클래스는 그 상위 클래스의 행위를 제대로 구현하고 있어야 한다. | Bird 클래스가 fly() 메소드를 가질 때, Penguin클래스를 상속한다면 Penguin 클래스는 fily() 할 수 없으므로 원칙이 위배된다. |
| 인터페이스 분리 원칙 (ISP)* Interface Segration Principle | 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하게 만들어서는 안 됩니다. | 하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 더 좋습니다. | 자동차 인터페이스를 운전 인터페이스, 정비 인터페이스로 분리 |
| 의존성 역전 원칙 (DIP)* Dependency Inversion Principle | 추상화에 의존해야지, 구체화에 의존하면 안된다. | 모듈 간의 의존성을 추상화를 통해 관리하여 시스템의 결합도를 낮춥니다. | 서버측 객체가 변경되어도 클라이언트측 객체는 변하면 안된다. |
객제지향의 핵심은 다형성. 하지만 다형성만으로는 OCP, DIP를 지킬 수 없다. 뭔가 필요하다. 스프링 프레임워크로 해결이 가능하다. 의존성 주입(Dependency Injection, DI), DI 컨테이너를 활용해서 클라이언트 코드의 변형 없이 기능을 확장할 수 있다.