KoreaIt Academy/JSP

[JSP]DBCP(DataBase Connection Pool), JNDI(Java Naming and Directory Interface), MyBatis Framework(#{}, ${}사용)

hongeeii 2021. 9. 12.
728x90
반응형

DBCP(DataBase Connection Pool) 

사용자 요청이 있을 때 마다 DB 연결을 한다면 코드가 복잡해지며,
많은 요청이 있을 때 연결 속도가 저하될 수 있습니다.

따라서 미리 Connection을 만들어 두고, 필요 시 저장된 공간에서 가져다 쓴 후 반환하는 기법입니다.
 

JNDI(Java Naming and Directory Interface) 

디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바 API이며,
외부에 있는 객체를 가져오기 위한 기술입니다. 


MyBatis Framework 

소스코드 안에 SQL문을 작성하면 코드가 길어지고 섞여 있어서 유지보수 및 분업이 쉽지 않습니다.
MyBatis는 기존 JDBC 방식과는 달리 SQL문을 XML파일에 작성함으로써 코드가 줄어들고, SQL문 수정이 편해집니다.

또한 DBPC를 사용하여 커넥션을 여러 개 생성하기 때문에

JDBC만 사용하는 것 보다는 작업 효율과 가독성이 좋아집니다.
ibatis는 2.5버전이며, JDK1.4버전 이상, MyBatis 3.0버전이며, JDK1.5버전 이상에서 지원합니다.
ibatis와 MyBatis의 차이점은 몇 개의 문법 및 사용 용어(명칭)변경 등이 있습니다.

 

 


1) 응용 프로그램이 SqlSessionFactoryBuilder를 통해 SqlSessionFactory를 빌드하도록 요청합니다.
2) SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 MyBatis 구성 파일을 읽습니다.
3) SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다.
4) 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.
5) 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.
6) SqlSessionFactory는 SqlSession을 생성하고 이를 응용 프로그램에 반환합니다.
7) 응용 프로그램이 SqlSession에서 매퍼 인터페이스의 구현 개체를 가져옵니다.
8) 응용 프로그램이 매퍼 인터페이스 메소드를 호출합니다.
9) 매퍼 인터페이스의 구현 객체가 SqlSession 메소드를 호출하고 SQL실행을 요청합니다.
10) SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행합니다.

MyBatis 설치
https://blog.mybatis.org/p/products.html

 

Products

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

 

 

 

MyBatis 설정

1. mybatis.jar 파일을 buildPath에 추가해줍니다.

2. config.xml 파일을 만들어 줍니다.

 

파라미터로 받은 값에 접근할 떄에는 #{}또는 ${}를 사용하여 가져옵니다.

1.#{}
받아온 파라미터 타입에 상관없이  String 타입으로 변경됩니다.
사용자가 직접 입력한 값에 사용하는 것이 좋습니다(보안에 유리합니다).

2.${}
받아온 파라미터의 타입을 그대로 유지합니다.
사용자가 직접 입력한 값을 전달받을 때에는 사용하지 않는 것이 좋습니다(쿼리 주입 때문에 보안에 취약합니다).
테이블이나 컬럼명을 파라미터로 받을 때 사용합니다.

<?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>
	<typeAliases>
		<typeAlias type="com.koreait.vo.UserVO" alias="userVO"/>
	</typeAliases>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.OracleDriver" />
				<property name="url"
					value="jdbc.oracle:thin:@localhost:1522:XE" />
				<property name="username" value="hr" />
				<property name="password" value="hr" />
			</dataSource>		
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="com/koreait/mybatis/sql/member.xml"/>
	</mappers>
</configuration>

3. xml을 매핑해줄 SqlMapConfig.java 파일을 만들어 줍니다.

package com.koreait.mybatis.config;

import java.io.IOException;
import java.io.Reader;

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

public class SqlMapConfig {
	private static SqlSessionFactory sqlsession_f;

