전자정부 프레임워크 게시판 만들기 연습 (3) MariaDB연동, 게시판 리스트 출력

 

1.  MariaDB연동, 게시판 리스트 출력

파일구조

 

 

ㄴ # 파일구조

 

2. MariaDB

(1). egovtest DB 생성
(2). test table 생성
(3). 열 추가 (아이디,제목,내용,작성자,작성날짜,파일이름)

 

 

MariaDB 테이블 생성 SQL 쿼리문

================================================

 

CREATE TABLE test(
testId INT(100) NOT NULL AUTO_INCREMENT ,
testTitle VARCHAR(300) ,
testContent VARCHAR(300) ,
testName VARCHAR(50) ,
testDate DATE,
fileName VARCHAR(50) ,
PRIMARY KEY (testId)
);

 

*********** ORACLE DB생성문 ********************

 

CREATE TABLE test(
testId NUMBER NOT NULL  ,
testTitle VARCHAR2(300) ,
testContent VARCHAR2(300) ,
testName VARCHAR2(50) ,
testDate DATE,
fileName VARCHAR2(50) ,
PRIMARY KEY (testId)
);

CREATE SEQUENCE TESTID START WITH 1 INCREMENT BY 1 MAXVALUE 10000 CYCLE NOCACHE;

테이블 제거 : drop table test;
시퀀스 제거 : drop sequence testid;

 

 

 

===============================================

 

 

3. pom.xml 에 MariaDB dependency 추가 

 

================================

 

<!-- maria DB  -->
<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>

 

 

 

 

************* 오라클 추가시 ***********************

                <!-- 오라클드라이버  -->
       <dependency>
         <groupId>com.oracle.database.jdbc</groupId>
         <artifactId>ojdbc6</artifactId>
         <version>11.2.0.4</version>
      </dependency>
               <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp  -->
<dependency>
    <groupId>commons-dbcp</groupId>
     <artifactId>commons-dbcp</artifactId>
     <version>1.4</version>
</dependency>



<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>

 

 

================================

 

 

4. resources/egovframework/spring/context-datasource.xml

ㄴ DB접속 정보 파일

 

=============================================

기존꺼 주석처리후 아래 코드 추가

 

<!-- Maria DB -->
<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/egovtest"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>

************************* 오라클 접속시 ******************

<!-- ORACLE -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>  

 

 

=============================================

 

 

JDBC는 클라이언트의 요청마다 커넥션을 생성하고 닫기 때문에 그 과정에서 시간이 소모되고 서버 자원이 낭비될 수 있다. 그래서 이런 문제를 해결하기 위해 등장한 것이 "커넥션 풀(Conntection Pool)"이다.
클라이언트가 요청할 때마다 커넥션을 연결하는 것이 아니라, 웹 컨테이너가 실행할 때 "풀" 안에 미리 커넥션들을 만들고, DB 작업 시 "풀"에서 빌려 사용 후 다시 반납하는 것이다. DataSource는 커넥션 풀을 관리하므로 DataSource를 통해 커넥션을 얻거나 반납할 수 있다. 

 

 

5. context-mapper.xml

 

============================================

 

<!-- SqlSession setup for MyBatis Database Layer -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--  DB 접속 설정 -->
<property name="dataSource" ref="dataSource" />
<!-- myBatis 기본설정 -->
<property name="configLocation" value="classpath:/egovframework/sqlmap/example/sql-mapper-config.xml" />
<!-- 쿼리문이 있는 xml 위치 -->
<property name="mapperLocations" value="classpath:/egovframework/sqlmap/example/mappers/**/*.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>

 

 

 

 

******************** 전자정부 4.0에서 변경된점 **************

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

 

 


    

 

============================================

VO객체를 맵핑하는 mybatis 설정
 
sqlSessionTemplate을 안써줬다가 sqlSession 빈 의존성주입오류부터해서 sqlSessionFactory 생성오류가 났다.

 

SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심으로, SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.getMapper()에 의해 리턴된 매퍼가 가진 메서드를 포함해서 SQL을 처리하는 마이바티스 메서드를 호출할때 SqlSessionTemplate은 SqlSession이 현재의 스프링 트랜잭션에서 사용될수 있도록 보장한다.SqlSessionTemplate은 생성자 인자로 SqlSessionFactory를 사용해서 생성한다.

 

 

6. 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 namespace="egovframework.example.ivory.service.TestMapper">
<select id="selectTest" resultType="egovframework.example.ivory.vo.TestVo">

SELECT * FROM test
ORDER BY testId DESC
</select>

</mapper>

 

=========================================

