스프링 MVC 패턴 기본 방식으로 DB 연동 (방법1: BeanNameUrlHandlerMapping)


게시판: 리스트 만들기



1. 프로젝트 만든 뒤 Java Build Path에서 버전을 맞춰준다.


이에 따라 pom.xml에서도 다음과 같이 버전을 통일시킨다.


<properties>

<java-version>1.8</java-version>

<org.springframework-version>4.2.5.RELEASE</org.springframework-version>

<org.aspectj-version>1.8.9</org.aspectj-version>

<org.slf4j-version>1.7.12</org.slf4j-version>

</properties>


또한 스프링 JDBC와 오라클 라이브러리 사용을 위한 설정도 추가한다.

version 부분은 pom.xml의 다른 dependency와 양식을 맞춰 같은 형식으로 표시해줘야 한다.


<!-- ojdbc6 설정시 추가 -->

<repositories>

<repository>

<id>codelds</id>

<url>http://code.lds.org/nexus/content/groups/main-repo</url>

</repository>

</repositories>


<!-- spring-jdbc 추가 -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>${org.springframework-version}</version>

</dependency>


<!-- Oracle 11g 라이브러리 사용 -->

<dependency>

<groupId>com.oracle</groupId>

<artifactId>ojdbc6</artifactId>

<version>11.2.0.3</version>

</dependency>





2. SQL로 DB에 테이블 입력

src/main/resources 아래에 sql 파일 생성.


create table springBoard(

seq number not null,

title varchar2(200) not null,

content varchar2(2000) not null,

writer varchar2(14) not null,

regdate varchar2(14) not null,

hitcount number not null,

password varchar2(20) not null,

constraint board_pk primary key(seq)

); 


create sequence springboard_seq;


select * from springboard;


insert into springboard values( springboard_seq.nextval, '첫번째 글', '첫번째 게시판 글입니다.', '홍길동', sysdate, 0, '1234');

insert into springboard values( springboard_seq.nextval, '두번째 글', '두번째 게시판 글입니다.', '이순신', sysdate, 0, '1234');




최초 실행 명령은 board_list.do 로 한다고 하자.


그렇다면 브라우저에서 이 명령으로 프로그램이 시작되게 해야 한다.



3. index.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>게시판</title>

</head>

<body>

<h2>게시판 테스트</h2>

<a href="board_list.do">게시판 목록으로 가기</a>

</body>

</html>


브라우저에서 http://localhost:8095/board/를 치면 index 화면으로 넘어간다.


이제 board_list.do를 만들어줄 차례.





4. web.xml

한글이 깨지지 않게끔 web.xml에 utf-8을 기본으로 하게끔 필터 세팅을 하고, 서블릿 매핑에서 *.do를 기본 설정으로 만들자.


<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern> <!-- 모든 요청에 대하여 -->

</filter-mapping>


<servlet-mapping>

<servlet-name>appServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>





5. 컨트롤러 작성


Controller 종류

- Controller (interface) : 최상위 컨트롤러 인터페이스

- AbstractController : 위의 인터페이스를 상속받아 만드는 컨트롤러

- AbstractComandController : 위의 컨트롤러 기능에 더 추가한 것이 이것

- MultiActionController

스프링에서 제공하는 위의 interface/class를 상속하여 자신만의 Controller를 작성한다.


package spring.mvc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class BoardListController extends AbstractController {

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// 스프링에서 제공하는 HandlerMapping
System.out.println("board_lis.do 실행");
return null;
}
}



6. 디스페처 서블릿이 컨트롤러 인식을 위해 핸들러 매핑 설정


Client요청과 Controller를 연결을 설정하기 위해 HandlerMapping를 해준다.


HandlerMapping : Client요청과 Controller를 연결을 설정

다양한 HandlerMapping 클래스를 Springframework가 제공 하며 Spring 설정파일에 <bean name=“HandlerMapping“>으로 등록하여 설정한다.


방법 1) BeanNameUrlHandlerMapping : 기본적인 동작 방식

- bean의 이름과 url을 mapping


