▸Spring MVC/기본 문법

스프링, Mybatis, MySQL_사용법 [2/5]

코데방 2020. 3. 22.
728x90
- Develop OS : Windows10 Ent, 64bit
- WEB/WAS Server : Tomcat v9.0
- DBMS : MySQL 5.7.29 for Linux (Docker)
- Language : JAVA 1.8 (JDK 1.8)
- Framwork : Spring 3.1.1 Release
- Build Tool : Maven 3.6.3
- ORM : Mybatis 3.2.8

 

Mybatis 연동 및 구조와 어노테이션 사용법은 이전글을 참조하시면 됩니다.

 

[Spring MVC/- 기본 문법] - 스프링, Mybatis - MySQL 연동 [1/2]

[Spring MVC/- 기본 문법] - @Resource, @Inject, @Autowired 사용 (자동 의존성 주입)

[Spring MVC/- 기본 문법] - @Repository, @Service 어노테이션

 

 

그리고 Mapper 인터페이스를 사용한 Mabatis 사용법은 다음글 참조하시면 됩니다.

 

[Spring MVC/- 기본 문법] - 스프링, Mybatis, MySQL_사용법(Mapper 인터페이스) [3/4]

 

 

 

 


 

 

1. Mybatis 설정 파일 작성

 

SqlSessionFactoryBean 클래스가 참조할 설정 파일을 먼저 작성합니다. 가장 기본적으로 VO(DTO) 객체를 등록해줍니다. 클래스를 찍어서 alias로 등록해주면 됩니다. alias는 앞으로 VO 객체를 지칭할 때 사용됩니다.

<?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> 
	<typeAliases>
		<typeAlias alias="UserVO" type="com.hsweb.springweb.UserVO" />
	</typeAliases>
</configuration>

 

	package com.hsweb.springweb;
	
	public class UserVO {
	
		private String user_id;
		private String user_pw;
	
		public String getUser_id() {
			return user_id;
		}
		public void setUser_id(String user_id) {
			this.user_id = user_id;
		}
		public String getUser_pw() {
			return user_pw;
		}
		public void setUser_pw(String user_pw) {
			this.user_pw = user_pw;
		}
	}

 

 


 

 

2. Mapper 파일 작성

 

SQL 쿼리문을 관리할 Mapper 파일입니다. 여러 개로 분리해서 사용해도 됩니다. 일단 기본적인 쿼리문을 작성해보겠습니다. namespapce는 파일마다 id가 겹칠 경우를 대비한 구분자입니다. 편한대로 지정해주면 됩니다.

 

* select 쿼리

  • <select> 태그 사용
  • id : 호출할 쿼리문 명칭
  • parameterType : 동적으로 변수를 받을 때 해당 변수의 타입 지정
  • resultType : 결과로 받을 VO 객체 (Mybatis 설정 파일에 기입한 alias 이름)
  • #{value} : 호출될 때 받은 변수를 ParameterType에서 지정한 타입으로 넣어줌
<mapper namespace="userDB">
	<!-- select 쿼리 (1개) -->
	<select id="selectUser" parameterType="string" resultType="UserVO">
		select * from user_info where user_id=#{value}
	</select>

	<!-- select 쿼리 (ALL) -->
	<select id="selectUserAll" resultType="UserVO">
		select * from user_info;
	</select>

 

 

