JSP&Servlet/기초정리

MyBatis 프레임워크 사용하기 - 회원가입 기능 구현

줘니(•̀ᴗ•́)و 2023. 2. 14. 11:34
728x90

* MyBatis

 

라이브러리는 내가 쓰다가 도구가 필요하면 그냥 가져다 쓰면 됨

프레임워크는 짜여진 틀이 있어 그 틀을 지켜야 사용할 수 있음

 

 

 

1. MyBatis 프레임워크 사용법

1) 기존 DAO 클래스 방식

2) Mapper interface 방식

3) Annotation 방식

 

 

 

 

 

DAO 메소드에서 혼자 다 하던 걸 다른 애들한테 나눠서 일처리를 할거야

단, 얘네가 하라는데로 형식을 다 지켰을 때만

Java 코드와 sql 쿼리를 분리하고, 자동으로 맵핑(연결)

 

 

 

2. MyBatis 라이브러리 추가하기(pom.xml)

→ 제일 먼저 할 것 : pom.xml 에 필요한 라이브러리 추가

 

 

 

사용을 위해 Ojdbc 라이브러리와 mybatis 라이브러리를 추가해주어야 한다.

Maven Repository 사이트에서 다운받으면 된다.

 

 

 

 

 

pom.xml 파일에 의존성 라이브러리들을 추가해주면 된다.

의존성 라이브러리는 dependencies 태그를 만들고,

그 안에 사이트를 통해 가져온 라이브러리들을 복사하여 입력하면 된다.

 

 

 

3. MyBatis 실습하면서 배우기!

- 회원가입 기능 만들기

 

 

 

