코딩공부/Java Spring

[spring 기초] Oracle mybatis 연동, 테이블 조회하기

integerJI 2020. 5. 17. 00:31

 

 

[spring 기초] OracleDB 셋팅, DB 생성 및 테이블 생성


 - 프로젝트 시작 전 개발환경 세팅

sts 3.9.11 https://integer-ji.tistory.com/52

oracle 11g : https://integer-ji.tistory.com/55

java 1.8 : https://integer-ji.tistory.com/49

Tomcat 8.5.50 : https://integer-ji.tistory.com/182


Java Package / Class 추가

 

 

src/main/java 아래에 패키지 4개를 추가해 줍니다.

 

com.project.service

ㄴ ProjectService

com.project.service.dao

ㄴ ProjectDAO

com.project.service.impl

ㄴ ProjectServiceImpl ( Impl 은 impL 입니다. 대소문자 주의)

com.project.vo

ㄴ ProjectVO

 

src/main/webapp/WEB-INF/soring/root-context.xml에 데이터베이스, MyBatis, Transaction 설정 추가

 

 

<?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:tx="http://www.springframework.org/schema/tx" 
	xsi:schemaLocation="http://www.springframework.org/schema/jdbc 
		http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd 
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

	<!-- 데이터베이스 연결 --> 
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:(개인SID)" /> 
		<property name="username" value="system"/> 
		<property name="password" value="(개인비밀번호)"/> 
	</bean>
	
	<!-- SqlSession --> 
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
		<property name="dataSource" ref="dataSource" />
		
		<!-- MyBatis 설정 파일의 위치를 지정합니다. -->
		<property name="configLocation" value="classpath:/mybatis-config.xml" />
		
		<!-- SQL 파일의 위치를 지정합니다. -->
		<property name="mapperLocations" value="classpath:/mapper/*.xml" />
	</bean>
	
	<!-- SqlSession -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> 
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" /> 
	</bean>
	
	<!-- 지정된 베이스 패키지에서 DAO(Mapper) 를 검색하여 등록합니다. -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
		<property name="basePackage" value="com.project.service.dao" /> 
	</bean>
	
	<!-- 트랜잭션 매니저 bean 을 등록합니다. -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
		<property name="dataSource" ref="dataSource" /> 
	</bean>
	
	<!-- 아노테이션 기반의 트랜잭션을 사용합니다. --> 
	<tx:annotation-driven transaction-manager="transactionManager"/> 

</beans>

 

beans에 네임스페이스 추가

 

데이터베이스 연결

username - 아이디 설정한 기억이 없으면 system으로 설정됩니다.

password - 설정한 비밀번호

 

SqlSession

MyBatis와 SQL 파일 위치 지정 ( 아직 안만듬 )

 

그 외 DAO 패키지 경로 등록과 bean등 작성하여 줍니다.

 

mybatis-config.xml 파일 생성

 

 

src/main/resources

ㄴ mybatis-config.xml

 

mybatis-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>
    <settings>
          <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
          <typeAlias alias="projectVO" type="com.project.vo.ProjectVO"/>
    </typeAliases>
</configuration>

settings에서 Camel 변환 해줍니다.

Camel이란 필드명을 쉽게 바꿔줍니다. ex) ROOT_ABC -> rootAbc ( _ )뒤에 오는 문자를 대문자로 

 

mapper 폴더와 Tb_Project_SQL.xml 생성

 

 

 

src/main/resources

ㄴmapper

   ㄴTb_Project_SQL.xml

 

Tb_Project_SQL.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="com.project.service.dao.ProjectDAO">

 <select id="selectProjectList" resultType="projectVO">
	SELECT 	PRO_ID, 
		PRO_TITLE, 
		PRO_BODY, 
		PRO_DATE 
		FROM TB_PROJECT
	ORDER BY PRO_ID DESC
 </select>

</mapper>

resultType가 projectVO인 이유는 mybatis-config.xml에서 설정해줬기 때문

 

VO 클래스 생성

 

 

package com.project.vo;

import java.util.Date;

