[Spring] - (4)MyBatis / 설정 및 연동

2022. 10. 9. 13:06Dev.Program/Java & Spring

728x90

< MyBatis >

>

MemDAOImpl 에 SQL 구문이 다 들어있다! 그래서 이걸 바꾸면 자바파일 계속 바꿔야함

그래서 SQL 구문을 xml 에 만들어서 xml 만 호출할 수 있도록 만들 거!

→ 자바 파일을 전혀 손 안대도 된다.

  • 우리는 지금 spring 이 3버전!
  • 그래서 context.xml 에 뭐가 많이 적혀있다!
  • 4버전으로 하면 이제 이런거 다 지워지고 DB 연동, MyBatis 연동만 남음



  • 새 프로젝트 만들기

  • Next

  • Finish

 

< MyBatis 이용하여 DB연동하기 위한 사전 작업 >

  1. MVC 프로젝트 만들기
  2. JDK 버전 설정 1.8
  • 지금은 1.6
  • 프로젝트에서 오른쪽 버튼 누르고 Properties

< 자바 버전 맞추기 >> 첫번째 설정

  • 1.8 버전으로 바꾸기

> 두번째 설정

  • 1.8 버전으로 바꾸기
  • 1.8로 변경되어있다!



  1. 스프링 버전

< 스프링 버전 맞추기 >< pom.xml >

  • 저장 누르면 자동으로 4버전으로 바뀜

 


<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>


<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
  • 커넥터랑 spring-jdbc 설치하기
  • 코드만 붙여넣고 저장하면 됨!


< web.xml >

<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 한글설정
  • 코드만 붙여넣고 저장하기!

 

http://localhost:8080/myweb/member/insert

  1. WAS 에서 처리 request, response 생성 요청정보 저장
  2. 서블릿, 한글설정 web.xml 무조건 참조하게 되어있음!
  • servlet-context.xml , root-context.xml 참조함
  • web.xml 보면 참조하는 거 볼 수 있다!

 

  1. servlet-context.xml : 자동으로 스캔하게끔 폴더 목록을 넣어줌

> src/main/java 폴더 내부에

======== com.itwillbs.controller 패키지 만들기

======== com.itwillbs.service 패키지 만들기

======== com.itwillbs.dao 패키지 만들기

======== com.itwillbs.domain 은 앞에 꺼 복사해오기

 

< servlet-context.xml >

<context:component-scan base-package="com.itwillbs.myweb2" />
<context:component-scan base-package="com.itwillbs.controller" />
<context:component-scan base-package="com.itwillbs.service" />
<context:component-scan base-package="com.itwillbs.dao" />
  • 추가해주기

 

  1. root-context.xml : DB 연동

< root-context.xml >

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/jspdb1"/>
<property name="username" value="jspid"/>
<property name="password" value="jsppass"/>
</bean>
  • 디비 연동하는 설정 넣어주기

 

  1. 기본적인 세팅은 완료되었고, 이제 찾아들어갈 것!

com.itwillbs.controller   MemberController 클래스 @Controller (어노테이션)

com.itwillbs.service       MemberService 인터페이스 / MemberServiceImpl 클래스

com.itwillbs.dao             MembeDAO 인터페이스 / MemberDAOImpl 클래스



======== MemberController.java 만들기

package com.itwillbs.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MemberController {

@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {

return null;
}

}
  • 어노테이션 필수

 

======== views 안에 member 폴더 만들기! 폴더!

  • 1에서 했던 jsp 들 다 들고오기! 총 7개

 

< MemberController.java >

@Controller
public class MemberController {

@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {

// views/member/insertForm.jsp 이동

return "/member/insertForm";
}

}
  • 추가
  • 실행화면(주소창 잘 보기!)



< insertForm.jsp >

<%@ 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>
<h1>insertForm</h1>
<form action="./member/insert" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pass"><br>
이름 : <input type="text" name="name"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
  • 이렇게 하면
  • 회원가입 눌렀을 때 주소창에 member/ 가 중복됨 ( . 으로 주소를 찾아가면 현재페이지 기준으로 가기 때문)
  • 이걸 taglib 로 주소를 찾아가게 만들 거!

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>insertForm</h1>
<form action="<c:url value='/member/insert'/>" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pass"><br>
이름 : <input type="text" name="name"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
  • 태그라이브러리를 이용해서 주소값 찾아감(맨 앞 슬래시 꼭 붙여주기!)
  • 회원 가입 누르면 주소창 잘 찾아감! (오류는 일단 보류)

 

< MemberController.java >