0) Main.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>
<title>Forty by HTML5 UP</title>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="assets/css/main.css" />
</head>
<body>

   <!-- Wrapper -->
   <div id="wrapper">

      <!-- Header -->
      <header id="header" class="alt"> <a href="index.html"
         class="logo"><strong>Forty</strong> <span>by HTML5 UP</span></a> <nav>
      <a href="#menu">로그인</a> <!-- 로그인 후 Logout.jsp로 이동할 수 있는'로그아웃'링크와 '개인정보수정'링크를 출력하시오. -->
      </nav> </header>

      <!-- Menu -->
      <nav id="menu">
      <ul class="links">
         <li><h5>로그인</h5></li>
         <form>
            <li><input type="text" placeholder="Email을 입력하세요"></li>
            <li><input type="password" placeholder="PW를 입력하세요"></li>
            <li><input type="submit" value="LogIn" class="button fit"></li>
         </form>
      </ul>
      <ul class="actions vertical">
         <li><h5>회원가입</h5></li>
         <form action="JoinService" method="post">
            <!-- name값을 컬럼 명과 동일하게 해주면 편하다! -->
            <li><input type="text" name="email" placeholder="Email을 입력하세요"></li>
            <li><input type="password" name="pw" placeholder="PW를 입력하세요"></li>
            <li><input type="text" name="tel" placeholder="전화번호를 입력하세요"></li>
            <li><input type="text" name="address" placeholder="집주소를 입력하세요"></li>
            <li><input type="submit" value="JoinUs" class="button fit"></li>
         </form>
      </ul>
      </nav>
      <!-- Banner -->
      <section id="banner" class="major">
      <div class="inner">
         <header class="major">
         <h1>로그인 한 세션아이디를 출력해주세요</h1>
         <!-- 로그인 후 로그인 한 사용자의 세션아이디로 바꾸시오.
                            ex)smart님 환영합니다 --> </header>
         <div class="content">
            <p>
               아래는 지금까지 배운 웹 기술들입니다.<br>
            </p>
            <ul class="actions">
               <li><a href="#one" class="button next scrolly">확인하기</a></li>
            </ul>
         </div>
      </div>
      </section>

      <!-- Main -->
      <div id="main">

         <!-- One -->
         <section id="one" class="tiles"> <article> <span
            class="image"> <img src="images/pic01.jpg" alt="" />
         </span> <header class="major">
         <h3>
            <a href="#" class="link">HTML</a>
         </h3>
         <p>홈페이지를 만드는 기초 언어</p>
         </header> </article> <article> <span class="image"> <img
            src="images/pic02.jpg" alt="" />
         </span> <header class="major">
         <h3>
            <a href="#" class="link">CSS</a>
         </h3>
         <p>HTML을 디자인해주는 언어</p>
         </header> </article> <article> <span class="image"> <img
            src="images/pic03.jpg" alt="" />
         </span> <header class="major">
         <h3>
            <a href="#" class="link">Servlet/JSP</a>
         </h3>
         <p>Java를 기본으로 한 웹 프로그래밍 언어/스크립트 언어</p>
         </header> </article> <article> <span class="image"> <img
            src="images/pic04.jpg" alt="" />
         </span> <header class="major">
         <h3>
            <a href="#" class="link">JavaScript</a>
         </h3>
         <p>HTML에 기본적인 로직을 정의할 수 있는 언어</p>
         </header> </article> <article> <span class="image"> <img
            src="images/pic05.jpg" alt="" />
         </span> <header class="major">
         <h3>
            <a href="#" class="link">MVC</a>
         </h3>
         <p>웹 프로젝트 중 가장 많이 사용하는 디자인패턴</p>
         </header> </article> <article> <span class="image"> <img
            src="images/pic06.jpg" alt="" />
         </span> <header class="major">
         <h3>
            <a href="#" class="link">Web Project</a>
         </h3>
         <p>여러분의 최종프로젝트에 웹 기술을 활용하세요!</p>
         </header> </article> </section>
         <!-- Two -->
         <section id="two">
         <div class="inner">
            <header class="major">
            <h2>나에게 온 메세지 확인하기</h2>
            </header>
            <p></p>
            <ul class="actions">
               <li>로그인을 하세요.</li>
               <li><a href="#" class="button next scrolly">전체삭제하기</a></li>
            </ul>
         </div>
         </section>

      </div>

      <!-- Contact -->
      <section id="contact">
      <div class="inner">
         <section>
         <form>
            <div class="field half first">
               <label for="name">Name</label> <input type="text" id="name"
                  placeholder="보내는 사람 이름" />
            </div>
            <div class="field half">
               <label for="email">Email</label> <input type="text" id="email"
                  placeholder="보낼 사람 이메일" />
            </div>

            <div class="field">
               <label for="message">Message</label>
               <textarea id="message" rows="6"></textarea>
            </div>
            <ul class="actions">
               <li><input type="submit" value="Send Message" class="special" /></li>
               <li><input type="reset" value="Clear" /></li>
            </ul>
         </form>
         </section>

         <section class="split"> <section>
         <div class="contact-method">
            <span class="icon alt fa-envelope"></span>
            <h3>Email</h3>
            <a href="#">로그인 한 사람의 이메일을 출력</a>
            <!-- 로그인 한 사용자의 이메일을 출력하시오 -->
         </div>
         </section> <section>
         <div class="contact-method">
            <span class="icon alt fa-phone"></span>
            <h3>Phone</h3>
            <span>로그인 한 사람의 전화번호를 출력</span>
            <!-- 로그인 한 사용자의 전화번호를 출력하시오 -->
         </div>
         </section> <section>
         <div class="contact-method">
            <span class="icon alt fa-home"></span>
            <h3>Address</h3>
            <span>로그인 한 사람의 집주소를 출력</span>
            <!-- 로그인 한 사용자의 집주소를 출력하시오 -->
         </div>
         </section> </section>
      </div>
      </section>

      <!-- Footer -->
      <footer id="footer">
      <div class="inner">
         <ul class="icons">
            <li><a href="#" class="icon alt fa-twitter"><span
                  class="label">Twitter</span></a></li>
            <li><a href="#" class="icon alt fa-facebook"><span
                  class="label">Facebook</span></a></li>
            <li><a href="#" class="icon alt fa-instagram"><span
                  class="label">Instagram</span></a></li>
            <li><a href="#" class="icon alt fa-github"><span
                  class="label">GitHub</span></a></li>
            <li><a href="#" class="icon alt fa-linkedin"><span
                  class="label">LinkedIn</span></a></li>
         </ul>
         <ul class="copyright">
            <li>&copy; Untitled</li>
            <li>Design: <a href="https://html5up.net">HTML5 UP</a></li>
         </ul>
      </div>
      </footer>

   </div>

   <!-- Scripts -->
   <script src="assets/js/jquery.min.js"></script>
   <script src="assets/js/jquery.scrolly.min.js"></script>
   <script src="assets/js/jquery.scrollex.min.js"></script>
   <script src="assets/js/skel.min.js"></script>
   <script src="assets/js/util.js"></script>
   <!--[if lte IE 8]><script src="assets/js/ie/respond.min.js"></script><![endif]-->
   <script src="assets/js/main.js"></script>

</body>
</html>

 

 

 

1) JoinService(Servlet) 파일

 

package com.smhrd.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 com.smhrd.model.MemberDAO;
import com.smhrd.model.MemberVO;