resultType에 TestVo만 써줬다가 class not found 오류가 나서 패키지경로까지 써주었다.

 

 

7. TestVo.java

 

============================================

 

package egovframework.example.ivory.vo;

public class TestVo {


private int testId;
private String testTitle;
private String testContent;
private String testName;
private String testDate;


public int getTestId() {
return testId;
}
public void setTestId(int testId) {
this.testId = testId;
}
public String getTestTitle() {
return testTitle;
}
public void setTestTitle(String testTitle) {
this.testTitle = testTitle;
}
public String getTestContent() {
return testContent;
}
public void setTestContent(String testContent) {
this.testContent = testContent;
}
public String getTestName() {
return testName;
}
public void setTestName(String testName) {
this.testName = testName;
}
public String getTestDate() {
return testDate;
}
public void setTestDate(String testDate) {
this.testDate = testDate;
}


}

 

============================================

 

 

 

8. TestController.java

 

==========================================

 

package egovframework.example.ivory.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.ivory.service.TestService;
import egovframework.example.ivory.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 "test/testList";
}
}

 

=========================================

 

 

 

9. TestService.java

=========================================

 

package egovframework.example.ivory.service;

import java.util.List;

import egovframework.example.ivory.vo.TestVo;

public interface TestService {

public List<TestVo> selectTest(TestVo testVo) throws Exception;


}

 

=========================================

 

 

10. TestServiceImpl.java

========================================

 

package egovframework.example.ivory.service.impl;

import java.util.List;

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


import egovframework.example.ivory.dao.TestDao;
import egovframework.example.ivory.service.TestService;
import egovframework.example.ivory.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);
}

}

 

========================================

 

 

11. TestDao.java

========================================

 

package egovframework.example.ivory.dao;

import java.util.List;


import egovframework.example.ivory.vo.TestVo;


public interface TestDao {

public List<TestVo> selectTest(TestVo testVo) throws Exception;

}

 

========================================

 

 

12. TestDaoImpl.java

=======================================

 

package egovframework.example.ivory.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.ivory.dao.TestDao;
import egovframework.example.ivory.service.TestMapper;
import egovframework.example.ivory.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);
}

}

 

 

========================================

 

 

13. TestMapper.java

=======================================

 

package egovframework.example.ivory.service;

import java.util.List;

import egovframework.example.ivory.vo.TestVo;
//Mapper namespace 와 ID를 연결할 Interface 를 두어서 interface를 호출하는 방법.
//Mybatis 매핑XML에 기재된 SQL을 호출하기 위한 인터페이스이다.
//SQL id는 인터페이스에 정의된 메서드명과 동일하게 작성한다
public interface TestMapper {


List<TestVo> selectTest(TestVo testVo) throws Exception;

}

 

=======================================

 

 

14. testList.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">
<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>
<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="10%" />
<col width="50%" />
<col width="20%" />
<col width="20%" />
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>등록일자</th>
</tr>
</thead>

<tbody>
<c:forEach items="${list}" var="result">
<tr>
<td>${result.testId}</td>
<td>${result.testTitle}</td>
<td>${result.testName}</td>
<td>${result.testDate}</td>
</tr>
</c:forEach>
</tbody>
</table>
<hr/>
<div>
<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>
<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>
</body>
</html>

 

======================================

 

게시판은 부트스트랩을 사용해서 간단하게 구현했다
미리 테이블에 데이터를 추가 후 서버를 실행

 

 

 

ㄴ 불러오기를 성공한 모습이다. 미리 DB에 더미 데이터들을 입력해 놓았다.

전자정부 프레임워크 게시판 만들기 연습 (2) 기초 설정 및 경로 설정

예제코드삭제/수정

 

 

웹 프로젝트를 생성했을 때 연결되는 sample 페이지 관련 소스를 전부 지우고 싶다. (필요없는 test폴더도)
 
그런데.. sample관련 경로 설정된 것들이 곳곳에 숨어있어서 여간 번거로운 일이 아닐 수 없다.
 
다음에 다시 생성했을 때 뚝 ! 딱~! 하기 위해 글을 남기자

 

1. Sample 관련 모든 소스 과감하게 삭제

(1) java 소스코드가 있는 egovframework.example.sample 패키지(하위 패키지, 클래스 모두)
(2) sql문이 있는 sqlmap - example 내 mappers 및 sample (sql-mapper-config.xml은 수정해서 사용하면 되니 지우지 말기!)
(3) WEF-INF - jsp -egovframework 폴더 전체

 

 

 

 

2. 삭제된 'sample' 관련 등 수정해야 할 부분