public class ProjectVO {
	private Integer proId;
	private String proTitle;
	private String proBody;
	private Date proDate;
}

 

시간을 가져오기 위한 util.date 추가.

 

여기서 카멜의 효과 디비 컬럼명 PRO_ID -> proId 변환

 

alt + shift + s -> Generate Getters and Setters 

혹은 우클릭 -> Source -> Generate Getters and Setters 클릭

 

 

 

---

에러 발생

"The operation is not applicable to the current selection. Select a field which is not declared as type variavle or a type that declares such fields."

 

 

 

해결 방법

 

마우스 커서를 class 안에 넣으세요...!

 

 

 

해결

---

 

 

 

전부 체크 후 Generate

 

 

 

package com.project.vo;

import java.util.Date;

public class ProjectVO {
	private Integer proId;
	private String proTitle;
	private String proBody;
	private Date proDate;
	
	public Integer getProId() {
		return proId;
	}
	public void setProId(Integer proId) {
		this.proId = proId;
	}
	public String getProTitle() {
		return proTitle;
	}
	public void setProTitle(String proTitle) {
		this.proTitle = proTitle;
	}
	public String getProBody() {
		return proBody;
	}
	public void setProBody(String proBody) {
		this.proBody = proBody;
	}
	public Date getProDate() {
		return proDate;
	}
	public void setProDate(Date proDate) {
		this.proDate = proDate;
	}
	
	
}

 

DAO 인터페이스 생성

 

 

package com.project.service.dao;
import java.util.List;

import com.project.vo.ProjectVO;

public interface ProjectDAO {
	List<ProjectVO> selectProjectList() throws Exception;

}

 

class가 아니라 interface 주의

 

service 인터페이스 생성

 

 

package com.project.service;
import java.util.List;

import com.project.vo.ProjectVO;

public interface ProjectService {
	List<ProjectVO> selectProjectList() throws Exception;
}

 

class가 아니라 interface 주의

 

service 구현 클래스 생성

 

 

package com.project.service.impl;

import java.util.List;

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

import com.project.service.ProjectService;
import com.project.service.dao.ProjectDAO;
import com.project.vo.ProjectVO;

@Service("projectService")
public class ProjectServiceImpl implements ProjectService {
	@Autowired
	private ProjectDAO projectMapper;

	@Override
	@Transactional
	public List<ProjectVO> selectProjectList() throws Exception {
		return projectMapper.selectProjectList();
	}	
}

 

이제 끝이 보입니당

 

Controller Request 추가

 

 

package com.project.controller;

import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.project.service.ProjectService;
import com.project.vo.ProjectVO;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	@Resource(name = "projectService")
	private ProjectService projectService;
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}
	
	@RequestMapping(value = "/projectList.do")
	public String projectList(Model model) throws Exception {

	    List<ProjectVO> list = projectService.selectProjectList();

	    logger.info(list.toString());

	    model.addAttribute("list", list);

	    return "projectList";
	}
	
}

 

 

 

view에 projectList.jsp 생성

 

 

 

projectList.jsp 내용 작성

 

 

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr"/>
    <title>Home</title>
</head>

<body>
<h1>Project List</h1>

<table border="1">
<thead>
  <tr>
    <th>번호</th>
    <th>제목</th>
    <th>본문</th>
    <th>작성일</th>
  </tr>
</thead>
<tbody>
<c:forEach var="item" items="${list}">
  <tr>
    <td>${item.proId}</td>
    <td>${item.proTitle}</td>
    <td>${item.proBody}</td>
    <td>${item.proDate}</td>
  </tr>
</c:forEach>
</tbody>
</table>
</body>
</html>

 

RunServer GoGo

 

 

..ㅠ

 

"org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'projectService' is defined"

 

발생..

 

-- 해결

 

 

 

 

base-package="com.project.controller" >>>> base-package="com.project"

 

controller뿐만 아니라 service도 포함되게 변경

 

참고 : https://okky.kr/article/291232

 

-- 끝

 

 

 

--

 

github commit로 마무리

 

 

 

 

github.com/integerJI/spring-crud.git