본문 바로가기
JAVA/spring

Spring CreateTest

by 개폰지밥 2019. 6. 13.
반응형

코드로 배우는 스프링 웹 프로젝트 보면서 해봄!!

1.1.1       개발 패키지 구성

Part 2에서 개발하는 프로젝트의 패키지 구성은 각 영역을 구분해서 아래와 같이 구성하라

1.1.2       테이블의 생성 작업

create table tbl_board(

bno INT NOT NULL AUTO_INCREMENT,

title VARCHAR(200) NOT NULL,

content TEXT NULL,

writer VARCHAR(50) NOT NULL,

regdate TIMESTAMP NOT NULL DEFAULT now(),

viewcnt INT DEFAULT 0,

PRIMARY KEY (bno));

 

Bno 칼럼은 primary key로 고유한 번호 가지도록 설계 auto_increment라는 제약조건을 이용해 자동으로 데이터 추가시 새로운 번호 가지도록 설계

Regdate 칼럼은 데이터가 추가될 때 현재 데이터베이스의 시간을 이용해 게시물이 생성된 시간을 기록 mysql의 경우 now() 함수를 사용하면 현재 시간을 얻을 수 있음

 

1.1.3       테스트를 위한 sql 준비

데이터를 추가하고 기능에 문제 없는지 테스트해 보는 작업

create table tbl_board(

bno INT NOT NULL AUTO_INCREMENT,

title VARCHAR(200) NOT NULL,

content TEXT NULL,

writer VARCHAR(50) NOT NULL,

regdate TIMESTAMP NOT NULL DEFAULT now(),

viewcnt INT DEFAULT 0,

PRIMARY KEY (bno));

 

insert into tbl_board (title, content, writer) values('제목입니다','내용입니다','user00');

 

1.2  스프링의 UTF-8 처리 필터 등록

<!-- filter -->

        <filter>

               <filter-name>encoding</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>

 

1.3  css, javascript 준비

bootstrap을 이용해서 화면을 구성하는 방식을 사용합니다. 부트스트랩은 반응형 웹 페이지를 만들 때 사용하는 twitter가 제공하는 오픈 소스입니다. 화면 전체의 레이아웃이나 자세한 css를 설정하는 데 많은 시간을 소모하게 되기 때문에 부트스트랩으로 만들어진 템플릿 페이지를 이용합니다.

‘Admin LTE’ 템플릿은 https://almsaeedstudio.com/AdminLTE에서 제공하는 오픈 소스로 부트스트랩을 사용해서 작성된 무료 템플릿입니다.

Admin LTE는 기본적으로 반응형 웹 페이지의 레이아웃을 제공하고, 화면 구성에 필요한 모든 CSS를 사용할 수 있습니다.

 

1.3.1       프로젝트의 템플릿 적용

이 책의 자료실에 있는 static.zip 파일과 include.zip 파일을 다운로드 받아서 압축을 해제 합니다. Static.zip 파일의 압축을 해제하면 bootstrap, dist, plugin 폴더가 생성되고, include.zip 파일을 해제하면 include 폴더가 생성됩니다.

이 중에서 bootstrap, dist, plugins 폴더는 현재 프로젝트의 ‘src/main/webapp/resources’ 폴더 내로 복사합니다.

Include 폴더는 ‘/WEB-INF/views’ 폴더로 복사합니다.

Include 폴더 내에서 cssjquery 등의 링크가 포함돼 있으므로, jsp 제작 시 include 시켜서 페이지를 제작합니다.

 ========> static.zip 파일과 include.zip 파일은 http://cafe.naver.com/gugucoding 에있음....  한참 찾음 ㅠㅠ

Home.jsp의 내용은 아래와 같이 수정합니다.

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

<%@ page session="false" %>

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

 

<%@include file="include/header.jsp" %>

 

<!-- Main content -->

<section class="content">

<div class="row">

<!-- left column -->

<div class="col-md-12">

<!-- general form elements -->

 

<div class="box">

<div class="box-header with-norder">

<h3 class="box-title">HOME PAGE</h3>

</div>

</div>

</div><!-- /.col (left) -->

</div><!-- /.row -->

</section><!-- /.content -->

<%@include file="include/footer.jsp" %>

 

02 영속(persistence) 계층, 비즈니스 계층

