본문 바로가기
교육/Spring

Spring 개발자 수업 97일차(3) - MyBatis(INSERT, DELETE, UPDATE)

by yhyuk 2021. 8. 13.
728x90
반응형

MyBatis(INSERT, DELETE, UPDATE)

[ 정의 ]

- MyBatis는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결시킨다.

- 예전에는 iBatis라고 불리었으며 현재는 iBatis와 MyBatis는 완전히 다른 기능을 한다.

- 응용 프로그램 계층(자바) <-> 퍼시스턴스 계층(중간 계층, JDBC) <-> 데이터베이스 계층(오라클)

- 중간 계층 기술 중 하나이다.(JDBC, MyBatis, JPA, Hibernate, Spring JDBC .. 등)

- MyBatis는 SQL 구문을 XML파일에서 작성한다. (기존에는 xxxDAO() 에서 try-catch문 안에 만들었음)

 

[ 예제 - MyBatis를 이용해서 DB 조작하기 ]

- 기존에 만들어 두었던 tblMemo 테이블을 MyBatis를 통해서 insert, update, delete를 해보자

- 예제 작업 전 설정 작업 ( * Log4j: 데이터베이스 작업 중 관련된 로그를 출력하는 기능 ) 

1. pom.xml
	- Java 버전에 맞게 변경
	- Spring 버전에 맞게 변경

2. lib
	- pom.xml
	- ojdbc6.jar
	- mybatis x n개
	- log4j

3. web.xml
	- 확장자 변경(*.action)
	- 인코딩 필터 추가(UTF-8)
	
4. root-context.xml
	- MyBatis 설정
	- Log4j 설정 > 추가
	
5. servlet-context.xml
	- 설정 없음

6. 파일 생성	
	- com.test.mybatis > MyBatisController.java, MyBatisDAO.java, MyBatisDTO.java
	- com.test.mybatis.mapper > test.xml
	- views > result.jsp

 

  1) MyBatisController.java

@Controller
public class MyBatisController {

	@RequestMapping(value = "/m1.action", method = { RequestMethod.GET })
	public String m1(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
		
		MyBatisDTO dto = new MyBatisDTO();
		
		dto.setSeq("3");
		dto.setName("김홍삼");
		dto.setMemo("메모입니당.");
		dto.setCategory("Mybatis");
		
		// 반환값이 없는 쿼리(insert, update, delete)
		int addResult = dao.add();
		int delResult = dao.del();
		int updateResult = dao.update(dto);
		
		req.setAttribute("addResult", addResult);
		req.setAttribute("delResult", delResult);
		req.setAttribute("updateResult", updateResult);
		
		return "result";
	}

}

 

  2) MyBatisDTO

import lombok.Data;

@Data
public class MyBatisDTO {
	private String seq;
	private String name;
	private String memo;
	private String regdate;
	private String category;
}

 

  3) MyBatisDAO

  - SqlSessionTemplate은 기존 JDBC의 Statement + ResultSet + Mapping을 모두 합쳐놓은것과 동일하다.

  - JDBC와 MyBatis의 반환값이 있는 쿼리와 반환값이 없는 쿼리 작성 비교

JDBC / MyBatis 반환값이 있는 쿼리 반환값이 없는쿼리
  JDBC 방식   stat.executeUpdate();   stat.executeQuery()
  MyBatis 방식   template.insert(), 
  template.delete(),
  template.update()
  template.selectXXX()
@Repository
public class MyBatisDAO {

	@Autowired
	private SqlSessionTemplate template; // Statement + ResultSet + Mapping

	// 반환값이 없는 쿼리 > insert, delete, update
	// template.insert("")      : 인자가 없는 쿼리 
	// template.insert("", obj) : 인자가 있는 쿼리
	public int add() {
		// 매개변수가 없는 반환값 없는 쿼리
		return template.insert("test.m1");
	}
	
	public int del() {
		// 매개변수가 있는 반환값 없는 쿼리
		return template.delete("test.m2", 5);
	}
	
