Mybatis

최현주·2023년 11월 3일
1

CONTROLLER

JoinProgram

<%@page import="model.MemberDAO"%>
<%@page import="model.MemberDTO"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.ibatis.reflection.SystemMetaObject"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<table border="1">
		<h2>회원관리페이지</h2>
		<tr>
			<td>ID</td>
			<td>PASSWORD</td>
			<td>NAME</td>
		</tr>
		<%
		List<MemberDTO> list = new MemberDAO().memberList();
		System.out.print(list.size());
		for(int i=0;i<list.size();i++){%>
		<tr>
			<td><%= list.get(i).getId() %></td>
			<td><%= list.get(i).getPw() %></td>
			<td><%= list.get(i).getName() %></td>
		</tr>
		<%} %>
		
		<%
			for(MemberDTO mem: list){%>
			<tr>
			<td><%=mem.getId() %></td>
			<td><%=mem.getPw() %></td>
			<td><%=mem.getName() %></td>
		</tr>	
			<%}
		%>
	</table>
	

</body>
</html>

이 코드는 Java 서블릿인 "JoinProgram"으로, 사용자 등록 또는 프로그램 가입을 처리하는 역할을 합니다. 다음은 이 코드가 어떤 동작을 하는지 한글로 설명한 것입니다:

  1. Import 문: 코드는 필요한 Java 클래스를 가져오는 import 문으로 시작합니다. 이러한 클래스에는 서블릿 및 데이터베이스와 관련된 클래스가 포함됩니다.

  2. @WebServlet 어노테이션: 이 어노테이션은 서블릿을 URL 패턴 "/JoinProgram"에 매핑합니다. 즉, 이 서블릿은 클라이언트가 이 URL로 요청을 보낼 때 호출됩니다.

  3. service 메소드: 이 메소드는 들어오는 HTTP 요청을 처리하는 역할을 합니다. 이 경우에는 HTTP POST 요청을 처리하도록 구성되어 있습니다.

  4. 요청 문자 인코딩: 코드는 요청의 문자 인코딩을 "UTF-8"로 설정하여 텍스트 데이터가 올바르게 해석되도록 합니다.

  5. 요청 매개변수 가져오기: HTTP 요청에서 "id," "pw" (비밀번호), 그리고 "name" 매개변수의 값을 가져옵니다. 이러한 매개변수는 사용자가 작성한 HTML 양식에서 제공됩니다.

  6. MemberDTO 객체 생성: 사용자의 입력 데이터 (id, 비밀번호, 이름)를 사용하여 MemberDTO (데이터 전송 객체) 객체를 생성합니다.

  7. join 메소드 호출: join 메소드는 사용자 등록을 시도하기 위해 MemberDAO 클래스의 join 메소드를 호출합니다. join 메소드는 사용자 정보를 데이터베이스에 추가하거나 등록과 관련된 다른 작업을 수행합니다.

  8. 결과 확인: join 메소드의 반환값 cnt를 검사하여 등록 작업의 결과를 확인합니다. 만약 cnt가 0보다 크면, 등록이 성공했다고 가정하고 "success" 문자열을 result 변수에 설정합니다. 그렇지 않으면, 등록이 실패했다고 가정하고 "fail" 문자열을 result 변수에 설정합니다.

  9. 리다이렉트: 마지막으로, 등록 결과에 따라 사용자를 적절한 페이지로 리다이렉트합니다. 등록이 성공했을 경우 "Main.jsp?result=success"로 리다이렉트하고, 실패했을 경우 "Main.jsp?result=fail"로 리다이렉트합니다.

이 서블릿은 사용자 등록 프로세스를 처리하고 등록이 성공했는지 여부에 따라 사용자에게 피드백을 제공합니다. MemberDAO 클래스의 join 메소드의 실제 구현이 데이터베이스와 상호작용하고 사용자 정보를 추가하는 역할을 담당합니다.

LoginProgram

package controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.MemberDAO;
import model.MemberDTO;

@WebServlet("/LoginProgram")
public class LoginProgram extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");

		String id = request.getParameter("id");
		String pw = request.getParameter("pw");

		MemberDTO dto = new MemberDTO(id, pw);

		String name = new MemberDAO().login(dto);
		System.out.println(name);
		
		if (name != null) {
			RequestDispatcher rd = request.getRequestDispatcher("loginSuccess.jsp");
			
			HttpSession session = request.getSession();
			session.setAttribute("name",name);
			response.sendRedirect("loginSuccess.jsp");
			//rd.forward(request, response);
		}else {
			response.sendRedirect("loginFail.jsp");
		}

	}

}