방법 2) SimpleUrlHandlerMapping

- url pattern들을 properties로 등록해 처리


방법1 빈네임 URL 핸들러 매핑을 이용하기 위해 설정 파일에 다음을 추가.

servlet-context.xml에 이하를 추가.


<beans:bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></beans:bean> 


디스페처 서블릿이 핸들러 매핑에게 물어보고, 핸들러 매핑은 다음을 통해 컨트롤러를 인식한다.

빈네임 URL 핸들러 매핑이 컨트롤러 클래스의 메서드 인식을 위해 다음을 추가해야 한다.


<beans:bean name="/board_list.do" class="spring.mvc.controller.BoardListController"></beans:bean>


이렇게 하면 해당 컨트롤러의 메서드를 board_list.do란 이름으로 작동할 수 있게 된다.


설정파일 servlet-context.xml의 전체 내용은 다음과 같다.


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<resources mapping="/resources/**" location="/resources/" />


<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/views/" /> // 불러올 이름 앞에 붙일 것과 뒤에 붙일 확장자에 대한 부분

<beans:property name="suffix" value=".jsp" />

</beans:bean>

<beans:bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></beans:bean>

<beans:bean name="/board_list.do" class="spring.mvc.controller.BoardListController"></beans:bean>

</beans:beans>



index.jsp를 실행시킨 뒤 board_list.do를 실행시키면 컨트롤러에서 테스트용으로 넣어둔 "board_lis.do 실행"이 콘솔창에 표시된다.




7. DB와의 연동을 위한 모델 로직 구현 (DTO)


package spring.mvc.dao;


