Spring (스프링) :
엔터프라이즈 용 자바 애플리케이션 개발을 편하게 해주는 = 대규모 자바개발을 편하게 해주는 도구
기업에서 운영하는 웹 서비스에는 비즈니스 로직이라는 것이 있다
비즈니스 로직이란 기업에 제공하는 서비스 코드를 구현한 것으로 사용자의 요구사항을 해결하기 위한 실질적인 코드
비즈니스 로직을 구현하는 기술자체가 복잡하고 어려웠기 때문에 스프링이 등장하기 이전에는 비즈니스 로직을 구현하는 기술 자체에 대한 공부가 필수적으로 필요했다
*엔터프라이즈 : 대규모
스프링이 등장함으로써 효율적으로 개발할 수있도록 다양한 도구와 기술을 지원한다
JSP, MyBatis, JPA 등 자바를 이용한 여러가지 기술이 있는데 이 기술들이 여러 프로젝트에서 많이 사용한다.
스프링은 이러한 기술들을 더 편하게 사용할 수 있도록 한다
스프링은 개발과정을 간소화 해주고 반복작업을 줄여준다
또한 스프링은 java 애플리케이션 개발이라는 말 그대로 java 언어를 기반으로 하는 웹 프레임 워크 자바로 다양한 애플리케이션을 만들기 위한 프로그래밍 틀.
*오픈소스 : 스프링은 모든 사용자에게 열려있다.
*경량급 : 스프링에서 경량급이라는 용어는 스프링이 복잡하고 무거운, 엔터프라이즈급 애플리케이션 개발을 보다 가볍고 유연하게 만들어준다는 의미
스프링을 사용하기 전에 작성했던 코드보다 스프링을 사용했을 때 개발자가 작성해야할 코드가 상대적으로 단순해졌다~ 즉 경량급의 의미는 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야함 했던 불필요하거나 반복되는 복잡한 코드들을 제거하여 코드의 복잡성을 낮출 수 있음을 의미한다
POJO(Plain Old Java Object)방식 :
POJO란, Plain Old Java Object, 즉 순수 Java만을 통해서 생성한 객체를 의미합니다.
순수 Java 만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용한다는 의미.
스프링의 가장 큰 특징은 POJO 프로그래밍을 지향하는 것. POJO 프로그래밍을 위해 스프링이 지원하는 기술인 IoC/DI, AOP, PSA에 대해알아보자
1. IoC(Inversion of Control, 제어반전, 제어역전) :
전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
✔ 객체생성을하는 주체의 반전
개발자가 객체생성하고 사용 >>> 스프링이 객체생성 해줌
✔ 객체간의 의존성을 외부에서 주입하는 방식
의존성을 주입하면 코드의 재사용성을 높여 소스코드를 다양한 곳에 사용할 수 있고 모듈간의 결합도도 낮출 수 있다
AOP(Aspect Oriented Programming) 관점(관심)지향프로그래밍 :
코드의 중복이라는 문제를 해결하기 위해서는 공통 관심 사항과 관련된 기능들을 별도의 객체로 분리해낸 다음, 분리해낸 객체의 메서드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있도록 해야 합니다.
이처럼, 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)라고 한다.
Bean생명주기 관리 :
스프링 프레임워크는 Bean이라는 이름으로 프레임워크에서 사용되는 Java 객체(혹은 Component)의 생성, 소멸을 직접 관리한다. 우선순위 설정, Configutaion을 통해 코드로 작성해 두고, 필요한 객체만을 사용할 수도 있다.
강낭콩 껍질 안에 뭐가 담겨져 있다는 의미로 콩
콩껍질 안에는 객체를 담는 다 그 객체의 생성, 소멸을 스프링이 관리해줌

Core: 제어 역전(IoC)과 의존성 주입(DI) 기능을 제공한다.
DAO: JDBC 추상 계층을 제공한다. JDBC는 자바의 데이터베이스 커넥터이다. 데이터가 담겨있는 VO(Value Object) 클래스를 이용해 사용한다.
ORM: JPA, Hibernate와 같은 ORM이나 MyBatis 같은 데이터베이스 API 등과 통합할 수 있는 기능을 제공한다.
AOP: 스프링 프레임워크에서 제공하는 AOP 패키지를 제공한다. 공통 로직을 한군데서 관리해서 공동으로 사용한다는 개념
Web: Spring Web MVC, Struts, WebWork 등 웹 애플리케이션 구현에 도움되는 기능을 제공한다.
JEE: EJB, JMX 등의 엔터프라이즈 J2EE 스펙에 관한 기능을 제공한다
*스프링 프레임워크의 구조