@WebServlet("/JoinService")
public class JoinService extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 0. 한글 인코딩 잡아주기
		request.setCharacterEncoding("utf-8");
		
		// 1. 요청받은 데이터 꺼내오기
		String email = request.getParameter("email");
		String pw = request.getParameter("pw");
		String tel = request.getParameter("tel");
		String address = request.getParameter("address");
		
		// 2. 요청받은 데이터 하나로 묶기
		// import 필요
		MemberVO vo = new MemberVO(email, pw, tel, address);
		
		// 3. DAO 생성
		MemberDAO dao = new MemberDAO();
		
		// 4. dao가 가지고 있는 회원가입 기능 호출
		int result = dao.join(vo);
		
		// 5. result 값에 따른 페이지 이동
		
		// 디스패처 한번만 쓰기 - 페이지에 주소를 기억할 변수 사용
		String moveURL = null;
		if(result > 0) {
			// 회원가입 성공
			moveURL = "join_success.jsp";
			request.setAttribute("email", email);
		}else {
			// 회원가입 실패
			moveURL = "main.jsp";
		}
		RequestDispatcher rd = request.getRequestDispatcher(moveURL);
		rd.forward(request, response);
	}
}

 

 

 

2) MemberVO 파일

: 요청받은 데이터(email, pw, tel, address)를 하나로 묶어 객체 만들어 사용하기 위해

 

package com.smhrd.model;

public class MemberVO {

	private String email;
	private String pw;
	private String tel;
	private String address;
	
	// 1. 4개 데이터 받아서 초기화시키는 생성자
	public MemberVO(String email, String pw, String tel, String address) {
		super();
		this.email = email;
		this.pw = pw;
		this.tel = tel;
		this.address = address;
	}

	// 2. 기본생성자
	public MemberVO() {
		
	}
	
	// 3. getter, setter()
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
}

 

 

 

3) Config 파일

: DB 연동을 위한 설정값, mapper.xml을 등록하기 위한 파일

: Java Resources에 database 패키지를 하나 만든 뒤 새로운 xml 파일을 만들기 위해

other → xml검색 → 그냥 xml 파일 선택 → mybatis-config.xml 파일 생성

 

 

먼저 xml 파일이란?

: 존재 자체가 서로 다른 주체간에 데이터를 전달하기 위해 데이터의 구조를 기술하는 언어

: Extensible Markup Language의 약자

 

스키마(xml 파일 안에서 사용할 수 있는 태그들의 집합)를 불러오는 작업이 선행되어야 함!!

스키마는 mybatis 공식 홈페이지에서 리스트 중 '시작하기' 에서 3번째 코드블럭을 복사해오면 된다.

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://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="com/smhrd/database/MemberMapper.xml"/>
  </mappers>
</configuration>

 

 

1. configuration : mybatis 설정을 기술하는 태그

2. environments : web project에서 사용할 데이터베이스'들'을 기술하는 공간

3. environment : 데이터베이스 한 개에 대한 정보를 기술하는 공간

4. transactionManager : 트랜젝션을 관리하는 방식에 대해 기술하는 공간

  - type의 종류

  •   JDBC - commit, rollback 기능을 이용하여 mybatis 자체에서 관리
  •   MANAGED - 서버의 관리기능

5.  dataSource : DB 연결 설정 정보를 기술하는 공간

  - type의 종류

  •    POOLED : 미리 커넥션 객체를 생성해놓고 요청 시 반환 → 커넥션 풀 방식
  •   UNPOOLED : 요청할 때마다 커넥션 객체를 생성 → 이제까지 했던 JDBC방식(getcon() 만들어서 했던 것)은 문 열고 닫고 반복하는 UNPOOLED 방식이었음
  •   JNDI

6. property : 연결할 DB 상세정보 기술

7. mappers : 사용할 mapper 파일'들'을 기술하는 공간

8. mapper : SQL 쿼리문을 가지고 있는 파일의 주소를 적는 공간

 

 

 

4) SqlSessionManager

: 각 service(기능)를 DB와 연동하기 위한 파일

: DAO에 포함되어 있어도 되는 내용이지만 객체화하여 필요시에만 사용할 수 있도록 Connection에 대한 내용을 따로 분리!

: static{ }안에 resource부터 ~ mybatis 공식 홈페이지에서 리스트 중 '시작하기' 에서 2번째 코드블럭을 복사해오면 됨

  static{ }은 객체 생성 시 실행되는 부분 , static은 고정된 공간을 공유함

  → 어떤 객체를 생성하던지 간에, 동일한 내용을 공유하게끔 만들기(동시에 일어남)

 

package com.smhrd.database;

import java.io.IOException;
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 {
	
	public static SqlSessionFactory sqlSessionFactory;
	// 객체 생성 시 실행되는 부분
	// : 어떤 객체를 생성하던지 간에, 동일한 내용을 공유하게끔 만들기
	// : 동시에 일어나야 할 때
	static{
		// 이 부분만 바꿔주면 됨
		String resource = "com/smhrd/database/mybatis-config.xml";
		InputStream inputStream;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	// DAO에서 sqlsessionfactory를 가져갈 수 있게끔 만드는 메소드 생성
	public static SqlSessionFactory getFactory() {
		return sqlSessionFactory;
	}
}

 

 

 

5) mapper.xml

