
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크.
기업에서는 운영하는 웹 서비스의 비즈니스 로직이 있다.
비즈니스 로직이란 ,기업이 제공하는 서비스를 코드로 구현한 것으로, 사용자의 요구사항을 해결하기 위한 실질적인 코드들을 의미.
스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 위해 기술 자체에 대한 공부를 해야했지만

스프링은 개발 초기에 기본적인 설정과 적용시킬 기술만 잘 선택해준다면, 기술보다 어플리케이션 로직 자체에 집중할 수 있는 장점이 있다.
어떤 개인 및 기업도 스프링을 사용하여 웹어플리케이션을 개발할 수 있다. 필요하다면 스프링의 코드를 일부 수정하여 사용하도 무관하다.
심지어 안정적인 개발과 개선이 보장된다.
라이브러리는 자동차
프레임워크는 비행기.
자동차로 목표를 향해가면 자유롭게 핸들을 돌리거나 루트를 선택할 수 있지만
비행기는 좌석 선택만하면 핸들을 돌리거나 하는 선택의 여지 없이 목표에 도달 한다.
프레임워크란, 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과관련된 코드의 뼈대를 미리 만들어 둔것을 의미한다.

▲ 스프링부트 프레임워크 구성.

순수 Java 만을 통해서 생성한 객체 지향.
순수 Java만을 사용한다는것은 Java 스펙에 정의된 기술만 사용한다는 뜻.
POJO는 말 그대로, 다른 기술을 사용하지 않는 순수한 Java만을 사용하여 만든 객체인 것입니다.

만일 라이브러리를 가져와서 사용한다면
해당 기술이 Deprecated되거나 신 기술이 등장하면 기존 기술과 관련된 코드를 모두 고쳐야하는 상황이 생기지만 POJO를 사용하면 외부 기술이나 규약 변화에 얽매이지 않을 수 있다.
객체지향 설계를 제한없이 적용할 수 있으며
코드가 단순해져 테스트와 디버깅 또한 쉽다.
JAVA 언어의 특징은 객체지향이다.
객체들 간의 관계를 적절히 맺어주는 것이 중요한 요소이다.
객체들 간에 관계를 맺어준다는 것은 거창한 것이 아니다.
A 인스턴스가 B 인스턴스의 메서드를 호출하고 있다면 A와 B는 의존 관계를 맺게되는데 이 A와 B는 의존 관계라 표현할 수 있다.

A와 B는 의존 관계는 개발자가 설정한다.
개발자가 직접 new 키워드를 사용하여 인스턴스를 생성하는 코드를 작성했기 때문이다.
이 코드에 뭐가 문제가 있는가?
A가 사용할 객체를 B가 아니라 새롭게 C를 정의해서 사용하고자 한다면 어떻게 해야 하나.
A코드를 아래처럼 변경 해야한다.

하지만 사용하는 객체가 수십, 수 백개라면 모든 객체의 코드를 수정해야한다.
하지만 스프링을 사용한다면 최소한의 수정만으로 유연하게 대처 가능하다.

A는 자신이 사용할 객체를 스스로 생성하지 않는다.
생성자를 통해 외부로부터 받아온다.
A는 자신이 사용할 객체를 알지 못하며, 그저 d에 할당된 인스턴스 example() 메서드가 존재한다는 것만 알고 있다.
누군가 A가 사용할 객체를 결정하고 생성해서 A가 인스턴스화될 때 인자로 전달해주어야만 합니다. 그래야 A는 B의 것이든, C의 것이든 example() 메서드를 호출할 수 있을 것이기 때문입니다. 그 누군가가 무엇일까요?
그 누군가가 바로 바로 스프링입니다. 스프링을 사용하면 애플리케이션의 로직 외부에서 A가 사용할 객체를 별도로 설정할 수 있습니다. 개발자가 설정 클래스 파일에 A가 사용할 객체를 C로 설정해두면, 애플리케이션이 동작하면서 스프링이 설정 클래스 파일을 해석하고, 개발자가 설정해둔대로 C 객체를 생성하여 A의 생성자의 인자로 C를 전달해줍니다.
개발자가 아닌 스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)라고 하며, 그 과정에서 C를 A의 생성자를 통해 주입해주는 것을 DI(Dependency Injection, 의존성 주입)라고 합니다.
애플리케이션을 개발할 때에 구현해야 하는 기능들은 크게 공통 관심 사항과 핵심 관심 사항으로 분류할 수 있습니다. 먼저, 핵심 관심 사항은 애플리케이션의 핵심 기능과 관련된 관심 사항으로, 커피 주문 애플리케이션을 예로 든다면 메뉴 등록하기, 주문하기, 주문 변경하기 등이 있을 것입니다.
반면, 공통 관심 사항은 모든 핵심 관심 사항에 공통적으로 적용되는 관심 사항들을 의미합니다. 예를 들어, 메뉴 등록하기, 주문하기, 주문 변경하기 등 모든 핵심 관심 사항에는 로깅이나 보안 등과 관련된 기능들이 공통적으로 적용되어야만 합니다.
이 때, 핵심 관심 사항과 공통 관심 사항이 코드에 아래와 같이 함께 모여 있으면 필연적으로 공통 관심 사항과 관련된 코드가 중복될 수밖에 없습니다. 이처럼 코드가 중복되어져 있는 경우, 공통 관심 사항을 수행하는 로직이 변경되면 모든 중복 코드를 찾아서 일일이 수정해주어야만 합니다.

코드 중복문제를 해결하기 위해서 어플리케이션 전반에 적용되는 공통기능을 비즈니스로직으로부터 분리하는 것을 AOP(pect Oriented Programming, 관심 지향 프로그래밍)라고 합니다.
웹 서버는 데이터베이스와 소통하며 웹 클라이언트의 요청을 처리해야 하기 때문입니다. 데이터베이스의 종류는 MySQL, Oracle, Maria DB, Mongo DB 등 실로 다양하다.
여러분이 MySQL을 사용하여 개발을 완료했는데, Maria DB로 데이터베이스를 바꿔야 하는 상황을 가정해봅시다. 이 때, 각 데이터베이스마다 사용 방법이 다르다면 어떨것 같나요? 아마 기존에 작성한 코드를 전부 지우고 새로 작성해야 하거나, 기존 데이터베이스와 새로운 데이터베이스 간에 사용 방법이 다른 코드를 모두 찾아서 일일이 수정해주어야 할 것입니다.
그러나, 스프링을 사용하면 동일한 사용방법을 유지한 채로 데이터베이스를 바꿀 수 있습니다. 이는 스프링이 데이터베이스 서비스를 추상화한 인터페이스를 제공해주기 때문에 가능합니다. 즉, 스프링은 Java를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스를 제공하고 있으며, 이를 JDBC(Java DataBase Connectivity)라고 합니다.
각 데이터베이스를 만든 회사들은 자신의 데이터베이스에 접근하는 드라이버를 Java 코드의 형태로 배포하는데, 이 드라이버에 해당하는 Java 코드의 클래스가 JDBC를 구현합니다. 따라서, JDBC를 기반으로 하여 데이터베이스 접근 코드를 작성해두면, 이후에 데이터베이스를 바꾸어도 기존에 작성한 데이터베이스 접근 로직을 그대로 사용할 수 있습니다.
이러한 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 한 것을 PSA(Portable Service Abstraction, 일관된 서비스 추상화)라고 합니다