* insert / update / delete 쿼리

  • <update>, <insert>, <delete> 태그 사용
  • 반환받을 결과가 없으므로 resultType 생략
  • 동적 변수가 여러개라면 VO 객체를 파라미터로 주고, #{value}에 필드명과 동일하게 value 값을 부여
  • resultType 지정 불필요
	<!--  insert 쿼리 -->
	<insert id="insertUser" parameterType="UserVO">
		insert into user_info values(#{user_id}, #{user_pw})
	</insert>

	<!-- update 쿼리 -->	
	<update id="updateUser" parameterType="userVO">
		update user_info set user_pw=#{user_pw} where user_id=#{user_id}
	</update>
	
	<!-- delete 쿼리 -->
	<delete id="deleteUser" parameterType="String">
		delete from user_info where user_id=#{value}
	</delete>
</mapper>

 

 

 


 

 

3. 코드에서 쿼리 수행

 

먼저 DB작업을 수행할 DAO 클래스를 하나 만들어주면서 @repository 어노테이션을 통해 루트 컨테이너의 빈(Bean) 객체로 등록해줍니다. 그리고 SqlSessionTemplate 객체를 하나 만들어서 역시 어노테이션을 통해 자동 의존성 주입을 받습니다. 혹시 이 부분이 헷갈리시는 분은 윗쪽의 링크글들을 참조하시면 됩니다.

 

package com.hsweb.springweb;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;

@Repository("userDAO")
public class UserDAO {

	@Resource(name="sqlSessoinTemplate")
	private SqlSessionTemplate session;
    
    
}

 

 

 

* select 쿼리 실행

 

  • 결과 데이터가 1개인 경우 : resultType selectOne("namespace.id", parameter)
  • 결과 데이터가 1개 이상인 경우 : List<resultType> select List("namespace.id", parameter)

그밖에도 Map 타입으로 받을 수도 있고 몇 가지가 더 있습니다. 'resultType, namesapce, id'는 mapper 파일에 기입한 정보를 그대로 붙여넣기해서 쓰면 됩니다.

 

	<!-- select 쿼리 (1개) -->
	<select id="selectUser" parameterType="string" resultType="UserVO">
		select * from user_info where user_id=#{value}
	</select>

	<!-- select 쿼리 (ALL) -->
	<select id="selectUserAll" resultType="UserVO">
		select * from user_info;
	</select>
package com.hsweb.springweb;

import java.util.List;
import javax.annotation.Resource;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

@Repository("userDAO")
public class UserDAO {

	@Resource(name="sqlSessoinTemplate")
	private SqlSessionTemplate session;
	
	// 1개만 select
	public UserVO select(String id) {

		UserVO user = session.selectOne("userDB.selectUser", id);
		return user;
	}
	
	// 여러 개 select
	public List<UserVO> selectAll() {
		
		List<UserVO> userList = session.selectList("userDB.selectUserAll");
		return userList;		
	}
}

 

 

 

잘 되는지 테스트해보면 정상적으로 쿼리가 작동하는 것을 확인할 수 있습니다.

 

package com.hsweb.springweb;

import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/board")
public class HomeController {

	// 루트 컨테이너에서 DAO 객체를 가져와 저장
	@Resource(name = "userDAO")
	private UserDAO dao;

	// "/list" URI에 대한 요청 처리
	@RequestMapping(value = "/list")
	public String home() {

		// 1개만 검색
		UserVO vo1 = dao.select("codevang");
		System.out.println("1개 검색" + vo1.getUser_id() + " : " 
					+ vo1.getUser_pw());

		
		
		// 1개 이상 검색
		List<UserVO> vo2 = dao.selectAll();
		for(int i = 0; i < vo2.size(); i++) {
			
			System.out.println("여러개 검색" + vo2.get(i).getUser_id() 
					+ " : " + vo2.get(i).getUser_pw());
		}
		
		return "/board/list";
	}
}

 

 

 

* insert / update / delete 쿼리

 

리턴값이 없다는 것 외에는 select와 사용 방법이 동일합니다. mapper 파일에 작성한 쿼리위치와, 파라미터로 설정한 VO 객체 또는 변수만 잘 넣어주면 설정한 쿼리대로 실행시켜 줍니다. 트랜젝션 처리는 다음글에서 다루도록 하겠습니다. 

 

	<!--  insert 쿼리 -->
	<insert id="insertUser" parameterType="UserVO">
		insert into user_info values(#{user_id}, #{user_pw})
	</insert>

	<!-- update 쿼리 -->	
	<update id="updateUser" parameterType="userVO">
		update user_info set user_pw=#{user_pw} where user_id=#{user_id}
	</update>
	
	<!-- delete 쿼리 -->
	<delete id="deleteUser" parameterType="String">
		delete from user_info where user_id=#{value}
	</delete>
package com.hsweb.springweb;

import javax.annotation.Resource;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

@Repository("userDAO")
public class UserDAO {

	@Resource(name="sqlSessoinTemplate")
	private SqlSessionTemplate session;
	
	// insert
	void insertUser() {
		UserVO vo = new UserVO();
		vo.setUser_id("codevangDB");
		vo.setUser_pw("P@ssw0rd");
		session.insert("userDB.insertUser", vo);
	}
	
	// update
	void updateUser() {
		UserVO vo = new UserVO();
		vo.setUser_id("codevang2");
		vo.setUser_pw("testPassword");
		session.update("userDB.updateUser", vo);
		
	}
	
	// delete
	void deleteUser() {
		session.delete("userDB.deleteUser", "codevangDB");
	}
}

 

728x90

댓글

💲 추천 글