BACK END/java spring(egov)

3. 예제 샘플 지우고 리스트 만들기

자코린이 2022. 3. 29. 17:59

위의 사진이 만드는 프로그램의 구조입니다.

 

처음 프로젝트를 만들었을 때 아래 9개의 폴더를 삭제합니다.

 

아마 처음에 egov를 설치하면 기본적으로 구조가 flat으로 되어있을 것입니다.

이를 hierarchical로 바꾸어 줍니다.

 

이제 설정을 바꾸어 줄 차례입니다.

폴더를 삭제하였으므로 mapper경로를 다시 설정합니다.

context-mapper.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-4.0.xsd">

	<!-- SqlSession setup for MyBatis Database Layer -->
	 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
        <!-- 설정파일 위치 -->
 		<property name="configLocation" value="classpath:/egovframework/sqlmap/example/sql-mapper-config.xml" />
        <!-- query가 있는 xml 위치 -->
        <property name="mapperLocations" value="classpath:/egovframework/sqlmap/mappers/*Mapper.xml" />


	
	</bean>
	  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    </bean>


	<!-- MapperConfigurer setup for MyBatis Database Layer with @Mapper("deptMapper") in DeptMapper Interface -->
 	<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
		<property name="basePackage" value="egovframework" />
	</bean>
    
</beans>

 

sql-mapper-config.xml

<?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>
		<typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
		<!--
		<typeAlias alias="searchVO" type="egovframework.example.sample.service.SampleDefaultVO"/>
		<typeAlias alias="sampleVO" type="egovframework.example.sample.service.SampleVO"/>
		-->
    </typeAliases>
</configuration>

두 VO를 삭제하였으므로 아래 두 줄은 주석처리 합니다.(삭제하셔도 상관없습니다.)

 

context-sqlmap.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-3.2.xsd">
	
	<!-- SqlMap setup for iBATIS Database Layer 
	<bean id="sqlMapClient" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:/egovframework/sqlmap/example/sql-map-config.xml"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>
 	-->
</beans>

주석처리 합니다.

 

dispatcher-servlet.xml

  <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1"
	    p:viewClass="org.springframework.web.servlet.view.JstlView"
	    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

jsp파일이 담기는 폴더를 삭제하였으므로 경로를 다시 설정합니다.

 

pom.xml에 다음 내용을 추가합니다.

log4jdbc, mysql, mariasql, dbcp 사용을 위해서 추가합니다.

  <dependency>
            <groupId>com.googlecode.log4jdbc</groupId>
            <artifactId>log4jdbc</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.31</version>
        </dependency>
        
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>2.4.1</version>
        </dependency>

 

context-datasource.xml 

DB에 연결하기 위한 설정파일입니다.

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
	
	<!-- 테스트 실행용 --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
        <property name="url" value="jdbc:mariadb://127.0.0.1:3306/test"/>
        <property name="username" value="root"/>
        <property name="password" value="비밀번호"/>
    </bean>

</beans>

 

이제 설정이 다 끝났습니다.

여기까지 하시고 clean을 하세요.

 

이제 Mapper.xml파일과 VO, Service, ServiceImpl, DAO, DAOImpl, Controller, Mapper 파일들을 만들 차례입니다.

 

Mapper.xml은 sql을 모아놓는 파일입니다.

아래 경로에 mappers폴더를 만들어 주세요.

 

이 폴더에 xml파일을 만들어 줍니다.

testMapper.xml

<?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파일로 바꾸어 줍니다.  -->
<mapper namespace="egovframework.example.sample.service.TestMapper">
  <select id="selectTest" resultType="egovframework.example.sample.vo.TestVO">
        SELECT * FROM stock
        Limit 1000
    </select>
</mapper>

파일을 만들고 저장하면 VO가 없다고 나옵니다 이를 위해 VO를 만들어 주어야 합니다.

아래 사진처럼 패키지와 class, interface를 생성합니다.

 

 

VO부터 구현합니다.

이는 데이터를 받는 형식으로 데이터의 결과값과 마찬가지로 만들어 주세요.

TestVO

getter setter 단축키는 alt + shift + s 키 입니다

package egovframework.example.sample.vo;

public class TestVO {
	private String kind;
	private String code;
	private String barcode;
	private String partname;
	private String std;
	private String qtybox;
	private String box;
	private String stock;
	public String getKind() {
		return kind;
	}
	public void setKind(String kind) {
		this.kind = kind;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getBarcode() {
		return barcode;
	}
	public void setBarcode(String barcode) {
		this.barcode = barcode;
	}
	public String getPartname() {
		return partname;
	}
	public void setPartname(String partname) {
		this.partname = partname;
	}
	public String getStd() {
		return std;
	}
	public void setStd(String std) {
		this.std = std;
	}
	public String getQtybox() {
		return qtybox;
	}
	public void setQtybox(String qtybox) {
		this.qtybox = qtybox;
	}
	public String getBox() {
		return box;
	}
	public void setBox(String box) {
		this.box = box;
	}
	public String getStock() {
		return stock;
	}
	public void setStock(String stock) {
		this.stock = stock;
	}
}

 

컨트롤러는 어떤 경로의 요청이 들어오면 어떠한 일을 처리하라고 말해주는 파일입니다.

TestController

package egovframework.example.sample.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import egovframework.example.sample.service.TestService;
import egovframework.example.sample.vo.TestVO;

@Controller
public class TestController {
    @Autowired
    private TestService testService;
    
