<< 학습 목표 >>

1. 프로젝트에서 MyBatis 를 사용하기 위한 라이브러리들을 추가할 수 있다.

2. MyBatis 를 사용한 프로젝트의 구조를 설명할 수 있다.

3. MyBatis 를 사용해 INSERT, UPDATE, DELETE, SELECT 쿼리를 수행할 수 있다.

4. DAO를 만들 수 있다.

5. 컨트롤러에서 DAO를 사용하도록 자동 의존 주입을 할 수 있다.


전 글 ( https://codingaja.tistory.com/114 ) 에서는 DB와 통신하기 위해 JdbcTemplate을 사용했었음

언급했듯 SpringFramework에서 DB와 통신할 때 JdbcTemplate을 거의 사용하지 않음

그 이유는 SQL이 코드에 포함 되어있기 때문에 프로젝트의 규모가 조금만 커지더라도 SQL을 관리하기가 어려워짐

 

SpringFramework에서 DB와 통신할 때는 주로 MyBatis 또는 JPA를 사용함

여기서 배울 MyBatis는 SQL을 xml 파일에 적어둠

MyBatis는 xml 파일에 적어둔 SQL과 DAO를 연결시켜주는 역할을 함

 

이제는 아니지만 종종 MyBatis로 인터넷에 검색 해보면 iBatis에 대한 글도 함께 검색됨

MyBatis, iBatis 이름이 비슷하니 헷갈릴 수 있는데 iBatis는 MyBatis의 구버전임

iBatis는 구버전, MyBatis는 신버전 이라는 버전이 다른것 뿐이지만 그에 따라 사용하는 방법이나 기능들이 조금씩 다르니 인터넷에 MyBatis 관련 글 중 iBatis 관련 글도 함께 나온나면 iBatis 관련된 글은 무시하자


이번에는 Mybatis로 DB와 통신하는 방법을 배우자

 

SpringFramework에서 MyBatis 를 사용하려면 라이브러리를 세 개 추가해야함

1. spring-boot-starter-jdbc

2. mariadb connector/j

3. MyBatis

 

전 글에서 [ spring-boot-starter-jdbc ] 와 [ mariadb connector/j ] 라이브러리를 추가했으니 [ MyBatis ] 라이브러리만 추가하자

 

인터넷에서 maven repository 검색(1) 후 해당 사이트로 접속(2) 후 mybatis spring boot 검색(3) 후  MyBatis Spring Boot Starter 라이브러리 페이지로 들어감(4)

 

MyBatis Spring Boot Stater는 최신 버전(1)으로 선택 하고 라이브러리 URL(2) 을 복사 한 후 프로젝트 내 pom.xml에 붙여넣자


라이브러리 URL에서 버전값은 지우지 말고 그대로 사용함


여기서 우리는 MyBatis를 학습하기 위해 회원가입, 전체 회원 정보 조회, 닉네임으로 특정 회원 정보 조회, 회원 정보 수정, 회원 정보 삭제가 가능한 컨트롤러를 개발할 것

 

전 글에서 해봤던 JdbcTemplate과 비교하기 위해 똑같은 기능을 구현하는 것

 

프로젝트 -> com.study.chapter04에 MyBatisController 클래스를 추가하고 아래 코드를 추가하자

package com.study.chapter04;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

@Controller
public class MyBatisController {
	
	@GetMapping("/chapter04/mybatis/members")
	public void getAllMembers() {
		System.out.println("<< 회원 정보 조회 시작 >>");

		// 전체 회원 정보 조회
		
		// 조회한 전체 회원 정보 출력
		
		System.out.println("<< 회원 정보 조회 종료 >>");
	}
	
	@GetMapping("/chapter04/mybatis/member")
	public void getMemberByNickname(String nickname) {
		System.out.println("<< 닉네임으로 회원 정보 조회 시작 >>");
		
		// 닉네임으로 회원 정보 조회
		
		// 조회한 회원 정보 출력
		
		System.out.println("<< 닉네임으로 회원 정보 조회 종료 >>");
	}
	
	@PostMapping("/chapter04/mybatis/member")
	public void insertMember(InsertMemberDto newMember) {
		System.out.println("<< 회원 가입 시작 >>");

		// 회원 가입
		
		System.out.println("<< 회원 가입 성공 >>");
	}
	
	@PutMapping("/chapter04/mybatis/member")
	public void updateMember(InsertMemberDto newMember) {
		System.out.println("<< 회원 정보 수정 시작 >>");
		
		// 회원 정보 수정
		
		System.out.println("<< 회원 정보 수정 성공 >>");
	}
	
	@DeleteMapping("/chapter04/mybatis/member")
	public void deleteMember(DeleteMemberDto deleteMember) {
		System.out.println("<< 회원 정보 삭제 시작 >>");
		
		// 회원 정보 삭제
		
		System.out.println("<< 회원 정보 삭제 성공 >>");
	}
}

컨트롤러를 구현하기 전 JdbcTemplate을 사용한 프로젝트와 MyBatis를 사용한 프로젝트의 구조와 흐름을 보자

<< JdbcTemplate 을 사용한 프로젝트의 구조와 흐름 >>

(1). 클라이언트가 회원 가입 요청을 하며 가입할 회원의 정보(id, pw, nickname, tel)을 보냄

(2-1). 컨트롤러는 클라이언트의 요청을 받음

(2-2). 이때 컨트롤러의 InsertMemberDto 타입 매개변수로 클라이언트가 보낸 가입할 회원의 정보가 저장됨

(3-1). 컨트롤러는 JdbcTemplate의 update 메서드를 호출해 INSERT 쿼리를 실행

(3-2). 이때 컨트롤러는 INSERT 쿼리에 값을 사용하기 위해 ? 로 쿼리를 구성하고 update 메서드를 호출 할 때 각 ? 에 들어갈 값을 지정함

 

<< MyBatis 를 사용한 프로젝트의 구조와 흐름 >>

MyBatis 를 사용한 프로젝트의 구조와 흐름은 설명할 필요도 없이 JdbcTemplate을 사용한 프로젝트의 구조와 흐름과 거의 같음

 

다른 부분은? DAO의 INSERT 쿼리를 수행할 메서드

 

MyBatis 를 사용한 프로젝트의 구조와 흐름 에서 정확하게 바꿔야할 부분이 있지만 우선은 여러분의 이해를 위해서 이렇게 그렸음


MyBatis 를 사용한 프로젝트의 구조에 대해서 알았으니 다시 본론으로 돌아가서 컨트롤러를 구현하면서 MyBatis에 대해서 배우자

 

컨트롤러 구현 순서는 전 글과 같이 [ 회원 가입 -> 전체 회원 정보 조회 -> 닉네임으로 회원 정보 조회 -> 회원 정보 수정 -> 회원 정보 삭제 ] 순서로 구현하자

 

<< 회원 가입 컨트롤러 구현 >>

더보기

// ...

@PostMapping("/chapter04/mybatis/member")
public void insertMember(InsertMemberDto newMember) {
	System.out.println("<< 회원 가입 시작 >>");
		
	// 회원 가입
		
	System.out.println("<< 회원 가입 성공 >>");
}

// ...

회원 가입 컨트롤러를 구현할것이니 회원 가입 컨트롤러 코드만 놓고 보자

클라이언트가 보낸 값(가입할 회원의 정보)은 기존에 만들어둔 InsertMemberDto가 받음 ( 1 ~ 2-2 )

 

이제 InsertMemberDto가 받은 회원의 정보를 DB에 저장하면 됨 ( 3-1, 3-2 )

JdbcTemplate은 자바 코드 내에 곧장 쿼리를 작성했지만 MyBatis는 쿼리를 xml 파일에 작성해야함
 

쿼리를 작성할 xml 파일은 프로젝트 -> src/main/resources 안에 두면 되는데 resources 폴더 안에 그대로 방치해 두면 프로젝트의 규모가 커졌을 때 xml 파일이 너무 많으니 복잡해짐

보통은 xml 파일을 위한 폴더를 만들고 그 안에 xml 파일을 둠

 

쿼리를 갖고 있는 xml 파일을 mapper 라고 부름

그래서 resources 폴더 내 mapper 폴더(1)를 만들고 그 안에 xml 파일(2)을 두자

쿼리를 갖고 있을 xml 파일 이름이 Member인데 파일 이름을 이렇게 지은 이유는 이 파일이 갖고 있을 쿼리가 member 테이블과 관련 되어있기 때문

Member.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="com.study.chapter04.MemberDao">

</mapper>

<< 코드 설명 >>

(1). 이 파일은 MyBatis 기술이 적용되 SQL문이 들어갈것이다 라는 표시

(2). SQL문은 mapper 태그 내 작성해야함
  namespace 속성은 이 파일에 작성한 쿼리와 연결될 DAO 클래스를 명시함
  따라서 mapper 태그 내 작성한 쿼리는 com.study.chapter04 패키지 내 MemberDao 인터페이스와 연결됨

 

지금까지 거쳐온 과정을 다시 한번 상기해보자

1. MyBatis를 사용하기 위해 라이브러리를 추가

2. 컨트롤러 구현 중 DB와 통신( 회원 정보 저장, INSERT ) 이 필요해짐

  DB와 통신하기 위해 resources -> mapper -> Member.xml 파일을 추가하고

  회원 정보를 저장하기 위해 쿼리문을 작성하려고 함

 

이제 회원 정보를 저장할 쿼리를 mapper 태그 내 작성하자

<?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.study.chapter04.MemberDao">
	<insert id="insertMember" parameterType="com.study.chapter04.InsertMemberDto">
		INSERT INTO member(id, pw, nickname, tel) VALUES(#{id}, #{pw}, #{nickname}, #{tel});
	</insert>
</mapper>

<< 코드 설명 >>

(1). INSERT 쿼리를 작성할 때는 insert 태그를 사용함
  id 속성 : mapper 태그의 namespace 속성 값과 함께 연계해 사용되는 속성으로 "이 insert 태그는  com.study.chapter04 패키지 내 MemberDao 인터페이스가 갖고 있는 insertMember 메서드와 연결해라" 가 됨
  parameterType 속성 : 이 쿼리가 전달 받을 객체의 타입, 이 쿼리에서 눈에 띄는 특이한 점이 있는데 일반적으로 Servlet에서부터 JdbcTemplate까지 값은 ? 를 사용하고 ? 에 들어 갈 값을 별도로 할당해줬음
  그러나 MyBatis는 ? 가 아닌 #{~} 인데 이는 parameterType 속성과 연계해 사용됨
  #{id} 는 "이 쿼리가 전달 받은 객체의 id 멤버 변수 값을 사용하겠다" 임, 나머지 pw, nickname, tel 역시 마찬가지

 

이 쿼리를 컨트롤러에서 사용하려면 mapper 태그의 namespace에 명시해둔 DAO가 필요함

프로젝트 -> com.study.chapter04 클래스 내 MemberDao 인터페이스를 추가하고 아래 코드를 추가하자

package com.study.chapter04;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberDao {
	void insertMember(InsertMemberDto newMember);
}

<< 코드 설명 >>

(1). "이 인터페이스는 mapper 태그의 namespace 속성에 명시해둔 DAO 인터페이스이다" 라는 애너테이션
  이 설명 보다 더 심오한 역할이지만 Spring Boot 난이도에 맞게 간단하게 설명한 것
  이 애너테이션이 없으면 DAO 인터페이스가 될 수 없으니 꼭 붙어야함

(2). mapper 태그 내 insert 태그의 id 속성 값과 동일한 이름의 메서드로 오타가 있으면 안됨
  이 메서드의 매개변수 타입은 insert 태그의 parameterType에 명시한 타입과 같아야함

 

이제 !  [ 쿼리가 들어있는 xml 파일 ] 과 [ DAO ] 를 MyBatis가 연결할 수 있도록 설정 값을 추가해야함

프로젝트 -> src/main/resources -> application.properties 에 다음과 같이 설정 값을 추가하자

// ...

mybatis.mapper-locations=classpath:mapper/**/**.xml

<< 설명 >>
이 설정값은 MyBatis가 [ 쿼리가 들어있는 xml 파일 ] 이 어디 있는지 알려주는 설정 값임

 

프로젝트의 규모가 커지면 쿼리가 많아지게 되고 그에 따라 xml 파일이 많아질텐데 mapper 안에 그대로 방치하면 안됨

그래서 mapper 폴더 안에 다시 어떤 기준에 맞춰서 여러 폴더가 생기고 그 안에 쿼리가 들어있는 xml 파일이 위치하게 됨

그래서 이 설정값이 mapper/**/**.xml이 되는 것

 

 

여기까지 컨트롤러에 필요한 것들이 준비 됐음

1. INSERT 쿼리 : Member.xml 파일에 insert 태그

2. INSERT 쿼리를 수행할 DAO : MemberDao 클래스 내 insertMember 메서드

 

이제 컨트롤러에서 INSERT 쿼리를 수행하도록  하자

package com.study.chapter04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

@Controller
public class MyBatisController {
	@Autowired
	private MemberDao memberDao;
    
    // ...
    
	@PostMapping("/chapter04/mybatis/member")
	public void insertMember(InsertMemberDto newMember) {
		System.out.println("<< 회원 가입 시작 >>");
		
		// 회원 가입
		memberDao.insertMember(newMember);
		
		System.out.println("<< 회원 가입 성공 >>");
	}
    
    // ...
}

<< 코드 설명 >>

(1). Chapter03 에서 배운 자동 의존 주입이 적용된 코드로 컨트롤러가 DAO에 의존해 DB와 통신함
  컨트롤러의 의존 객체는 DAO이므로 @Autowired 애너테이션을 붙여 SpringFramework가 자동으로 의존 주입을 해주도록 설정
( Chapter03에서 언급했듯 SpringFramework의 큰 특징 중 하나가 DI이고 굉장히 중요하므로 만약 이해가 안된다면 Chapter03을 더 복습해야함 )

(2). DAO를 통해 DB에 회원 정보를 저장

 

여기서 프로젝트의 구조를 다시 살펴보자

 

처음 프로젝트 구조를 살펴보며 잠깐 언급했던 말이 있음

 

" MyBatis 를 사용한 프로젝트의 구조와 흐름 에서 정확하게 바꿔야할 부분이 있지만 우선은 여러분의 이해를 위해서 이렇게 그렸음 "

 

현재 (3-1) 의 역할을 하는건 MemberDao의 insertMember 메서드임

insertMember 메서드가 실행시키는 INSERT 쿼리는 " INSERT INTO member(id, pw, nickname, tel) VALUES(#{id}, #{pw}, #{nickname}, #{tel}); " 임

 

따라서 프로젝트 구조에서 실행시키는 쿼리를 정확하게 바꾸면 다음과 같음

쿼리에서 사용한 #{id}, #{pw}, #{nickname}, #{tel}은 쿼리가 전달 받은 객체의 멤버 변수명임

 

이제 서버를 실행시키고 회원 가입이 되는지 확인하자



<< 전체 회원 정보 조회 컨트롤러 구현 >>

더보기

전체 회원 정보를 조회할 쿼리 먼저 작성하자

프로젝트 -> src/main/resources -> mapper -> Member.xml 파일 내 다음과 같이 select 태그를 추가하자

 << 코드 설명 >>

(1). 회원 정보를 조회한 후 조회 결과 또는 결과들을 담아 반환함
  조회 결과 또는 결과들을 담을 때는 resultType 속성에 명시한 클래스를 활용함
  resultType 속성 값으로 DTO를 지정했음
  이때 조회 결과 칼럼명과 DTO의 멤버 변수명이 일치해야함

 

이번에는 컨트롤러에서 쿼리를 실행하고 결과를 받아올 수 있게 중간 다리 역할을 하는 DAO 내 selectAllMembers 메서드를 추가하자

package com.study.chapter04;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberDao {
	void insertMember(InsertMemberDto newMember);
	List<SelectMemberDto> selectAllMembers();
}

<< 코드 설명 >>

(1). 메서드명 : select 태그의 id 속성과 일치해야함
  반환 타입 : 조회 결과 또는 결과들을 담아야하는데 List 타입이 아니면 결과만 담을 수 있으므로 List 타입으로 지정해 조회 결과가 있다면 반환할 때 하나만 담겨 반환될 것이고 조회 결과들이 있다면 반환할 때 여러 개가 담겨 반환됨
  List의 제네릭스 타입이 SelectMemberDto인 이유는 select 태그의 resultType 속성 값과 일치해야하므로...
  select 태그만 보면 SELECT 쿼리 수행 후 결과가 반환될 지 결과들이 반환될 지 모르는 것
  select 태그와 연결된 DAO의 selectAllMembers 메서드의 반환 타입에 따라 조회 결과가 담길 수도 있고 조회 결과들이 담길 수 있음
  selectAllMembers 메서드의 반환 타입이 List<SelectMemberDto> 가 아닌 SelectMemberDto 라면 select 쿼리 결과가 여러 개라도 조회 결과 하나만 반환됨

 

이제 전체 회원 정보를 조회할 컨트롤러를 완성하자

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

@Controller
public class MyBatisController {
	@Autowired
	private MemberDao memberDao;
	
	@GetMapping("/chapter04/mybatis/members")
	public void getAllMembers() {
		System.out.println("<< 회원 정보 조회 시작 >>");
		
		// 전체 회원 정보 조회
		List<SelectMemberDto> allMembers = memberDao.selectAllMembers();
		
		// 조회한 전체 회원 정보 출력
		for(SelectMemberDto member : allMembers) {
			System.out.println(member);
		}
		
		System.out.println("<< 회원 정보 조회 종료 >>");
	}
    
    // ...
}

간단하므로 별도의 코드 설명은 생략



<< 닉네임으로 회원 정보 조회 컨트롤러 구현 >>

여기서부터는 여러분이 먼저 구현하고 여러분의 구현과 제 구현을 비교 해보세요

더보기

저는 지금까지와 마찬가지로 구현 순서를 [ 쿼리 작성 > DAO 내 메서드 추가 > 컨트롤러 완성 ] 로 했음

만약 [ 컨트롤러 구현 > DAO 내 메서드 추가 > 쿼리 작성 ] 순서로 보고 싶다면 밑에서 위로 올라오면서 보면 됨

 

1. 쿼리 작성 ( Member.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="com.study.chapter04.MemberDao">
	// ...
    
	<select id="selectMember" parameterType="String" resultType="com.study.chapter04.SelectMemberDto">
		SELECT * FROM member WHERE nickname = #{nickname};
	</select>
    
    // ...
</mapper>

 

2. DAO 내 메서드 추가 ( MemberDao )

package com.study.chapter04;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberDao {
	// ...
    
	SelectMemberDto selectMember(String nickname);
    
    // ...
}

 

3. 컨트롤러 완성

package com.study.chapter04;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

@Controller
public class MyBatisController {
	@Autowired
	private MemberDao memberDao;
    
	// ...
    
	@GetMapping("/chapter04/mybatis/member")
	public void getMemberByNickname(String nickname) {
		System.out.println("<< 닉네임으로 회원 정보 조회 시작 >>");
		
		// 닉네임으로 회원 정보 조회
		SelectMemberDto member = memberDao.selectMember(nickname);
		
		// 조회한 회원 정보 출력
		System.out.println(member);
		
		System.out.println("<< 닉네임으로 회원 정보 조회 종료 >>");
	}
    
	// ...
}


<< 회원 정보 수정 컨트롤러 구현 >>

여기서부터는 여러분이 먼저 구현하고 여러분의 구현과 제 구현을 비교 해보세요

더보기

저는 지금까지와 마찬가지로 구현 순서를 [ 쿼리 작성 > DAO 내 메서드 추가 > 컨트롤러 완성 ] 로 했음

만약 [ 컨트롤러 구현 > DAO 내 메서드 추가 > 쿼리 작성 ] 순서로 보고 싶다면 밑에서 위로 올라오면서 보면 됨

 

1. 쿼리 작성 ( Member.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="com.study.chapter04.MemberDao">
	// ...
	
	<update id="updateMember" parameterType="com.study.chapter04.InsertMemberDto">
		UPDATE member SET pw = #{pw}, nickname = #{nickname}, tel = #{tel} WHERE id = #{id}
	</update>
    
 	// ...
</mapper>

 

2. DAO 내 메서드 추가 ( MemberDao )

package com.study.chapter04;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberDao {
	// ...
    
	void updateMember(InsertMemberDto newMember);
    
	// ...
}

 

3. 컨트롤러 완성

package com.study.chapter04;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

@Controller
public class MyBatisController {
	@Autowired
	private MemberDao memberDao;
	
	// ...
	
	@PutMapping("/chapter04/mybatis/member")
	public void updateMember(InsertMemberDto newMember) {
		System.out.println("<< 회원 정보 수정 시작 >>");
		
		// 회원 정보 수정
		memberDao.updateMember(newMember);
		
		System.out.println("<< 회원 정보 수정 성공 >>");
	}
	
	// ...
}


<< 회원 정보 삭제 컨트롤러 구현 >>

여기서부터는 여러분이 먼저 구현하고 여러분의 구현과 제 구현을 비교 해보세요

더보기

저는 지금까지와 마찬가지로 구현 순서를 [ 쿼리 작성 > DAO 내 메서드 추가 > 컨트롤러 완성 ] 로 했음

만약 [ 컨트롤러 구현 > DAO 내 메서드 추가 > 쿼리 작성 ] 순서로 보고 싶다면 밑에서 위로 올라오면서 보면 됨

 

1. 쿼리 작성 ( Member.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="com.study.chapter04.MemberDao">
	// ...
    
	<delete id="deleteMember" parameterType="com.study.chapter04.DeleteMemberDto">
		DELETE FROM member WHERE id = #{id} AND pw = #{pw}
	</delete>
    
	// ...
</mapper>

 

2. DAO 내 메서드 추가 ( MemberDao )

package com.study.chapter04;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberDao {
	// ...
    
	void deleteMember(DeleteMemberDto deleteMember);
    
\	// ...
}

 

3. 컨트롤러 완성

package com.study.chapter04;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

@Controller
public class MyBatisController {
	@Autowired
	private MemberDao memberDao;
	
	// ...
	
	@DeleteMapping("/chapter04/mybatis/member")
	public void deleteMember(DeleteMemberDto deleteMember) {
		System.out.println("<< 회원 정보 삭제 시작 >>");
		
		// 회원 정보 삭제
		memberDao.deleteMember(deleteMember);
		
		System.out.println("<< 회원 정보 삭제 성공 >>");
	}
    
	// ...
}


여기까지 MyBatis를 사용해 기본적인 CRUD 방법을 알아봤음

여기까지만 알아도 충분하지만 이제부터 좀 더 깊게 들어가서 알아보자

728x90
LIST