everyday com-eat
카테고리
작성일
2022. 2. 22. 15:51
작성자
갱수터
728x90

❓ Mybatis란?

- 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크

분류 ORM
(Object Relational Mapping)
SQL Mapper
종류 JPA/Hibernate, OpenJPA, EclipseLink, TopLink Essentials iBatis, MyBatis, Oracle SQLJ
기능 객체와 관계형 데이터베이스의 데이터를 매핑 객체와 SQL문을 매핑하여 데이터를 객체화하는 기술
장점 - 객체 모델만을 이용 객체지향적으로 프로그래밍 가능
- SQL을 직접 작성하지 않아도 됨 (개발시간 단축)
- 유지보수 용이
- DBMS 종속성 X
- 관계를 정확히 명시
- 복잡한 SQL문도 처리할 수 있음
단점 - 데이터의 관계가 복잡할 수록 구현하기 어려움
- 복잡한 SQL문을 처리하기 어려움
- SQL 구문을 직접 작성해야함
- 유지보수 하락
-DBMS의 종속성이 높음

 

Springboot와 mybatis 이용 웹프로젝트 layer 

 

 

 

프로젝트 생성

라이브러리 선택

 

 

 

 

src/main/java 설정

controller, dto, mapper, service 패키지 생성

 

 

2. Member dto 생성

더보기
package ksmart42.mybatis.dto;

public class Member {
	private String memberId;
	private String memberPw;
	private String memberName;
	private String memberLevel;
	private String memberEmail;
	private String memberAddr;
	private String memberRegDate;
	public String getMemberId() {
		return memberId;
	}
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPw() {
		return memberPw;
	}
	public void setMemberPw(String memberPw) {
		this.memberPw = memberPw;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public String getMemberLevel() {
		return memberLevel;
	}
	public void setMemberLevel(String memberLevel) {
		this.memberLevel = memberLevel;
	}
	public String getMemberEmail() {
		return memberEmail;
	}
	public void setMemberEmail(String memberEmail) {
		this.memberEmail = memberEmail;
	}
	public String getMemberAddr() {
		return memberAddr;
	}
	public void setMemberAddr(String memberAddr) {
		this.memberAddr = memberAddr;
	}
	public String getMemberRegDate() {
		return memberRegDate;
	}
	public void setMemberRegDate(String memberRegDate) {
		this.memberRegDate = memberRegDate;
	}
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Member [memberId=");
		builder.append(memberId);
		builder.append(", memberPw=");
		builder.append(memberPw);
		builder.append(", memberName=");
		builder.append(memberName);
		builder.append(", memberLevel=");
		builder.append(memberLevel);
		builder.append(", memberEmail=");
		builder.append(memberEmail);
		builder.append(", memberAddr=");
		builder.append(memberAddr);
		builder.append(", memberRegDate=");
		builder.append(memberRegDate);
		builder.append("]");
		return builder.toString();
	}
}

 

3. MemberMapper 인터페이스 생성

package ksmart42.mybatis.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import ksmart42.mybatis.dto.Member;

@Mapper
public interface MemberMapper {
	//회원 전체목록 조회 
	public List<Member> getMemberList();
}

 

5. memberServiece 설정

package ksmart42.mybatis.service;

import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ksmart42.mybatis.dto.Member;
import ksmart42.mybatis.mapper.MemberMapper;

@Service
@Transactional
public class MemberService {
	
	//DI 의존성 주입 생성자 메서드 주입방식
	private MemberMapper memberMapper;
    
	public MemberService(MemberMapper memberMapper) {
		this.memberMapper = memberMapper;
	}
	
	public List<Member> getMemberList(){
		List<Member> memberList = memberMapper.getMemberList();
		
		return memberList;
	}
}

 

6. memberController 설정

package ksmart42.mybatis.controller;

import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import ksmart42.mybatis.dto.Member;
import ksmart42.mybatis.service.MemberService;

@Controller
@RequestMapping("/member")
public class MemberController {
	
	private static final Logger log = LoggerFactory.getLogger(MemberController.class);
	