	static {
		try {
			String resource = "./com/koreait/mybatis/config/config.xml";
			Reader reader = Resources.getResourceAsReader(resource);
			sqlsession_f = new SqlSessionFactoryBuilder().build(reader);
			reader.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException("초기화 문제 발생, SqlMapConfing.java");
		}
	}
	
	public static SqlSessionFactory getSqlMapInterface() {
		return sqlsession_f;
	}
	
}

 

4. 사용할 sql문을 파일명.xml파일에 저장합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http//mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="User">
	<select id="checkId" parameterType="string" resultType="_int">  <!-- 기본자료형 : _를 붙여줌 _int // 클래스형 : 소문자로 시작  string -->
		SELECT COUNT(ID) FROM TABLE_USER WHERE ID = #{id}
	</select>
	
	<insert id="join" parameterType="UserVO">
		INSERT INTO TABLE_USER 
		VALUES(SEQ_USER.NEXTVAL, #{id}, #{name}, #{password}, #{gender}, #{zipcode}
		, #{address}, #{address_detail}, #{address_etc})
	</insert>
	
	<select id="searchId" parameterType="_int" resultType="string">
		SELECT ID FROM TABLE_USER WHERE NUM = #{userNum}
	</select>
	
	<delete id="deleteUser" parameterType="_int" returnType="_int">
		DELETE FROM TABLE_USER WHERE NUM = #{userNum}
	</delete>
	
	<select id="countUser" returnType="_int">
		SELECT * FROM TABLE_USER
	</select>
	
	<select id="userList"  resultType="UserVO">
		SELECT * FROM TABLE_USER
	</select>
	
	<select id="login" parameterType="hashmap" resultType="_int">
		SELECT COUNT(*) FROM TABLE_USER WHERE ID = #{id} AND PASSWORD = #{pw}
	</select>
	
	<update id="updateUserName" parameterType="hashmap">
		UPDATE TABLE_USER SET NAME = #{name} WHERE NUM = #{num}
	</update>
	
</mapper>

 

5. dao에 사용할 메소드를 만들어주고 만들어 놓은 MyBatis를 사용합니다.

사용 : sql.xml파일의 sqlsession.select|insert|update|delete("namespace명.id명","파라미터명");

package com.koreait.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.koreait.mybatis.config.SqlMapConfig;
import com.koreait.vo.UserVO;

public class UserDAO {
	SqlSessionFactory sqlsession_f = SqlMapConfig.getSqlMapInterface();
	SqlSession sqlsession;

	public UserDAO() {
		sqlsession = sqlsession_f.openSession();
	}
	
	//회원 이름 수정
	public void updateUserName(int num, String name) {
		HashMap<String, String> map = new HashMap<>();
		map.put("num", String.valueOf(num));
		map.put("name", name);
		
	}
	

	// 아이디 중복검사
	public boolean checkId(String id) {
		return (Integer) sqlsession.selectOne("User.checkId", id) == 0;
	}

	// 회원가입
	public void join(UserVO user) {
		sqlsession.insert("User.join", user);
	}

	// 회원번호로 아이디 조회
	public String searchId(int userNum) {
		return (String) sqlsession.selectOne("User.searchId", userNum);
	}

	// 회원번호로 회원 삭제
	public boolean deleteUser(int userNum) {
		return sqlsession.delete("User.deleteUser", userNum) == 1;
	}

	// 회원 전체 수
	public int countUser() {
		return sqlsession.selectOne("User.countUser");
	}

	// 회원 전체 목록
	/*
	 * public ArrayList<UserVO> userList(){ ArrayList<UserVO> list = new
	 * ArrayList<>(); for (int i = 0; i < countUser(); i++) {
	 * list.add(sqlsession.selectOne("User.userList")); } return list; }
	 */

	public List<UserVO> userList(){
		return sqlsession.selectList("User.userList");
	}
	
	//로그인
	public boolean login(String id, String pw) {
		Map<String, String> map = new HashMap<>();
		map.put("id", id );
		map.put("pw", pw);
		return (Integer)sqlsession.selectOne("User.login",map)==1;
		
	}
	
	
}
728x90
반응형

추천 글