본문 바로가기
Servlet-Jsp

workout(운동기록프로그램 myBatis) #2

by 지민재 2022. 8. 12.
반응형
SMALL
 common.jsp 에 타이틀도 아이디 마다 제목을 정하도록 코드 작성 아래 코드추가
<%@ attribute name="title" type="java.lang.String" %>
<title>${empty title ? "게시판" : title}</title>
 에도 아래 코드 추가  삼항 조건문으로 tilte 있으면 게시판 없으면 title 으로 구현하였습니다.  
main.jsp
<%@ arrtibout name="title" type="java.lang.String" %>
<layout:common title = "${title}">
main.jsp 도 적용될 수 있게 attribute 으로 변수 값을 받아 넘겨주었다. 

잘 출력되는것을 볼 수 있습니다.

 

common.jsp 
<%@ attribute name="menu" fragment="true"%>
<jsp:invoke fragment="menu" />
main.jsp
</jsp:attribute>
	<jsp:attribute name="menu">
	<nav>
	<a href="#">운동 추가</a>
	<a href="#">운동 수정</a>
	<a href="#">운동 삭제</a>
	</nav>
	</jsp:attribute>
메뉴가 없는 페이지도 있을 수 도 있기 때문에 메뉴 부분도 동적으로 관리 할 수 있게 코드를 추가해주었습니다.

 

main.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<header>
	<section class = 'top-menu'>
	<a href="<c:url value="/member/join"/>">회원가입</a>
	<a href="<c:url value="/member/login"/>">로그인</a>
	</section>
	<section class = 'logo'>로고</section>
	
	</header>
사이트 가장 상단에 회원가입 로그인 부분을 헤더부분에 정의하였고 회원가입 페이지와 로그인 페이지를 미리 정의 하였다. 

 

 mybatis.workout.xml 설정 
<?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>
  <properties>
	  <property name="hostname" value="localhost" />
      <property name="driver" value="com.mysql.cj.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/workout?characterEncoding=UTF8&amp;serverTimezone=UTC" />
      <property name="username" value="root" />
      <property name="password" value="sql 비밀번호 입력!" />
  </properties>
  
  <typeHandlers>
  <typeHandler handler="org.apache.ibtis.type.LocalDateTypeHandler"/>
  </typeHandlers>
  
  <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="kr/codefty/board/mapper/MemberMapper.xml" />
  </mappers>
</configuration>

 

위 그림에 체크한 부분은 본인 sql에 맞게 변경하면 됩니다.

typeHandlers 을 입력해야 LocalDateType 이 인식하기때문에 추가해야함 안하면 오류남

dataSource Type을 POOLED로 설정하였는데, 이는 커넥션 풀(Connection Pool)을 사용하여 데이터베이스 접속을 하므로 성능상의 이점이 있습니다.

 

MemberDto 클래스 생성
package models.member;

import java.time.LocalDateTime;

public class MemberDto {
	private int memNo; // 회원번호
	private String memId; // 아이디
	private String memNm; // 회원명
	private String memPw; // 비밀번호
	private String email; // 이메일
	private String mobile; // 폰 번호
	

	private LocalDateTime regDt; // 가입일
	private LocalDateTime modDt; // 정보 수정일

	public int getMemNo() {
		return memNo;
	}

	public void setMemNo(int memNo) {
		this.memNo = memNo;
	}

	public String getMemId() {
		return memId;
	}

	public void setMemId(String memId) {
		this.memId = memId;
	}

	public String getMemNm() {
		return memNm;
	}

	public void setMemNm(String memNm) {
		this.memNm = memNm;
	}

	public String getEmail() {
		return email;
	}

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

	public String getMemPw() {
		return memPw;
	}

	public void setMemPw(String memPw) {
		this.memPw = memPw;
	}

	public LocalDateTime getRegDt() {
		return regDt;
	}

	public void setRegDt(LocalDateTime regDt) {
		this.regDt = regDt;
	}

	public LocalDateTime getModDt() {
		return modDt;
	}

	public void setModDt(LocalDateTime modDt) {
		this.modDt = modDt;
	}
	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	@Override
	public String toString() {
		return "MemberDto [memNo=" + memNo + ", memId=" + memId + ", memNm=" + memNm + ", memPw=" + memPw + ", email="
				+ email + ", mobile=" + mobile + ", regDt=" + regDt + ", modDt=" + modDt + "]";
	}

}
models.member 패키지에 맴버에 관련된 데이터나 로직을 구현하는 클래스 생성

 

MemberMapper.xml 생성

설정 코드

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

 

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

