스프링 프레임워크(Spring framework)
- 서버에서 실행되는 엔터프라이즈 애플리케이션 개발을 지원하는 프레임워크다
- POJO(Plain Old Java Object)를 사용해서 서버용 자바 애플리케이션 개발을 지원하는 프레임워크
POJO (Plain Old Java Object)
POJO는 단순한 옛날 자바 객체를 뜻한다
Plain
- 특정한 라이브러리나 프레임워크에 종속적이지 않다
- 애플리케이션을 실행하기 위해서 특정한 서버가 필요하지 않다
Old
- EJB가 등장하기 전에 자바 클래스를 정의, 생성, 실행했던 그 옛날 방식
- EJB에서는 EJB서버가 제공하는 서비스를 사용하기 위해서는 특정한 인터페이스를 구현하고, 특정한 클래스를 상속받아서 개발해야 한다
- EJB에서는 애플리케이션을 실행하기 위해서 애플리케이션을 패키징하고, XML을 작성하고, 패키징된 애플리케이션을 서버에 배포하고, 서버를 재시작해야 한다
스프링의 주요특징
- 의존성 주입
- 관점지향 프로그래밍
- 선언적 트랜잭션 처리
- MVC 패턴의 웹 애플리케이션 개발
- 다양한 데이터베이스 엑세스
스프링 프레임워크의 기능
- 스프링 프레임워크는 애플리케이션 실행에 필요한 객체를 생성해준다
- 애플리케이션 실행에 필요한 모든 객체의 생성을 스프링에게 위임
- 예) Controller 객체, Service 객체, DAO 객체 등
- 스프링 프레임워크는 객체들간의 의존관계에 맞게 객체를 조립해준다
- 의존성 주입(Dependency Injection)을 지원
- 스프링 프레임워크는 다양한 데이터베이스 엑세스 기술과 연동을 지원
- ibatis, mybatis, JPA, hibernate 등
- 스프링 프레임워크는 관점지향 프로그래밍을 활용한 공통기능 개발을 지원
스프링 라이브러리의 종류
| 종류 | 역할 |
| Spring MVC | MVC 패턴의 웹 애플리케이션 개발 |
| Spring JDBC | 데이터베이스 엑세스 지원 |
| Spring ORM | |
| Spring AOP | 관점 지향 프로그래밍 개발 |
| Spring Bean | 스프링 컨테이너를 제공 => 의존성 주입 지원 |
| Spring Core | |
| Spring Context | |
| Spring WEB |

IOC(제어역전, Inversion of Control)
- 제어역전은 자신이 사용할 객체에 대한 결정권이 자신에게 있지 않고, 외부(제 3자) 모듈에게 결정권을 위임한 것이다.
- 자신이 사용할 객체를 직접 생성하지 않는다 ( = 자신이 사용할 객체를 외부(제 3자)모듈이 결정하는 것)
제어역전의 종류
의존성 검색(DL: Dependency Lookup, DP: Dependency Pull)
- 자신이 사용할 객체를 자신이 직접 생성하지 않고, 미리 생성된 객체 중에서 적절한 객체를 찾아서 사용하는 것
의존성 주입 (DI: Dependency Injection)
- 자신이 사용할 객체를 자신이 직접 생성하지 않고, 외부 모듈이 조립해주는 객체를 사용하는 것
- 객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리해준다
의존관계 처리방식
의존관계를 처리하는 방식은 Setter 메소드를 기반으로 하는 Setter 인젝션과 생성자를 기반으로 하는 생성자 인젝션으로 나뉜다
생성자 인젝션 방법은 <constructor-arg> 엘리먼트를 사용한다

<constructor-arg> 엘리먼트에는 ref와 value 속성을 사용하여 생성자 매개변수로 전달할 값을 지정할 수 있다
전달될 데이터가 객체일때는 ref
고정된 문자열, 정수 같은 기본형 데이터일때는 value
Setter 인젝션 방법은 <property> 엘리먼트를 사용한다