public class BoardDto {

private int seq;

private String title;

private String content;

private String writer;

private String regdate;

private int hitcount;

private String password;

public int getSeq() {

return seq;

}

public void setSeq(int seq) {

this.seq = seq;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public String getWriter() {

return writer;

}

public void setWriter(String writer) {

this.writer = writer;

}

public String getRegdate() {

return regdate;

}

public void setRegdate(String regdate) {

this.regdate = regdate;

}

public int getHitcount() {

return hitcount;

}

public void setHitcount(int hitcount) {

this.hitcount = hitcount;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}



8. DB와의 연동을 위한 모델 로직 구현 (DAO)


DB에서 데이터를 읽어왔을 때 그 데이터를 저장하는 시퀀스를 구현한다.

스프링에서 제공하는 DB를 편하게 저장해주는 JDBC 템플릿을 이용한다.



1) pom.xml에 JDBC 추가


<!-- jdbc 속성을 저장한 파일을 대상으로 빈 생성 -->

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<value>classpath:config/jdbc.properties</value>

</property>

</bean>

<!-- jdbc 프로퍼티를 실질적으로 연동하여 처리하는 설정 -->

<!-- 1. Data Source : Oracle DB 테이블 연동(JDBC방식) -->

<bean id="dataSource" 

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="${jdbc.driver}" />

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

</bean>

<!-- 2. JdbcTemplate 빈 객체 생성(dataSource 이용) -->

<!-- 위에서 생성한 dataSource 객체를 jdbcTemplate에 알려줘야 함. -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<constructor-arg ref="dataSource"/>

</bean>

<bean id="menu" class="spring.jdbc.view.MenuUi" p:selectTeam-ref = "selectTeam"/>

<bean id="selectTeam" class="spring.jdbc.view.TeamService" p:teamDAO-ref = "teamDAO"/>

<bean id="teamDAO" class="spring.jdbc.dao.TeamDAOImpl" p:jdbcTemplate-ref="jdbcTemplate"/>

</beans>




웹 관련 설정은 spring/appServlet/servlet-context.xml은 웹 관련된 설정을 담당.


웹 관련 이외의 DB관련 설정 정보는 spring/root-context.xml에 설정한다.



9. DB 설정 파일


src/main/webapp/resources/WEB-INF/spring/root-context.xml


<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Root Context: defines shared resources visible to all other web components -->

<!-- jdbc 속성을 저장한 파일을 대상으로 빈 생성 -->

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<value>classpath:config/jdbc.properties</value>

</property>

</bean>

<!-- 1. Data Source : Oracle DB 테이블 연동(JDBC방식) -->

<bean id="dataSource" 

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="${jdbc.driver}" />

<property name="url" value="${jdbc.url}"/>

<property name="username" value="${jdbc.username}"/>

<property name="password" value="${jdbc.password}"/>

</bean>

<!-- 2. JdbcTemplate 빈 객체 생성(dataSource 이용) -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<constructor-arg ref="dataSource"/>

</bean>

</beans>





10. 설정 파일에 DAO 연결


src/main/webapp/resources/WEB-INF/spring/appServlet/servlet-context.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<!-- <annotation-driven /> -->

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- <context:component-scan base-package="spring.mvc.board" /> -->
<beans:bean id="handlerMapping" 
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<beans:bean name="/board_list.do" class="spring.mvc.controller.BoardListController" >
<beans:property name="boardDao" ref="boardDao" />
</beans:bean>
<beans:bean id="boardDao" class="spring.mvc.dao.BoardDao">
<beans:property name="jdbcTemplate" ref="jdbcTemplate" />
</beans:bean>
</beans:beans>



11. 컨트롤러 작성


package spring.mvc.controller;


import java.util.List;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.AbstractController;


import spring.mvc.dao.BoardDao;

import spring.mvc.dao.BoardDto;


public class BoardListController extends AbstractController{


private BoardDao boardDao;

public void setBoardDao(BoardDao boardDao){

this.boardDao = boardDao;

}

@Override

protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {

// TODO Auto-generated method stub

//System.out.println("board_list.do 실행");

List<BoardDto> boardList = boardDao.getBoardList();

return new ModelAndView("list", "boardList", boardList);

}

}





12. DAO 완성

package spring.mvc.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;


public class BoardDao {

private JdbcTemplate jdbcTemplate;
private List<BoardDto> list = null;
public void setJdbcTemplate(JdbcTemplate jdbcTemplat){
this.jdbcTemplate = jdbcTemplat;
}
public List<BoardDto> getBoardList() {
// TODO Auto-generated method stub
String sql = "select * from springBoard";
return list = jdbcTemplate.query(sql, new RowMapper<BoardDto>(){

@Override
public BoardDto mapRow(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
BoardDto board = new BoardDto();
board.setSeq(arg0.getInt("seq"));
board.setTitle(arg0.getString("title"));
board.setContent(arg0.getString("content"));
board.setWriter(arg0.getString("writer"));
board.setRegdate(arg0.getString("regdate"));
board.setHitcount(arg0.getInt("hitcount"));
board.setPassword(arg0.getString("password"));
return board;
}
});
}
}



13. JDBC 프로퍼티

src/main/resources/config/ 안에 jdbc.properties 라는 파일을 만들어 넣어준다.


jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@localhost:1521:xe

jdbc.username=hr

jdbc.password=tiger





14. 실제 보여줄 게시판 jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


<jsp:useBean id="boardList" type="java.util.List" scope="request" />

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

<script type="text/javascript">

function fn_insert() {

location.href="board_insert.do";

}

</script>

</head>

<body>

테스트 : ${requestScope.board}

<p></p>

글의 총갯수 : ${boardCount}

<hr></hr>

<p align="center">

     게시판 LIST

</p>

<input type="button" value="글쓰기" onclick="fn_insert()"/>

<hr/>

<table border="1">

<tr>

<th>번호</th><th>제목</th><th>등록자</th><th>등록일</th>

</tr>

<c:forEach var="vo" items="${boardList}">// 표현언어를 이용, vo 객체

<tr>

<td>${vo.seq}</td> // 표현언어는 getter 메서드를 호출해서 값을 읽어옴.

<td><a href="board_detail.do?seq=${vo.seq}">${vo.title}</a></td> // 글 클릭시 상세보기 위한 부분

<td>${vo.writer}</td>

<td>${vo.regdate}</td>

</tr>

</c:forEach>

</table>

</body>

</html>





Posted by netyhobby
,