<mapper namespace="MemberMapper">
<resultMap type="models.member.MemberDto" id="memberMap">
	<result property="memNo" column="memNo" />
	<result property="memId" column="memId" />
	<result property="memPw" column="memPw" />
	<result property="memNm" column="memNm" />
	<result property="email" column="email" />
	<result property="mobile" column="mobile" />
	<result property="regDt" column="regDt" />
	<result property="modDt" column="modDt" />
</resultMap>

<select id="member" parameterType="models.member.MemberDto" resultMap="memberMap">
SELECT * FROM member WHERE memId=#{memId};
</select>
<select id="members" parameterType="models.member.MemberDto" resultMap="memberMap">
SELECT * FROM member;
</select>

<select id="count" parameterType="models.member.MemberDto" resultType="int">
SELECT COUNT(*) FROM member WHERE memId=#{memId};
</select>

<insert id="register" parameterType="models.member.MemberDto" useGeneratedKeys="true" keyProperty="memNo">
INSERT INTO member (memId, memPw, memNm, email, mobile)
VALUES(#{memId}, #{memPw}, #{memNm}, #{email}, #{mobile});
</insert>

<update id="update" parameterType="models.member.MemberDto">
UPDATE member
SET 
memNm=#{memNm},
email=#{email},
mobile=#{mobile},
modDt=NOW()
WHERE memId=#{memId};
</update>

<delete id="delete" parameterType="models.member.MemberDto">
DELETE FROM member WHERE memId=#{memId};
</delete>
</mapper>
<mapper namespace="MemberMapper"> namespace 의 이름을 가지고 설정을 찾는다.

resultMap : select 쿼리를 사용할 때 나오는 결과 ResultSet을 Dto 클래스에 맵핑해준다.
<resultMap type="models.member.MemberDto" id="memberMap">
type : "맵핑할 패키지와 Dto클래스" id : 내부에 쓸 값

<result property="memNo" column="memNo" /> property :
dto 클래스에 있는 맴버변수 setter column : 데이터 베이스 속성

<select id="member" parameterType="models.member.MemberDto" resultMap="memberMap"> 여기서 id : MemberMapper 에 있는 특정 아이디로 접근해서 select sql을 실행한다
ex : MemberMapper.member parameterType : WHERE 조건이나 등등 매칭할 수 있는 타입 ,  "models.member.MemberDto"에 맵핑해준다

<select id="member" parameterType="models.member.MemberDto" SELECT * FROM member WHERE memId=#{memId}; #{memId} << MemberDto 에 있는 getter 가 맵핑이됨 (다른 클래스에 getter 이 와도됨)


useGeneratedKeys="true" : 증감번호를 했던것을 받아올 수 있음
keyProperty="memNo : 추가된 회원번호를

Connection 객체 만들기
package mybatis;

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

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

public class Connection {

	private static SqlSessionFactory sqlSessionFactory;
	
	static { 
	try {
		
		Reader reader = Resources.getResourceAsReader("mybatis/workout/mybatis-workout.xml");
		
		if (sqlSessionFactory == null) {
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

	public static SqlSession getSqlSession() {
		SqlSession session = sqlSessionFactory.openSession();
		
		return session;
	}
}
static  : 생성자처럼 초기화 역활 그러나 static 은 클래스로더에 올라갈 때 초기화됨

설정파일을 읽어와서 만들어야한다 !

접속정보를 명시하고 있는 XML의 경로 읽기


SqlSessionFactoryBuilder :
SqlsessionFactioy 을 구성해주는 클래스 그리고 설정파일을 가지고 SqlsessionFactioy 빌더해준다 그러면 SqlsessionFactioy 가 Sqlsession 을 만든다.
설정파일을 불러올 때 자체적으로 구현되어있는 클래스 Resources

 

테스트
package models.member;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import mybatis.Connection;

public class MemberTest {
public static void main(String[] args) {
	SqlSession sqlSession = Connection.getSqlSession();
	
	MemberDto member = new MemberDto();
	member.setMemId("user1");
	member.setMemPw("123456");
	member.setMemNm("사용자1");
	member.setEmail("alswo471@test.org");
	member.setMobile("01000000000");
	
	int affectedRows = sqlSession.insert("MemberMapper.register", member);
	System.out.println("반영된 레코드 수" + affectedRows);
	System.out.println(member);
	
	List<MemberDto> members = sqlSession.selectList("MemberMapper.members");
	System.out.println(members);
	sqlSession.commit();
	sqlSession.close();
}
}
mybatis 에서는 기본적으로 트랜지션을 수동관리 하게 되어있다. 처음에 시작을 하고 종료하면서 실행하는 시점은 본인이 정해야한다. 기본값으로 트랜지션이 켜져있어서 종료를 해야줘야한다. 이유는 sql이 전체로 묶여있기 때문에 하나의 단위로 처리해야 하기 때문이다. 그래서 sql에 반영하려면 반드시 commit()을 넣어줘야한다.  

 

댓글