프레임워크(Framework)란?
- 사전적 의미는 '어떤 것을 구성하는 구조 또는 뼈대'
- 소프트웨어적 의미로는 '기능을 미리 클래스나 인터페이스 등으로 만들어 제공하는 반제품
장점
- 일정한 기준에 따라 개발이 이루어지므로 개발 생산성과 품질이 보장된 애플리케이션을 개발할 수 있음.
- 개발 후 유지보수 및 기능의 확장성에서도 고품질 보장
스프링 프레임워크
- 스프링프레임워크 는 자바 웹 애플리케이션 개발을 위한 오픈 소스 프레임워크
컨테이너란?
- 톰캣은 서블릿 컨테이너라고 부르는데, 그 이유는 톰캣을 실행하면 톰캣은 서블릿의 생성, 초기화, 서비스, 실행, 소멸에 관한 모든 권한을 가지고 서블릿을 관리
- 스프링은 애클리케이션에서 사용되는 여러가지 빈(클래스객체)을 개발자가 아닌 스프링이 권한을 가지고 직접 관리
스프링의 특징
- 가볍고 배우기도 쉬우며 경량 컨테이너의 기능을 수행
- 제어 역행(IoC, Inversion of Control) 기술을 이용해 애플리케이션 간의 느슨한 결합을 제어함
- 의존성 주입(DI, Dependency Injection) 기능을 지원함
- 관점 지향(AOP, Aspect-Oriented Programming) 기능을 이용해 자원 관리함
- 영속성과 관련된 다양한 서비스를 지원함
- 수많은 라이브러리와의 연동 기능을 지원함

- 의존성 주입: 클래스 객체를 개발자가 코드에서 생성하지 않고 프레임워크가 생성하여 사용하는 방법
- 제어 역행 : 서블릿이나 빈 등을 개발자가 코드에서 생성하지 않고 프레임워크가 직접 수행하는 방법
- 관점 지향 : 핵심 기능 외 부수 기능들을 분리 구현함으로써 모듈성을 증가시키는 방법

의존성주입
- 연관 관계를 개발자가 직접 코딩을 통해 컴포넌트(클래스)에 부여하는 것이 아니라 컨테이너가 연관 관계를 직접 규정하는 것
- 코드에서 직접적인 연관관계가 발생하지 않으므로 각 클래스의 변경이 자유로워짐
-> 코드를 CRUD할 때 다른 코드에 영향을 미치면 좋은 코드가 아니다.
장점
클래스들 간의 의존 관계를 최소하하여 코드를 단순화할 수 있다.
애플리케이션을 더 쉽게 유지 및 관리할 수 있음
기존 구현방법은 개발자가 직접 코드안에서 객체의 생성과 소멸을 제어했지만 의존성 주입은 객체의 생성, 소멸과객체 간의 의존 관계를 컨테이너가 제어함
제어의 역전
- 기존 코드에서는 개발자가 직접 객체를 제어했지만 스프링프레임워크에서는 객체의 제어를 스프링이 직접 담당
- IoC의 종류도 여러가지이며, 일반적으로 스프링에서는 DI로 IoC의 기능을 구현하므로 IoC보다는 DI라는 용어를 더 많이 사용함.
How to?
- 생성자에 의한 주입
- Setter에 의한 주입
Lazy-init
서블릿은 기본적으로 브라우저에서 요청 발생 시 메모리에 로드됨. 최초로 요청을 한 사람은 결과를 늦게 받게 됨. 로드 시간 단축을 위해 로드온스타트업 기능을 제공
스프링 설정파일을 xml에 빈태그로 설정 -> 내가 선언한 bean 모두 한번에 로드됨
자원을 낭비하는 것을 방지하기 위해 lazy-init이라는 속성을 이용해서 빈을 언제 실행할지 지정 가능
lazy-init
- false : 바로 서버에 업로드
- true : 요청 또는 사용할 때 업로드
- default : 바로 서버에 업로드