반응형

# MVC05_03 JDBC를 MyBatis로 변경_1

## 회원 리스트 가져오는 기능 작업

1. MemberDAO

  • MemberMapper와 연결을 위한 코드 작성
package kr.bit.model;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

// JDBC -> MyBatis
public class MemberDAO {
	private static SqlSessionFactory sqlSessionFactory;	// DB를 연결하고 있는 객체들이 존재.
	
	// 초기화 블럭 => 프로그램 실행 시 딱 한번만 실행되는 코드.
	static {
		try {
			String resource = "kr/bit/mybatis/config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);	// 읽기
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
	
	// 회원 리스트 조회 기능
	public List<MemberVO> memberList() {
		// SqlSession 은 Connection + Statement 의 기능을 합쳐 놓은 것.
		SqlSession session = sqlSessionFactory.openSession();
		List<MemberVO> list = session.selectList("memberList");		// mapper와 연결 ""에는 id이름 적기 일반적으로 해당 매서드 이름적음.
		session.close();	// 연결 종료(반납)
		return list;
	}
}

2. MemberMapper.xml

  • 쿼리의 id의 경우 DAO에서 입력한 id값과 동일하게 해주기.
  • resultType는 해당 쿼리문의 결과에 의해 묶어지는 타입정보 작성
<?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">
<!-- namerspace는 이름. -->
<mapper namespace="kr.bit.mybatis.MemberMapper">
  
    <select id="memberList" resultType="kr.bit.model.MemberVO">
		SELECT *
		FROM member
    </select>
    
</mapper>
  • 쿼리문 작성 시 마다 resultType에 kr.bit.model.MemberVO로 작성하는 번거로움이 있는데, 이를 해소하기 위해서 config.xml에 아래와 같이 설정을 해줘야 한다. type에 해당하는 것을 alias에 적은 별칭으로 사용하겠다는 의미.
<typeAliases><!-- 별칭설정 -->
	    <typeAlias type="kr.bit.model.MemberVO" alias="memberVO"/>
</typeAliases>

### 정리

  • MemberDAO에서 memberList 실행
  • MemberMapper.xml 에서 동일한 id의 쿼리문 실행, 실행된 쿼리는 설정된 resultType으로 묶어진다.

## 회원가입 기능 작업

1. MemberDAO

  • MemberMapper와 연결을 위한 코드 작성
  • Insert의 경우 mapper의 id 와 값을 넘겨주기 위한 vo 2개의 매개변수를 넣어줘야 한다.
  • 저장, 수정 등의 경우 데이터베이스의 정보가 변경되므로 commit을 해줘야 한다. (session.commit();)
// 회원 가입 기능
public int memberInsert(MemberVO vo) {
  SqlSession session = sqlSessionFactory.openSession();
  int cnt = session.insert("memberInsert", vo);
  session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
  session.close();	// 연결 종료(반납)
  return cnt;
}

2. MemberMapper.xml

  • parameterType는 해당 쿼리문에 넘어가는 정보의 타입을 의미.
<insert id="memberInsert" parameterType="memberVO">
  INSERT INTO member(id, pass, name, age, email, phone) 
  values(#{id}, #{pass}, #{name}, #{age}, #{email}, #{phone})
</insert>

 

# MVC05_03 JDBC를 MyBatis로 변경_2

## 회원 삭제 기능 작업

1. MemberDAO

  • MemberMapper와 연결을 위한 코드 작성
// 회원 삭제 기능
public int memberDelete(int num) {
  SqlSession session = sqlSessionFactory.openSession();
  int cnt = session.delete("memberDelete", num);
  session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
  session.close();	// 연결 종료(반납)
  return cnt;
}

2. MemberMapper.xml

  • parameterType는 해당 쿼리문에 넘어가는 정보의 타입을 의미. 넘어가는 타입이 object이므로 Integer로 작성.
<delete id="memberDelete" parameterType="Integer">
  DELETE 
  FROM member
  WHERE num = #{num}
</delete>

## 회원 상세 보기 기능 작업

1. MemberDAO

  • MemberMapper와 연결을 위한 코드 작성
// 회원 상세보기
public MemberVO memberContent(int num) {
  SqlSession session = sqlSessionFactory.openSession();
  MemberVO vo = session.selectOne("memberContent", num);
  session.close();	// 연결 종료(반납)
  return vo;
}

2. MemberMapper.xml

  • 회원 상세보기의 경우 특정 회원의 번호를 받을 parameterType과 쿼리문의 결과로 조회된 대상의 정보를 넘겨줄 resultType이 필요하다.
<select id="memberContent" parameterType="Integer" resultType="memberVO">
  SELECT *
  FROM member
  WHERE num = #{num}
</select>

## 회원 수정하기 기능 작업

1. MemberDAO

  • MemberMapper와 연결을 위한 코드 작성
// 회원 수정하기
public int memberUpdate(MemberVO vo) {
  SqlSession session = sqlSessionFactory.openSession();
  int cnt = session.update("memberUpdate", vo);
  session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
  session.close();	// 연결 종료(반납)
  return cnt;
}

2. MemberMapper.xml

<update id="memberUpdate" parameterType="memberVO">
  UPDATE member 
  SET age = #{age}, email = #{email}, phone = #{phone} where num = #{num}
</update>

## 정리

1. MemberDAO

package kr.bit.model;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

// JDBC -> MyBatis
public class MemberDAO {
	private static SqlSessionFactory sqlSessionFactory;	// DB를 연결하고 있는 객체들이 존재.
	
	// 초기화 블럭 => 프로그램 실행 시 딱 한번만 실행되는 코드.
	static {
		try {
			String resource = "kr/bit/mybatis/config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);	// 읽기
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
	
	// 회원 리스트 조회 기능
	public List<MemberVO> memberList() {
		// SqlSession 은 Connection + Statement 의 기능을 합쳐 놓은 것.
		SqlSession session = sqlSessionFactory.openSession();
		List<MemberVO> list = session.selectList("memberList");		// mapper와 연결 ""에는 id이름 적기 일반적으로 해당 매서드 이름적음.
		session.close();	// 연결 종료(반납)
		return list;
	}
	
	// 회원 가입 기능
	public int memberInsert(MemberVO vo) {
		SqlSession session = sqlSessionFactory.openSession();
		int cnt = session.insert("memberInsert", vo);
		session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
		session.close();	// 연결 종료(반납)
		return cnt;
	}
	
	// 회원 삭제 기능
	public int memberDelete(int num) {
		SqlSession session = sqlSessionFactory.openSession();
		int cnt = session.delete("memberDelete", num);
		session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
		session.close();	// 연결 종료(반납)
		return cnt;
	}
	
	// 회원 상세보기
	public MemberVO memberContent(int num) {
		SqlSession session = sqlSessionFactory.openSession();
		MemberVO vo = session.selectOne("memberContent", num);
		session.close();	// 연결 종료(반납)
		return vo;
	}
	
	// 회원 수정하기
	public int memberUpdate(MemberVO vo) {
		SqlSession session = sqlSessionFactory.openSession();
		int cnt = session.update("memberUpdate", vo);
		session.commit();	// DB 내용이 수정되므로 commit을 해줘야 한다.
		session.close();	// 연결 종료(반납)
		return cnt;
	}
}

2. 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">
<!-- namerspace는 이름. -->
<mapper namespace="kr.bit.mybatis.MemberMapper">
  
    <!-- 회원 리스트(전체) -->
    <select id="memberList" resultType="memberVO">
	    SELECT *
    	FROM member
    </select>
    
    <!-- 회원 가입 -->
    <insert id="memberInsert" parameterType="memberVO">
        INSERT INTO member(id, pass, name, age, email, phone) 
        values(#{id}, #{pass}, #{name}, #{age}, #{email}, #{phone})
    </insert>
    
    <!-- 회원 삭제 -->
    <delete id="memberDelete" parameterType="Integer">
        DELETE 
        FROM member
        WHERE num = #{num}
    </delete>
    
    <!-- 회원 상세보기 -->
    <select id="memberContent" parameterType="Integer" resultType="memberVO">
        SELECT *
        FROM member
        WHERE num = #{num}
    </select>
    
    <!-- 회원 정보 수정 -->
    <update id="memberUpdate" parameterType="memberVO">
        UPDATE member 
        SET age = #{age}, email = #{email}, phone = #{phone} where num = #{num}
    </update>
    
</mapper>
반응형
반응형

# MVC05_01 JDBC와 MyBatis 설정

## MVC04 import 하여 MVC05로 변경

  • Project Explorer 에서 빈 공간 우 클릭 > Import > MVC04 WAR File 찾아서 클릭 후 프로젝트 이름을 MVC05로 변경

## 톰캣 서버 등록

  • Servers > 톰캣 우 클릭 > Add and Remove > Available 에서 MVC05 클릭 후 Add하여 Configured로 이동 후 Finish.

## 톰캣 서버 등록 확인

  • Servers > 톰캣 서버 더블클릭 > Modules에 MVC05 정상적으로 등록되어있는지 확인.

## 기존 JDBC와 MyBatis

1. 기존 JDBC

  • 소스코드 안에 중요 정보(데이터베이스 접속 정보, 아이디, 패스워드 등) 포함.
  • 자바 소스코드 + SQL 명령문이 섞어있어(임베디드) 유지보수 시 문제 발생 가능성 존재.
  • JDBC 이용 시 개발자가 모두 직접해야 하기 때문에 개발 속도가 상당히 늦어진다.
  • 그래서 이러한 단점 등을 해결하기 위해 MyBatis API를 이용 할 예정.

2. MyBatis

  • MyBatis의 핵심은 기존 JDBC (자바 소스코드 + SQL)에서 자바 소스코드와 SQL 쿼리를 분리 시키자는 것.
  • 자바 소스코드에서 분리된 SQL과 어떻게 연결해서 사용할지에 대한 방법론과 이 방법론을 실제 구현해 줄 API가 MyBatis이다.
  • MyBatis란 자바에서 SQL Mapping해서 사용하는 프레임워크, 한마디로 SQL Mapping Framework

## MyBatis 설정 파일 3개.

  • 프로젝트 > src 에서 마우스 우 클릭 > Package > kr.bit.mybatis 이름의 패키지 생성
  • MyBatis 이용을 위해서는 기본적으로 3개의 설정 파일 필요. 
  • https://blog.mybatis.org/p/products.html
 

Products

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

위 사이트에서 해당항목의 docs => MyBatis 설명서

 

mybatis – MyBatis 3 | Getting started

It's very important to understand the various scopes and lifecycles classes we've discussed so far. Using them incorrectly can cause severe concurrency problems. Dependency Injection frameworks can create thread safe, transactional SqlSessions and mappers

mybatis.org

1. The configuration XML File (MyBatis 환경설정 파일) => 가장 중요

  • 아래와 같은 형식의 파일.
  • 해당파일로 연결을 하기 떄문에 3개의 설정 파일 중 가장 중요하다.
<?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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>
  • 프로젝트 우 클릭 > src > 생성한 패키지(kr.bit.mybatis) 우 클릭 > New > Other >XML File 클릭 후 Next > config.xml 이름의 xml 파일 생성

2. Properties File (데이터베이스 접속 URL, 드라이버 정보, 사용자 ID, PW 등의 정보를 저장해 주는 파일)

  • 프로젝트 우 클릭 > src > 생성한 패키지(kr.bit.mybatis) 우 클릭 > New > Other > File 클릭 후 db.properties 이름의 파일 생성.
  • properties 파일은 key=value 형식으로 저장
  • 아래와 같이 작성(공백 없도록 주의)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&serverTimeZone=UTC
username=root
password=비밀번호

3. Mapper XML File (SQL 문장을 저장할 파일)

  • 아래와 같은 형식의 파일.
<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>
  • 프로젝트 우 클릭 > src > 생성한 패키지(kr.bit.mybatis) 우 클릭 > New > Other >XML File 클릭 후 Next > MemberMapper.xml 이름의 xml 파일 생성

 

# MVC05_02 Connection Pool

## MyBatis API 설치

 

Releases · mybatis/mybatis-3

MyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.

github.com

  • 다운로드 받은 mybatis-3.4.6 압축해제 후 mybatis-3.4.6.jar 파일을 복사해서 프로젝트 > WebContent > WEB-INF > lib에 복사

## Connection Pool 기법

  • 자바에서 데이터베이스를 연동하기위해 Connection이 필요. 이때 Connection에 부하가 많이 걸리는데, JDBC에서는 DB에 연결할 일이 생길 때 Connection을 생성, 사용 후 Connection을 끊는데.. 유저가 많아지면 점점 부하가 많이 걸리게 된다.
  • MyBatis는 위 과정에서 Connection을 사용 후 Connection을 제거하는게 아닌, 재활용하자는 취지. (성능 개선)
  • MyBatis는 여러개의 커넥션을 메모리에 미리 생성. (Connection Pool)
  • DB작업을 위해 자바에서 Connection Pool에 미리 만들어진 커넥션을 꺼내와서 사용 후 반환(객체 사용 후 반환)
  • JDBC에서는 연결된 객체를 Connection 라고 부르고, MyBatis에서는 Connection을 sqlSession이라고 부른다.

## sqlSessionFactory

  • 기존 MemberDAO에서 DB 관련 연결 소스코드 제거.
  • config.xml로부터 sqlSessionFactory 생성을 위해 코드 작업
package kr.bit.model;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

// JDBC -> MyBatis
public class MemberDAO {
	private static SqlSessionFactory sqlSessionFactory;	// DB를 연결하고 있는 객체들이 존재.
	
	// 초기화 블럭 => 프로그램 실행 시 딱 한번만 실행되는 코드.
	static {
		try {
			String resource = "kr/bit/mybatis/config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);	// 읽기
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
}

 

 

 

 

 

반응형
반응형

# MVC 프레임워크는 내손에[나프 2탄] : 개발환경 구축

## 개발 환경

  • Windows XP 7, 10
  • 전자정부표준프레임워크(Eclipse, eGovFrame-3.9.0)
  • JDK 8
  • MySQL 5.6 Server
  • Apache Tomcat 8.5 Server
  • BootStrap3 Template

## 전자정부프레임워크 설치

 

교육자료 | 표준프레임워크 포털 eGovFrame

처리중입니다. 잠시만 기다려주십시오.

www.egovframe.go.kr

## 이클립스 실행

  • 다운로드 완료 후 압축해제 한 파일 중 이클립스 실행.
  • Package Explorer 에 연습예제 lab101 ~ lab403 제거 (선택사항) (삭제 시 Delete project contents on disk 체크하여 삭제해야 workSpace에서도 삭제 됨)
  • 삭제 후 하단 Servers 탭에서 톰캣 우 클릭 > Add and Remove 클릭하여 등록된거 없는 지 확인
  • Package Explorer 에서 Server > server.xml 들어가서 하단 부분에 삭제한 것 중 등록된것 있는지 확인.(있으면 해당 부분 제거)

## JDK 연결 확인

  • 이클립스 실행 후 상단 Window > Preferences > Java > Installed JREs 들어가서 jdk 연결 되어있는지 확인.

## 톰캣 서버 연결 확인

  • 이클립스 실행 후 상단 Window > Preferences > Server > Runtime Environments 들어가서 톰캣서버 연결 되어있는지 확인

## 기존 MVC04 Import

  • 기존 MVC04로 작업하기 위해 해당 파일 다운로드 후 Import 하여 작업진행
  • Package Explorer 에서 빈 영역 우 클릭 > Import > Web > WAR File 클릭 후 Next > 다운로드 받아둔 MVC04 파일 선택 후 Finish.

## Context 등록

  • 웹 애플리케이션을 WAS 톰캣 Server가 인식할 수 있도록 등록.
  • 톰캣 서버 우 클릭 > Add and Remove 에서 Available 에 존재하는 MVC04 클릭 후 Add 하여 Configured로 등록 후 Finish.

## Context 등록 확인 방법

1. Server.xml 확인

  • Servers 의 Server.xml 파일 열어서 해당 파일 하단에 등록한 MVC04 있는지 확인
  • 정상 등록된 경우 Server.xml에 아래와 같이 등록되어있다.
<Context docBase="MVC04" path="/MVC04" reloadable="true" source="org.eclipse.jst.jee.server:MVC04"/></Host>

2. Tomcat 확인

  • 하단 Servers 탭에서 Tomcat v8.5 Server at localhost 더블 클릭
  • Modules 들어가서 정상등록 여부 확인

 

# MVC 프레임워크는 내손에[나프 2탄] : MySQL 데이터 베이스 설정

## MySQL 실행

  • C:\eGovFrame-3.9.0\bin\mysql-5.6.21 해당 경로 진입하여 startup.bat 파일 실행
  • 해당 파일을 열어보면 아래와 같이 되어있음.
cd bin
mysqld.exe --console
  • MySQL port : 3306
  • 서버 중지 : Ctrl + C 연속으로 누르면 Shutdown complete 명령이 나오고, 명령을 입력하여 중지하면 된다.

## MySQL 데이터베이스 접속

### 명령 프롬프트(cmd) 를 이용한 mysql 연결

  • cmd 관리자 권한으로 실행 후 아래와 같이 경로 입력하여 mysql 실행 (startup.bat 실행된 상태에서 진행해야 한다.)
cd C:\eGovFrame-3.9.0\bin\mysql-5.6.21\bin
  • mysql 로그인의 경우 아래와 같이 진행(비밀번호 설정한 적 없는 초기 root 계정은 아래와 같이 접속 가능)
mysql -u root -p

## MySQL 계정 암호 설정

  • root 계정으로 로그인 한 상태에서 아래와 같이 입력하여 진행
show databases;		// 존재하는 데이터베이스 확인.

use mysql;			// mysql 데이터베이스 진입

show tables;		// mysql의 테이블 리스트 확인

select * from user;	// user 테이블 확인.

update user set password=password('비밀번호입력') where user='root' and host='localhost';	// 비밀번호 변경

flush privileges;	// 변경된 사항 적용
  • 설정 완료 후 아래 명령어로 빠져나온 후 변경된 내용으로 접속 확인.
quit;

### Data Source Explorer 이용한 mysql 연결

  • 이클립스 > Data Source Explorer > Dataase Connections 우 클릭 > New > MySQL 클릭 후 Next > Drivers 오른쪽에 + 기호 클릭 후 아래와 같이 설정 진행
Name/Type : MySQL JDBC Driver 5.1 선택

JARList : 샘플용 드라이버 존재하는 것 클릭 후 Clear All, 
추가 클릭 후 C:\eGovFrame-3.9.0\maven\repository\mysql\mysql-connector-java\5.1.31 경로로 가서
mysql-connector-java-5.1.31.jar 선택 후 열기(mysql 접속용 드라이버 연결)

Properties : 비밀번호 등 입력.
  • 그 후 Save password 체크 후 Test Connection으로 연결여부 확인 후 Finish.
반응형

+ Recent posts