@RequestMapping(value = "/member/insert", method = RequestMethod.POST)
public String insertPost(MemberBean mb) {
// 작업 : MemberServiceImpl(처리작업) -> MemberDAOImpl(DB작업)
System.out.println(mb.getId());

return "redirect:/member/login";
}
  • 아이디 입력하고 회원가입해보기
  • 주소창 확인
  • 콘솔창에 뜸! (값이 잘 넘어온다)

 

======== MemberService.java(인터페이스로 만들기)

======== MemberServiceImpl.java(인터페이스 상속 받기)

< MemberServiceImpl.java >

package com.itwillbs.service;

import org.springframework.stereotype.Service;

@Service
public class MemberServiceImpl implements MemberService {

}
  • @Service 어노테이션 필수

 

< MemberService.java >

package com.itwillbs.service;

import com.itwillbs.domain.MemberBean;

public interface MemberService {
// 추상메서드
public void insertMember(MemberBean mb);

}
  • 추상메서드 하나 만들기

 

< MemberServiceImpl.java >

@Service
public class MemberServiceImpl implements MemberService {

@Override
public void insertMember(MemberBean mb) {

}

}
  • 추상메서드 구현하기(@Override 어노테이션 필수)

 

======== MemberDAO.java(인터페이스로 만들기)

======== MemberDAOImpl.java(인터페이스 상속 받기)

< MemberDAOImpl.java >

package com.itwillbs.dao;

import org.springframework.stereotype.Repository;

@Repository
public class MemberDAOImpl implements MemberDAO {

}

  • 어노테이션 필수!

 

< MemberDAO.java >

package com.itwillbs.dao;

import com.itwillbs.domain.MemberBean;

public interface MemberDAO {
// 추상메서드
public void insertMember(MemberBean mb);
}
  • 추상메서드 만들기

 

< MemberDAOImpl.java >

package com.itwillbs.dao;

import org.springframework.stereotype.Repository;

import com.itwillbs.domain.MemberBean;

@Repository
public class MemberDAOImpl implements MemberDAO {
@Override
public void insertMember(MemberBean mb) {
System.out.println("MemberDAOImpl - insertMember()");
}
}

 

< MemberController. java >

package com.itwillbs.controller;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.itwillbs.domain.MemberBean;
import com.itwillbs.service.MemberService;

@Controller
public class MemberController {
// 기존 자바 객체생성
// MemberService memberService = new MemberServiceImpl();
// 자동객체생성 : xml에서 MemberServiceImpl객체생성 set메서드 호출해서 값주입
@Inject
private MemberService memberService;
//가상주소 http://localhost:8080/myweb2/member/insert

@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {

// views/member/insertForm.jsp 이동

return "/member/insertForm";
}

@RequestMapping(value = "/member/insert", method = RequestMethod.POST)
public String insertPost(MemberBean mb) {
System.out.println(mb.getId());
// 작업 : MemberServiceImpl(처리작업) -> MemberDAOImpl(DB작업) 객체생성 메서드호출

memberService.insertMember(mb);
return "redirect:/member/login";
}

}

  • @Inject ← 자동 주입
  • 여기서 memberService 라는 변수명은 변경하면 안됨! 하나의 약속!

 

< MemberServiceImpl.java >

@Service
public class MemberServiceImpl implements MemberService {

@Inject
private  MemberDAO memberDAO;

@Override
public void insertMember(MemberBean mb) {
System.out.println("MemberServiceImpl - insertMember()");
memberDAO.insertMember(mb);
}

}
  • Service 에서도 MemberDAO 자동으로 객체 생성하는 거 만들어줌
  • 여기서 memberDAO 라는 변수이름은 변경하면 안됨! 약속된 거

  • 콘솔창 보면 찾아들어가는 것을 알 수 있다!

 

< MyBatis 연동 >

 

https://mvnrepository.com/

  • 두 개 설치

 

< pom.xml >


<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>


<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
  • pom.xml 에 붙여넣고 저장하기(자동설치)
  • Maven 보면 설치되어있다

 

 

 

< root-context.xml >

  • SqlSessionFactoryBean 자동완성!
  • 우린 미리 설치해놨기 때문에 자동완성이 됨

  • 참조변수 가져옴

  • 설정파일들(xml), sql 파일들(xml)

 

> 마이바티스 사이트(한글설명)  https://mybatis.org/mybatis-3/ko/index.html

  • 이런 값들 복사해서 가져오기! (직접 적으면 에러날 수 있기 때문에~~)

 

< MyBatis 설정 >

  • 환경설정 파일들은 resources 에 만듦!

  • mybatis-config.xml 이름으로 새 xml 파일 만들기

> 1) 설정파일