이 코드는 Java 서블릿인 "LoginProgram"으로, 사용자 로그인을 처리하는 역할을 합니다. 다음은 이 코드가 어떤 동작을 하는지 한글로 설명한 것입니다:

  1. Import 문: 코드는 필요한 Java 클래스를 가져오는 import 문으로 시작합니다. 이러한 클래스에는 서블릿, 데이터베이스와 관련된 클래스가 포함됩니다.

  2. @WebServlet 어노테이션: 이 어노테이션은 서블릿을 URL 패턴 "/LoginProgram"에 매핑합니다. 즉, 이 서블릿은 클라이언트가 이 URL로 요청을 보낼 때 호출됩니다.

  3. service 메소드: 이 메소드는 들어오는 HTTP 요청을 처리하는 역할을 합니다. 이 경우에는 HTTP POST 요청을 처리하도록 구성되어 있습니다.

  4. 요청 문자 인코딩: 코드는 요청의 문자 인코딩을 "UTF-8"로 설정하여 텍스트 데이터가 올바르게 해석되도록 합니다.

  5. 요청 매개변수 가져오기: HTTP 요청에서 "id"와 "pw" (비밀번호) 매개변수의 값을 가져옵니다. 이러한 매개변수는 사용자가 입력한 로그인 정보입니다.

  6. MemberDTO 객체 생성: 사용자의 입력 데이터 (id, 비밀번호)를 사용하여 MemberDTO (데이터 전송 객체) 객체를 생성합니다.

  7. 로그인 시도: login 메소드를 사용하여 사용자가 입력한 정보로 로그인을 시도합니다. login 메소드는 입력된 ID와 비밀번호를 확인하여 로그인이 성공하면 사용자의 이름을 반환하고, 실패하면 null을 반환합니다.

  8. 로그인 결과 확인: 반환된 이름이 null이 아닌 경우, 로그인에 성공했다고 가정하고 "loginSuccess.jsp" 페이지로 이동합니다. 성공한 경우에는 세션을 사용하여 사용자의 이름을 "name" 속성으로 설정합니다.

  9. 로그인 실패 처리: 반환된 이름이 null인 경우, 로그인에 실패했다고 가정하고 "loginFail.jsp" 페이지로 이동합니다.

이 서블릿은 사용자의 로그인을 처리하고 로그인 성공 또는 실패에 따라 다른 페이지로 이동합니다. 로그인이 성공하면 "loginSuccess.jsp"로 이동하고, 실패하면 "loginFail.jsp"로 이동합니다.

database

SqlSessionManager.java

package database;

import java.io.InputStream;

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

public class SqlSessionManager {
	
	// 4. SqlSessionManager 만들기
	//    SqlSessionFactory를 관리하는 class
	// 	  SqlSession == Connection
	//    SqlSessionFactory == Connection객체를 여러개 가지고 있는 공장
	//	  데이터베이스를 *미리* 연결하는 동작(Connection Pool : CP)
	//    이걸 하는 이유(why)? db연결하는 부분이 성능이 가장 떨어지는 부분이라서 성능 향상을 위해
	//    mybatis는 성능 향상을 위해 connection객체를 
	//    미리 만들어서 빌려주고 반납하는 형식으로 진행
	
	// static 블록 : 객체를 호출(실행)할 때 무조건 실행되는 부분
	//              주로 초기화할때 사용
	public static SqlSessionFactory sqlSessionFactory;
	
