[Spring] MyBatis - CRUD

suyeon·2022년 7월 29일

Spring

목록 보기
3/6
post-thumbnail

⚡ MyBatis

  • 쿼리 기반 웹 애플리케이션을 개발할 때 가장 많이 사용되는 SQL 매퍼(Mapper) 프레임워크이다.
  • MyBatis를 사용하지 않고 직접 JDBC를 이용할 경우 문제점 :
    • 개발자가 반복적으로 작성해야 할 코드가 많고, 서비스 로직 코드와 쿼리를 분리하기가 어렵다.
    • 또한 커넥션 풀의 설정 등 개발자가 신경 써야 할 부분이 많아 여러 가지 어려움이 있다.
  • 따라서, JDBC를 이용해서 직접 개발하기보다는 MyBatis와 같은 프레임워크를 사용하는 게 일반적이다.
  • JDBC를 이용하여 프로그래밍을 하는 방식:
    • 클래스나 JSP와 같은 코드 안에 SQL문을 작성하는 방식
    • 따라서 SQL의 변경 등이 발생할 경우 프로그램을 수정해야 한다.
      -> 유연하지 않다, 코드가 복잡하게 섞여 있어서 가독성도 떨어짐
  • 마이바티스에서는 SQL을 XML 파일에 작성하기 때문에, SQL의 변환이 자유롭고 가독성도 좋다.

🦾 Mybatis 실습

1. pom.xml
	- 스프링 버전, 자바 버전 설정
	- <java-version>1.11</java-version>
	- <org.springframework-version>5.0.7.RELEASE</org.springframework-version>
	- <version>3.5.1</version>
	- <source>1.11</source>
	- <target>1.11</target>
    
	- Project Facets > Java > 11

2. 파일 생성하기
	- com.test.spring > "MyBatisController.java"
					  > "MyBatisService.java" (I)
					  > "MyBatisServiceImpl.java"
					  > "MyBatisDAO.java" (I)
					  > "MyBatisDAOImpl.java" 
					  > "MyBatisDTO.java"
    - "com.test.spring.mapper" > "test.xml"
	- views > "result.jsp"
	- WEB-INF > "mybatis.xml"

3. script.sql
	- tblMyBatis
	
4. WEB-INF > spring > root-context.xml

👉 기본 설정

  1. Mybatis 라이브러리 pom.xml 추가
  • MyBatis와 mybatis-spring을 사용하기 위해 pom.xml 파일에 추가적인 라이브러리를 설정해야 한다.
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.10</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.7</version>
</dependency>
    
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>4.3.8.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
  <groupId>commons-dbcp</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>1.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.lazyluke/log4jdbc-remix -->
<dependency>
  <groupId>org.lazyluke</groupId>
  <artifactId>log4jdbc-remix</artifactId>
  <version>0.2.7</version>
</dependency>	

💬 pom.xml

  • 메이븐 설정 파일
  • <dependency> 관리 : 프로젝트를 구현하는데 반드시 필요한 *.jar(클래스들) , 의존 객체
  • <dependency> 1개당 : 1개 이상의 *.jar를 관리한다.

💬 Maven Repository

  • https://mvnrepository.com/
  • 여러 *.jar 관리하고 있는 온라인 저장소
  • Maven pom.xml의 내용을 바탕으로 Maven Repository에서 필요한 *.jar를 다운로드한다.
  1. /WEB-INF/lib 폴더 만들기
  • ojdbc.jar 제공 안 하므로, 직접 설치해야 함
  1. root-context.xml 추가
	<!-- 프로젝트 전반에 걸친 환경 설정 -->
	<!-- DB 설정 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
	     <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
	     <property name="username" value="hr"></property>
	     <property name="password" value="java1234"></property>
	</bean>	

	<bean id="log4j" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
		<constructor-arg ref="dataSource"></constructor-arg>
		<property name="logFormatter">
			<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
				<property name="loggingType" value="MULTI_LINE"></property>
				<property name="sqlPrefix" value="[SQL] "></property>
			</bean>
		</property>
	</bean>

	<bean id="sessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="log4j"></property><!-- 객체 의존 주입 -->
		<property name="mapperLocations" value="classpath*:com/test/spring/mapper/*.xml"></property>
		<property name="configLocation" value="/WEB-INF/mybatis.xml"></property>
	</bean>
	
	<!-- 최종적으로 사용하는 아이 -->
	<bean class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg ref="sessionfactory"></constructor-arg>
    </bean>

💬 모든 라이브러리 관리는 pom.xml
외부 연동 관련 정보는(DB접속하기 위한 정보를 설정) root-context.xml


  • script.sql - tblMyBatis 테이블생성
create table tblMyBatis (
    seq number primary key,
    item varchar2(100) not null,
    price number not null,
    regdate date default sysdate not null
);

create sequence seqMyBatis;

insert into tblMyBatis (seq, item, price, regdate) values (seqMyBatis.nextVal, '마우스', 35000, default);
insert into tblMyBatis (seq, item, price, regdate) values (seqMyBatis.nextVal, '키보드', 50000, default);
insert into tblMyBatis (seq, item, price, regdate) values (seqMyBatis.nextVal, '모니터', 230000, default);

commit;
  • MyBatisDTO.java
package com.test.spring;

import lombok.Data;

@Data
public class MyBatisDTO {
	
	private String seq;
	private String item;
	private String price;
	private String regdate;
	
}

💬 Spring MVC 전체 구조

  • MyBatisController > (의존) > MyBatisService > (의존) > MyBatisDAO > (의존) > SqlSessionTemplate

