스프링(Spring)으로 프로젝트 만들어보기(1)
스프링 프레임워크(Spring Framework)는 Java 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하는 경량화된 솔루션이다. 또한 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준 프레임워크 기반 기술로서 쓰이고 있다.
스프링 프레임워크의 특징 알아보기
스프링 프레임워크는 다른 프레임워크에 비해 다음과 같은 특징을 가지고 있다.
1. 자바 객체를 직접 관리한다.
각각의 객체 생성이나 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
2. POJO(Plain Old Java Object) 방식의 프레임워크이다.
POJO는 gettet/setter를 가진 단순 자바 오브젝트로 정의를 하고 있다. 이러한 단순 오브젝트는 의존성이 없고 추후 테스트 및 유지보수가 편리한 유연성의 장점을 가지는데 이 장점들로 인해 객체지향적인 다양한 설계와 구현이 가능해진다. POJO는 일반적인 J2EE 프레임워크에 비해 구현을 위한 특정한 인터페이스를 구현하거나 상속 받을 필요가 없어서 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
3. 제어의 역전(IoC : Inversion of Control)을 지원한다.
Spring에서 Ioc는 스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 관리(제어)해주는 행위로, 일반적인 상황에서는 new 연산자를 통해 객체를 생성하고, 객체의 의존성을 맺어주고, 초기화를 해주는 등으로 개발자가 직접 객체를 제어해야했다. 하지만 Spring 에서는 xml파일 또는 어노테이션 방식으로 스프링 컨테이너에 Bean(객체)를 등록하기만 하면, 스프링 컨테이너에서 Bean의 생명주기(생성 -> 의존성 설정 -> 초기화 -> 소멸)를 전부 관리해준다. 즉, 객체에 대한 제어의 흐름을 사용자가 컨트롤하지 않고 컨테이너로 역전되기 때문에 제어의 역전이라고 하는것이다.
4. 스프링은 의존성 주입(DI : Dependency Injection)을 지원한다.
의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것이다. 스프링에서는 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다. 이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높여준다.
5. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다.
스프링은 로깅이나 보안, 트랜잭션 등 핵심적인 비즈니스 로직과 관련이 없으나 여러 곳에서 공통적으로 쓰이는 기능들을 분리하여 개발하고 실행 시에 서로 조합할 수 있는 관점 지향 프로그래밍(AOP)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
6. MVC 패턴(Model2)
*DTO(Data Transfer Object) : 데이터 전송을 위한 객체
MVC란 Model, View, Controller 구조로 사용자 인터페이스와 비지니스 로직을 분리하여 개발 하는 것이다. MVC에서는 Model1과 Model2로 나누어져 있으며 일반적인 MVC는 Model2를 지칭한다.
Model
Model은 데이터처리를 담당하는 부분이다. 애플리케이션에 비즈니스 로직과 사용되는 데이터를 다루는 영역이며 일반적으로 비즈니스 데이터는 데이터베이스에 의해 관리되고, 그 데이터를 다루는 연산은 SQL문을 통해서 구현된다.
Model 부분은 Serivce 영역과 DAO 영역으로 나누어지게 된다. 여기서 중요한 것은 Service 부분은 불필요하게 HTTP통신을 하지 않아야하고, request나 response와 같은 객체를 매개변수로 받아선 안된다. 또한 Model 부분의 Service는 view에 종속적인 코드가 없어야 하고 View 부분이 변경되더라도 Service 부분은 그대로 재사용 할 수 있어야 한다.
Model에서는 View와 Controller 어떠한 정보도 가지고 있어서는 안된다.
View
View는 사용자 인터페이스를 담당하며 최종 사용자에게 보여줄 프리젠테이션 로직을 담당하는 영역이다.(화면) 일반적으로 자바 웹 애플리케이션에서는 JSP를 통해서 구현된다.
View는 Controller를 통해 모델에 데이터에 대한 시각화를 담당하며 View는 자신이 요청을 보낼 Controller의 정보만 알고 있어야 하는 것이 핵심이다. Model이 가지고 있는 정보를 저장해서는 안되며 Model, Controller에 구성 요소를 알아서는 안된다.
Controller
Controller는 흐름을 관리하는 역할을 하며, 모델과 뷰 영역간의 조정 역할을 한다. 사용자의 요청을 받아 이를 수행하기 위한 비즈니스 로직을 선택하고 호출하며, 수행한 비즈니스 로직의 결과를 보여주기 위해 뷰를 선택하여 포워드 해주는 역할을 한다.
View에 받은 요청을 가공하여 Model(Service 영역)에 이를 전달하며 또한 Model로 부터 받은 결과를 View로 넘겨주는 역할을 한다. Controller에서는 모든 요청 에러와 모델 에러를 처리하며 View와 Model의 정보를 알고 있어야한다.
*Model1과 Model2의 비교
Model1
Model1은 요청 흐름을 제어하기 위한 Controller 가 특별히 존재하지 않는다. MVC로 굳이 구분하자면 클라이언트의 요청을 받은 JSP가 Model 영역을 선택해서 호출하므로 Controller 역할을 수행한다고 볼 수 있다. JSP는 JavaBean을 이용하여 데이터베이스를 연동하여 Model 영역의 수행 결과를 받아 클라이언트에게 보내줄 UI(User Interface)를 생성하므로 View 역할도 수행한다. 프레젠테이션로직과 비지니스로직의 분리가 어렵고 그로인한 View의 재사용성이 떨어진다.
하지만 개발기간이 짧은 소규모의 프로젝트나, 변경사항이나 요구사항이 적을경우 빠르게 개발할수 있다는 이점이 있다.
Model2
모델2에서는 서블릿이 흐름을 제어하는 Controller 역할을 수행한다. 모든 클라이언트에 요청은 서블릿에 전달되어 서블릿이 클라이언트의 요청에 따라 비즈니스 로직을 호출하고 그결과에 따라 View에 해당하는 JSP를 호출하는 방식이다.
Model2가 Model1에 비해 개발 초기의 부하가 비교적 높고, 아키텍처에 대한 수준 높은 이해를 요구하지만, 재사용성이 높고 확장이 Model1에 비해 용이하다는 장점이 있다. 무엇보다, Model2는 그 구조적 특징으로 인해 자연스럽게 MVC각 영역의 역할이 구분되도록 해준다.
Model2는 Controller 역할을 하는 서블릿의 역할이 매우 중요하며, 서블릿이 잘못 개발된 경우 애플리케이션 전체에 미치는 영향이 매우 크다. 초기에 Model2를 적용한 웹 애플리케이션 중에는 서블릿 구현시 Model 영역과 View 영역을 호출해주는 부분이 하드 코딩되어 있거나 비효율적으로 구현되어 애플리케이션의 효율을 떨어뜨리고 구조만 복잡하게 되어버리는 경우가 많았다. 그러나 수많은 시행착오 끝에 잘 구축된 Controller들이 재활용되기 시작하면서 웹 프레임워크(Framework) 형태로 보급되기 시작하였다.
Spring Framework의 구조
Spring Core
Spring Core는 Spring Container을 의미한다. core라는 말 그대로 Container는 Spring Framework의 핵심이며, 그중 핵심은 Bean Factory Container다. 그 이유는 바로 Bean Factory는 IOC패턴을 적용하여 객체 구성 부터 의존성 처리까지 모든 일을 처리하는 역할을 하고 있기 때문이다.
Spring Context
Spring context는 Spring Framework의 context 정보들을 제공하는 설정 파일이다. Spring Context에는 JNDI, EJB, Validation, Scheduiling, Internaliztaion 등 엔터프라이즈 서비스들을 포함하고 있다.
Spring AOP
Spring AOP module은 Spring Framework에서 관점지향 프로그래밍을 할 수 있고 AOP를 적용 할수 있게 도와주는 Module이다.
Spring DAO
DAO란 Data Access Object의 약자로 Database Data에 접근하는 객체이다. Spring JDBC DAO는 추상 레이어를 지원함으로써 코딩이나 예외처리 하는 부분을 간편화 시켜 일관된 방법으로 코드를 짤 수 있게 도와준다.
Spring ORM
ORM이란 Object relational mapping의 약자로 간단하게 객체와의 관계 설정을 하는 것이다. Spring에서는 Ibatis, Hibernate, JDO 등 인기있는 객체 관계형 도구(OR도구)를 사용 할 수 있도록 지원한다.
Spring Web
Spirng에서 Web context module은 Application module에 내장되어 있고 Web기반의 응용프로그램에 대한 Context를 제공하여 일반적인 Web Application 개발에 필요한 기본적인 기능을 지원한다. 그로인해 Jakarta Structs 와의 통합을 지원하고 있다.
Spring MVC
Spring에서는 MVC에서는 Model2 구조로 Apllication을 만들 수 있도록 지원한다. MVC (Model-View-Controller) 프레임워크는 웹 응용 프로그램을 작성하기위한 완전한 기능을 갖춘 MVC를 구현한다. MVC 프레임 워크는 전략 인터페이스를 통해 고급 구성 가능하며 JSP, Velocity, Tiles, iText 및 POI를 포함한 수많은 뷰 기술을 지원하고 있다.