<%@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"으로, 사용자 등록 또는 프로그램 가입을 처리하는 역할을 합니다. 다음은 이 코드가 어떤 동작을 하는지 한글로 설명한 것입니다:
Import 문: 코드는 필요한 Java 클래스를 가져오는 import 문으로 시작합니다. 이러한 클래스에는 서블릿 및 데이터베이스와 관련된 클래스가 포함됩니다.
@WebServlet
어노테이션: 이 어노테이션은 서블릿을 URL 패턴 "/JoinProgram"에 매핑합니다. 즉, 이 서블릿은 클라이언트가 이 URL로 요청을 보낼 때 호출됩니다.
service
메소드: 이 메소드는 들어오는 HTTP 요청을 처리하는 역할을 합니다. 이 경우에는 HTTP POST 요청을 처리하도록 구성되어 있습니다.
요청 문자 인코딩: 코드는 요청의 문자 인코딩을 "UTF-8"로 설정하여 텍스트 데이터가 올바르게 해석되도록 합니다.
요청 매개변수 가져오기: HTTP 요청에서 "id," "pw" (비밀번호), 그리고 "name" 매개변수의 값을 가져옵니다. 이러한 매개변수는 사용자가 작성한 HTML 양식에서 제공됩니다.
MemberDTO
객체 생성: 사용자의 입력 데이터 (id, 비밀번호, 이름)를 사용하여 MemberDTO
(데이터 전송 객체) 객체를 생성합니다.
join
메소드 호출: join
메소드는 사용자 등록을 시도하기 위해 MemberDAO
클래스의 join
메소드를 호출합니다. join
메소드는 사용자 정보를 데이터베이스에 추가하거나 등록과 관련된 다른 작업을 수행합니다.
결과 확인: join
메소드의 반환값 cnt
를 검사하여 등록 작업의 결과를 확인합니다. 만약 cnt
가 0보다 크면, 등록이 성공했다고 가정하고 "success" 문자열을 result
변수에 설정합니다. 그렇지 않으면, 등록이 실패했다고 가정하고 "fail" 문자열을 result
변수에 설정합니다.
리다이렉트: 마지막으로, 등록 결과에 따라 사용자를 적절한 페이지로 리다이렉트합니다. 등록이 성공했을 경우 "Main.jsp?result=success"로 리다이렉트하고, 실패했을 경우 "Main.jsp?result=fail"로 리다이렉트합니다.
이 서블릿은 사용자 등록 프로세스를 처리하고 등록이 성공했는지 여부에 따라 사용자에게 피드백을 제공합니다. MemberDAO
클래스의 join
메소드의 실제 구현이 데이터베이스와 상호작용하고 사용자 정보를 추가하는 역할을 담당합니다.
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"으로, 사용자 로그인을 처리하는 역할을 합니다. 다음은 이 코드가 어떤 동작을 하는지 한글로 설명한 것입니다:
Import 문: 코드는 필요한 Java 클래스를 가져오는 import 문으로 시작합니다. 이러한 클래스에는 서블릿, 데이터베이스와 관련된 클래스가 포함됩니다.
@WebServlet
어노테이션: 이 어노테이션은 서블릿을 URL 패턴 "/LoginProgram"에 매핑합니다. 즉, 이 서블릿은 클라이언트가 이 URL로 요청을 보낼 때 호출됩니다.
service
메소드: 이 메소드는 들어오는 HTTP 요청을 처리하는 역할을 합니다. 이 경우에는 HTTP POST 요청을 처리하도록 구성되어 있습니다.
요청 문자 인코딩: 코드는 요청의 문자 인코딩을 "UTF-8"로 설정하여 텍스트 데이터가 올바르게 해석되도록 합니다.
요청 매개변수 가져오기: HTTP 요청에서 "id"와 "pw" (비밀번호) 매개변수의 값을 가져옵니다. 이러한 매개변수는 사용자가 입력한 로그인 정보입니다.
MemberDTO
객체 생성: 사용자의 입력 데이터 (id, 비밀번호)를 사용하여 MemberDTO
(데이터 전송 객체) 객체를 생성합니다.
로그인 시도: login
메소드를 사용하여 사용자가 입력한 정보로 로그인을 시도합니다. login
메소드는 입력된 ID와 비밀번호를 확인하여 로그인이 성공하면 사용자의 이름을 반환하고, 실패하면 null을 반환합니다.
로그인 결과 확인: 반환된 이름이 null이 아닌 경우, 로그인에 성공했다고 가정하고 "loginSuccess.jsp" 페이지로 이동합니다. 성공한 경우에는 세션을 사용하여 사용자의 이름을 "name" 속성으로 설정합니다.
로그인 실패 처리: 반환된 이름이 null인 경우, 로그인에 실패했다고 가정하고 "loginFail.jsp" 페이지로 이동합니다.
이 서블릿은 사용자의 로그인을 처리하고 로그인 성공 또는 실패에 따라 다른 페이지로 이동합니다. 로그인이 성공하면 "loginSuccess.jsp"로 이동하고, 실패하면 "loginFail.jsp"로 이동합니다.
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 라이브러리를 사용하여 데이터베이스 연결을 관리하는 역할을 합니다. 아래는 이 코드의 주요 내용을 한국어로 설명한 것입니다:
SqlSessionFactory
관리 클래스: 이 클래스는 MyBatis에서 사용되는 SqlSessionFactory
객체를 관리합니다. SqlSessionFactory
는 데이터베이스 연결을 나타내며, 이 클래스는 이 객체를 생성 및 관리하는 역할을 합니다.
데이터베이스 연결과 성능 향상: SqlSessionFactory
는 MyBatis를 사용하여 데이터베이스와 연결할 때 사용됩니다. 데이터베이스 연결은 성능이 가장 떨어지는 부분 중 하나이기 때문에 이를 효율적으로 관리하기 위해 사용됩니다.
Connection Pool: 이 클래스는 데이터베이스 연결을 효율적으로 관리하기 위해 "Connection Pool" 개념을 사용합니다. "Connection Pool"은 데이터베이스 연결을 미리 생성하고 필요할 때 빌려주고 다시 반납하는 방식으로 동작합니다.
Static 블록: 클래스가 초기화될 때 실행되는 부분을 나타내는 static 블록이 사용됩니다. 이 부분은 클래스가 로드될 때 실행되며, 주로 초기화 작업에 사용됩니다.
환경 설정 파일 읽기: mybatis-config.xml
파일을 읽어내기 위해 Resources.getResourceAsStream()
메서드를 사용하여 입력 스트림을 여는 부분이 있습니다. 이 XML 파일은 MyBatis 환경 설정에 관한 정보를 포함합니다.
SqlSessionFactory
생성: SqlSessionFactoryBuilder
클래스를 사용하여 SqlSessionFactory
객체를 생성합니다. 이 객체는 데이터베이스 연결을 나타내며, MyBatis를 통해 데이터베이스와 상호 작용하는 데 사용됩니다.
getSqlSession
메서드: 이 메서드는 외부에서 SqlSessionFactory
객체를 얻기 위해 사용됩니다. sqlSessionFactory
필드를 반환하여 데이터베이스 연결을 관리하는 객체를 얻을 수 있습니다.
이 클래스는 MyBatis를 사용하여 데이터베이스와의 연결을 관리하고, 데이터베이스 연결에 대한 설정을 mybatis-config.xml
파일에서 읽어내어 SqlSessionFactory
를 생성합니다. 이렇게 생성된 SqlSessionFactory
를 다른 클래스에서 사용하여 데이터베이스 연결을 관리하고 데이터베이스와 상호 작용합니다.
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=service
password=12345
이것은 Oracle 데이터베이스에 연결하기 위한 JDBC 드라이버 정보 및 데이터베이스 연결 구성을 나타내는 설정 파일 또는 프로퍼티 파일의 내용입니다. 각 항목에 대한 설명은 다음과 같습니다:
driver=oracle.jdbc.driver.OracleDriver
: 이 부분은 JDBC 드라이버 클래스의 이름을 지정합니다. Oracle 데이터베이스와 연결할 때 사용할 드라이버 클래스는 "oracle.jdbc.driver.OracleDriver"입니다.
url=jdbc:oracle:thin:@localhost:1521:xe
: 이 부분은 데이터베이스 연결 URL을 지정합니다. Oracle 데이터베이스에 대한 URL은 일반적으로 "jdbc:oracle:thin:@호스트주소:포트번호:SID" 형식을 따릅니다. 여기서 "localhost"는 데이터베이스 서버의 호스트 주소, "1521"은 포트 번호, "xe"는 Oracle 데이터베이스의 서비스 식별자(SID)입니다.
username=service
: 이 부분은 데이터베이스에 연결할 때 사용할 사용자 이름 또는 계정 이름을 지정합니다. 여기서는 "service" 사용자 이름을 사용하고 있습니다.
password=12345
: 이 부분은 데이터베이스 사용자의 암호 또는 비밀번호를 지정합니다. 여기서는 "12345"가 사용자 "service"의 암호로 설정되어 있습니다.
이 설정 파일을 사용하면 Java 애플리케이션에서 Oracle 데이터베이스와 연결할 때 필요한 정보를 제공할 수 있습니다. 이 정보를 사용하여 데이터베이스와 통신하고 데이터를 가져오거나 업데이트할 수 있습니다.
<?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) 파일입니다. 아래는 이 코드의 주요 내용을 설명한 것입니다:
XML 선언: XML 버전 및 인코딩 스타일을 지정합니다. 여기서는 XML 버전 1.0과 UTF-8 인코딩을 사용하고 있습니다.
DTD (Document Type Definition): 이 부분은 XML 문서의 유형을 정의하며, MyBatis 매퍼 파일의 DTD를 지정합니다. DTD는 문서 구조 및 유효성을 검사하기 위해 사용됩니다.
<mapper>
요소: 이 요소는 MyBatis 매퍼 파일의 루트 요소입니다. 여기서는 <mapper>
요소를 열고 닫음으로써 매퍼 파일의 내용을 정의합니다.
namespace
속성: 이 속성은 현재 매퍼 파일의 SQL 쿼리문과 매핑하는 Java 클래스를 그룹화합니다. SQL 쿼리문의 id
와 Java 클래스를 연결하는 역할을 합니다. 여기서는 "database.Mapper"를 namespace로 지정하고 있으므로 이 매퍼 파일과 database.Mapper
클래스가 관련되어 있다고 나타냅니다.
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 설정 파일인 mybatis-config.xml
을 나타내며, MyBatis 프레임워크를 구성하고 데이터베이스와의 연결 정보를 설정하는 역할을 합니다. 아래는 이 코드의 주요 내용을 한국어로 설명한 것입니다:
XML 선언: XML 버전 및 인코딩 스타일을 지정합니다. 여기서는 XML 버전 1.0과 UTF-8 인코딩을 사용하고 있습니다.
DTD (Document Type Definition): 이 부분은 XML 문서의 유형을 정의하며, MyBatis 설정 파일의 DTD를 지정합니다. DTD는 문서 구조 및 유효성을 검사하기 위해 사용됩니다.
<configuration>
요소: 이 요소는 MyBatis 설정 파일의 루트 요소입니다. 모든 설정은 <configuration>
요소 내에서 정의됩니다.
<properties>
요소: 이 요소는 MyBatis 설정 파일에서 사용하는 속성 값을 정의합니다. 여기서는 "database/db.properties" 파일을 참조하여 데이터베이스 연결 정보를 설정합니다. ${driver}
, ${url}
, ${username}
, ${password}
와 같은 변수는 db.properties
파일에서 정의된 값을 사용합니다.
<environments>
요소: 이 요소는 MyBatis 환경을 설정합니다. 여기서는 "development"라는 환경을 설정하고 있으며, 기본 환경은 "development"로 설정됩니다.
<environment>
요소: 이 요소는 특정 환경의 설정을 정의합니다. "development" 환경에서는 JDBC를 사용하는 트랜잭션 관리자와 POOLED 데이터 소스를 설정하고 있습니다.
<transactionManager>
요소: 이 요소는 트랜잭션 관리자의 유형을 지정합니다. 여기서는 "JDBC"를 사용하고 있으며, JDBC를 통해 트랜잭션을 관리합니다.
<dataSource>
요소: 이 요소는 데이터베이스 연결 풀을 지정합니다. POOLED 데이터 소스를 사용하고 있으며, 데이터베이스 드라이버, URL, 사용자 이름, 비밀번호를 설정합니다. 이 정보는 ${driver}
, ${url}
, ${username}
, ${password}
와 같은 변수를 통해 참조됩니다.
<mappers>
요소: 이 요소는 MyBatis 매퍼 파일의 위치를 지정합니다. 여기서는 "database/Mapper.xml" 파일을 참조하여 SQL 쿼리문과 Java 클래스의 매핑 정보를 포함하고 있습니다.
이 MyBatis 설정 파일은 MyBatis 프레임워크를 초기화하고 데이터베이스와의 연결 정보를 설정하는 데 사용됩니다. 설정 파일을 통해 MyBatis는 데이터베이스 연결을 설정하고 매퍼 파일의 SQL 쿼리문과 Java 클래스를 매핑합니다.
이 코드는 Java 클래스인 MemberDAO
로, 데이터베이스와 상호 작용하기 위한 기능을 구현합니다. 아래는 이 코드의 주요 내용을 한국어로 설명한 것입니다:
SqlSessionFactory
및 SqlSession
설정: 코드는 데이터베이스와의 연결을 관리하는 SqlSessionFactory
와 SqlSession
을 설정합니다. SqlSessionManager.getSqlSession()
를 통해 SqlSessionFactory
를 얻고, SqlSessionFactory
를 사용하여 SqlSession
을 생성합니다. openSession(true)
를 호출하여 자동 커밋 모드로 설정합니다.
join
메소드: 이 메소드는 회원 가입을 처리하는 역할을 합니다. 회원 정보를 입력하면 데이터베이스에 추가합니다. sqlSession.insert
를 사용하여 database.Mapper
의 join
쿼리를 실행하고 회원 정보를 데이터베이스에 추가한 후, cnt
를 반환합니다. 메소드가 성공하면 cnt
는 1 이상의 값을 가지며, 실패하면 0을 반환합니다.
login
메소드: 이 메소드는 로그인을 처리하는 역할을 합니다. 사용자가 입력한 ID와 비밀번호를 확인하여 로그인하고 사용자 이름을 반환합니다. sqlSession.selectOne
을 사용하여 database.Mapper
의 login
쿼리를 실행하고 사용자 이름을 반환합니다.
memberList
메소드: 이 메소드는 회원 정보 목록을 반환하는 역할을 합니다. sqlSession.selectList
를 사용하여 database.Mapper
의 memberList
쿼리를 실행하고 모든 회원 정보를 가져온 후, 회원 정보 목록을 리스트 형태로 반환합니다.
예외 처리: 각 메소드는 예외 처리를 포함하고 있으며, 예외가 발생하면 데이터베이스 세션을 닫아 리소스를 해제합니다. 이로 인해 메소드가 정상적으로 실행되든 예외가 발생하든 세션을 항상 닫아 리소스 누수를 방지합니다.
이 MemberDAO
클래스는 데이터베이스와 상호 작용하기 위한 기능을 제공하며, 회원 가입, 로그인, 회원 정보 목록을 처리하는 데 사용됩니다. 데이터베이스와의 상호 작용을 위해 MyBatis를 사용하며, SQL 쿼리문은 MyBatis 매퍼 파일 database.Mapper
에서 정의됩니다.