일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- string
- math
- deque
- javascript
- alter
- scanner
- JPA
- spring boot
- union_find
- set
- 큐
- NIO
- CSS
- Java
- 스프링부트
- priority_queue
- sql
- 스택
- Properties
- List
- GC로그수집
- date
- dfs
- Union-find
- Calendar
- 힙덤프
- map
- html
- 리소스모니터링
- BFS
- Today
- Total
매일 조금씩
02/01 ! - SpringMVC(4) : 데이터베이스 연결 (MyBatis), 전자정부 웹 프로젝트를 MariaDB로 게시판 실행시키기 본문
02/01 ! - SpringMVC(4) : 데이터베이스 연결 (MyBatis), 전자정부 웹 프로젝트를 MariaDB로 게시판 실행시키기
mezo 2021. 2. 25. 20:00Spring - database
1. 직접연결
1) java
기본 방식
2) root-context.xml
servlet-context.xml
*spring-jdbc / spring-tx
2. JdbcTemplate
* spring-jddbc / spring-tx
* org.springframework.jdbc.core.JdbcTemplate
* 메서드
1) update() - DML
2) queryForObject() - 한행
3) query - 여러행
3. Mybatis
이렇게 Spring에 필요한 것들이 나와있다.
맞는 버전이 뭔지 나와있다. 다운로드는 따로 필요없다. 그냥 버전 확인용.
3-11. 데이터베이스 연결하기(3) - MyBatis
> SpringMyBatisEx01
1) 프로젝트 세팅
2) pom.xml에 mariadb, spring jdbc 드라이버 추가
> pom.xml
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
3) pom.xml에 MyBatis, MyBatis Spring 드라이버 추가
> pom.xml
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
4) root-context.xml 에 데이터베이스와 MyBatis에 관한 내용 넣기
> root-context.xml
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.mariadb.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3307/sample" />
<property name="username" value="root" />
<property name="password" value="!123456" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- mybatisConfig와 함께 쓸때 -->
<!-- <property name="configLocation" value="classpath:myBatisConfig.xml" /> -->
<property name="mapperLocations" value="classpath:mappers/mapper.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" >
<constructor-arg ref="sqlSessionFactory" />
</bean>
5) src/main/esources 폴더에 mappers 패키지를 만들고 그안에 mapper.xml을 만든다.
> mapper.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="mybatis">
<select id="selectNow" resultType="String">
select now()
</select>
<select id="selectDeptList" resultType="com.exam.mybatis01.DeptTO">
select deptno, dname, loc from dept
</select>
</mapper>
6) controller에서 mapper의 sql문을 통해 sqlSession으로 결과물을 가져온다.
> HomeController.java
package com.exam.mybatis01;
import java.util.ArrayList;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@Autowired
private SqlSession sqlSession;
// root-context.xml에서 sqlSession을 만든다.
@RequestMapping(value = "/jdbc1.do")
public String jdbc1() {
System.out.println("jdbc1.do 호출 : " + sqlSession);
String result = sqlSession.selectOne("selectNow");
System.out.println("결과 : " + result);
return "jdbc1";
}
@RequestMapping(value = "/jdbc2.do")
public String jdbc2() {
System.out.println("jdbc2.do 호출 : " + sqlSession);
ArrayList<DeptTO> lists = (ArrayList)sqlSession.selectList("selectDeptList");
for(DeptTO to : lists) {
System.out.println(to.getDeptno());
System.out.println(to.getDname());
System.out.println(to.getLoc());
}
return "jdbc1";
}
}
7) dao를 사용한다면?
dao에서 sqlsession으로 결과를 가져옴
> HomeController.java
package com.exam.mybatis01;
import java.util.ArrayList;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@Autowired
private SqlSession sqlSession;
// root-context.xml에서 sqlSession을 만든다.
@Autowired
private DeptDAO deptDao;
@RequestMapping(value = "/jdbc1.do")
public String jdbc1() {
System.out.println("jdbc1.do 호출 : " + sqlSession);
String result = sqlSession.selectOne("selectNow");
System.out.println("결과 : " + result);
return "jdbc1";
}
@RequestMapping(value = "/jdbc2.do")
public String jdbc2() {
System.out.println("jdbc2.do 호출 : " + sqlSession);
ArrayList<DeptTO> lists = (ArrayList)sqlSession.selectList("selectDeptList");
for(DeptTO to : lists) {
System.out.println(to.getDeptno());
System.out.println(to.getDname());
System.out.println(to.getLoc());
}
return "jdbc1";
}
@RequestMapping(value = "/jdbc3.do")
public String jdbc3() {
//DeptDAO deptDao = new DeptDAO();
String result = deptDao.selectNow();
System.out.println(result);
return "jdbc1";
}
@RequestMapping(value = "/jdbc4.do")
public String jdbc4() {
System.out.println("jdbc4.do 호출 : " + sqlSession);
ArrayList<DeptTO> lists = (ArrayList)deptDao.selectList();
for(DeptTO to : lists) {
System.out.println(to.getDeptno());
System.out.println(to.getDname());
System.out.println(to.getLoc());
}
return "jdbc1";
}
}
> DeptDAO.java
package com.exam.mybatis01;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class DeptDAO {
@Autowired
private SqlSession sqlSession;
public String selectNow() {
String result = sqlSession.selectOne("selectNow");
return result;
}
public ArrayList<DeptTO> selectList() {
ArrayList<DeptTO> result = (ArrayList)sqlSession.selectList("selectDeptList");
return result;
}
}
응용실습) 우편번호 검색기만들기
> ZipcodeSearchSpringMybatisEx01
8) 인터페이스를 끼고 하는것
mapper, HomeController, root-context 가지고 만든다.
인터페이스가 mapper를 부른다. 그 과정을 mybatis가 처리한다.
mybaits의 config 인터페이스를 사용하는 것이다.
가장 먼저 root-context.xml에 com.exam.config 패키지가 basePackage라고 선언해줘야한다.
com.exam.config 안에 인터페이스가 들어가게 되기 때문이다.
> root-context.xml
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.exam.config" />
</bean>
위의 코드는 myBatis가 하는 기능(SqlSession)을 com.exam.config에 모두 포함시킨다.
따라서 com.exam.config에 만드는 인터페이스는 SqlSession을
써주지 않아도 된다.
그냥 mapper의 sql문을 받으면 자동으로 된다.
그다음 com.exam.config 안에 인터페이스를 만들어서 메서드들을 선언한다.
> SqlMapperInter.java
package com.exam.config;
public interface SqlMapperInter {
// mapper.xml의 sql 이름과 같게 선언해주기
public abstract String selectNow();
public abstract ArrayList<DeptTO> selectDeptList();
}
선언하는 메서드명은 mapper에 정의된 sql 문의 id또는 namer과 같게 해주야 한다.
왜냐면 여기서 선언한 메서드를 mapper파일에서 구현하기 때문인다.
그다음 mapper에서 인터페이스에서 선언된 메서드를 구현하기 위해 mapper의 namespace를 인터페이스명으로 바꿔준다.
> mapper.xml
<!-- 인터페이스와 같게 namespace 변경 -->
<mapper namespace="com.exam.config.SqlMapperInter">
<!-- <mapper namespace="mybatis"> -->
<select id="selectNow" resultType="String">
select now()
</select>
<select id="selectDeptList" resultType="com.exam.mybatis01.DeptTO">
select deptno, dname, loc from dept
</select>
</mapper>
그리고 controller에선 인터페이스를 선언하고, 인터페이스를 통해 메서드를 호출한다.
> HomeController.java
@Autowired
private SqlMapperInter sqlMapperInter;
@RequestMapping(value = "/jdbc5.do")
public String jdbc5() {
// 인터페이스를 통해서 mapper.xml의 selectNow를 찾아감
String result = sqlMapperInter.selectNow();
System.out.println("결과 : " + result);
return "jdbc1";
}
@RequestMapping(value = "/jdbc6.do")
public String jdbc6() {
// 인터페이스를 통해서 mapper.xml의 selectDeptList 찾아감
ArrayList<DeptTO> lists = sqlMapperInter.selectDeptList();
for(DeptTO to : lists) {
System.out.println(to.getDeptno());
System.out.println(to.getDname());
System.out.println(to.getLoc());
}
return "jdbc1";
}
여기서 인터페이스를 통해 호출되는 메서드들은 mapper의 sql문을 말한다.
응용실습) mybatis로 model2 게시판 만들기
내가한거
> SpringMybatisBoardEx01
강사님이 한거
> BoardSpringMyBatisEx01
1) 가장먼저 root-context.xml 잘설정해주고 SqlSession다해주고
2) mapper.xml에 sql문 모두 넣기
3) dao 가서 @Repository와 @Autowired를 쓰려면 해당 파일이 포함된 패키기가 등록이 되어 있어야한다.
등록하는 위치는? servlet-context.xml에 넣어줘야한다. close() 쓰면 안된다.
Spring - 전자정부 프레임워크
이전에 전자정부 프레임워크를 다운받은적이 있다. (1/26 수업 참고)
C:\eGovFrameDev-3.9.0-64bit
다운받은걸 열어보면 eclipse폴더와 workspace 폴더가 있다.
여기서 eclipse폴더의 eclipse.exe를 실행시킨다.
이때 workspace를 C:\eGovFrameDev-3.9.0-64bit\workspace로 한다.
eclipse가 실행되면 가장먼저 server를 tomcat v9로 세팅한다.
만약, Spring MVC Project로 개발하려면 Spring 개발 환경으로 바꿔야한다.
Eclipse 에서 만드는것과 동일 하게 만들면 된다.
1. 전자정부 프레임워크로 게시판 만들기
전자정부프레임워크에서 제공하는 것을 사용해서
우리가 했던 mariadb로 게시판을 구현한다.
eGovFrame Web Project로 만들면 게시판이 이미 구현되어 있는데 mariadb로는 구현되어 있지 않다.
우린 mariadb로 바꿔서도 게시판이 구현되는지 확인해야한다.
1) eGovFrame으로 개발환경을 바꿔야한다.
2) 그후 eGovFrame Web Project로 프로젝트를 만든다.
그럼 다운로드가 실행된다.
다운로드가 다된 후, index.jsp에서 실행시키면 게시판이 잘 실행되는지 확인한다.
위 사진의 순서대로 수정한다.
3) 게시판이 잘 실행되면 pom.xml부터 수정한다.
<!-- mysql이나 oracle 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>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>14</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ojdbc-14.jar</systemPath>
</dependency>
-->
위처럼 주석처리 되어 있는것을.. 아래처럼 log4jdbc와 commons-dbcp를 주석해제 해고, mariadb를 추가한다.
<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>
<!-- mariadb 추가 -->
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.1</version>
</dependency>
<!-- mysql이나 oracle DB 사용시 아래 설정 추가
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<dependency>
<groupId>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>14</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ojdbc-14.jar</systemPath>
</dependency>
-->
4) datasource가 될 mariadb에 관한 정보를 추가한다.
src/main/resources > egovframework > spring > context-datasource .xml에서 수정하면 된다.
기존에 초기 실행용으로 쓰여있던 코드를 주석처리하고, mariadb 코드를 추가한다.
<!-- 테스트 실행용
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location= "classpath:/db/sampledb.sql"/>
</jdbc:embedded-database>
-->
<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:mysql://127.0.0.1:3307/project" />
<property name="username" value="project"/>
<property name="password" value="123456"/>
</bean>
5) mariadb용 mapper파일을 추가한다.
src/main/resources > egovframework > sqlmap > example > sample 에 추가한다.
여기선 EgovSample_Sample_MariaDB.xml이다.
6) 추가한 mapper가 resource가 되게 해준다.
src/main/resources > egovframework > sqlmap > example > sql-map-config.xml 을 수정한다.
추가한 mapper파일 명으로 수정한다.
7) index.jsp를 실행시키면 게시판이 정상적으로 실행된다.