- context-mapper.xml 
(경로 : src/main/resource/egovframework/spring)

 

# 변경 전

 

표시한 부분을 아래와 같이 수정했다. "mapperLocations" property의 classpath*/ 에서 '*' 빼먹지 말기!

 

ㄴ # 변경 후  8, 9, 14번 라인 경로 변경

 

 

참고로 sqlmap 내에 example을 oracle로 수정 할 경우. 경로의 example을 oracle로 수정해주면된다.

만약 수정하지 않았다면 oracle대신 example을 넣으면 된다.

 

 

 

 

 

3.

- sql-mapper-config.xml 
(경로 : src/main/resources/egovframework/sqlmap/example 혹은 변경한 폴더명)
 
searchVO와 sampleVO는 sample 패키지를 삭제했으므로 클래스가 존재하지 않아 에러가 날 것이니 삭제한다.

 

ㄴ # 주석 처리 완료

 

 

********************* 전자정부 4.0에서 변경된 점 **************************

<configuration>
    <typeAliases>
<typeAlias alias="egovMap" type="org.egovframe.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>

 

 

4.

- context-sqlMap.xml
(경로 : src/main/resource/egovframework/spring)
 
주석처리하자

 

ㄴ # 주석 처리 완료

 

 

5. 

- dispatcher-servlet.xml
(경로 : src/main/webapp/WEB-INF/config/egovframework/springmvc)
 
 
이 부분은 컨트롤러에서 RequestMapping 할 때 return해주는 jsp 경로 설정에 대한 부분인데, 나는 jsp내에 egovframework/example 부분을 다 삭제했으니 아래와 같이 수정했다.

 

 

ㄴ # 변경전

 

ㄴ # 변경후

 

 

6. !! 여기서부터는 패키지명을 다음과 같이 수정했을 때 변경해야 할 부분이다. !!

(패키지명 변경안하면 안해도됨 7번으로 넘어가자)

 

 

 

- context-aspect.xml
(경로 : src/main/resource/egovframework/spring)
 
상단에 aop 태그 부분과 하단에 egovHdler, otherHandler의 경로가 example로 되어있는데 변경한 패키지명에 맞게 경로 설정 해준다.
 
* 내가 변경한 패키지명은 egovframework.ECALL_C ... 였다

 

 

ㄴ # 변경전

 

 

ㄴ # 변경후

 

- dispatcher-servlet.xml
 
마찬가지로 example 패키지를 전부 ECALL_C로 수정했기 때문에 설정된 경로들도 수정해준다 !
 

 

ㄴ # 변경전

 

ㄴ # 변경후

 

 

7. JSP 테스트 페이지 연결해서 작동상태 확인하기

 

-경로 src/main/java  egovframework.example.cmmn.web 패키지 안에
TestController.java 파일 생성

 

=================================================

package egovframework.example.cmmn.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

@RequestMapping(value="/testList.do")
public String testListDo() {
return "test/testList";
}

}

====================================================

 

WEB-INF/jsp/test/testList.jsp 파일 생성

 

===================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>

 

========================================================

 

서버 실행 후 localhost:8080/testList.do 접속

 

 

ㄴ 서버 정상 작동을 확인

전자정부 프레임워크 게시판 만들기 연습 (1) 기초 환경 설정

기본 개발환경

JDK 1.8

전자정부프레임워크 3.9

Tomcat 9.0

maven 4.0

mariaDB 10.8.3

 

 

1. 이클립스 오른쪽위 Java EE 에서 eGovFrame 으로 바꿔주기

 

2. 프로젝트 생성

New  >  eGovFrame Web Project

 

3. 프로젝트 설정

Project name : 프로젝트명
Target Runtime : 톰캣 설정
Dynamic Web Module version : default 2.5
Group Id : com.xx~ (보통 회사이름)
Artifact Id : 프로젝트명
Version : 처음 생성 하므로 1.0.0 v

 

 

4. Next > Generate Example에 체크하여 예제소스 생성하기
(기본세팅이되어 개발하기 편리, Sample은 지울예정)

 

5. Finish

 

6. 메이븐 업데이트

프로젝트 우클릭 > Maven > Update Project > OK

 

7. 실행화면 바꾸기
Window > Preferences > General > Web Browser
Use external web browser에 체크, Chrome에 체크

 

 

8. 프로젝트 실행
프로젝트 우클릭 > Run As > Run On Server > Finish

 

 

 

 

 

 

주소창에 localhost:8080/프로젝트명
혹은
서버 더블클릭 > Modules탭 > Path를 '/'로 바꿔주면 localhost:8080으로도 가능

 

 

 

+ Recent posts