프로젝트의 전체 구조가 갖춰졌다고 판단된다면 본격적인 구현에 들어갑니다. 구현 작업중에 가장 먼저 처리하는 작업은 등록 기능이고 그 중에서도 영속 계층에 대한 처리입니다.

데이터베이스와 고나련된 작업을 먼저해서 좋은 점 중 하나는 그 사이에 변경되는 화면의 설계를 미룰 수 있다는 점과 was없이 테스트를 진행할 수 있다는 점입니다.

-       org.zerock.domain

n  테이블과 관련된 BoardVO 클래스를 설계하고 작성

n  Mybatis를 이용하는 boardDAO, BoardDAOImpl을 작성합니다.

n  Resources 폴더 내에 xml mapper를 작성합니다.

n  Src/test/java 밑의 boardmappertests.java를 작성하고 만들어진 daosql의 동작을 테스트 합니다.

2.1 BoardVo의 작성

테이블의 구조를 객체화시킬 때 사용하는 BoardVo 클래스 작성 합니다.

Org.zerock.domain 패키지 내에 BoardVo클래스를 아래와 같이 생성합니다.

VO 클래스를 작성할 때는 테이블의 칼럼 이름과 VO 속성 이름을 동일하게 해주는 것이 읽기에 좋고, 코드를 작성하기도 편리하다.

package org.zerock.domain;

 

import java.util.Date;

 

public class BoardVO {

       

        private Integer bno;

        private String title;

        private String content;

        private String writer;

        private Date regdate;

private int viewcnt;

 

        public Integer getBno() {

               return bno;

        }

        public void setBno(Integer bno) {

               this.bno = bno;

        }

        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 Date getRegdate() {

               return regdate;

        }

        public void setRegdate(Date regdate) {

               this.regdate = regdate;

        }

        public int getViewcnt() {

               return viewcnt;

        }

        public void setViewcnt(int viewcnt) {

               this.viewcnt = viewcnt;

        }

       

 

}

 

 

2.2 DAO의 생성과 XML Mapper 작업

VO는 전체 영역에서 파라미터와 리턴 타입으로 사용되므로 가장 먼저 작업되고, 이후에는 MyBatisDAO, XML Mapper를 설정해 주고 테스트하는 과정을 거치도록 합니다.

2.2.1 xml 네임스페이스의 추가

Beans, context, mybatis-spring(옵션)이 필요하므로 체크하고 저장합니다.

2.2.2 sessionfactory, sqlsessiontemplate의 추가

Mybatissqlsessionfactory, sqlsessiontemplate을 등록합니다.

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

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

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

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

        xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"

        xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd

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

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

 

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

 

        <bean id="dataSource"

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

               <property name="driverClassName"

                       value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>

               <property name="url"

                       value="jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex?useSSL=false"></property>

               <property name="username" value="zerock"></property>

               <property name="password" value="zerock"></property>

        </bean>

       

        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="dataSource" ref="dataSource"/>

        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>

        <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>

        </bean>

       

        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">

        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>

        </bean>

       

        <context:component-scan base-package="org.zerock.persistence"></context:component-scan>

</beans>

 

 

2.2.3 BoardDAO의 생성

Org.zerock.persistence 패키지에 BoardDAO 인터페이스를 아래와 같이 작성합니다.

package org.zerock.persistence;

 

import java.util.List;

 

import org.zerock.domain.BoardVO;

 

public interface BoardDAO {

       

        public void create(BoardVO vo)throws Exception;

        public BoardVO read(Integer bno)throws Exception;

        public void update(BoardVO vo)throws Exception;

        public void delete(Integer bno)throws Exception;

        public List<BoardVO> listAll()throws Exception;

 

}

 

2.2.4 xml mapper에서의 sql 처리

/src/main/resources/mappers 폴더를 작성하고 폴더에 boardMapper.xml을 작성하고, insert, update, delete, select를 사용해서 sql을 추가합니다.

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

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mpper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

<mapper namespace="org.zerock.mapper.BoardMapper">

 

<insert id="create">

