▶스프링(Spring)
Web Application 개발에 주로 사용되는 JAVA 기반 프레임워크이다.
▶프레임워크
편의를 위해 여러 기능들을 추상적으로 정의해놓은 틀.
사용자는 필요한 기능을 가져와서 틀에 맞추어 구현하기만 하면 된다.
즉, 내비게이션과 비슷한 역할을 한다고 할 수 있다. (안내에 따라 안전운전 만 하면 됨)
- 스프링 프레임워크 주요 기능
1. DI : 의존 객체 주입
2. AOP : 관점 지향 프로그래밍
3. JDBC : Java Data Base Connector
4. MVC : Model, View, Controller
▶MVC 패턴
Model-View-Controller의 약자로 애플리케이션을 세 가지의 영역으로 구분한 개발 방법론이다.
사용자 인터페이스로부터 비즈니스 로직을 분리하여
애플리케이션의 시각적 요소와 그 이면에서 수행되는 비즈니스 로직을 서로 영향 없이 유지보수할 수 있다는 장점을 가졌다.
영역 |
설명 |
Model |
- 애플리케이션에 비즈니스 로직과 사용되는 데이터를 다루는 영역이다. - 일반적으로 비즈니스 데이터는 DBMS에 의해 관리되고, 그 데이터를 다루는 연산은 SQL문을 통해 구현된다. |
View |
- 최종 사용자에게 보여주기 위한 프리젠테이션 로직을 다루는 영역이다. - 일반적으로 자바 웹 애플리케이션은 JSP를 통해 구현된다. |
Controller |
- 사용자로부터 요청을 받아 Model을 통해서 데이터를 가져오고, 그 정보를 바탕으로 View를 제어하여 응답하는 역할을 하는 영역이다. |
▶스프링 프레임워크 모듈
스프링 프레임워크 모듈 |
제공 기능 |
spring-core |
DI, IOC |
spring-aop |
AOP 구현 기능 |
spring-jdbc |
데이터베이스를 쉽게 다룰 수 있게 하는 기능 |
spring-tx |
트랜잭션 관련 기능 |
spring-webmvc |
Model/View/Controller 패턴을 이용한 구현 |
▶IOC (Inversion of Control)
객체의 생성, 생명 주기의 관리 등 모든 객체에 대한 제어권이 컨테이너에 있는 아키텍처이다.
▶스프링 IOC 컨테이너 (=스프링 컨테이너)
스프링 프레임워크에서 XML문서(spring 설정 파일)를 통해 생성 및 조립된 객체들을 담아놓은 큰 그릇이라고 생각하면 쉽다.
사용자는 담겨있는 것들 중 필요한 객체(기능)들을 꺼내서 구현하기만 하면 된다.
- 스프링 컨테이너 생명주기
GenericXmlApplicationContext 객체를 생성할 때 스프링 컨테이너가 생성되고, 내부에 bean 객체들이 생성된다.
(스프링 컨테이너의 생성 시점 = bean 객체의 생성 시점)
GenericXmlApplicationContext 객체의 close() 메서드 호출시 스프링 컨테이너와 bean 객체들이 소멸된다.
(스프링 컨테이너의 소멸 시점 = bean 객체의 소멸 시점)
▶Maven
자바 프로젝트의 빌드를 자동화해주는 빌드 툴 중의 하나.
메이븐 설정 파일(settings.xml, pom.xml)을 참조한다.
- 구조
폴더 및 파일 | 설명 |
MavenPjt/ |
스프링 프로젝트 root |
MavenPjt/pom.xml | 메이븐 설정 파일 |
MavenPjt/src | 폴더 |
MavenPjt/src/main | 폴더 |
MavenPjt/src/main/java |
자바 파일들이 관리되는 폴더 |
MavenPjt/src/main/resources |
스프링 설정 파일 또는 프로퍼티 파일 등이 관리되는 폴더 |
메이븐은 위와 같은 구조로 구성되어 있어야 빌드가 가능하다.
-메이븐 프로젝트 생성 방법
1. 이클립스에서 maven project를 자동 생성하여 사용
2. 구조에 맞게 폴더 및 파일을 생성한 뒤 import하여 사용
▶pom.xml
메이븐 설정파일.
메이븐은 이 파일의 내용을 토대로 모듈(라이브러리)을 연결해준다.
pom.xml에 필요한 모듈들을 명시해주기만 하면
메인 레파지토리에서 필요한 모듈들을 자동으로 다운받아온다.
한 번 다운로드한 뒤에는 받아 둔 모듈을 사용하게 되어있다.
(즉, 처음 한 번만 모듈을 다운로드하는 시간이 소요됨)
▶스프링 설정 파일(.xml)
스프링 프레임워크에서 객체를 생성하기 위해 참조하는 xml 파일
bean 객체를 생성하기 위해 bean 태그를 사용한다.
<bean id="bean객체 아이디" class="클래스 경로"/>
//해당 클래스를 통해 인스턴스를 생성하고 id를 붙여서 관리한다.
여러 파일로 분리하는 것도 가능하다.
일반적으로 기능 별로 구분하여 파일을 분리한다.
<import resource="스프링설정파일.xml"/>
import 태그로 분리된 스프링 설정 파일(.xml)을 하나로 합칠 수 있다.
[applicationContext.xml]
▶스프링 설정 파일(.class)
스프링 프레임워크에서 객체를 생성하기 위해 참조하는 class 파일
@import({Config2.class, Config3.class})
위와 같이 import 애너테이션으로 분리된 스프링 설정 파일(.class)을 하나로 합칠 수 있다.
@Autowired
Calculator calcObj;
위와 같이 Autowired 애너테이션으로 의존 객체를 자동 주입할 수 있다.
[Config.class]
@Configuration
public class Config {
// <bean id="bean객체 아이디" class="클래스명"/>
/* <bean id="bean객체 아이디" class="클래스명">
<constructor-arg ref="bean객체 아이디"></constructor-arg>
</bean> */
}
/* <bean id="calc" class="Calculator">
<property name="numbers">
<List>
<value>1</value>
<value>2</value>
</List>
</property>
</bean> */
[main 메서드]
public class main(String[] args) {
// GenericXmlApplicationContext ctx = new GenericXmlApplicationContext ("classpath:applicationContext.xml");
}
▶GenericXmlApplicationContext
import org.springframework.context.support.GenericXmlApplicationContext;
import문은 이클립스의 자동 생성 기능으로 생성하도록 하자.
//ctx라는 이름으로 스프링 컨테이너 객체를 생성한다.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext( "classpath:스프링설정파일명.xml" )
//스프링설정파일.xml이 여러개인 경우
String[] appCtxs = {"classpath:스프링설정파일명1.xml",
"classpath:스프링설정파일명2.xml",
"classpath:스프링설정파일명3.xml"};
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext( appCtxs );
//스프링 컨테이너인 ctx의 getBean() 메소드를 통해 담겨있는 객체들 중 필요한 객체를 꺼내올 수 있다.
ctx.getBean("빈 객체 아이디", "클래스명.class");
※ Singleton (default)
스프링 컨테이너에 생성된 bean 객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성되며,
bean객체를 getBean() 메소드로 호출할때마다 동일한 객체가 반환된다.
※ Prototype
스프링 설정 파일의 <bean> 태그에 scope="prototype" 속성을 넣어주면,
해당 bean객체를 getBean() 메소드로 호출할때마다 새로운 객체가 반환된다.
▶DI(Dependency Injection)
의존 주입 : 객체가 의존하고 있는 객체를 외부에서 주입해주는 기법이다.
스프링은 DI 기능을 제공한다.
의존 주입 방법
- 일반 자바 프로그램
1. 생성자를 통해 의존 객체를 주입한다.
: new 클래스(의존 객체);
2. Setter를 통해 의존 객체를 주입한다.
: 객체.setObject(의존 객체);
- 스프링 프레임워크
1. 스프링 설정 파일에서 <bean>태그 내부에 <constructor-arg> 태그를 통해 의존 객체를 주입한다. (생성자)
: <constructor-arg ref="bean객체 아이디"></constructor-arg>
2. 스프링 설정 파일에서 <bean>태그 내부에 <property> 태그를 통해 의존 객체를 주입한다. (Setter)
: ※ setter 메소드가 정의되어있어야한다.
// setter의 인자 값이 bean객체인 경우
// setter의 인자 값이 String 타입인 경우
// setter의 인자 값이 List<String> 타입인 경우
// setter의 인자 값이 Map<String, String> 타입인 경우
▶의존 객체 자동 주입
스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능이다.
- @Autowired
주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.
스프링 설정 파일의 <beans> 태그에 namespace, url 등을 추가해줘야 함
<beans> 태그 내부에 있는 bean 객체 각각에 <constructor-arg ref="bean 객체 아이디"> 태그를 넣는 대신에
<context:annotation-config/>태그를 상단에 명시해준다.
클래스의 생성자, 메서드, 프로퍼티 위에 애너테이션 @Autowired를 명시해준다.
동일한 타입의 객체가 여러 개 생성되어 있는 경우에 예외가 발생할 수 있다.
따라서 예외 발생시 어떤 의존 객체를 선택할 것인지 명시해주어야 한다.
스프링 설정 파일의 <bean> 태그 내부에
<qualifier value="bean객체 아이디"/> 태그를 추가한 뒤
클래스에
@Autowired
@Qualifier("bean객체 아이디") 애너테이션을 추가해주면 된다.
- @Resource
주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다.
스프링 설정 파일에 추가해야 할 내용은 @Autowired와 동일하다.
클래스의 메서드, 프로퍼티 위에 애너테이션 @Resource를 명시해준다.
※ 클래스의 생성자가 아니라 메서드, 프로퍼티 위에 @Autowired 또는 @Resource를 명시해 의존 객체 자동 주입을 하기 위해서는 기본 생성자가 반드시 명시되어 있어야 한다. 객체를 만들어서 주입해주어야 하는데, 기본 생성자가 없으면 객체를 만드는 것이 불가능하기 때문이다.
▶웹 프로그래밍 설계 모델
-Model1
문서가 너무 장황해져서 유지보수가 힘들고 분석하기 힘들다.
-Model2
각각의 기능들을 모듈화 시켜 분리함으로써, 유지보수가 쉽고 분석하기 편하다.
-스프링 MVC 프레임워크 설계 구조
-> : 요청
<- : 응답
1. 브라우저(클라이언트) -> DispatcherServlet
2. DispatcherServlet -> HandlerMapping (가장 적합한 Controller를 찾아줌)
3. DispatcherServlet <--> HandlerAdapter (해당 Controller의 가장 적합한 메소드를 찾아줌/Model) <--> Controller
4. DispatcherServlet -> ViewResolver (처리 결과를 출력할 View를 선택 (JSP) )
5. DispatcherServlet -> View (응답을 생성)
6. View -> 브라우저(클라이언트) (JSP 응답)
- DispatcherServlet 설정
[web.xml]
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
마지막 수정 : 2019.04.17. 20:51
'□ 이론 > 기타' 카테고리의 다른 글
JSP 개념 정리 (0) | 2019.04.17 |
---|---|
JavaScript 기초 개념 정리 (0) | 2019.03.29 |
[Java] 배열(array) (0) | 2019.01.06 |
C++에서의 string 클래스 (0) | 2018.11.19 |
StringTokenizer class (스트링 토크나이저 클래스) (0) | 2018.11.12 |