: 사용하게 될 sql 문장을 정리할 수 있는 파일(sql문 준비)

my batis 홈페이지에서 시작하기 → 6번째 Exploring Mapped SQL Statements 코드 복사

 

복사해 온 코드는 select문에 대한 태그가 오는데 내가 필요한 태그로 바꿔서 이용하면 됨(insert, delete 등)

 

회원가입을 위한 sql 문장이 필요하니 insert문에 대한 태그를 만들 것.

여기서는 '?' 인지하지 못함 → my batis에서 사용하는 변수 사용할 것

mybatis 변수 : 바인드 변수 → #{변수명}

 

여러개의 insert문이 사용될 수 있어 어떤 기능을 위한 insert 인지 구분하기 위해 id 설정.

 

<?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">
  
<!-- mapper의 위치 지정 해줘야 함 -->
<mapper namespace="com.smhrd.database.MemberMapper">

	<!-- 회원 가입을 위한 sql 문장 작성하기 -->
	<insert id="join" parameterType="com.smhrd.model.MemberVO">
		insert into web_member values(#{email}, #{pw}, #{tel}, #{address})
	</insert>
</mapper>

 

 

mapper 파일 작성 뒤 config 파일로 가서 마지막 mapper를 수정해줘야 한다.

: <mapper resource="com/smhrd/database/MemberMapper.xml"/>

 

 

6) MemberDAO 파일

: 회원가입 기능(Join 메소드) - DB 연결

 

package com.smhrd.model;

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

import com.smhrd.database.SqlSessionManager;

public class MemberDAO {

	// 작업을 진행할 수 있는 Connection 생성!
	SqlSessionFactory sqlSessionFactory = SqlSessionManager.getFactory();
	
	public int join(MemberVO vo) {
		
		// 1. connection 빌려오기
		SqlSession sqlSession = sqlSessionFactory.openSession(true);
		
		// : openSession에 true값을 넣어주면 수행하고자 하는 sql에 대하여 
            	// commit 작업을 자동으로 진행한다.
		
		// 2. SQL 문장 실행(mapper.xml)
		//sqlSession.insert(String(id), Object(parameterType));
		int cnt = sqlSession.insert("join", vo);
		
		// 3. 객체 닫기
		sqlSession.close(); // 다른 실행을 위하여 Connection이 반납되는 것

		// 4. 결과값 return
		return cnt;
	}
}

 

 

2. SQL 문장 실행은 명령어를 메소드의 이름으로 활용

→ sqlSession.insert("join", vo);

예외사항! → select(전체를 가져오는) / selectOne(전체 중 일부만 가져오는)

sqlSession.select(String(id), Object(parameterType));

sqlSession.selectOne(String(id), Object(parameterType));

 

 

 

7) join_success.jsp

: 로그인 성공 시 - 만들어진 틀에 email 값 가져와 화면에 입력한 email로 출력되게 하기

 

<%@ 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>
		<title>Forty by HTML5 UP</title>
		<meta charset="utf-8" />
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]-->
		<link rel="stylesheet" href="assets/css/main.css" />
		<!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]-->
		<!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]-->
		
	</head>
	<style>
		#Update > ul.actions {
			margin-top:10%;
		}
	</style>
	<body style="text-align: center;">

		<!-- Wrapper -->
			<div id="wrapper">
				<!-- Menu -->
					<nav id="Update">	
						<ul class="actions vertical">
							<li><h1>환영합니다!</h1></li>
							<li>회원가입을 축하합니다.</li>
							<!-- request영역에 저장된 회원정보 중 이메일을 출력하시오. -->
							<!-- email 값 꺼내와서 출력하기 -->
							<%
								String email = (String)request.getAttribute("email");
							%>
							<li>메세지시스템의 새로운 이메일은 <%=email %>입니다.</li>
							<li><button onclick='location.href="main.jsp"'>시작하기</button></li>
						</ul>
					</nav>			
			</div>
		<!-- Scripts -->
			<script src="assets/js/jquery.min.js"></script>
			<script src="assets/js/jquery.scrolly.min.js"></script>
			<script src="assets/js/jquery.scrollex.min.js"></script>
			<script src="assets/js/skel.min.js"></script>
			<script src="assets/js/util.js"></script>
			<!--[if lte IE 8]><script src="assets/js/ie/respond.min.js"></script><![endif]-->
			<script src="assets/js/main.js"></script>
	</body>
</html>

 

 

 

나만 알 수 있는 나만의 공부일지..🤦‍♀️🤦‍♂️

로그인 기능은 다음 포스팅에!

 

 

 

728x90