insert into tbl_board (title, content, writer) values(#{title}, #{content}, #{writer})

</insert>

 

<select id="read" resultType="org.zerock.domain.BoardVO">

select bno, title, content, writer, regdate, viewcnt from tbl_board where bno = #{bon}

</select>

 

<update id="update">

update tbl_board set title =#{title}, content =#{content} where bno = #{bno}

</update>

 

<delete id="delete">

delete from tbl_board where bno = #{bno}

</delete>

 

<select id="listAll" resultType="org.zerock.domain.BoardVO">

<![CDATA[ select bno, title, content, writer, regdate, viewcnt from tbl_board where bno >0 order by bno desc, regdate desc]]>

</select>

</mapper>

 

boardMapper.xml의 각 sql 문의 id 속성 값은 boardDAO 인터페이스와 동일하게 설정해주어서 혼란을 피하는 것이 좋습니다.

 

2.2.5 BoardDAO의 구현 클래스 BoardDAOImpl

BoardDAO 인터페이스를 구현한 BoardDAOImple은 다음과 같이 작성됩니다.

package org.zerock.persistence;

 

import java.util.List;

 

import javax.inject.Inject;

 

import org.apache.ibatis.session.SqlSession;

import org.springframework.stereotype.Repository;

import org.zerock.domain.BoardVO;

 

@Repository

public class BoardDAOImpl implements BoardDAO {

 

        @Inject

        private SqlSession session;

 

        private static String namespace = "org.zerock.mapper.BoardMapper";

 

        @Override

        public void create(BoardVO vo) throws Exception {

               // TODO Auto-generated method stub

               session.insert(namespace + ".create", vo);

 

        }

 

        @Override

        public BoardVO read(Integer bno) throws Exception {

               // TODO Auto-generated method stub

               return session.selectOne(namespace + ".read", bno);

        }

 

        @Override

        public void update(BoardVO vo) throws Exception {

               // TODO Auto-generated method stub

               session.update(namespace + ".dpdate", vo);

 

        }

 

        @Override

        public void delete(Integer bno) throws Exception {

               // TODO Auto-generated method stub

               session.update(namespace + ".delete", bno);

        }

 

        @Override

        public List<BoardVO> listAll() throws Exception {

               // TODO Auto-generated method stub

               return session.selectList(namespace + ".listAll");

        }

 

}

 

BoardDAOImpl 클래스를 작성한 후에는 반드시 스프링의 빈으로 제대로 등록되었는지 root-context.xml을 선택하고, Beans Graph 탭을 이용해서 확인하기

<결과>

 

2.2.6 BoardDAO의 테스트

작성된 BoardDAO의 테스트 작업은 jUnit을 사용해서 진행합니다. 테스트 코드의 기본 형태는 아래와 같이 작성합니다.

package org.zerock.test;

 

import javax.inject.Inject;

 

import org.junit.runner.RunWith;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

 

import org.zerock.persistence.BoardDAO;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})

 

public class BoardDAOTest {

       

        @Inject

        private BoardDAO dao;

       

        private static Logger logger = LoggerFactory.getLogger(BoardDAOTest.class);

 

}

 

 

testCreate() 부분만 테스트하기 위해 나머지는 주석 처리해봄

각 메소드에 대한 테스트는 아래와 같습니다.

package org.zerock.test;

 

import javax.inject.Inject;

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import org.zerock.domain.BoardVO;

import org.zerock.persistence.BoardDAO;

import org.zerock.persistence.BoardDAOImpl;

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })

 

public class BoardDAOTest {

 

        @Inject

        private BoardDAO dao;

 

        private static Logger logger = LoggerFactory.getLogger(BoardDAOTest.class);

 

        @Test

        public void testCreate() throws Exception {

               BoardVO board = new BoardVO();

               board.setTitle("추가된거니");

               board.setContent("추가된거니");

               board.setWriter("user012");

              

               dao.create(board);

        }

 

        /*

         * @Test public void testRead() throws Exception {

         * logger.info(dao.read(1).toString()); }

         *

         * @Test public void testUpdate() throws Exception {

         *

         * BoardVO board = new BoardVO(); board.setBno(1); board.setTitle("수정된 글입니다.");

         * board.setContent("수정 테스트"); dao.update(board);

         *

         * }

         *

         * @Test public void testDelete() throws Exception { dao.delete(1);

         *

         * }

         */

 

}

 

<결과>

 

반응형

'JAVA > spring' 카테고리의 다른 글

register(등록), success(등록 성공)  (0) 2019.07.04
spring homapage  (0) 2019.06.14
Spring Connection(DataSource)  (0) 2019.06.11
Spring+mybatis  (0) 2019.06.05
spring + mybatis + mysql - 2  (0) 2019.06.04

댓글