본문 바로가기

□ 이론/기타

스프링 프레임워크 기본 개념 정리

▶스프링(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에 필요한 모듈들을 명시해주기만 하면 

메인 레파지토리에서 필요한 모듈들을 자동으로 다운받아온다.

한 번 다운로드한 뒤에는 받아 둔 모듈을 사용하게 되어있다.

(즉, 처음 한 번만 모듈을 다운로드하는 시간이 소요됨)

다운로드 된 모듈들은 Maven Dependencies 폴더에 저장된다.



▶스프링 설정 파일(.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