    @RequestMapping(value="/testList.do")
    public String testListDo(TestVO testVo, Model model) throws Exception{
        model.addAttribute("list", testService.selectTest(testVo));
        
        
        return "testList";
    }

}

 

서비스는 컨트롤러가 하는 일을 도와줍니다.

TestService

package egovframework.example.sample.service;

import java.util.List;

import egovframework.example.sample.vo.TestVO;

public interface TestService {
	 public List<TestVO> selectTest(TestVO testVo) throws Exception;
}

 

TestServiceImpl

package egovframework.example.sample.service.impl;
import java.util.List;

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

import egovframework.example.sample.dao.TestDAO;
import egovframework.example.sample.service.TestService;
import egovframework.example.sample.vo.TestVO;

@Service
public class TestServiceImpl implements TestService{
 
    @Autowired
    private TestDAO testDao;
    
    @Override
    public List<TestVO> selectTest(TestVO testVo) throws Exception {
        return testDao.selectTest(testVo);
    }
 
}

 

다오는 직접 데이터를 가져오는 일을 합니다.

TestDAO

package egovframework.example.sample.dao;

import java.util.List;

import egovframework.example.sample.vo.TestVO;

public interface TestDAO {
	  public List<TestVO> selectTest(TestVO testVo) throws Exception;

	 
}

 

TestDAOImpl

package egovframework.example.sample.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import egovframework.example.sample.dao.TestDAO;
import egovframework.example.sample.service.TestMapper;
import egovframework.example.sample.vo.TestVO;

@Repository
public class TestDAOImpl implements TestDAO {
 
    @Autowired
    private SqlSession sqlSession;
    
    @Override
    public List<TestVO> selectTest(TestVO testVo) throws Exception {
        TestMapper mapper = sqlSession.getMapper(TestMapper.class);
        return mapper.selectTest(testVo);
    }
 
}

 

맵퍼 인터페이스는 mapper.xml에 적은 sql을 불러옵니다.

TestMapper 

package egovframework.example.sample.service;

import java.util.List;

import egovframework.example.sample.vo.TestVO;

public interface TestMapper {
	List<TestVO> selectTest(TestVO testVo) throws Exception;


}

 

TestList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 아래줄이 있어야 jsp형식을 사용할 수 있습니다.--> 
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Board List</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
    
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
<style type="text/css">
a{
 text-decoration: auto;
}
</style>
</head>
<body>
 <br/>
    <h1 class="text-center">Board List</h1>
    <br/>
    <br/>
    <div class="container">
        <table class="table table-hover table-striped text-center" style="border:1px solid;">
				<colgroup>
					<col width="20" />
					<col width="10%" />
					<col width="10%" />
					<col width="20%" />
					<col width="10%" />
					<col width="10%" />
					<col width="10%" />
					<col width="10%" />
				</colgroup>
				<tbody>
				<thead>

					<tr>
						<th>분류항복</th>
						<th>코드</th>
						<th>바코드</th>
						<th>제품이름</th>
						<th>용량</th>
						<th>박스당 갯수</th>
						<th>박스 수</th>
						<th>낱개</th>
					</tr>
				</thead>

<!-- jstl 데이터베이스를 검색해 넘겨 받은 list 를 result 라는 이름으로 순차적으로 실행을 시키게 됨  java의 for문같이 순차적으로 실행시킴-->
			 
          <c:forEach items="${list }" var="result">
					<tr>
						<td><c:out value="${result.kind}" /></td>
						<td><c:out value="${result.code}" /></td>
						<td><c:out value="${result.barcode}" /></td>
						<td><c:out value="${result.partname}" /></td>
						<td><c:out value="${result.std}" /></td>
						<td><c:out value="${result.qtybox}" /></td>
						<td><c:out value="${result.box}" /></td>
						<td><c:out value="${result.stock}" /></td>
					</tr>
				</c:forEach>
	
				</tbody>
			</table>
        <hr/>
	<div>
	<br>
	    <ul class="pagination justify-content-center">
                <li><a href="#" style="margin-right:5px;" class="text-secondary">◀</a></li>
                <li><a href="#" style="margin-right:5px;" class="text-secondary">1</a></li>
                <li><a href="#" style="margin-right:5px;" class="text-secondary">2</a></li>
                <li><a href="#" style="margin-right:5px;" class="text-secondary">3</a></li>
                <li><a href="#" style="margin-right:5px;" class="text-secondary">4</a></li>
                <li><a href="#" style="margin-right:5px;" class="text-secondary">5</a></li>
                <li><a href="#" style="margin-right:5px;" class="text-secondary">▶</a></li>
            </ul>
        </div>
        <a class="btn btn-outline-info" style="float:right">글쓰기</a>
    </div>
    <br>

</body>
</html>

 

여기까지 하면 화면에 결과가 출력되는 것을 확인 할 수 있습니다.

 

정리하자면 spring은 각 항목에 DI를 걸어주고, mybatis는 sql과 java코드를 분리해주는 역할을 합니다.

 

참조 : https://haenny.tistory.com/67

 

[eGovFramework] Spring 기반 웹 프로젝트 만들기(2) : sample 삭제

[eGovFramework] Spring 기반 웹 프로젝트 만들기(2) : sample 삭제 Spring 기반 웹 프로젝트 만들기(1) [eGovFramework] Spring 기반 웹 프로젝트 만들기(1) : 프로젝트 생성 [eGovFramework] Spring 기..

haenny.tistory.com

https://ivory-room.tistory.com/63?category=875739 

 

전자정부프레임워크기반 게시판 만들기 (5) 페이징,검색

Pagination과 Search 클래스 추가 페이징,검색 참고 블로그 : freehoon.tistory.com/112?category=735500 Spring 블로그 만들기 - 9. 페이징(pagination) 이 포스팅의 샘플 게시판 개발 환경은 MAC OS, STS, Open..

ivory-room.tistory.com