(Spring4셋팅 Step5) mybatis 추가하기

프로그래밍/Java | 2015. 7. 15. 22:31
Posted by 애니스

1. pom.xml 파일에 mybatis dependency 추가

 

  <!-- Spring orm -->

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>4.0.4.RELEASE</version>
  </dependency>

    <!-- MyBatis -->
  <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.0.6</version>
  </dependency>

  <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis-spring</artifactId>
   <version>1.0.2</version>
  </dependency>

  <!-- DBCP -->
  <dependency>
   <groupId>commons-dbcp</groupId>
   <artifactId>commons-dbcp</artifactId>
   <version>1.2.2</version>
  </dependency> 

 

2. pom.xml 파일에 oracle jdbc dependency 추가

oracle jdbc는 repository 를 추가해야만 정상 다운로드 받을 수 있다.

 

dependencies 위에 repository 를 추가한다.

 

 <repositories>
  <repository>
   <id>oracle</id>
   <name>ORACLE JDBC Repository</name>
   <url>http://maven.jahia.org/maven2</url>
  </repository>
 </repositories> 

 

다음으로 dependency를 추가한다.

 

<!-- ORACLE -->
  <dependency>
   <groupId>com.oracle</groupId>
   <artifactId>ojdbc6</artifactId>
   <version>11.1.0.7.0</version>
  </dependency> 

 

3. application-context.xml 파일에 설정 정보 추가

 

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

 

 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation" value="/WEB-INF/mybatis-config.xml" />
  <property name="typeAliasesPackage" value="com.test.web" />
  <property name="mapperLocations" value="classpath*:com/test/web/**/dao/mapper/*Mapper.xml" />
 </bean>

 <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg ref="sqlSessionFactory" />
 </bean>
 
 <!-- dao 스캔 -->
 <bean class= "org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.test.web.**.dao" />
 </bean>

 

 

 

<property name="typeAliasesPackage" value="com.test.web" />

- mybatis에서 resultType과 parameterType 사용시 bean 객체를 사용할려면 패키지 경로 및 bean 클래스명까지 입력해야 한다.

하지만 alias 처리를 해주면 bean 클래스명만 입력하면 되므로 조금 간소해진다.

ex ) MemberBean 을 사용할 경우 com.test.web.member.bean.MemberBean --> memberBean

 

<property name="mapperLocations" value="classpath*:com/test/web/**/dao/mapper/*Mapper.xml" />

기능명Mapper.xml 파일은 실제 쿼리 내용이 담겨 있다.

이 부분도 전체 경로를 명시하는 방법도 있지만, 기능이 추가되거나 삭제시에 설정 부분을 수정해야 하는 번거로움이 있다.

이 부분을 간소화하기 위해 com.test.web.기능명.dao.mapper 패키지내에 기능명Mapper.xml 패턴으로 정의해놓으면

서버 재 시작시 자동으로 추가되도록 처리한 부분이다.

 

<property name="basePackage" value="com.test.web.**.dao" />

dao 파일은 spring과 mybatis를 연결해주는 인터페이스 파일이다.

이 부분도 마찬가지도 규칙에 맞게 해당 패키지내 작성한다면 서버 재 시작시 자동으로 추가된다.

 

 

다음으로 mybatis-config.xml 파일을 작성한다.

WEB-INF 폴더 밑에 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>
  <!-- 데이터베이스로의 응답을 얼마나 오래 기다릴지를 판단하는 타임아웃을 셋팅 -->

  <!-- 단위 : 밀리세컨 25초로 셋팅 -->
  <setting name="defaultStatementTimeout" value="25000"/>
 </settings>
</configuration> 

 

 

 

다음으로 log4j 설정을 추가하자.

src/main/resocuces 밑에 log4j.properties 열어 빨간색 내용을 추가해보자.

 

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm} %-5p (%F:%L) - %m%n

 

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

 

log4j.logger.com.mybatis=DEBUG

 

여기는 추후 서버에서 QUERY질의시 sql과 파라미터, 결과등을 출력한다.

 

 

 

기본적인 설정은 끝났다.

 