라이브러리 :
프레임워크 :
API는 점원과 같은 역할
API는 손님(프로그램)이 주문할 수 있게 메뉴(명령 목록)를 정리하고, 주문(명령)을 받으면 요리사(응용프로그램)와 상호작용하여 요청된 메뉴(명령에 대한 값)를 전달한다
쉽게 말해, API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체로 볼 수 있다

API는 서버와 데이터베이스에 대한 출입구 역할을 한다.
: 데이터베이스에는 소중한 정보들이 저장되는데요. 모든 사람들이 이 데이터베이스에 접근할 수 있으면 안 되겠지요. API는 이를 방지하기 위해 여러분이 가진 서버와 데이터베이스에 대한 출입구 역할을 하며, 허용된 사람들에게만 접근성을 부여해줍니다.
API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다.
: 여기서 애플리케이션이란 우리가 흔히 알고 있는 스마트폰 어플이나 프로그램을 말합니다. API는 애플리케이션과 기기가 데이터를 원활히 주고받을 수 있도록 돕는 역할을 합니다.
API는 모든 접속을 표준화한다.
API는 모든 접속을 표준화하기 때문에 기계/ 운영체제 등과 상관없이 누구나 동일한 액세스를 얻을 수 있습니다. 쉽게 말해, API는 범용 플러그처럼 작동한다고 볼 수 있습니다.
: private API는 내부 API로, 회사 개발자가 자체 제품과 서비스를 개선하기 위해 내부적으로 발행합니다. 따라서 제 3자에게 노출되지 않습니다.
: public API는 개방형 API로, 모두에게 공개됩니다. 누구나 제한 없이 API를 사용할 수 있는 게 특징입니다.
:partner API는 기업이 데이터 공유에 동의하는 특정인들만 사용할 수 있습니다. 비즈니스 관계에서 사용되는 편이며, 종종 파트너 회사 간에 소프트웨어를 통합하기 위해 사용됩니다.
API를 사용하면 많은 이점들이 있는데요. Private API를 이용할 경우, 개발자들이 애플리케이션 코드를 작성하는 방법을 표준화함으로써, 간소화되고 빠른 프로세스 처리를 가능하게 합니다. 또한, 소프트 웨어를 통합하고자 할 때는 개발자들 간의 협업을 용이하게 만들어줄 수 있죠.
public API와 partner API 를 사용하면, 기업은 타사 데이터를 활용하여 브랜드 인지도를 높일 수 있습니다. 뿐만 아니라 고객 데이터베이스를 확장하여 전환율까지 높일 수 있지요.
스프링 부트 :
스프링 부트는 스프링을 기반으로 하여 애플리케이션을 쉽게 생성하고 배포하기 위해 개발된 모듈이다. 기본적으로 의존성 관리와 라이브러리의 설정을 해주며, 웹 서버가 하나의 파일에 내장된 상태로 빌드되기 때문에 배포(Deploy)가 매우 간편해진다.
스프링 부트에서는 5가지 핵심 기능을 제공하여 사용자가 스프링 프레임워크를 편리하게 사용하도록 도와준다.
내장 서버(TomCat): 톰캣이라고 하는 내장 서버가 있어서 별도의 서버를 설치할 필요 없이 손쉽게 웹 애플리케이션을 개발하고 배포할 수 있다.
자동 라이브러리 관리: 수많은 라이브러리를 베스트 프랙티스 기반으로 자동으로 선택하고 관리함으로써 프로젝트를 쉽고 빠르게 시작할 수 있다.
자동 구성: 복잡한 스프링 설정을 자동화함으로써 개발자가 쉽고 빠르게 애플리케이션을 개발할 수 있다.
외부 설정: 애플리케이션을 개발 환경 ↔ 운영 환경처럼 서로 다른 환경에서 사용할 때 필요한 외부 설정값을 편리하게 조회할 수 있다.
모니터링 & 관리 기능: 애플리케이션의 수많은 지표를 자동으로 수집/모니터링/관리할 수 있는 기능을 제공한다.
스프링 부트에서 지원하는 스프링 모듈은 종속성 이름 앞에 spring-boot-starter-라는 접두사가 붙는다.