	static {
		try {
			// mybatis 환경설정 파일 경로
			String resource = "database/mybatis-config.xml";
			
			// xml파일을 읽어내기 위해 inputStream 여는 것!
			InputStream inputStream = Resources.getResourceAsStream(resource);
			
			// SqlSessionFactory : connection객체가 여러개인 Connection Pool
			sqlSessionFactory =
			  new SqlSessionFactoryBuilder().build(inputStream);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public static SqlSessionFactory getSqlSession() {
		return sqlSessionFactory;
	}
}

이 코드는 Java 클래스인 SqlSessionManager로, MyBatis 라이브러리를 사용하여 데이터베이스 연결을 관리하는 역할을 합니다. 아래는 이 코드의 주요 내용을 한국어로 설명한 것입니다:

  1. SqlSessionFactory 관리 클래스: 이 클래스는 MyBatis에서 사용되는 SqlSessionFactory 객체를 관리합니다. SqlSessionFactory는 데이터베이스 연결을 나타내며, 이 클래스는 이 객체를 생성 및 관리하는 역할을 합니다.

  2. 데이터베이스 연결과 성능 향상: SqlSessionFactory는 MyBatis를 사용하여 데이터베이스와 연결할 때 사용됩니다. 데이터베이스 연결은 성능이 가장 떨어지는 부분 중 하나이기 때문에 이를 효율적으로 관리하기 위해 사용됩니다.

  3. Connection Pool: 이 클래스는 데이터베이스 연결을 효율적으로 관리하기 위해 "Connection Pool" 개념을 사용합니다. "Connection Pool"은 데이터베이스 연결을 미리 생성하고 필요할 때 빌려주고 다시 반납하는 방식으로 동작합니다.

  4. Static 블록: 클래스가 초기화될 때 실행되는 부분을 나타내는 static 블록이 사용됩니다. 이 부분은 클래스가 로드될 때 실행되며, 주로 초기화 작업에 사용됩니다.

  5. 환경 설정 파일 읽기: mybatis-config.xml 파일을 읽어내기 위해 Resources.getResourceAsStream() 메서드를 사용하여 입력 스트림을 여는 부분이 있습니다. 이 XML 파일은 MyBatis 환경 설정에 관한 정보를 포함합니다.

  6. SqlSessionFactory 생성: SqlSessionFactoryBuilder 클래스를 사용하여 SqlSessionFactory 객체를 생성합니다. 이 객체는 데이터베이스 연결을 나타내며, MyBatis를 통해 데이터베이스와 상호 작용하는 데 사용됩니다.

  7. getSqlSession 메서드: 이 메서드는 외부에서 SqlSessionFactory 객체를 얻기 위해 사용됩니다. sqlSessionFactory 필드를 반환하여 데이터베이스 연결을 관리하는 객체를 얻을 수 있습니다.

이 클래스는 MyBatis를 사용하여 데이터베이스와의 연결을 관리하고, 데이터베이스 연결에 대한 설정을 mybatis-config.xml 파일에서 읽어내어 SqlSessionFactory를 생성합니다. 이렇게 생성된 SqlSessionFactory를 다른 클래스에서 사용하여 데이터베이스 연결을 관리하고 데이터베이스와 상호 작용합니다.

db.properties

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=service
password=12345

이것은 Oracle 데이터베이스에 연결하기 위한 JDBC 드라이버 정보 및 데이터베이스 연결 구성을 나타내는 설정 파일 또는 프로퍼티 파일의 내용입니다. 각 항목에 대한 설명은 다음과 같습니다:

  1. driver=oracle.jdbc.driver.OracleDriver: 이 부분은 JDBC 드라이버 클래스의 이름을 지정합니다. Oracle 데이터베이스와 연결할 때 사용할 드라이버 클래스는 "oracle.jdbc.driver.OracleDriver"입니다.

  2. url=jdbc:oracle:thin:@localhost:1521:xe: 이 부분은 데이터베이스 연결 URL을 지정합니다. Oracle 데이터베이스에 대한 URL은 일반적으로 "jdbc:oracle:thin:@호스트주소:포트번호:SID" 형식을 따릅니다. 여기서 "localhost"는 데이터베이스 서버의 호스트 주소, "1521"은 포트 번호, "xe"는 Oracle 데이터베이스의 서비스 식별자(SID)입니다.

  3. username=service: 이 부분은 데이터베이스에 연결할 때 사용할 사용자 이름 또는 계정 이름을 지정합니다. 여기서는 "service" 사용자 이름을 사용하고 있습니다.

  4. password=12345: 이 부분은 데이터베이스 사용자의 암호 또는 비밀번호를 지정합니다. 여기서는 "12345"가 사용자 "service"의 암호로 설정되어 있습니다.

이 설정 파일을 사용하면 Java 애플리케이션에서 Oracle 데이터베이스와 연결할 때 필요한 정보를 제공할 수 있습니다. 이 정보를 사용하여 데이터베이스와 통신하고 데이터를 가져오거나 업데이트할 수 있습니다.

Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<!-- 5. Mapper 만들기 -> SQL 쿼리문을 작성하는 파일 -->
<!-- namesapce : 현재 Mapper의 id를 그룹화 하는 속성
				sql태그의 id가 중복될 수 있기 때문에 id를 잘 찾아갈 수 있도록 그룹화
				주로 현재 Mapper파일의 경로를 작성 -->
<mapper namespace="database.Mapper">
 
 		<insert id="join" parameterType="model.MemberDTO">
 			insert into member1 values (#{id}, #{pw}, #{name})
 		</insert>
 		
 		<select id="login" parameterType="model.MemberDTO" resultType = "String">
 			select name from member1 where id=#{id} and pw=#{pw}
 		</select>
 		
 		<select id="memberList" resultType="model.MemberDTO">
 			select*from member1
 		</select>
 
 
</mapper>

이 코드는 MyBatis를 사용하여 데이터베이스에 대한 SQL 쿼리문을 작성하고 매핑하는 MyBatis 매퍼(XML) 파일입니다. 아래는 이 코드의 주요 내용을 설명한 것입니다:

  1. XML 선언: XML 버전 및 인코딩 스타일을 지정합니다. 여기서는 XML 버전 1.0과 UTF-8 인코딩을 사용하고 있습니다.

  2. DTD (Document Type Definition): 이 부분은 XML 문서의 유형을 정의하며, MyBatis 매퍼 파일의 DTD를 지정합니다. DTD는 문서 구조 및 유효성을 검사하기 위해 사용됩니다.

  3. <mapper> 요소: 이 요소는 MyBatis 매퍼 파일의 루트 요소입니다. 여기서는 <mapper> 요소를 열고 닫음으로써 매퍼 파일의 내용을 정의합니다.

  4. namespace 속성: 이 속성은 현재 매퍼 파일의 SQL 쿼리문과 매핑하는 Java 클래스를 그룹화합니다. SQL 쿼리문의 id와 Java 클래스를 연결하는 역할을 합니다. 여기서는 "database.Mapper"를 namespace로 지정하고 있으므로 이 매퍼 파일과 database.Mapper 클래스가 관련되어 있다고 나타냅니다.

  5. SQL 쿼리문 정의: 매퍼 파일에서는 다양한 SQL 쿼리문을 정의할 수 있습니다. 여기서는 다음 세 가지 SQL 쿼리문을 정의하고 있습니다:

    • <insert> 요소: id 속성은 SQL 쿼리문의 식별자를 나타냅니다. parameterType 속성은 이 쿼리문에 전달되는 파라미터의 자료형을 나타냅니다. SQL 쿼리문은 "insert into member1 values (#{id}, #{pw}, #{name})"로, 데이터베이스 테이블 "member1"에 데이터를 삽입하는 역할을 합니다.

    • <select> 요소: 두 개의 <select> 요소가 있습니다. 첫 번째 <select> 요소는 id가 "login"이며, 로그인을 검증하기 위한 SQL 쿼리문을 나타냅니다. parameterType 속성은 model.MemberDTO 클래스를 사용하고 있고, resultType 속성은 문자열로 지정되어 로그인 성공 시 사용자 이름을 반환합니다. 두 번째 <select> 요소는 id가 "memberList"이며, 모든 회원 정보를 가져오기 위한 SQL 쿼리문을 정의합니다.

이 MyBatis 매퍼 파일은 데이터베이스와 상호 작용하기 위한 SQL 쿼리문을 정의하고 Java 클래스와 연결하는 역할을 합니다. 이러한 매퍼 파일은 MyBatis를 사용하여 데이터베이스와 상호 작용할 때 중요한 구성 요소 중 하나입니다.

mybatis-config.xml

이 코드는 MyBatis 설정 파일인 mybatis-config.xml을 나타내며, MyBatis 프레임워크를 구성하고 데이터베이스와의 연결 정보를 설정하는 역할을 합니다. 아래는 이 코드의 주요 내용을 한국어로 설명한 것입니다:

  1. XML 선언: XML 버전 및 인코딩 스타일을 지정합니다. 여기서는 XML 버전 1.0과 UTF-8 인코딩을 사용하고 있습니다.

  2. DTD (Document Type Definition): 이 부분은 XML 문서의 유형을 정의하며, MyBatis 설정 파일의 DTD를 지정합니다. DTD는 문서 구조 및 유효성을 검사하기 위해 사용됩니다.

  3. <configuration> 요소: 이 요소는 MyBatis 설정 파일의 루트 요소입니다. 모든 설정은 <configuration> 요소 내에서 정의됩니다.

  4. <properties> 요소: 이 요소는 MyBatis 설정 파일에서 사용하는 속성 값을 정의합니다. 여기서는 "database/db.properties" 파일을 참조하여 데이터베이스 연결 정보를 설정합니다. ${driver}, ${url}, ${username}, ${password}와 같은 변수는 db.properties 파일에서 정의된 값을 사용합니다.

  5. <environments> 요소: 이 요소는 MyBatis 환경을 설정합니다. 여기서는 "development"라는 환경을 설정하고 있으며, 기본 환경은 "development"로 설정됩니다.

  6. <environment> 요소: 이 요소는 특정 환경의 설정을 정의합니다. "development" 환경에서는 JDBC를 사용하는 트랜잭션 관리자와 POOLED 데이터 소스를 설정하고 있습니다.

  7. <transactionManager> 요소: 이 요소는 트랜잭션 관리자의 유형을 지정합니다. 여기서는 "JDBC"를 사용하고 있으며, JDBC를 통해 트랜잭션을 관리합니다.

  8. <dataSource> 요소: 이 요소는 데이터베이스 연결 풀을 지정합니다. POOLED 데이터 소스를 사용하고 있으며, 데이터베이스 드라이버, URL, 사용자 이름, 비밀번호를 설정합니다. 이 정보는 ${driver}, ${url}, ${username}, ${password}와 같은 변수를 통해 참조됩니다.

  9. <mappers> 요소: 이 요소는 MyBatis 매퍼 파일의 위치를 지정합니다. 여기서는 "database/Mapper.xml" 파일을 참조하여 SQL 쿼리문과 Java 클래스의 매핑 정보를 포함하고 있습니다.

이 MyBatis 설정 파일은 MyBatis 프레임워크를 초기화하고 데이터베이스와의 연결 정보를 설정하는 데 사용됩니다. 설정 파일을 통해 MyBatis는 데이터베이스 연결을 설정하고 매퍼 파일의 SQL 쿼리문과 Java 클래스를 매핑합니다.

Model

MemberDAO



이 코드는 Java 클래스인 MemberDAO로, 데이터베이스와 상호 작용하기 위한 기능을 구현합니다. 아래는 이 코드의 주요 내용을 한국어로 설명한 것입니다:

  1. SqlSessionFactorySqlSession 설정: 코드는 데이터베이스와의 연결을 관리하는 SqlSessionFactorySqlSession을 설정합니다. SqlSessionManager.getSqlSession()를 통해 SqlSessionFactory를 얻고, SqlSessionFactory를 사용하여 SqlSession을 생성합니다. openSession(true)를 호출하여 자동 커밋 모드로 설정합니다.

  2. join 메소드: 이 메소드는 회원 가입을 처리하는 역할을 합니다. 회원 정보를 입력하면 데이터베이스에 추가합니다. sqlSession.insert를 사용하여 database.Mapperjoin 쿼리를 실행하고 회원 정보를 데이터베이스에 추가한 후, cnt를 반환합니다. 메소드가 성공하면 cnt는 1 이상의 값을 가지며, 실패하면 0을 반환합니다.

  3. login 메소드: 이 메소드는 로그인을 처리하는 역할을 합니다. 사용자가 입력한 ID와 비밀번호를 확인하여 로그인하고 사용자 이름을 반환합니다. sqlSession.selectOne을 사용하여 database.Mapperlogin 쿼리를 실행하고 사용자 이름을 반환합니다.

  4. memberList 메소드: 이 메소드는 회원 정보 목록을 반환하는 역할을 합니다. sqlSession.selectList를 사용하여 database.MappermemberList 쿼리를 실행하고 모든 회원 정보를 가져온 후, 회원 정보 목록을 리스트 형태로 반환합니다.

  5. 예외 처리: 각 메소드는 예외 처리를 포함하고 있으며, 예외가 발생하면 데이터베이스 세션을 닫아 리소스를 해제합니다. 이로 인해 메소드가 정상적으로 실행되든 예외가 발생하든 세션을 항상 닫아 리소스 누수를 방지합니다.

MemberDAO 클래스는 데이터베이스와 상호 작용하기 위한 기능을 제공하며, 회원 가입, 로그인, 회원 정보 목록을 처리하는 데 사용됩니다. 데이터베이스와의 상호 작용을 위해 MyBatis를 사용하며, SQL 쿼리문은 MyBatis 매퍼 파일 database.Mapper에서 정의됩니다.

profile
갓벽한 개발자

0개의 댓글