* 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>© 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>
나만 알 수 있는 나만의 공부일지..🤦♀️🤦♂️
로그인 기능은 다음 포스팅에!
'JSP&Servlet > 기초정리' 카테고리의 다른 글
MyBatis 회원정보수정 기능 구현 (0) | 2023.02.15 |
---|---|
MyBatis 로그인, 로그아웃 기능 구현 (0) | 2023.02.14 |
JSP&Servlet 기초 - MVC Model2 방식 (0) | 2023.02.13 |
Maven 방식 사용하기 (0) | 2023.02.13 |
JSP&Servlet 기초 - MVC Model1 방식 (0) | 2023.02.09 |