	public int update(MyBatisDTO dto) {
		// 매개변수가 있는 반환값 없는 쿼리
		return template.update("test.m3", dto);
	}
}

 

  4) test.xml

  - MyBatis에서는 SQL구문을 xml파일에서 따로 형식에 맞게 작성한다.

  - 매개변수가 넘어 올 때는 반드시 parameterType으로 자료형을 설정해야한다.

  - 매개변수는 #{ } 형식으로 나타낸다. (호따옴표 사용 NO!!)

<?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="test">
	
	<!--  
		<insert id=""></insert>
		<update id=""></update>
		<delete id=""></delete>
		<select id=""></select>
	-->
	
	<!-- add -->
	<insert id="m1">
		insert into tblMemo (seq, name, memo, regdate, category)
			values (seqMemo.nextVal, '홍길동', 'MyBatis 테스트', default, 'mybatis')
	</insert>
	
	<!-- delete -->
	<delete id="m2" parameterType="Integer">
		delete from tblMemo where seq = #{ seq }
	</delete>
	
	<update id="m3" parameterType="com.test.spring.mybatis.MyBatisDTO">
		update tblMemo set
			name = #{ name }, <!-- 넘어온 getName()을 name으로 줄여준다. -->
			memo = #{ memo }, <!--  어떤 자료형이든 호따옴표를 절대 붙이면 안된다.!! -->
			category = #{ category }
		where seq = #{ seq }
	</update>
	
</mapper>

 

  5) result.jsp

  - 눈으로 결과값을 (0 or 1) 확인 하기 위한 페이지

<div>insert 작업 결과: ${ addResult }</div>
<div>delete 작업 결과: ${ delResult }</div>
<div>update 작업 결과: ${ updateResult }</div>

 

- 결과 페이지

정상적으로 DB작업이 이루어졌다는 의미인 1이 출력된 모습이다.

 

- 위에서 설정한 MyBatis를 이용한 DB작업 insert, update, delete도 SQL-Developer를 확인하면 제대로 작업이 이루어 진걸 확인할 수 있다.

- 추가로 SQL구문을 작성하는 test.xml파일에서 m3를 보면 매개변수(dto)가 넘어왔으므로 parameterType="자료형"을 지정해줘야하는데 패키지명 까지 전부 적어줘야 적용이 된다. (여러 패키지에서 중복된 이름이 있을 수있기 때문에..)

 

[ parameterType Alias(별칭) 지정하기 ]

- 방금 위에서 얘기한것처럼 parameterType을 매번 패키지명까지 적어가면서 하기에는 굉장히 불편하다.

- 이러한 불편사항을 해결하기 위해 alias를 지정할 수 있다!

- 아래 코드에서 별칭 지정을 해준 com.test.mybatis.MyBatisDTO 클래스는 이제부터 parameterType="dto"으로 사용해도 동일하다!!

- webapp > WEB-INF > views > mybatis.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">

<!-- webapp > WEB-INF > mybatis.xml -->
<configuration>

	<!-- Mapper에서 사용하는 자료형에 대한 별칭 만드는 작업 -->
	<typeAliases>
		<typeAlias type="com.test.mybatis.MyBatisDTO" alias="dto" />
	</typeAliases>
   
</configuration>

 

MEMO>

# 스프링에서 어노테이션을 굉장히 많이 쓰는데 수업을 따라가면서 중간중간 많이 까먹는거같다. 어노테이션 잘 작성하자.

# xml파일에서 선언문 <?xml version="1.0" encoding="UTF-8"?> 앞에는 무조건 띄어쓰기, 공백, 엔터, 주석등... 오면 에러가 발생한다. 

# 기존 JDBC을 사용해서 DB작업을 했을때와 오늘 배운 MyBatis를 사용해서 DB작업을 했을 때를 비교해보면 무조건 오늘 배운 MyBatis가 굉장히 편하고, 유지/보수가 쉽다는걸 알았다.

# 이제 곧 수료와 더불어 마지막 스프링 프로젝트와 취업 준비 + 수업이 동시에 이루어 져서 많이 어수선한거같다. 잘 마무리하자.
728x90
반응형

댓글