-
스프링이란?Spring_FrameWork 2019. 3. 13. 13:02
스프링 프레임워크의 주요 특징은 다음과 같다.
- 의존주입 (Dependency Injection : DI)지원
- AOP (Aspect-Oriented Programing)지원
- MVC 웹 프레임워크 제공
- JDBC, JPA 연동 기술 및 선언적 트랜잭션 처리 등 DB 연동 지원
이 외에 스케줄링 메시지연동(JMS) 이메일 발송, 테스트 지원등 자바기반의 어플리케이션을 개발하는데 다양한 기능제공.
실제로 스프링 프레임 워크를 이용해서 웹 어플리케이션을 개발할때에는 스프링 프레임 워크만 단독으로 사용하기 보다는 여러 스프링 관련 프로젝트와 사용
이들 중 자주 사용되는 것은 다음과 같다.
스프링 데이터 : 적은 양의 코드로 데이터 연동을 처리할 수 있도록 도와주는 프레임 워크
스프링 시큐리티 : 인증/인가와 관련된 프레임워크로서 웹 접근 제어 , 객체 접근 제어 , DB 오픈 ID LDAP등 다양한 인증방식, 암호화 기능을 제공한다.
스프링 배치 : 로깅/추척 , 작업 통계, 실패처리등 배치 처리에 필요한 기본 기능과 웹 기반 관리 화면을 제공한다.
01 스프링 프로젝트 시작
1. 메이븐으로 프로젝트 생성2. 이클립스에서 메이븐 프로젝트 임포트3. 스프링에 맞는 자바코드와 설정파일 작성이런식으로 폴더구조를 만듬
C:\spring4\sp4-chap02\ : 프로젝트 폴더
C:\spring4\sp4-chap02\src\main\java : 자바 소스 위치 폴더
C:\spring4\sp4-chap02\src\main\resources : 자원 파일 위치 폴더
C:\spring4\sp4-chap02 폴더에 pom.XML 파일 작성
123456789101112131415161718192021222324252627282930313233<?xml version="1.0" encoding="UTF-8" ?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>sp4</groupId><artifactId>sp4-chap02</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.0.RELEASE</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target><encoding>utf-8</encoding></configuration></plugin></plugins></build></project>cs 메이븐 프로젝트의 핵심은 pom.xml 메이븐 프로젝트는 프로젝트의
루트 디렉토리의 pom.xml 파일을 갖는다.
pom.xml은 메이븐 프로젝트에 대한 설정 정보를 담고 있는 파일이다.
프로젝트에서 필요로하는 의존 모듈이나 플러그 인 등에 대한 내용을 담는다.
이 중 의존 설정에 대한 내용을 간단하게 알아보고 추가로 메이븐 레포지터리와 기본 폴더 구조에 대해
살펴보자
(1)메이븐 의존 설정
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.0.RELEASE</version></dependency></dependencies>메이븐은 한개의 모듈을 아티팩트라는 단위로 관리한다.
위 설정의 경우 spring-context라는 식별자를 가진 4.1.0 release 버전의 아티팩트에 대한 의존을 추가
의존을 추가한다는 것은 일반적인 자바 어플리케이션에서 클래스패스에 sprint-context 아티팩트를 추가한다는 것을 의미
각 아티팩트의 완전한 이름은 "아티팩트이름-버전.jar"이므로, 위 설정은 메이븐 프로젝트의 소스 코드를 컴파일 하고 실행할 때 사용할 클래스 패스에 spring-context-4.1.0.RELESE.jar 파일을 추가한다는 것을 의미한다.
(2)메이븐 리포지터리
의존설정을 추가했지만 어디서도 다운 받지않음
답은 원격 리포지토리와 로컬리포지토리에 있다. 메이븐은 컴파일하거나 코드를 실행하기위해 <dependency>로 설정한 아티팩트 파일을 찾을 때 다음과 같은 과정을 거친다.
1. 메이븐 로컬 리포지터리에서 [그룹ID]\[아티팩트ID]\[버전] 폴더에 "아티펙트ID-버전.jar"형식의 이름을 갖는 파일이 있는지검사한다. 파일이 존재하면 , 이 파일을 사용한다.
2. 만약에 로컬리포지터리에 파일이 없으면 메이븐의 원격중앙 리포지터리로 부터 해당파일을 다운로드받아 로컬리포지터리에 복사한뒤 그파일을 사용한다.
[사용자홈폴더]\.m2\repository 폴더를 사용한다.
(3)의존의 전이
mvc 컴파일을 실행하면 받은 파일을 보면 spring-context-4.1.0.RELEASE.jar 파일외에 여러 아티팩트 파일을 다운로드 받음
파일중에는 컴파일을 수행하는 필요한 메이븐 컴파일러 플러그인과 같이 메이븐 관련파일과
추가 디펜던시에 설정한 아티팩트가 다시 의존하는 파일도 추가된다.
만약에 의존하는 아티팩트가 또다른 아티팩트에 의존하고 있다면 그 아티팩트도 함깨 다운로드 한다.
이를 의존 전이라고 부른다.
[4] 기본 폴더 구조
src\main\java
src\main\resources
이 두 폴더는 메이븐이 정의되어 있는 기본 폴더로서 각각 자바 소스코드와 자원파일을 위치 시킬때 사용된다.
이때 자원파일은 클래스 패스에 위치할 파일을 의미하며 ,
스프링에서 설정 XML 파일이나 프로퍼티 파일등을 src\main\resources 폴더에 위치시킨다.
웹 애플리케이션을 개발할때 src\main\webapp 폴더를 웹 애플리케이션 기준 폴더로 사용하며 이폴더를 기준으로 JSP 소스코드나
WEB-INF\web.xml 파일등을 작성해서 넣는다.
메이븐 프로젝트를 이클립스에 임포트
file -> import -> Maven/Existing Maven Projects -> next -> Browse -> 아까 생성한 폴더를 root 디렉터리로 설정
다음과 같이 생성된 것을 확인 가능
예제 코드 작성
Greeter: 콘솔에 간단한 메시지를 출력하는 자바 클래스application,xml : 스프링 설정 파일Main.java : main()메서드를 통햇 스프링과 Greeter를 실행하는 자바 클래스java 소스 폴더에 chap2 패키지 생성 chap2에 greeter 클래스 추가1234567891011121314package chap02;public class Greeter {private String format;public String greet(String guest) {return String.format(format, guest);}public void setFormat(String format) {this.format = format;}}cs Greeter greeter = new Greeter();
greeter.setFormat("%s,안녕하세요!");
String msg = greeter.greet("스프링"); //msg 는 "스프링,안녕하세요!"가 된다.
apllicationContest.xml 파일 작성
이 파일은 resources 폴더에 작성하면된다.
123456789101112<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="greeter" class="chap02.Greeter"><property name="format" value="%s, 안녕하세요!" /></bean></beans>cs 핵심은 8~10행 부분 한개의 객체를 생성하고 초기화하는 것에 대한 내용을 담고 있다.
스프링이 생성하는 객체를 빈 객체라고 부르는데, 이 빈객체에 대한 정보를 담고 있는 태그가 <bean> 태그 이다.
<bean> 태그의 주요 속성은 다음과 같다.
id : 빈객체를 구분할 때 사용할 이름
class : 빈객체를 생성할때 사용할 클래스
id는 빈객체를 참조할 때 사용되고 뒤에서 이 값을 사용
스프링은 <property>태그를 처리 할때 , name 속성에 지정한 값의 첫글자를 대문자로 변환한 뒤에 일치하는 set 메서드를 사용한다.
9행에서 name의 속성값은 format이고 vlaue의 속성값은 "%s, 안녕하세요!" 인데 이설정음 다음의 메서드를 사용해서 값을 설정한다.
빈태그와 프로퍼티 태그를 사용한 XML설정과 객체 생성간의 관계를 일반적인 자바 코드와 비교하면 다음과같다.
실제 스프링은 XML설정파일을 읽어온뒤에 자바의 리플렉션 기능을 이용해서 객체를 생성하고 set 메서드를 실행한다.
이제 남은 건 스프링이 제공하는 클래스를 이요해서 applicationContext.xml 파일을 읽어와 사용하는 것이다.
관련된 코드는 다음과 같다.
1234567891011121314package chap02;import org.springframework.context.support.GenericXmlApplicationContext;public class Main {public static void main(String[] args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");Greeter g = ctx.getBean("greeter",Greeter.class);String msg = g.greet("스프링");System.out.println(msg);ctx.close();}}cs 3 : GenericXmlApplicationContext는 XML 파일로 부터 설정정보를 읽어와 빈 객체를 생성하고 관리하는 기능을 제공한다.
객체를 생성할때 applicationContest.xml 파일의 경로를 생성자 파라미터로 전달 . <bean> 설정정보를 읽어와 내부적으로Greeter객체를 생성하고 초기화 한다.
10: getbean 메서드는 XML파일의 빈객체를 검색할때 사용 id 속성과 검색할빈객체의 타입을 입력
10행에서 구한 객체를 greet 메서드를 실행
123456783월 13, 2019 12:39:59 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions정보: Loading XML bean definitions from class path resource [applicationContext.xml]3월 13, 2019 12:40:00 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh정보: Refreshing org.springframework.context.support.GenericXmlApplicationContext@66a29884: startup date [Wed Mar 13 12:40:00 KST 2019]; root of context hierarchy스프링, 안녕하세요!3월 13, 2019 12:40:00 오후 org.springframework.context.support.GenericXmlApplicationContext doClose정보: Closing org.springframework.context.support.GenericXmlApplicationContext@66a29884: startup date [Wed Mar 13 12:40:00 KST 2019]; root of context hierarchycs 다음과 같은 결과가 출력
02 스프링은 객체 컨테이너
스프링의 핵심기능을 객체를 생성하고 초기화 하는 것이다. 이와 관련된 기능은 ApplicationContext라는 인터페이스에정의 되어있으며, GenericXmlApplicationContext 클래스는 이 인터페이스를 알맞게 구현한 클래스중의 하나이다.GenericXmlApplicationContext은 XML 파일로부터 정보를 읽어 객체생성과 초기화를 수행하느데XML 파일이아닌 자바 설정 코드나 그루비 설정코드를 이용해서 객체 생성/초기화를 수행하는 클래스도 제공하고 있다.GenericXmlApplicationContext : XML로부터 객체 설정 정보를 가져온다.
AnnotationConfigApplicationContext : 자바 애노태이션을 이요한 클래스로부터 객체 설정 정보를 가져온다.
GenericGroovyApplicationContext : 그루비 코드를 이용해 설정정보를 가져온다.
ApplicationContext(BeanFactory)는 빈 객체의 생성, 초기화, 보관, 제거등을 관리하는데 이런이유로 ApplicationContext를 스프링 컨테이너라고도 부른다.
싱글톤객체
123456789101112131415package chap02;import org.springframework.context.support.GenericXmlApplicationContext;public class Main2 {public static void main(String[] args) {GenericXmlApplicationContext ctx =new GenericXmlApplicationContext("classpath:applicationContext.xml");Greeter g1 = ctx.getBean("greeter", Greeter.class);Greeter g2 = ctx.getBean("greeter", Greeter.class);System.out.println("(g1 == g2) = " + (g1 == g2));ctx.close();}}cs 10~11 : greeter인 빈객체를 구해서 g1과 g2에 할당
12: 두객체가같은 객체인지 콘솔에 출력
123456783월 13, 2019 12:57:02 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions정보: Loading XML bean definitions from class path resource [applicationContext.xml]3월 13, 2019 12:57:02 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh정보: Refreshing org.springframework.context.support.GenericXmlApplicationContext@66a29884: startup date [Wed Mar 13 12:57:02 KST 2019]; root of context hierarchy(g1 == g2) = true3월 13, 2019 12:57:02 오후 org.springframework.context.support.GenericXmlApplicationContext doClose정보: Closing org.springframework.context.support.GenericXmlApplicationContext@66a29884: startup date [Wed Mar 13 12:57:02 KST 2019]; root of context hierarchycs 스프링은 별도의 설정을 하지 않을경우 하나의 빈객체만을 생성하고
이들 빈객체를 싱글톤 범위를 갖는다고 표현한다. 싱글톤은 단일 객체를 의미하는 단어로서 스프링은 기본적으로 한개의 빈태그에 대해
하나의 빈객체를 생성한다.
다음과 같이 설정하면 생성되는 빈객체는 greeter에 해당하는 객체하나 와 greeter1에 해당하는 객체
이렇게 두개가 생성된다.
12345678910111213141516<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="greeter" class="chap02.Greeter"><property name="format" value="%s, 안녕하세요!" /></bean><bean id="greeter1" class="chap02.Greeter"><property name="format" value=" 안녕하세요!,%s" /></bean></beans>cs 123456789101112131415package chap02;import org.springframework.context.support.GenericXmlApplicationContext;public class Main2 {public static void main(String[] args) {GenericXmlApplicationContext ctx =new GenericXmlApplicationContext("classpath:applicationContext.xml");Greeter g1 = ctx.getBean("greeter", Greeter.class);Greeter g2 = ctx.getBean("greeter1", Greeter.class);System.out.println("(g1 == g2) = " + (g1 == g2));ctx.close();}}123456783월 13, 2019 1:01:25 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions정보: Loading XML bean definitions from class path resource [applicationContext.xml]3월 13, 2019 1:01:25 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh정보: Refreshing org.springframework.context.support.GenericXmlApplicationContext@66a29884: startup date [Wed Mar 13 13:01:25 KST 2019]; root of context hierarchy(g1 == g2) = false3월 13, 2019 1:01:25 오후 org.springframework.context.support.GenericXmlApplicationContext doClose정보: Closing org.springframework.context.support.GenericXmlApplicationContext@66a29884: startup date [Wed Mar 13 13:01:25 KST 2019]; root of context hierarchycs 'Spring_FrameWork' 카테고리의 다른 글
DI정리 (0) 2019.03.18 의존 자동 주입 (0) 2019.03.15 SpringSecurityPractice_02 (0) 2019.01.10 Spring Web Scurity Practice (0) 2019.01.06 Spring Web Security (0) 2019.01.06