[Spring] 스프링 프레임워크
-자바에서 가장 많이 사용하는 프레임워크
-자바 기반의 애플리케이션 프레임워크로 *엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능 제공
-현재 우리나라 전자정부 표준 프레임워크로 공공기관 웹 서비스 개발 때 사용
*앤터프라이즈급 개발
-기업환경을 대상으로 하는 개발을 뜻함
-네이버, 카카오톡 같은 대규모 데이터를 처리하는 환경
#.스프링의 특징과 구조
$.제어역전(Loc)
- 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것
- 이를 통해 의존성 주입(DI : Dependency Injection), 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)등 가능
-일반적인 자바에서는 객체를 사용하기 위해 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사
-즉. 객체를 생성하고 사용하는 일련의 과정을 개발자가 직접 제어

-제어 역전(Loc : Inversion of Control)은 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 *외부에 위임
*외부 - 스프링 컨테이너 or Loc 컨테이너
>개발자가 *비즈니스 로직을 작성하는데 집중하게 해
*비즈니스 로직 - 프로그램의 핵심, 데이터가 어떻게 생성, 저장되는지 작성한 코드
$.의존성 주입(DI)
-제어의 역전의 방법 중 하나
-외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
-주입 받는 방법 : 3가지
> 생성자를 통한 주입 -> 공식문서 권장: 레퍼런스 객체 없이는 객체를 초기화할 수 없기 때
> 필드 객체 선언을 통한 주입
> setter 메서드를 통한 의존성 주입
> @Autowired 라는 어노테이션



$.관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)
-*관점을 기준으로 묶어 개발하는 방식
*관점(Aspect)- 어떤 기능을 구현할 때 *핵심 기능과 *부가 기능을 구분해 각각 하나의 관점으로 보는 것을 의미
*핵심 기능 - 비즈니스 로직을 구성하는 과정이서 비즈니스 로직이 처리하려는 목적 기능
ex) 상품정보 DB에 저장, 저장된 상품정보를 보여주는 코드
*부가 기능 - 비즈니스 로직 사이에 로깅 처리, 트랜잭션 처리하는 코드
-AOP관점에서는 어떤 기능인지에 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 되기 때문에
-반복되는 기능을 공통 로직으로 처리하도록 모듈화해 삽입하는 방식
-구현 방법 : 3가지
> 컴파일 과정에 사입
> 바이트코드를 메로리에 로드하는 과정에 삽입
> 프록시 패턴을 이용한 방식 -> 스프링에서는 이것을 사용
스프링은 개존 개발 방식의 문제와 한계를 극복하기 위해 다양한 기능을 제공하나 설정이 복잡하다.
이를 해결하기 위해 나온 것이 스프링 부트(spring boot)