======== src/main/resources 파일 안에 mybatis-config.xml

< mybatis-config.xml >

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  • 추가해주기
  • 환경설정들 모아두는 파일!


> 2) Sql구문 파일

======== src/main/resources 파일 안에 mappers 폴더 만들기

======== mappers 폴더 안에 memberMapper.xml 만들기

< memberMapper.xml >

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  • 추가해주기
  • Sql 구문들 모아두는 파일!



< root-context.xml >

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"/>
</bean>
  • value 값 넣어주기
  • 우리는 memberMapper.xml 파일만 만들었는데, 나중에 이 보라색 부분은 파일들이 점점 추가될 거! 그래서 * 로 적어줘야함
  • 파란색 부분은 안에 폴더가 들어갈 수도 있다는 의미의 ** 추가! (없을 수도 있고 있을 수도 있고 전체 경우의 수 추가)

-------- 여기까지가 설정 완료!

> 이제 이걸 쓰겠다고 선언해줘야함

  • SqlSessionTemplate
  • 깨끗하게 캐시를 비우겠다는 의미

 

  • property 는 set 메서드를 호출해서 값을 넣는것!

> property set 메서드 사용하는 거 말고, 생성자를 호출할 수도 있음

 

  • 생성자를 통해 값을 넣을 건데, 생성자가 초기화가 안되어있어서 빨갛게 오류나는 것!
  • 생성자 호출 <constructor-arg name=”초기값이름” ref=”참조값”></constructor-arg>
  • 참조!

< root-context.xml >

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
  • 최종 추가 코드

 

> DB 설정은 끝남! 이제 이걸 MemberDAOImpl 에서 가져다쓸 거!

< MemberDAOImpl.java >

@Inject
private SqlSession sqlSession;
  • 추가해주기
  • 객체 생성! @Inject 필수

  • 이런식으로 넣어줌
  • 파일이름은 실제 파일이름이 아니라 xml 내부에서 붙여준 이름

< memberMapper,xml >

  • 우리가 정하는 파일이름 namespace
  • mapper 한 묶음의 이름을 이렇게 지정한다

  • Sql구문 이름은 보통 함수이름을 그대로 사용한다(헷갈리지 않기 위해서)

 