	//DI 의존성 주입 생성자 메서드 주입방식(bean으로 등록 되어 있기 때문에 가능한 방법)
	private MemberService memberService;
	
	public MemberController(MemberService memberService) {
		this.memberService = memberService;
	}
	
	@GetMapping("/memberList")
	public String getMemberList(Model model) {
		
		log.info("회원목록요청");	//로그
		
		List<Member> memberList = memberService.getMemberList();
		
		model.addAttribute("title", "회원목록조회");
		model.addAttribute("memberList", memberList);
		
		return "member/memberList";
	}
}

 

 

src/main/resources 설정

1. application.property 설정하기

- 서버포트, thymeleaf cache 새로고침, db연결정보, mybatis 설정, log 정보 설정 등

(2022.02.22 - [Framework/Spring] - (Springboot) log4j log4j 설정 글)

#서버 포트 설정
server.port=80

#thymeleaf cache 설정여부 false
spring.thymeleaf.cache=false

#db 연결정보 log4jdbc datasource 설정
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/ksmart42db?serverTimezone=UTC&characterEncoding=UTF8
spring.datasource.username=ksmart42id
spring.datasource.password=ksmart42pw

#mybatis 설정
#mapper xml 파일 위치 경로 설정 classpath: == src/main/resources/
mybatis.mapper-locations=classpath:mapper/**/*.xml
#mapper dto 설정
mybatis.type-aliases-package=ksmart42.mybatis.dto

# log 설정파일 위치
logging.config=classpath:logback-spring.xml

# spring banner 파일 경로 설정
spring.banner.location=classpath:templates/banner.txt

 

 

4. MemberMapper.xml 설정

Mybatis 3 소개페이지

Mybatis ArchitectureInDetail 페이지

위의 소개 페이지 또는 구글 검색등으로 mapper 태그 긁어서 MemberMapper.xml 파일에 붙여넣기

2. 자동완성으로 생기는 <mapper></mapper> 태그의 namespace속성에

위에서 만들어둔 memberMapper인터페이스 경로를 써준다.

 

3. 멤버의 목록을 조회하기 위해서 select 문을 써준다. 

member 객체의 dto setter,getter 메서드와 맞춰주기 위해서 as 이용

 

▼ 완성된 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">
<mapper namespace="ksmart42.mybatis.mapper.MemberMapper">
	<select id="getMemberList" resultType="Member">
		SELECT
			 m.m_id			AS memberId
			,m.m_pw			AS memberPw
			,m.m_name		AS memberName
			,m.m_level		AS memberLevel
			,m.m_email		AS memberEmail
			,m.m_addr		AS memberAddr
			,m.m_reg_date	AS memberRegDate
		FROM
			tb_member AS m;
	</select>
</mapper>

 

 

7. memberList.html 작업하기

(thymeleaf 레이아웃 나누기 > )

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" 
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
	layout:decorate="~{layout/default}">
	<!-- 사용자 정의 title -->
	<th:block layout:fragment="customTitle">
		<title th:text="${title}"></title>
	</th:block>
	<th:block layout:fragment="customContents">
		<table border="1">
			<thead>
				<tr>
					<th>회원아이디</th>
					<th>회원비밀번호</th>
					<th>회원이름</th>
					<th>회원등급</th>
					<th>회원이메일</th>
					<th>회원주소</th>
					<th>회원등록날짜</th>
				</tr>
			</thead>
			<tbody>
				<tr th:if="${not #lists.isEmpty(memberList)}" th:each="l : ${memberList}">
					<td th:text="${l.memberId}"></td>
					<td th:text="${l.memberPw}"></td>
					<td th:text="${l.memberName}"></td>
					<td th:text="${l.memberLevel}"></td>
					<td th:text="${l.memberEmail}"></td>
					<td th:text="${l.memberAddr}"></td>
					<td th:text="${l.memberRegDate}"></td>
				</tr>
				<tr th:unless="${not #lists.isEmpty(memberList)}">
					<td colspan="7">등록된 회원의 정보가 없습니다.</td>
				</tr>
			</tbody>
		</table>
	</th:block>
</html>

 

 

완성된 모습

현재 db목록

728x90