[Spring] 🔗Spring Framework
웹사이트 제작 시
- Java 변형된 jsp/servlet
↓
- 안정적으로 사용하기위해 j2EE컨테이너만들었음 (EJB)
: 특정한 형식으로 압축해서 EJB 전용서버에 올려야하고(=배포) 지원하는 서버로만 사용해야 하므로 웹사이트 제작이 어렵고 복잡
사용자 입장에서는 안정성은 있지만 느리고. 개발자 입장에서는 무겁고 복잡
↓
- Spring Framework
: EJB의 단점을 보완 경량, 단순, 경량 컨테이너
스프링은 EJB(Enterprise Java Beans)의 무겁고 복잡한 플랫폼에서 벗어나, POJO(Plain Old Java Object)기반의 경량화된 개발 환경을 제공하는 오픈소스 프레임워크이다.
소프트웨어 프레임워크 ≒ 뼈대 혹은 기반구조
MVC패턴을 적용한 JSP/Servlet웹사이트
JSP/Servlet에서는 원하는대로 형태를 바꿀 수 있지만
Spring Framework는 고유의 뼈대 혹은 기반구조가 정해져있다 (→문법이 존재,강요됨 → 경량,단순)
* 소프트웨어 프레임워크의 특징
- 개발 용이성 : 패턴기반 개발과 비즈니스 로직에만 집중한 개발 가능. 공통 기능은 프레임워크가 제공.
- 운영 용이성 : 변경이 용이함. 비즈니스로직/아키텍처 파악이 용이.
- 시스템 복잡도의 감소 : 복잡한 기술은 프레임워크에 의해 숨겨짐. 미리 잘 정의된 기술셋 적용.
- 개발코드의 최소화 : 반복 개발 제거. 공통 컴포넌트와 서비스 활용.
- 이식성 : 플랫폼 비의존적인 개발 기능. 플랫폼과의 연동은 프레임워크가 제공.
- 변경용이성 : 잘 구조화 된 아키텍처 적용. 플랫폼에 비의존적
- 품질보증 : 검증된 개발 기술과 패턴에 따른 개발. 고급 개발자와 초급 개발자의 차이를 줄여줌.
- 설계와 코드의 재사용성 : 프레임워크의 서비스 및 패턴의 재사용. 사전에 개발된 컴포넌트의 재사용
* 스프링 프레임워크의 특징
1) 경량(Lightweight)
스프링은 여러 개의 모듈로 구성되어 있으며, 각 모듈은 하나 이상의 JAR 파일로 구성되어 있다. 그리고 이 몇 개의 JAR 파일만 있으면 개발과 실행이 모두 가능하고 크기도 작다. 따라서 스프링을 이용해서 만든 애플리케이션의 배포 역시 매우 빠르고 쉽다.
2) IoC((Inversion of Control)) 컨테이너 = Spring 컨테이너 [Spring] 🔗1) IoC컨테이너(Spring 컨테이너)
IoC가 적용되기 전에는 애플리케이션 수행에 필요한 객체의 생성이나 객체와 객체 사이의 의존 관계를 개발자가 직접 자바 코드로 처리했었다. 하지만 IoC가 적용되면 객체 생성을 자바 코드로 직접 처리하는 것이 아니라 컨테이너가 대신 처리한다.
IoC 컨테이너는 자바 객체의 생성, 소멸과 같은 라이프 사이클을 관리하며, 스프링 컨테이너로부터 필요한 객체를 가져와 사용하고 안넣으면 일반적인 객체가되어서 스프링의 기능을 심지못한다.
3) DI(Dependency Injection)를 지원 [Spring] 🔗2) DI(Dependency Injection)
설정 파일이나 어노테이션을 통해서 객체 간의 의존 관계를 설정(의존관계 주입)
객체간 의존 관계를 형성할 때 의존(dependency)하는 객체를 조립기가 삽입(inject)해 주는 방식. 스프링은 설정 파일과 어노테이션을 이용하여 손쉽게 객체 간의 의존 관계를 설정하는 기능 제공.
4) AOP(Aspect Oriented Programming) 지원 [Spring] 🔗3) AOP
관점지향 프로그래밍은 공통으로 사용하는 기능들을 외부의 독립된 클래스로 분리하고, 해당 기능을 프로그램 코드에 직접 명시하지 않고 선언적으로 처리하여 적용하는 것을 말한다.
트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심은 아닌 기능들을 분리해서 각 모듈에서 적용
5) POJO(Pain Old Java) 지원.
POJO란 말 그래도 평범한 옛날 자바 객체를 의미한다.
6) 트랜잭션 처리를 위한 일관된 방법 제공.
7) JDBC, MyBatis(iBatis), 하이버네트, JPA 등 데이터베이스 처리를 위한 라이브러리 연동
8) JMS, 메일, 스케줄링 등 엔터프라이즈 어플리케이션을 개발하는데 필요한 다양한 API 연동
9) Spring MVC
Model,View,Controller 사이의 의존관계를 컨테이너에서 관리
스프링 프레임워크 설치
스프링 사이트 : http://spring.io/
STS 다운로드 : http://spring.io/tools/sts
Maven
메이븐(Maven)은 소프트웨어를 개발할 때 반복되는 작업을 자동화하는 빌드 도구.
메이븐을 사용하면 표준 프로젝트를 일관된 방식과 구조로 관리하고 배포하고 운영할 수 있다.
- 메이븐의 특징
- 정형화된 구조와 절차를 제공 : 메이븐은 컴파일(compile),패키징(package),테스트(test) 등의 작업 프로세스를 정형화하고 이를 준수하도록 장제
- 디펜던시 라이블러리 해결을 자동화 : 디펜던시 라이블러리 혹은 라이브러리 디펜던시는 라이브러리 의존성(혹은 종속성)을 의미한다. 애플리케이션을 실행하기 위해 필요한 라이브러리들과 그 라이브러리들이 필요로 하는 라이브러리들을 가리킨다.
- 라이브러리 관리가 용이 : 메이븐에서는 라이브러리 전용 저장소(repository)를 제공하므로, 통합 관리가 가능
- 라이프 사이클을 가짐 : 라이프 사이클에 따라서 연속적으로 단계를 설정
- 다양한 플러그인을 활용할 수 있음 : 플러그인으로 기능을 확장한다. 플러그인을 사용하면 IDE 프로젝트로 자동 변환, 데이터베이스 통합, 다양한 리포트 생성 등의 작업을 수행할 수 있다. 메이븐은 pom.xml 파일에 위의 내용을 기술한다.
- 디펜던시 관리
프로젝트에 포함된 디펜던시는 pom.xml 파일 안에 <dependencies> 요소를 사용하여 표현하며 POM의 일부로 메이븐에서 사용하게 된다. 프로젝트 디펜던시들은 저장소에 저장된다.
- 디펜던시 필수 항목은 세 가지
항목 | 설명 |
groupId | 부분적인 프로젝트나 조직에서의 라이브러리 집합을 식별하기 위해 제공 |
artifactId | 프로젝트의 실제 이름으로 groupId와 합쳐져서 프로젝트 식별에 쓰인다. |
version | 선언한 디펜던시 아티팩트의 버전으로 프로젝트 내에서 사용하는 아티팩트의 일관성을 지킬 수 있다. |
- 추가로 scope 항목을 정의(JDK나 웹 애플리케이션 서버(WAS)에서 제공하는 라이브러리와 디펜던시에서 선언한 라이블러리 간의 충돌이 일어나는 경우가 발생할 수 있으므로 사용하고자 하는 라이브러리의 스코프(scope)를 명시해야 하는 경우)
디펜던시 scope | 적용 범위 |
compile | 기본값으로 모든 클래스 패스에서 사용 가능하다 |
provided | 컴파일과 유사나 패키지에는 포함되지 않는다. 컨테이너나 JDK에서 제공한다. 예) 웹 애플리케이션을 위한 Servlet API, JSP API |
runtime | 컴파일러가 아닌 런타임 시에 사용된다. 예) JDBC drivers |
test | 테스트 단계에서만 사용된다. 예) JUnit |
system | provided와 유사하나 개발자가 직접 JAR 파일을 제공해야 하고 저장소에서 지정한 dependency를 잦지 않는다 |