<?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="com.itwillbs.mapper.MemberMapper">
  <insert id="insertMember">
  INSERT INTO member(id, pass, name, reg_date) values(#{id},#{pass},#{name},#{reg_date})
  </insert>
  </mapper>
  
  • ? 물음표 대신에 #{변수이름} ⇐ 꼭 똑같이 적어줘야함! 똑같이 적어야 값을 찾아간다
  • 세미콜론은 붙이면 안됨!

 

< MemberDAOImpl.java >

  • 아무나 수정못하게 private
  • 객체생성 하지 않고 어디서나 호출 가능하도록 static 붙여줌
  • 계속 호출되니까 파일이름은 이렇게 멤버변수로 만들어둔다

 

  • . 필수! +로 합쳐준다.
  • mb 를 넣으면 이름에 맞는 거 자동으로 골라옴

 

package com.itwillbs.dao;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.itwillbs.domain.MemberBean;

@Repository
public class MemberDAOImpl implements MemberDAO {

@Inject
private SqlSession sqlSession;

private static String namespace="com.itwillbs.mapper.MemberMapper";

@Override
public void insertMember(MemberBean mb) {
System.out.println("MemberDAOImpl - insertMember()");
sqlSession.insert(namespace+".insertMember", mb);
}

}
  • 코드

 

< mybatis-config.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>
 
  </configuration>
  • 설정값이 없으면 공백으로 놔두면 됨!
  • <configuration> </configuration> 가 기본적으로 세팅이 되어있어야 함

 

  • 실행해보기
  • 디비에 Insert 됨!



> 로그인 직접 해보기

< MemberController.java >

@RequestMapping(value = "/member/login", method = RequestMethod.GET)
public String login() {
return "/member/loginForm";
}

@RequestMapping(value = "/member/login", method = RequestMethod.POST)
public String loginPost(MemberBean mb, HttpSession session) {
System.out.println(mb.getId());
System.out.println(mb.getPass());
System.out.println("로그인처리");
// 리턴값 MemberBean mb2 = userCheck(mb);
MemberBean mb2 = memberService.userCheck(mb);
// 아이디 비밀번호 일치하면 mb2 회원정보 모두 가져오기
if(mb2!=null) { // 일치
// 세션값 생성 "id", id
session.setAttribute("id", mb.getId());
} else {
// 일치하지 않음 메세지 뿌리기
}
return "redirect:/member/main";
}

@RequestMapping(value = "/member/main", method = RequestMethod.GET)
public String main() {

return "/member/main";
}
  • 메서드 만들기
  • 메인 주소가 들어왔을 때(GET방식) 주소이동시키는 메서드도 만들기

 

< MemberService.java >

public MemberBean userCheck(MemberBean mb);

< MemberServiceImpl.java >

@Override
public MemberBean userCheck(MemberBean mb) {
System.out.println("MemberServiceImpl - userCheck()");
return memberDAO.userCheck(mb);
}
  • 추가
  • memberDAO 에 userCheck() 메서드 자동완성하기

 

< MemberDAO.java >

public MemberBean userCheck(MemberBean mb);

< MemberDAOImpl.java >

@Override
public MemberBean userCheck(MemberBean mb) {
System.out.println("MemberDAOImpl - userCheck()");
return sqlSession.selectOne(namespace+".userCheck", mb);
}
  • 추가
  • 하나만 리턴하기 때문에 selectOne() 함수 사용

 

< memberMapper.xml >

  <mapper namespace="com.itwillbs.mapper.MemberMapper">
  <insert id="insertMember">
  INSERT INTO member(id, pass, name, reg_date) values(#{id},#{pass},#{name},#{reg_date})
  </insert>
  <select id="userCheck" resultType="com.itwillbs.domain.MemberBean">
  SELECT * FROM member WHERE id=#{id} AND pass=#{pass}
  </select>
  </mapper>
  • MemberBean 에 담기 때문에 MemberBean 의 경로값을 적어줌

 

> 실행해보기 http://localhost:8080/myweb2/member/login

  • 콘솔창
  • 실행결과
  • 로그인 처리 잘 됨!

 

> 이제 로그인할 때 아이디/비밀번호 틀렸을 때를 제어해보자

< MemberController.java >

@RequestMapping(value = "/member/login", method = RequestMethod.POST)
public String loginPost(MemberBean mb, HttpSession session, Model model) {
System.out.println(mb.getId());
System.out.println(mb.getPass());
System.out.println("로그인처리");
// 리턴값 MemberBean mb2 = userCheck(mb);
MemberBean mb2 = memberService.userCheck(mb);
// 아이디 비밀번호 일치하면 mb2 회원정보 모두 가져오기
if(mb2!=null) { // 일치
// 세션값 생성 "id", id
session.setAttribute("id", mb.getId());
} else {
// 아이디 없음, 비밀번호 틀림
model.addAttribute("msg", "입력하신 정보가 일치하지 않습니다");
// views/member/msg.jsp 이동
return "/member/msg";
}
return "redirect:/member/main";
}
  • else 부분 추가해주기! 메세지를 담아서 jsp 단으로 감

======== member 폴더 안에 msg.jsp 만들기

< msg.jsp >

<h1>/WEB-INF/views/member/msg.jsp</h1>
<script type="text/javascript">
alert("${msg}");
history.back();
</script>
  • body 부분에 추가해주기
  • 일치하지 않을 경우 이렇게 alert 창 뜸



> 로그아웃 해보기

< MemberController.java >

// 로그아웃
@RequestMapping(value = "/member/logout", method = RequestMethod.GET)
public String logout(HttpSession session) {
// 세션 초기화
session.invalidate();
return "redirect:/member/main";
}
  • 추가

⇒ 클릭 시

 

< main.jsp >

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>/WEB-INF/views/main.jsp</h1>
<c:if test="${empty sessionScope.id}">
<c:redirect url="/member/login"/>
</c:if>
${sessionScope.id }님 로그인 하셨습니다.
<input type="button" value="로그아웃" onclick='location.href="<c:url value='/member/logout'/>"'><br>
<a href="<c:url value='/member/info'/>">회원정보조회</a><br>
<a href="<c:url value='/member/update'/>">회원정보수정</a><br>
<a href="<c:url value='/member/delete'/>">회원정보삭제</a><br>
<c:if test="${!(empty sessionScope.id) }">
<c:if test="${sessionScope.id eq 'admin'}">
<a href="<c:url value='/member/list'/>">회원목록</a><br>
</c:if>
</c:if>

</body>
</html>
  • 경로 다 바꾸기

 

728x90

'Dev.Program > Java & Spring' 카테고리의 다른 글

[Spring] - (6) ajax, AOP  (0) 2022.10.10
[Spring] - (5)  (0) 2022.10.10
[Spring] - (3)데이터베이스 연동  (0) 2022.10.09
[Spring] - (2)  (0) 2022.10.09
[Spring] - (1)설치 및 설정하기  (0) 2022.10.09