티스토리 뷰

안녕하세요. MIN-IT입니다.


이번시간은 Spring MVC프로젝트를 이용하여 게시판을 만들어보겠습니다.


게시판을 만들기위한 기본세팅 및 DAO/VO/Service를 만들어 보겠습니다.

(총 2개의 포스팅으로 작업을 완성 할 예정입니다.)


가장 기본적인 CRUD를 배우는 시간을 가지겠습니다.


퍼가실 때 댓글을 남겨주세요!


http://min-it.tistory.com


실습을 진행하기에 앞서 JDK의 버전과 스프링의 버전이

일치한지 확인하고 시작하겠습니다.


1. 프로젝트-오른쪽마우스-properties-Project Facets-Java가 1.8버전인지 확인을합니다.




2. 프로젝트의 pom.xml파일안의 자바 버전이 1.8인지 확인합니다.




다음 테스트 및 프로젝트를 위한 라이브러리들을 추가합니다.

(http://mvnrepository.com 에서 찾아서 추가시킵니다.)


        <!-- Spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>


        <!-- DB연결 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>


        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>


        <!-- Mybatis-Spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>


  <!--로그-->

         <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
            <version>1.16</version>
        </dependency>  

      <!-- Spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>


pom.xml에  해당 dependecy를 추가한 후 저장합니다.



정상적인 테스트를 위해 javax.servlet과 jaunit의 버전을 변경해줍니다.






3. 다음은 root-context.xml에 DataSource를 추가합니다.


     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
         <property name="url" value="jdbc:mysql://127.0.0.1:3306/test1"></property>
         <property name="username" value="root"></property>
         <property name="password" value="1234"></property>
     </bean>



*수정을 해주세요

-mysql의 포트번호가 3306이 아닌 다른포트일경우

-test1 =>자신이 만든 스키마명

-username =>mysql의 아이디

-password =>mysql의 비밀번호




프로젝트의 다음과 같은 패키지를 만듭니다.




src/main/java : controller/dao/domain/service 패키지

src/main/resources : mapper 패키지



워크벤치를 이용해서 다음과 같이 테이블을 생성합니다.




CREATE TABLE `test1`.`hello_board` (
  `b_no` INT NOT NULL AUTO_INCREMENT,
  `b_title` VARCHAR(200) NOT NULL,
  `b_detail` TEXT NULL,
  `b_writer` VARCHAR(45) NOT NULL,
  `b_date` TIMESTAMP NULL,
  `b_count` INT NULL DEFAULT 0,
  PRIMARY KEY (`b_no`));





4. web.xml에서 인코딩 설정을 합니다.

(한글 깨짐을 방지하기 위해서)


    <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>
   
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>







5. domain패키지-boardVO클래스를 만들어 다음과 같이 입력합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package org.hello.domain;
 
import java.util.Date;
 
public class BoardVO {
 
    private int b_no;
    private String b_title;
    private String b_detail;
    private String b_writer;
    private Date b_date;
    private int b_count;
    
    public BoardVO(){};
    
    public int getB_no() {
        return b_no;
    }
    public void setB_no(int b_no) {
        this.b_no = b_no;
    }
    public String getB_title() {
        return b_title;
    }
    public void setB_title(String b_title) {
        this.b_title = b_title;
    }
    public String getB_detail() {
        return b_detail;
    }
    public void setB_detail(String b_detail) {
        this.b_detail = b_detail;
    }
    public String getB_writer() {
        return b_writer;
    }
    public void setB_writer(String b_writer) {
        this.b_writer = b_writer;
    }
    public Date getB_date() {
        return b_date;
    }
    public void setB_date(Date b_date) {
        this.b_date = b_date;
    }
    public int getB_count() {
        return b_count;
    }
    public void setB_count(int b_count) {
        this.b_count = b_count;
    }
    
    
    
}
 
cs





6.root.context.xml의 namespace를 다음과같이 체크합니다.





7.root.context.xml의 source부분을

아까 입력한 dataSource밑에다가 다음과 같이 추가합니다.

(root-context.xml부분)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     
     <!--  mybatis와 스프링 연동작을 하기위한 SqlsessionFactory == DB연결 및 SQL의 실행을 대한객체 -->
     
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
             <property name="dataSource" ref="dataSource"></property>
             
                  <!-- mybatis-config.xml이 스프링 시작될때 같이 실행되도록 설정하기  -->
             <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
             
                  <!-- XML Mapper 인식하게 설정 -->
            <property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml"></property>
            
                         
     </bean>
     
    <!-- SQLSessionTemplate설정하기 DAO인터페이스를 만들었기때문에 Mybatis에서 DAO인터페이스를 구현하기위해서 필요한작업 -->
 
    <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.hello.dao"></context:component-scan>
 
cs




8. DAO패키지에서 BoardDAO인터페이스 파일을 생성하여 입력합니다.

(DAO-BaordDAO 인터페이스 파일)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package org.hello.dao;
 
import java.util.List;
 
import org.hello.domain.BoardVO;
 
public interface BoardDAO {
 
    public void create(BoardVO vo) throws Exception;
    
    public List<BoardVO> listAll() throws Exception;
    
    public BoardVO read(Integer b_no) throws Exception;
    
    public void delete(Integer b_no) throws Exception;
    
    public void update(BoardVO vo) throws Exception;
    
 
    
}
 
cs







9. mapper패키지로가서 boardMapper.xml파일을 생성후 CRUD SQL문 만들기

(mapper-boardMapper.xml)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
 
<mapper namespace="org.hello.mapper.BoardMapper">
 
 
    <!-- 게시판 추가하기 -->
    <insert id="insertBoard">
        insert into hello_board (b_title,b_writer,b_detail,b_date) values(#{b_title},#{b_writer},#{b_detail},SYSDATE())
 
    </insert>
    
    <!-- 게시판 리스트보기 -->
    <select id="listBoard" resultType="org.hello.domain.BoardVO">
    <![CDATA[
    
        select * from hello_board 
        order by b_no DESC
    ]]>
    </select>
    
    <!-- 게시판 상세보기 -->
    <select id="detailBoard" resultType="org.hello.domain.BoardVO">
            select * from hello_board where b_no = #{b_no}
    </select>
 
    <!-- 게시판 삭제하기 -->
    <delete id="deleteBoard">
        delete from hello_board where b_no = #{b_no}
    </delete>
    
    <!-- 게시판 수정하기 -->
    <update id="updateBoard">
        update hello_board set b_title=#{b_title} , b_detail = #{b_detail} where b_no = #{b_no}
    </update>
 
</mapper>
cs


여기서 #{b_title}처럼 #{xxx}는 boardVO클래스안의

변수들을 가져다 쓴다고 생각하시면됩니다.

(boardVO객체를 생성한다. ->생성한 boardVO객체에 데이터를 집어넣는다  ->

boardVO객체안에 넣은 데이터를 가지고 SQL문에서 활용한다.)


resultTpye ="org.hello.domain.BoardVO" 되어있습니다.

resultType이나 parameterType에서 클래스명을적을때 패키지명까지 입력을 해야하는

번거로움이 있습니다. 패키지명을 생략하기위해서 <typeAliases>라는 것

사용합니다.


mybatis의 부분이기 때문에 mybatis-config.xml설정파일에서

다음과 같이 내용을 추가합니다.

(mybatis-config.xml)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
 
    <typeAliases>
        <package name="org.zerock.domain"/>
    </typeAliases>
 
</configuration>
 
 
cs


이렇게 <typeAliases>를 사용하게되면

resultTpye ="org.hello.domain.BoardVO" 대신

resultTpye ="BoardVO"를 사용할 수 있습니다.



10. domain패키지 안에 BoardDAOImp 클래스를 생성합니다.

(domain-BoardDAOImp)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package org.hello.dao;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.hello.domain.BoardVO;
import org.springframework.stereotype.Repository;
 
@Repository
public class BoardDAOImp implements BoardDAO {
    
    @Inject
    private SqlSession sqlSession;
    
    private static String namespace = "org.hello.mapper.BoardMapper";
 
    //게시판추가
    @Override
    public void create(BoardVO vo) throws Exception {
        
        sqlSession.insert(namespace+".insertBoard", vo);
 
    }
    
    //게시판보기
    @Override
    public List<BoardVO> listAll() throws Exception {
        
        sqlSession.selectList(namespace+".listBoard");
        return null;
    }
    
    //게시판 상세
    @Override
    public BoardVO read(Integer b_no) throws Exception {
        sqlSession.selectOne(namespace+".detailBoard", b_no);
        return null;
    }
 
    //게시판 삭제
    @Override
    public void delete(Integer b_no) throws Exception {
        sqlSession.delete(namespace+".deleteBoard", b_no);
 
    }
 
    //게시판 수정
    @Override
    public void update(BoardVO vo) throws Exception {
        sqlSession.update(namespace+".updateBoard", vo);
 
    }
 
}




 
cs





10. 다음은 비즈니스 영역인 Service부분을

Service인터페이스와 ServiceImpl 구현객체를 만들어

Service를 구현해보겠습니다.

(Service패키지-BoardService/BoardServiempl)




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package org.hello.service;
 
import java.util.List;
 
import org.hello.domain.BoardVO;
 
public interface BoardService {
    
    
    public void create(BoardVO vo) throws Exception;
    
    public List<BoardVO> listAll() throws Exception;
    
    public BoardVO read(Integer b_no) throws Exception;
    
    public void delete(Integer b_no) throws Exception;
    
    public void update(BoardVO vo) throws Exception;
    
 
}
 
cs

(Service인터페이스)




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package org.hello.service;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.hello.dao.BoardDAO;
import org.hello.domain.BoardVO;
import org.springframework.stereotype.Service;
 
@Service
public class BoardServiceImpl implements BoardService {
 
    @Inject
    private BoardDAO dao;
    
    
    @Override
    public void create(BoardVO vo) throws Exception {
        dao.create(vo);
 
    }
 
    @Override
    public List<BoardVO> listAll() throws Exception {
        
        
        return dao.listAll();
    }
 
    @Override
    public BoardVO read(Integer b_no) throws Exception {
        
        return dao.read(b_no);
    }
 
    @Override
    public void delete(Integer b_no) throws Exception {
        dao.delete(b_no);
 
    }
 
    @Override
    public void update(BoardVO vo) throws Exception {
        
        dao.update(vo);
 
    }
 
}
 
cs

(ServiceImpl 클래스)





여기서 포스팅을 마치도록 하겠습니다.

다음시간은 컨트롤러와 뷰를 만들어

게시판을 완성시켜보겠습니다.




* 포스팅을 마치겠습니다.

궁금하거나 잘못된 부분이있다면 알려주시면 감사하겠습니다.*

을 마치겠습니다.

궁금하거나 잘못된 부분이있다면 알려주시면 감사하겠습니다.*



출처: http://min-it.tistory.com/6 [MIN-IT]



댓글