이제 간단한 회원 가입을 하는 기능을 만들어 테스트 해봅시다.

 

먼저 회원정보 테이블을 생성한다.

 

많은 항목이 있을수도 있지만 mybatis 연동 테스트를 위해 컬럼은 대충 만들겠다.

 

CREATE TABLE TB_MEMBER (
  MB_ID    VARCHAR2(20 BYTE),
  MB_NAME  VARCHAR2(20 BYTE),
  MB_PW    VARCHAR2(20 BYTE),
  MB_ADDR  VARCHAR2(200 BYTE),
  CONSTRAINT TB_MEMBER_PK PRIMARY KEY (MB_ID)
);

COMMENT ON TABLE TB_MEMBER IS '회원테이블';
COMMENT ON COLUMN TB_MEMBER.MB_ID IS '회원아이디';
COMMENT ON COLUMN TB_MEMBER.MB_NAME IS '회원명';
COMMENT ON COLUMN TB_MEMBER.MB_PW IS '회원패스워드';
COMMENT ON COLUMN TB_MEMBER.MB_ADDR IS '회원주소'; 

 

테이블을 만들었으니 매핑에 이용할 bean을 만들자.

 

package com.test.web.member.bean;

 

public class MemberBean {

 /** 회원 아이디 */
 private String mbId;
 /** 회원명 */
 private String mbName;
 /** 회원 패스워드 */
 private String mbPw;
 /** 회원 주소 */
 private String mbAddr;
 
 public String getMbId() {
  return mbId;
 }
 public void setMbId(String mbId) {
  this.mbId = mbId;
 }
 public String getMbName() {
  return mbName;
 }
 public void setMbName(String mbName) {
  this.mbName = mbName;
 }
 public String getMbPw() {
  return mbPw;
 }
 public void setMbPw(String mbPw) {
  this.mbPw = mbPw;
 }
 public String getMbAddr() {
  return mbAddr;
 }
 public void setMbAddr(String mbAddr) {
  this.mbAddr = mbAddr;
 }

 

다음으로 회원 가입 화면을 만들어봅시다.

회원 테이블에 들어갈 회원아이디, 회원명, 회원패스워드, 회원 주소만 입력받는 간단한 화면이다.

 

먼저 컨트롤러에 회원 가입 화면으로 이동하는 메소드를 하나 추가한다.

 

 /** 회원 가입 화면 */
 @RequestMapping("/member/insertMemberForm.do")
 public String insertMemberForm() throws Exception {
  return "member/insertMemberForm";
 }

 

위 메소드에 정의한 대로 WEB-INF/view/member 폴더 밑에 insertMemberForm.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">
</head>
<body>
 <form method="post" action="/member/insertMember.do">
  회원가입<br/><br/>
  <div>
   <label for="mbId" style="display:inline-block;width:100px;">회원아이디</label>
   <input type="text" name="mbId" id="mbId"/>
  </div>
  <div>
   <label for="mbName" style="display:inline-block;width:100px;">회원명</label>
   <span><input type="text" name="mbName" id="mbName"/></span>
  </div>
  <div>
   <label for="mbPw" style="display:inline-block;width:100px;">회원패스워드</label>
   <span><input type="text" name="mbPw" id="mbPw"/></span>
  </div>
  <div>
   <label for="mbAddr" style="display:inline-block;width:100px;">회원주소</label>
   <span><input type="text" name="mbAddr" id="mbAddr"/></span>
  </div>
  <input type="submit" value="회원가입">
 </form>
</body>
</html> 

 

간단한 입력화면이다.

여기서 주의할 점은 빨간색 부분... 엘리먼트들의 이름이다.

 

조금만 주의깊게 보면 MemberBean에 선언된 변수명이랑 같다는 것을 알수 있다.

 

동일하게 한 이유는 컨트롤러에서 입력된 데이터들을 받을때 bean에 셋팅될 것이다.

 

이제 회원가입 쿼리를 작성해보자.

 

앞서 설정했던 패키지 규칙에 따라 com.test.web.member.dao.mapper 안에 MemberMapper.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.test.web.member.dao.MemberDao">