👉 INSERT (인자값X, 반환값X)

1) MyBatisController.java

  • @Autowired
    • Spring DI 어노테이션
    • 무조건적인 객체에 대한 의존성을 주입시킴
@Controller
public class MyBatisController {
	@Autowired
	private MyBatisService service; 
    
	@GetMapping(value="/m1")
	public String m1(Model model) {
		
		//정적 쿼리 > 인자값X, 반환값X
		service.m1();
		
		return "result";
	}    

2) MyBatisService.java

public interface MyBatisService {
	void m1();
}

3) MyBatisServiceImpl.java

  • @Service
    • Bean 인스턴스를 생성
    • 서비스 클래스에서 사용
    • 비즈니스 로직을 수행하는 클래스라는 것을 나타내는 용도이다
@Service
public class MyBatisServiceImpl implements MyBatisService {
	@Autowired
	private MyBatisDAO dao;
    
    @Override
	public void m1() {
		dao.m1();
	}
}

4) MyBatisDAO.java

public interface MyBatisDAO {
	void m1();
}

5) MyBatisDAOImpl.java

  • @Repository

    • DAO 클래스에서 사용
    • DataBase에 접근하는 메소드를 가지고 있는 클래스에서 쓰인다
  • MyBatis > XML 기반의 Query 작업

  1. executeUpdate() - 반환값이 있는 쿼리
    • template.insert(null)
    • template.update(null)
    • template.delete(null)
  2. executeQuery() - 반환값이 없는 쿼리
    • template.selectOne(null)
    • template.selectList(null)
@Repository
public class MyBatisDAOImpl implements MyBatisDAO {
	@Autowired
	private SqlSessionTemplate template; // 기존의 JDBC : Statement + ResultSet + Mapping
    
    @Override
	public void m1() {
		template.insert("test.m1");
	}
}

6) test.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="test">
   	<insert id="m1">
   		insert into tblMyBatis (seq, item, price, regdate) 
   			values (seqMyBatis.nextVal, '본체', 50000, default)
   	</insert>
</mapper>

👉 INSERT (인자값O, 반환값O)

  • m4?item=본체&price=50000
  • [ 방법 ]
    1. 각각 매개변수로 만들기 (Model model, String item, String price)
    2. DTO 넣어서 만들기 (Model model, MyBatisDTO dto)

1) MyBatisController.java

@GetMapping(value="/m4")
public String m4(Model model, MyBatisDTO dto) {

  int result = service.m4(dto);
  model.addAttribute("result", result);
  return "result";
}

2) MyBatisService.java

int m4(MyBatisDTO dto);

3) MyBatisServiceImpl.java

@Override
public int m4(MyBatisDTO dto) {
	return dao.m4(dto);
}

4) MyBatisDAO.java

int m4(MyBatisDTO dto);

5) MyBatisDAOImpl.java

public int m4(MyBatisDTO dto) {
	return template.insert("test.m4", dto);
}

6) test.xml ⭐

<insert id="m4" parameterType="dto">
   	insert into tblMyBatis (seq, item, price, regdate) 
   		values (seqMyBatis.nextVal, #{item}, #{price}, default)
</insert>
  • 매개변수가 넘어 올 때는 반드시 parameterType으로 자료형을 설정
  • 매개변수는 #{ } 형식으로 나타냄
  • paramerterType은 일반적으로 기본형이나 VO형태 클래스를 사용함
  • 객체를 넣을 때는 parameterType에 패키지 경로까지 다 써줘야 하는데, 패키지 경로를 쓰지 않을려면 다음과 같이 mybatis.xml를 수정하면 됨
  • typeAlias 태그의 type 속성에는 패키지를 포함한 클래스 이름을 쓰고 alias에는 그 클래스를 사용하기 위한 별칭을 적어줌

✔ mybatis.xml

<typeAliases>
	<typeAlias type="com.test.spring.MyBatisDTO" alias="dto"/>   
</typeAliases>

👉 UPDATE

1) MyBatisController.java

@GetMapping(value="/m2")
public String m2(Model model, String seq) {
  
  // > seq 전달 > 가격 인상
  //http://localhost:8090/spring/m2?seq=1
  
  int result = service.m2(seq);
  model.addAttribute("result", result);  
  return "result";
}

2) MyBatisService.java

int m2(String seq);

3) MyBatisServiceImpl.java

@Override
public int m2(String seq) {
  return dao.m2(seq);
}

4) MyBatisDAO.java

int m2(String seq);

5) MyBatisDAOImpl.java

public int m2(String seq) {
  return template.update("test.m2", seq);  
}

6) test.xml

<update id="m2" parameterType="String">
  update tblMyBatis set price = price * 1.2
      where seq = #{seq}
</update>

👉 DELETE

1) MyBatisController.java

@GetMapping(value="/m3")
public String m3(Model model, String seq) {  
  int result = service.m3(seq);
  model.addAttribute("result", result);
  return "result";
}

2) MyBatisService.java

int m3(String seq);

3) MyBatisServiceImpl.java

@Override
public int m3(String seq) {
  return dao.m3(seq);
}

4) MyBatisDAO.java

int m3(String seq);

5) MyBatisDAOImpl.java

@Override
public int m3(String seq) {
  return template.delete("test.m3", seq);
}

6) test.xml

<delete id="m3" parameterType="String">
   	delete from tblMyBatis where seq = #{seq}
</delete>

참고사이트
🔗 [Spring] 마이바티스(MyBatis)란? & 연동하는 방법

0개의 댓글