<property> 엘리먼트에도 ref와 value 속성을 사용하여 생성자 매개변수로 전달할 값을 지정할 수 있다
전달될 데이터가 객체일때는 ref
고정된 문자열, 정수 같은 기본형 데이터일때는 value
DI를 사용하는 이유
- 자신이 사용할 객체(의존하는 객체)를 직접 생성하지 않고, 제 3자로부터 제공받기 때문에 쉽게 다른 객체로 교체할 수 있다.
- 다른 객체로 쉽게 교체할 수 있다는 것은 애플리케이션의 확장성을 높이는 것
애플리케이션의 확장성을 높이는 방법
- 자신이 사용할 객체를 자신이 결정하지 않는다.
- 인터페이스를 이용한 느슨한 결합을 유도한다.
- 의존성 주입을 통해서 외부모듈로부터 자신이 사용할 객체를 주입받는다.
의존성 주입 어노테이션
@Autowired
@Autowired 어노테이션은 주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당한다
@Autowired
private MyService myService;
@ Qualifier
@ Qualifier 어노테이션은 특정 객체의 이름을 이용하여 의존성 주입할 때 사용한다. 주로 같은 타입의 빈이 여러 개 일때 구체적인 빈을 선택하기 위해 함께 사용된다
@Autowired
@Qualifier("specificBean")
private MyInterface myBean;
@ Inject
@ Inject 어노테이션은 @Autowired와 동일한 기능을 제공한다
@ Resource
@ Resource 어노테이션은 @Autowired와 @Qualifier 의 기능을 결합한 어노테이션이다. 주로 JNDI 리소스와의 연결을 위해 사용
@Resource(name = "specificBean")
private MyInterface myBean;
Spring Container
- IOC의 구현체
- 스프링 컨테이너는 객체의 생성, 객체의 의존관계를 파악해서 의존성을 주입한다 ( = 스프링 컨테이너는 설정정보(XML, 어노테이션으로 설정한다.)를 읽어서 객체를 생성하고, 의존성을 주입한다.
- 객체의 생성/유지/폐기/조립/제공 등의 기능을 제공한다.
Spring Container의 장점
Spring Container의 장점은 의존성 주입을 통한 느슨한 결합입니다.
코드의 모듈화를 촉진하고 테스트 가능한 코드를 작성할 수 있도록 한다. 또한 Spring Container는 객체의 라이프 사이클을 관리하므로 메모리 누수나 객체 소멸에 대한 걱정을 줄여줍니다.
Container 개념
: 객체의 라이프 사이클을 관리하고, 객체를 제공하는 것 ( = 객체의 라이프 사이클을 관리 - 객체의 생성, 유지, 폐기, 조립, 제공 등의 기능을 제공)
스프링의 중요 컨테이너
BeanFactory
- 스프링 컨테이너의 가장 핵심적인 기능이 정의된 인터페이스다.
- 객체 생성, 객체 조립 기능과 관련된 표준이 정의
- 구현 클래스 : XmlBeanFactory
ApplicationContext
- BeanFactory 인터페이스를 상속받아서 정의된 인터페이스다.
- BeanFactory 인터페이스에 정의된 기능 외에 AOP, 국제화처리, 이벤트 처리와 관련된 표준이 정의되어 있다.
- 구현 클래스
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- GenericXmlApplicationContext
- AnnotationConfigApplicationContext
WebApplicationContext
- ApplicationContext 인터페이스를 상속받아서 정의된 인터페이스다.
- 제공하는 기능은 ApplicationContext와 동일하다.
- 웹 애플리케이션에 적합한 스프링 컨테이너다.
- 구현 클래스 : XmlWebApplicationContext
자동 의존성 주입
: 스프링에서는 자동 의존성 주입을 쉽게 구현할 수 있도록 다양한 어노테이션을 제공한다
주로 @Component 와 그 파생 어노테이션들을 사용하여 스프링 컨테이너에게 어떤 클래스를 빈으로 등록하고 의존성 주입을 자동으로 수행하도록 알려준다
@Component
@Component 어노테이션은 일반적인 스프링 빈을 나타내며, 스프링 컨테이너에 해당 클래스를 빈으로 등록한다
이 어노테이션이 붙은 클래스는 자동으로 검색되어 스프링 컨테이너에 등록
@Controller
@Controller 어노테이션은 주로 Spring MVC에서 컨트롤러 클래스를 나타낸다
이 어노테이션이 붙은 클래스는 스프링 MVC에서 요청을 처리하는 컨트롤러로 인식되어 자동으로 빈으로 등록된다
@RestController
@RestController 어노테이션은 @Controller와 유사하지만, 해당 컨트롤러가 JSON 또는 XML 형식의 응답을 생성하는 RESTful 서비스의 컨트롤러임을 나타낸다
@Service
@Service 어노테이션은 비즈니스 로직을 담당하는 서비스 클래스에 사용. 스프링 컨테이너에 빈으로 등록되어 의존성 주입이 자동으로 이루어진다
@Repository
@Repository 어노테이션은 데이터베이스와 관련된 작업을 수행하는 DAO(Data Access Object) 클래스에 사용됩니다
주로 데이터베이스 예외를 스프링이 특별한 예외로 변환하여 처리
@ControllerAdvice 및 @RestControllerAdvice
@ControllerAdvice 와 @RestControllerAdvice 어노테이션은 전역 예외 처리를 담당하는 클래스에 사용된다
이 클래스들은 @Controller 및 @RestController 에서 발생하는 예외를 처리하고 응답을 조작할 수 있도록 한다
★ 싱글톤★
- 소프트웨어 디자인 패턴 중 하나로, 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 패턴
- 해당 클래스의 인스턴스가 어플리케이션 내에서 전역적으로 접근 가능하게 하고, 여러 곳에서 해당 인스턴스를 공유하여 사용할 수 있도록 한다
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
빌드도구 (Build Tool)
- 빌드 도구는 프로젝트 생성, 컴파일, 테스트, 패키징, 배포 등의 작업을 위한 전용 프로그램
- Ant, Maven, Gradle 등의 빌드도구가 있다
Maven
- 자바용 프로젝트 관리도구
- maven은 프로젝트의 전체 라이프 사이클을 관리하는 도구
- 프로젝트의 생성, 컴파일, 빌드, 패키징, 배포 등의 작업을 수행할 수 있다
- 프로젝트 및 빌드 단계가 표준화할 수 있고, 종속성(의존하는 라이브러리) 관리를 효율적으로 처리할 수 있다
Maven의 특징
Project Object Model(POM)
- 프로젝트의 구조, 라이브러리 의존성, 빌드 설정 등을 정의하는 XML 파일
- pom.xml은 프로젝트의 메타정보를 포함하고 있으며, 메이븐은 이 정보를 바탕으로 프로젝트를 빌드하고 종속성을 관리한다.
의존성 관리
- 프로젝트가 필요로 하는 외부 라이브러리 및 종속성을 관리한다.
- pom.xml파일에서 종속성을 선언하면 maven이 해당 종속성을 자동으로 다운로드하고 프로젝트에 포함시킨다.
다양한 플러그인
- 컴파일, 테스트, 패키징, 배포 등을 지원하는 다양한 플러그인을 제공한다.
- 사용자는 필요한 작업을 수행하기 위해서 플러그인을 등록할 수 있다.
중앙저장소 제공
- maven은 중앙저장소를 통해 라이브러리와 플러그인을 제공한다.
- 사용자가 필요로 하는 라이브러리와 플러그인을 다운로드 할 수 있고, 자신이 제작한 라이브러리나 플러그인을 배포할 수 있다.
빌드 라이프 사이클 제공
- maven은 미리 정의된 빌드 라이프 사이클을 제공한다.
- mavne은 clean, compile, test, package, install, deploy 등의 단계로 구성된 일련의 빌드단계가 있다.
'Spring' 카테고리의 다른 글
| Spring_Spring MVC, 첨부파일 업로드 (0) | 2024.03.15 |
|---|---|
| Spring_스프링 시큐리티 (0) | 2024.03.12 |
| Spring_form 입력 값 유효성 체크, <form:form>태그 (3) | 2024.03.06 |
| Spring_AOP (0) | 2024.02.27 |
| Model2_MVC패턴 (Spring 들어가기 전) (0) | 2024.02.15 |