 <!-- 회원 가입 -->
 <insert id="insertMember">
 INSERT INTO TB_MEMBER (
  MB_ID,
  MB_NAME,
  MB_PW,
  MB_ADDR
 ) VALUES ( 
  #{mbId},
  #{mbName},
  #{mbPw},
  #{mbAddr} 
 )
 </insert>
 
</mapper>

 

 

<mapper namespace="com.test.web.member.dao.MemberDao">

우선 봐야할 부분이 mapper namespace 다.

 

여기에는 현재 MemberMapper.xml 파일의 인터페이스명을 입력해준다.

 

다음으로 데이터를 셋팅하는 부분이다.

mybatis에서 데이터를 셋팅하려면 #{아이디} 이런식으로 표기해줘야 한다.

 

MemberBean을 그대로 사용할 예정이라, 아이디 부분에 MemberBean안에 변수들만 그대로 사용하였다.

 

  #{mbId},
  #{mbName},
  #{mbPw},
  #{mbAddr} 

 

다음으로 MemberDao를 작성해보자.

MemberDao는 com.test.web.member.dao 패키지에 위치한다.

 

package com.test.web.member.dao;

 

import com.test.web.member.bean.MemberBean;

 

public interface MemberDao {
 
 /** 회원 가입 */
 public int insertMember(MemberBean memberBean);
 

 

insertMember 메소드에 MemberBean을 그대로 넘겼다.

 

다음으로 MemberServiceImpl이다.

MemberServiceImpl은 com.test.member.service 패키지 내에 위치한다.

 

package com.test.web.member.service;

 

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

import com.test.web.member.bean.MemberBean;
import com.test.web.member.dao.MemberDao;

 

@Service
public class MemberServiceImpl implements MemberService {
 
 @Autowired
 private MemberDao memberDao;
 
 /** 회원 가입 */
 public int insertMember(MemberBean memberBean) throws Exception {
  return memberDao.insertMember(memberBean);
 }
}
 

 

여기서는 방금전에 생성하였던 MemberDao 내 insertMember를 호출한다.

 

빨간색 부분을 좀 더 보자.

 

앞에서의 스캔 설정으로 인해 스프링 컨테이너가 해당 패키지내 MemberDao 객체를 등록하고,

@Autowired 애노테이션으로 memberDao에 객체를 자동으로 주입시킨다.

 

이런 부분이 스프링의 DI(Dependency Injection : 의존주입) 의 한 부분이다.

 

 

 

다음으로 MemberService 를 생성하자.

MemberService 는 MemberServiceImpl의 인터페이스이다.

 

패키지는 MemberServiceImpl과 동일한 com.test.web.member.service 이며, 내용은 아래와 같다.

 

 

package com.test.web.member.service;

 

import com.test.web.member.bean.MemberBean;

 

public interface MemberService {

 /** 회원 가입 */
 public int insertMember(MemberBean memberBean) throws Exception;


}
 

 

이제 MemberController에 회원 가입 처리를 위한 메소드를 생성하자.

 

MemberController는 기존 것을 그대로 사용하면 된다.

 

이때까지 작업 한 내용과 통합해서 보겠다.

 

 

package com.test.web.member.controller;

 

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
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 com.test.web.member.bean.MemberBean;
import com.test.web.member.service.MemberService;

 

@Controller
public class MemberController {
 
 private final Logger logger = LogManager.getLogger(this.getClass());
 
 @Autowired
 MemberService memberService;
 
 /** 회원 가입 화면 */
 @RequestMapping("/member/insertMemberForm.do")
 public String insertMemberForm() throws Exception {
  return "member/insertMemberForm";
 }
 
