그러나 인터넷 사용자가 폭발적으로 증가하고 애플리케이션의 기능이 복잡해짐에 따라 기존의 JDBC로 개발하는 데는 한계가 드러나게 되었습니다.
기존 JDBC로 개발할 경우 반복적으로 구현해야 할 SQL문도 많을 뿐만 아니라 SQL문도 복잡합니다. 따라서 자연스럽게 마이바티스나 하이버네이트 같은 데이터베이스 연동 관련 프레임워크가 등장하게 되었습니다.
기존의 JDBC를 연동하려면 다음과 같은 과정을 거쳐야 했습니다.
connection ->Statement 객체 생성 -> SQL문 전송 ->결과 반환 -> close
이방식의 단점은 SQL문이 프로그래밍 코드에 섞여 코드를 복잡하게 만든다는 것입니다. 이 방법을 개선해 SQL문의 가독성을 높여 사용하기 편하게 만든 것이 바로 마이바티스 프레임워크입니다.
마이바티스 프레임워크의 특징
SQL 실행 결과를 자바 빈즈 또는 Map 객체에 매핑해 주는 Persisitence 솔루션으로 관리합니다. 즉, SQL을 소스 코드가 아닌 XML로 분리합니다.
SQL문과 프로그래밍 코드를 분리해서 구현합니다.
데이터소스 기능과 트랜잭션 처리 기능을 제공합니다.
persistence framework의 구조
SqlMapConfig.xml에 각 기능별로 실행할 SQL문을 SqlMap.xml에 미리 작성한 후 등록합니다.
애플리케이션에서 데이터베이스와 연동하는데 필요한 데이터를 각각의 매개변수에 저장한 후 마이바티스에 전달합니다.
애플리케이션에서 요청한 SQL문을 SqlMap.xml에서 선택합니다.
전달한 매개변수와 선택한 SQL문을 결합합니다.
매개변수와 결합된 SQL문을 DBMS에서 실행합니다.
DBMS에서 반환된 데이터를 애플리케이션에서 제공하는 적당한 매개변수에 저장한 후 반환합니다.
다시 정리해 보자면 데이터베이스 연동 시 사용되는 SQL문을 미리 SqlMapConfig.xml에 작성해 놓고 애플리케이션에서 데이터 베이스 연동 시 해당 sql문에서 사용될 데이터를 지원하는 해당 매개 변수에 저장한 후 SQL문에 전달합니다. 전달된 매개변수와 SQL문을 결합해 SQL문을 DBMS로 전송하여 실행합니다. 그리고 그 결과를 애플리케이션에서 제공하는 자료형으로 반환합니다.
JDBC는 자바 데이터 접근 기술의 근간이라 할 정도로 대부분의 개발자가 쉽게 이해할 수 있어 많이 사용하는 데이터 액세스 기술입니다. 그러나 시간이 지남에 따라 SQL문이 지나치게 복잡해지면서 개발이나 유지관리에 어려움이 생기기 시작했습니다. 특히 cONNECTION 객체 같은 공유 리소스를 제대로 처리해주지 않으면 버그를 발생시키는 원인이 되곤 했습니다.
스프링에서 제공하는 JDBC는 이러한 기존 JDBC의 장점과 단순함을 유지하면서 단점을 보완했습니다. 간결한 API뿐만 아니라 확장된 JDBC의 기능도 제공합니다.
이번에 사용할 파일들 입니다.
lib 폴더와 action-servlet.xml , web.xml은 이 전글에서 했던 것들을 가져와 재사용 하겠습니다.
파일
설명
web.xml
ContextLoaderListener를 이용해 빈 설정 XML 파일들을 읽어 들입니다.
action-servlet.xml
스프링에서 필요한 여러 가지 빈을 설정합니다.
action-dataSource.xml
스프링 JDBC 설정에 필요한 정보를 설정합니다.
jdbc.properties
데이터베이스 연결정보를 저장합니다.
action-service.xml
서비스 빈 생성을 설정합니다.
1. action-servlet.xml과 action-dataSource.xml의 <beans> 태그는 이전 글에서 실습한 action-servlet.xml의 것을 복사해 붙여 넣겠습니다.
2. web.xml을 다음과 같이 작성합니다. 한 개의 XML 파일에서 모든 빈을 설정하면 복잡해서 관리하기 어려우므로 빈의 종류에 따라 XML 파일에 나누어 설정합니다. 그러면 톰캣 실행시 web.xml에서 스프링의 ContextLoaderListener를 이용해 빈 설정 XML 파일들을 읽어 들입니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 여러 설정 파일을 읽어 들이기 위해 스프링의 ContextLoaderListener를 설정합니다. -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- 애플리케이션 실행 시 ContextLoaderListener로 해당 위치의 설정 파일을 읽어 들입니다. -->
/WEB-INF/config/action-service.xml
/WEB-INF/config/action-dataSource.xml
</param-value>
</context-param>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springramework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3. action-servlet.xml을 다음과 같이 작성합니다. 여기서는 뷰 관련 빈과 요청을 처리할 빈 그리고 메서드를 설정합니다. 이때 주의할 점은 빈 주입 시 주입 받는 클래스에서는 주입되는 빈에 대한 setter를 반드시 구현해야 한다는 것입니다.
5. 다음으로 action-dataSource.xml을 작성합니다. 이 파일은 스프링에서 사용할 데이터베이스 연동 정보를 설정합니다. 먼저 jdbc.properties 파일에서 데이터베이스 연결 정보를 가져온 후 이 연결 정보를 이용해 스프링에서 제공하는 SimpleDriverDataSource로 id가 dataSource인 빈을 생성합니다. 그리고 dataSource 빈을 memberDAO 빈으로 주입합니다.
SimpleUrlController를 이용해 요청을 처리하려면 각 요청명에 대해 다시 스프링의 Controller 인터페이스를 구현한 각각의 컨트롤러 클래스를 만들어야만 합니다. 하지만 MultiActionController를 이용하면 여러 요청명에 대해 한 개의 컨트롤러에 구현된 각 메서드로 처리할 수 있어 편리합니다.
이번 글에서는 MultiActionController를 이용해 스프링 MVC를 실습해 보겠습니다.
이번에 사용할 클래스들은
클래스
설명
MultiActionController
URL 요청명으로 바로 컨트롤러를 지정해서 사용할 수 있습니다.
PropertiesMethodNameResolver
URL 요청명으로 컨트롤러의 설정 파일에서 미리 설정된 메서드를 바로 호출해서 사용할 수 있습니다.
InternalResourceViewResolver
JSP나 HTML 파일과 같이 웹 애플리케이션의 내부 자원을 이용해 뷰를 생성하는 기능을 제공합니다. 기본적으로 사용하는 View 클래스이며 prefix와 suffix 프로퍼티를 이용해 경로를 지정할 수 있습니다.
또한 MultiActionController를 이용한 실습에 필요한 파일들은
파일
설명
web.xml
브라우저에서 *.do로 요청하면 스프링의 DispatcherServlet 클래스가 요청을 받을 수 있게 서블릿 매핑을 설정합니다.
action-servlet.xml
스프링에서 필요한 빈들은 설정합니다.
UserController.java
매핑된 요청에 대해 컨트롤러의 기능을 수행합니다.
loginForm.jsp
로그인창입니다.
result.jsp
로그인 결과를 보여주는 JSP입니다.
1. 패키지를 만들고 UserController 클래스를 추가합니다. 그리고 loginForm.jsp, result.jsp등 필요한 파일을 준비하겠습니다.
2. action-servlet.xml을 다음과 같이 수정하겠습니다.
브라우저에서 /test/*.do로 호출하면 userUrlMapping 빈을 이용해 userController 빈을 호출합니다.
userController 빈의 methodNameResolver 프로퍼티에는 userMethodNameResolver가 주입되어 있으므로 /test/login.do로 요청하면 userController 빈의 login 메서드를 호출합니다. 또한 userMethodNameResolver는 스프링의 PropertiesMethodNameResolver 클래스를 이용해 요청명에 대해 호출할 메서드를 바로 지정합니다.
3. UserController 클래스를 다음과 같이 작성합니다. UserController 클래스는 MultiAction Controller를 상속받음으로써 지정한 요청명에 대해 바로 메서드를 호출할 수 있으며 ModelAndView 객체에 JSP에 전달할 값을 바인딩할 수 있습니다. ModelAndView 객체를 이용하면 더 이상 request 객체에 바인딩해서 포워딩할 필요가 없고, 문자열 이외의 다른 객체들도 ModelAndView 객체에 바인딩할 수 있습니다. 따라서 ModelAndView의 setViewName()메서드를 이용해 JSP 이름을 설정한 후 반환합니다.
package com.spring.ex02;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
// 설정 파일의 userMethodNameResolver 프로퍼티를 사용하려면 반드시 MultiActionController를 상속 받아야 합니다.
public class UserConroller extends MultiActionController{
public ModelAndView login(HttpServletRequest request, HttpServletResponse response)
throws Exception{
String userID ="";
String passwd ="";
ModelAndView mav = new ModelAndView();
request.setCharacterEncoding("utf-8");
userID=request.getParameter("userID");
passwd=request.getParameter("passwd");
//ModelAndView에 로그인 정보를 바인딩합니다.
mav.addObject("userID", userID);
mav.addObject("passwd", passwd);
//ModelAndView 객체에 포워딩할 JSP 이름을 설정합니다.
mav.setViewName("result");
return mav;
}
}
4. loginForm.jsp를 다음과 같이 작성합니다. 로그인창에서 ID와 비밀번호를 입력하고 로그인을 클릭하면 /test/login.do로 DispatcherServlet에 요청합니다.
2. DispatcherServlet은 요청에 대해 미리 action-servlet.xml에 매핑된 SimpleUrlController 를 요청합니다.
3. 컨트롤러는 요청에 대해 test 폴더에 있는 index.jsp를 브라우저로 전송합니다.
서블릿에서는 브라우저 요청 처리 시 서블릿에서 제공하는 메서드를 이용해 요청명을 일일이 가져왔습니다. 그러나 스프링에서는 브라우저의 요청을 쉽게 가져올 수 있는 여러 가지 기능을 제공합니다. 그중 SimpleUrlController를 사용해 보겠습니다. 먼저 스프링을 설정합니다.
새프로젝트를 만들고 위에 있는 파일들을 다운로드하고 복사해서 lib 폴더에 붙여 넣어 줍니다.
스프링 설정을 마쳤으니 SimpleUrlController를 이용해 요청을 처리해 보겠습니다.
실습 파일에 대한 간단한 설명을 하자면..
파일
설명
web.xml
브라우저에서 *.do로 요청 시 스프링의 DispatcherServlet 클래스가 요청을 받을 수 있게 서블릿 매핑을 합니다.
action-servlet.xml
스프링 프레임워크에서 필요한 빈들을 설정합니다.
SimpleUrlController.java
매핑된 요청에 대해 컨트롤러의 기능을 수행합니다.
index.jsp
요청에 대한 컨트롤러가 브라우저로 전송하는 JSP파일입니다.
web.xml을 다음과 같이 작성합니다. 브라우저에서 *.do로 요청하면 스프링의 Dispacther Servlet클래스가 요청을 받을 수 있게 서블릿 매핑을 설정합니다. 또한 <load-on-startup>태그를 이용해 톰캣 실행 시 미리 스프링의 DispatcherServlet을 메모리에 로드 합니다.
action-servlet.xml에 필요한 빈들을 다음과 같이 설정합니다. SimpleUrlController 클래스에 대해 id가 simpleUrlController인 빈을 생성합니다. 스프링의 SimpleUrlHandlerMapping 클래스 빈을 생성하면 요청명 /test/index.do에 대해 처리하는 컨트롤러를 SimpleUrlController로 설정합니다.
SimpleUrlController 클래스는 다음과 같이 작성합니다. 설정 파일의 요청을 처리하기 위해서는 반드시 Controller 인터페이스를 구현해야 하며, SimplerUrlController 클래스로 요청 시 ModelAndView 객체를 생성해 응답할 jsp이름인 index.jsp로 설정하여 반환합니다.
컨트롤러에서 ModelAndView의 인자로 설정된 index.jsp를 화면에 출력하도록 설정합니다.