 /** 회원 가입 처리 */
 @RequestMapping("/member/insertMember.do")
 public String insertMember(MemberBean memberBean, Model model) throws Exception {
  
  logger.info("memberBean.mbId : "+memberBean.getMbId());
  logger.info("memberBean.mbName : "+memberBean.getMbName());
  logger.info("memberBean.mbPw : "+memberBean.getMbPw());
  logger.info("memberBean.mbAddr : "+memberBean.getMbAddr());
  
  int resultCnt = memberService.insertMember(memberBean);
  String result = "";
  if ( resultCnt == 0 ){
   result = "failure";
  } else {
   result = "success";
  }
  
  model.addAttribute("result", result);
  model.addAttribute("memberBean", memberBean);
  
  return "member/insertMemberCompleted";
 }
 
}

 

여기서 가장 주의깊게 볼 부분이 붉은색 영역 MemberBean memberBean 이 부분이다.

 

앞서 회원가입 jsp 화면에서 데이터를 넘길때 element name과 memberBean의 변수가 일치할 경우

 

memberBean 에 값들이 셋팅된다.

 

화면에서 정상적으로 값이 넘어오는지 확인하기 위해 로그도 남겨놨으니,

 

작업을 진행하면서 확인해보도록 하겠다.

 

 

 

그리고 회원 가입 완료 jsp를 만들어 결과를 출력해 봅시다.

 

WEB-INF/view/member 폴더 밑에 insertMemberCompleted.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">
</head>
<body>
  회원가입<br/><br/>
  
  회원 가입 성공 실패 : ${result}
  
  <div>
   <label for="mbId" style="display:inline-block;width:100px;">회원아이디</label>
   <span>${memberBean.mbId}</span>
  </div>
  <div>
   <label for="mbName" style="display:inline-block;width:100px;">회원명</label>
   <span>${memberBean.mbName}</span>
  </div>
  <div>
   <label for="mbPw" style="display:inline-block;width:100px;">회원패스워드</label>
   <span>${memberBean.mbPw}</span>
  </div>
  <div>
   <label for="mbAddr" style="display:inline-block;width:100px;">회원주소</label>
   <span>${memberBean.mbAddr}</span>
  </div>
</body>
</html> 

 

 

데이터가 정상적으로 insert 되었다면 회원 가입 성공 실패 부분에 success,

 

실패하였다면 failure 로 결과를 확인할 수 있다.

 

그럼 테스트를 해보자 ~

 

브라우저 URL에 http://localhost/member/insertMemberForm.do 입력 후 엔터

 

 

 

임의의 데이터를 입력 후 회원가입을 클릭

 

 

 

이렇게 결과를 출력한다.

 

로그를 살펴보도록 하자~

 

 

2015/07/16 22:29 INFO  (MemberController.java:47) - memberBean.mbId : hong
2015/07/16 22:29 INFO  (MemberController.java:48) - memberBean.mbName : 홍길동
2015/07/16 22:29 INFO  (MemberController.java:49) - memberBean.mbPw : 1234
2015/07/16 22:29 INFO  (MemberController.java:50) - memberBean.mbAddr : 서울시 종로구
2015/07/16 22:29 DEBUG (JakartaCommonsLoggingImpl.java:27) - ooo Connection Opened
2015/07/16 22:29 DEBUG (JakartaCommonsLoggingImpl.java:27) - ==>  Executing: INSERT INTO TB_MEMBER ( MB_ID, MB_NAME, MB_PW, MB_ADDR ) VALUES ( ?, ?, ?, ? )
2015/07/16 22:29 DEBUG (JakartaCommonsLoggingImpl.java:27) - ==> Parameters: hong(String), 홍길동(String), 1234(String), 서울시 종로구 (String) 

 

화면에서 입력한 데이터가 로그에 찍히는 것을 확인할 수 있다.

 

또한 쿼리문과 쿼리에 들어간 파라미터까지 확인이 가능하다.

 

그럼 정상적으로 입력되었는지 디비를 확인해보자.

 

 

SELECT * FROM TB_MEMBER 

 

 

위와 같이 쿼리 질의시 정상적으로 등록된 것을 확인할 수 있다.

 

 


MB_ID                MB_NAME              MB_PW               MB_ADDR                                
--------------- ------------------- ----------------- ------------------------------------------
hong                 홍길동                     1234                    서울시 종로구                         

1 row selected. 

 

 
블로그 이미지

애니스

카테고리

분류 전체보기 (10)
프로그래밍 (10)
애니스전용 (0)