JAVA๋ฅผ ์žก์•„๋ผ!...

Spring Framework_DAO_MyBatis ๋ณธ๋ฌธ

Spring

Spring Framework_DAO_MyBatis

onivv 2024. 3. 25. 15:26

๐Ÿ“Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์„ ์œ„ํ•œ ๊ธฐ์ˆ  3๊ฐ€์ง€

 

์ค‘๊ฐ„ ํ”„๋กœ์ ํŠธ_Servlet + JSP (DBMS : Oracle)

  • [ver1] JDBCUtil ํด๋ž˜์Šค๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•ด JDBC ์—ฐ๊ฒฐ ๋ฐ ๊ด€๋ จ ์ž‘์—…์„ ์บก์Аํ™”ํ•ด ์‘์ง‘๋„๋ฅผ ๋†’์ž„

์ตœ์ข… ํ”„๋กœ์ ํŠธ_+ Spring Framework + MyBatis Framework (DBMS : MySQL)

  • [ver2] JdbcTemplate ํŒจํ„ด ์‚ฌ์šฉ. ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…(JDBC์—ฐ๊ฒฐ๋กœ์ง)์„ ํ…œํ”Œ๋ฆฟํ™”ํ•ด ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉ
  • [ver3] MyBatis๋Š” JDBC ์ฝ”๋“œ๋ฅผ ๋Œ€์‹ ํ•ด SQL๊ณผ JAVA ๊ฐ์ฒด๊ฐ„์˜ ๋งคํ•‘์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
    RowMapper์™€ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•ด์คŒ
    RowMapper ์ธํ„ฐํŽ˜์ด์Šค_mapRow(ResultSet rs, int rowNum) ๋ฉ”์„œ๋“œ
    ResultSet(SQL ์ฟผ๋ฆฌ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ)์—์„œ ๊ฐ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์ž๋ฐ” ๊ฐ์ฒด(DTO, ์—”ํ‹ฐํ‹ฐ, ์ปค๋งจ๋“œ ๊ฐ์ฒด, POJO)์˜ ๊ฐ ํ•„๋“œ์— ์„ค์ •

 

[ver2] ↓

 

https://onivv.tistory.com/143

 

Spring Framework_DAO_JdbcTemplate

[ JdbcTemplate์„ ํ™œ์šฉํ•œ DAO version upgrade ] ๊ธฐ์กด DAO์— ํ…œํ”Œ๋ฆฟ ํŒจํ„ด์„ ํ™œ์šฉํ•œ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€ JdbcTemplate : ํ…œํ”Œ๋ฆฟ ํŒจํ„ด์„ ํ™œ์šฉํ•œ ํด๋ž˜์Šค ๋ฐ˜๋ณต๋˜๋Š” JDBC์˜ ๋กœ์ง(DB์—ฐ๊ฒฐ → SQL ์ƒ์„ฑ →

onivv.tistory.com

 

ํ˜„์žฌ SQL๋ฌธ์ด JAVA ์ฝ”๋“œ์— ์ž‘์„ฑ๋˜์–ด์žˆ์Œ

์˜ˆ์‹œ ์ฝ”๋“œ (WishListDAO.java)

๋ฌธ์ œ

  • SQL๋ฌธ์— ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒ(A์— ๋Œ€ํ•œ ๋ณ€ํ™”์ธ๋ฐ)๋˜์—ˆ์„๋•Œ, ํŒŒ์ผ์„ ์žฌ์ปดํŒŒ์ผํ•ด์•ผ๋งŒํ•จ(B๋„ ์˜ํ–ฅ์„๋ฐ›์Œ)
    → ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๋‹ค. ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค. 

ํ•ด๊ฒฐ

  • ์‘์ง‘๋„๋ฅผ ๋†’์—ฌ์•ผํ•จ == ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ
      SQL๋ฌธ์„ .javaํŒŒ์ผ ์™ธ๋ถ€์— ์ž‘์„ฑํ•˜๊ธฐ
  • ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ ค์™€์•ผํ•˜๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ค์ •ํŒŒ์ผ .xml์— ์ž‘์„ฑํ•˜์ž!
    MyBatis ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ค์ •ํŒŒ์ผ == SQL์„ ์ €์žฅํ•œ๋Š” ํŒŒ์ผ == mapper.xml

[ MyBatis ํ”„๋ ˆ์ž„์›Œํฌ - ์žฅ์  ]

  1. ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Œ : SQL์€ .xml์—, JAVA๋Š” .java์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ
  2. ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Œ : SQL์„ ๋ณ€๊ฒฝํ•ด๋„, JAVA ์žฌ์ปดํŒŒ์ผ์ด ํ•„์š” ์—†์Œ
  3. id๊ฐœ๋…์ด ์ƒ๊ฒจ์„œ searchCondition์ด ํ•„์š”์—†์Œ

โœ”๏ธ MyBatis ์˜์กด์„ฑ ์ถ”๊ฐ€

build.gradle

 

 

โœ”๏ธ MyBatis๊ฐ€ XML ๋งคํผ ํŒŒ์ผ์„ ์ฝ์–ด์•ผํ•˜๋ฏ€๋กœ, 'application.properties'์— mapper ํŒŒ์ผ ์œ„์น˜ ์ง€์ •

  • classpath(src/main/resources) > mapperํด๋” > ๋ชจ๋“ .xmlํŒŒ์ผ
  • mapper๋ผ๋Š” ์• ๋Š” ๋ชจ๋“  xml์„ ์˜๋ฏธํ•˜๋Š”๊ตฌ๋‚˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ

application.properties

 

โœ”๏ธ SQL๋ฌธ์„ ์ž‘์„ฑํ•  xml ํŒŒ์ผ ์ž‘์„ฑ

mapper.xml์˜ ์‹œ์ž‘ ์Šคํ‚ค๋งˆ & ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ โญ

  • MyBatisํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ค์ •ํŒŒ์ผ == SQL์„ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ == mapper.xml 

 

โœ”๏ธ  MyBatis ๋งคํผ๋Š” Interface ์‚ฌ์šฉ!

 

  • ibatis๊ฐ€ ์ง€๊ธˆ์˜ mybatis์‹œ์ดˆ..
    ibatis == mybatis
    ์˜›๋‚ ์— ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๊ตฌ๋‚˜..!
  • ์ธํ„ฐํŽ˜์ด์Šค์˜€๋˜ DAO๊ฐ€ @Mapper๋ฅผ ํ†ตํ•ด ๊ฐ์ฒดํ™”๋๊ธฐ๋•Œ๋ฌธ์—,
    Service์—์„œ InterfaceSerialDAO๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋จ

๊ธฐ์กด_SerialServiceIml.java

  • ๊ธฐ์กด์—๋Š” JdbcTemplate์„ ์‚ฌ์šฉํ•˜๋Š” DAO๋ฅผ ์˜์กด์ฃผ์ž…ํ•ด์„œ Service๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ

  • namespace ์†์„ฑ = ๋ˆ„๊ตฌ์™€ mapper๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ธ์ง€ ์ž‘์„ฑํ•˜๋Š” ๊ณต๊ฐ„
  • id ์†์„ฑ = ์–ด๋–ค ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๋ฉ”์„œ๋“œ๋ช… ์ •ํ™•ํžˆ ๊ธฐ์ž…
  • resultType ์†์„ฑ = ๋ˆ„๊ตฌ๋ฅผ ๋ฐ˜ํ™˜ํžˆ๋Š”์ง€ ์ž‘์„ฑ
  • parameterType ์†์„ฑ = ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…

++ parameterType

Map<String, Object>

SQL๋ฌธ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋“ฑ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด Map ์‚ฌ์šฉ

 

SerialDAO.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.webWeavers.weaveGlow.biz.serial.ISerialDAO">
	<select id="selectAllOrderList" resultType="com.webWeavers.weaveGlow.biz.serial.SerialDTO">
		WITH BS AS (
			SELECT
				SERIAL_PK,
				COUNT(BUYPRODUCT_PK) - 1 AS CNT
			FROM BUYPRODUCT
			GROUP BY SERIAL_PK
		)
		SELECT
			S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS, S.MEMBER_ID, M.MEMBER_NAME,
			BS.CNT, MAX(P.PRODUCT_NAME) AS PRODUCT_NAME,
			SUM(P.PRODUCT_PRICE * B.BUYPRODUCT_CNT) AS TOTALPRICE
		FROM SERIAL S
		LEFT JOIN BUYPRODUCT B ON S.SERIAL_PK = B.SERIAL_PK
		LEFT JOIN BS ON S.SERIAL_PK = BS.SERIAL_PK
		LEFT JOIN PRODUCT P ON B.PRODUCT_PK = P.PRODUCT_PK
		LEFT JOIN MEMBER M ON S.MEMBER_ID = M.MEMBER_ID
		GROUP BY S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS, S.MEMBER_ID, M.MEMBER_NAME, BS.CNT
		ORDER BY S.SERIAL_PK DESC
	</select>
	
	<select id="selectAllOrderProduct" resultType="com.webWeavers.weaveGlow.biz.serial.SerialDTO">
		SELECT
			S.SERIAL_PK, S.SERIAL_REGDATE, M.MEMBER_NAME,
			P.PRODUCT_NAME, B.BUYPRODUCT_CNT,
			(P.PRODUCT_PRICE * B.BUYPRODUCT_CNT) AS TOTALPRICE
		FROM SERIAL S
		LEFT JOIN BUYPRODUCT B ON S.SERIAL_PK = B.SERIAL_PK
		LEFT JOIN PRODUCT P ON B.PRODUCT_PK = P.PRODUCT_PK
		LEFT JOIN MEMBER M ON S.MEMBER_ID = M.MEMBER_ID
		WHERE S.SERIAL_PK = #{serialPK}
		ORDER BY B.BUYPRODUCT_PK DESC
	</select>
	
	<select id="selectAllOrderSearch" resultType="com.webWeavers.weaveGlow.biz.serial.SerialDTO">
		WITH BS AS (
			SELECT
				SERIAL_PK,
				COUNT(BUYPRODUCT_PK) - 1 AS CNT
			FROM BUYPRODUCT
			GROUP BY SERIAL_PK
		)
		SELECT
			S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS,
			S.MEMBER_ID, M.MEMBER_NAME,
			BS.CNT, MAX(P.PRODUCT_NAME) AS PRODUCT_NAME,
			SUM(P.PRODUCT_PRICE * B.BUYPRODUCT_CNT) AS TOTALPRICE
		FROM SERIAL S
		LEFT JOIN BUYPRODUCT B ON S.SERIAL_PK = B.SERIAL_PK
		LEFT JOIN BS ON S.SERIAL_PK = BS.SERIAL_PK
		LEFT JOIN PRODUCT P ON B.PRODUCT_PK = P.PRODUCT_PK
		LEFT JOIN MEMBER M ON S.MEMBER_ID = M.MEMBER_ID
		WHERE 
			S.SERIAL_STATUS LIKE CONCAT('%',#{serialStatus},'%')
			AND M.MEMBER_NAME LIKE CONCAT('%',#{memberName},'%')
			AND DATE(S.SERIAL_REGDATE) LIKE CONCAT('%',#{serialRegdate},'%')
		GROUP BY S.SERIAL_PK, S.SERIAL_REGDATE, S.SERIAL_STATUS, S.SERIAL_DELIVERYADDRESS, S.MEMBER_ID, M.MEMBER_NAME, BS.CNT
		ORDER BY S.SERIAL_PK DESC
	</select>
			
	<insert id="insert">
		INSERT INTO SERIAL (MEMBER_ID, SERIAL_DELIVERYADDRESS) VALUES (#{param1}, #{param2})
	</insert>
	
	<update id="update">
		UPDATE SERIAL SET SERIAL_STATUS = #{serialStatus} WHERE SERIAL_PK = #{serialPK}
	</update>
	
</mapper>

 

ISerialDAO.java (๋งคํ•‘ํ•  DAO)

package com.webWeavers.weaveGlow.biz.serial;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ISerialDAO {
	
	// ์ „์ฒด ์ฃผ๋ฌธํ˜„ํ™ฉ_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€
	public List<SerialDTO> selectAllOrderList();
	
	// ์ฃผ๋ฌธ๋ฒˆํ˜ธ๋ณ„ ์ƒํ’ˆํ˜„ํ™ฉ_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€
	public List<SerialDTO> selectAllOrderProduct(Map<String, Object> map);
	
	// ์ฃผ๋ฌธ๊ฒ€์ƒ‰_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€	
	public List<SerialDTO> selectAllOrderSearch(Map<String, Object> map);

	// ์ฃผ๋ฌธ์ถ”๊ฐ€_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€	
	// ์ •์„
	public int insert(String memberID, String serialDeliveryAddress);
	
	// ์ฃผ๋ฌธ์ƒํƒœ๋ณ€๊ฒฝ_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€	
	// ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” SQL๋ฌธ์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋‹ฌ์งˆ ์ˆ˜ ์žˆ์Œ > ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” Map์„ ์ธ์ž๋กœ ์ฃผ๋Š” ๊ฒฝ์šฐ
	public int update(Map<String, Object> map);	
	
}

 

SerialService.java (Interface)

package com.webWeavers.weaveGlow.biz.serial;

import java.util.List;

public interface SerialService {
	List<SerialDTO> selectAll(SerialDTO serialDTO);
//	SerialDTO selectOne(SerialDTO serialDTO);
	
	boolean insert(SerialDTO serialDTO);
	boolean update(SerialDTO serialDTO);
//	boolean delete(SerialDTO serialDTO);
}

 

SerialServiceImpl.java (Interface ๊ตฌํ˜„)

package com.webWeavers.weaveGlow.biz.serial;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("serialService")
public class SerialServiceImpl implements SerialService {

	@Autowired
	private ISerialDAO serialDAO;

	@Override
	public List<SerialDTO> selectAll(SerialDTO serialDTO) {
		// ์ „์ฒด ์ฃผ๋ฌธํ˜„ํ™ฉ_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€
		if (serialDTO.getSearchCondition().equals("orderList")) {
			return serialDAO.selectAllOrderList();
		}
		// ์ฃผ๋ฌธ๋ฒˆํ˜ธ๋ณ„ ์ƒํ’ˆํ˜„ํ™ฉ_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€
		else if (serialDTO.getSearchCondition().equals("orderProduct")) {
			Map<String, Object> map = new HashMap<String, Object>();	
			map.put("serialPK", serialDTO.getSerialPK());
			return serialDAO.selectAllOrderProduct(map);
		}
		// ์ฃผ๋ฌธ๊ฒ€์ƒ‰_(๊ด€๋ฆฌ์ž)์ฃผ๋ฌธ๊ด€๋ฆฌํŽ˜์ด์ง€	
		else if (serialDTO.getSearchCondition().equals("orderSearch")) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("serialStatus", serialDTO.getSerialStatus());
			map.put("memberName", serialDTO.getMemberName());
			map.put("serialRegdate", serialDTO.getSerialRegdate());
			return serialDAO.selectAllOrderSearch(map);
		}
		return null;
	}

//	@Override
//	public SerialDTO selectOne(SerialDTO serialDTO) {
//		return serialDAO.selectOne(serialDTO);
//	}

	// ์ •์„
	@Override
	public boolean insert(SerialDTO serialDTO) {
		int result = serialDAO.insert(serialDTO.getMemberID(), serialDTO.getSerialDeliveryAddress());
		if (result <= 0) {
			return false;
		}
		return true;
	}

	// ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” SQL๋ฌธ์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋‹ฌ์งˆ ์ˆ˜ ์žˆ์Œ > ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” Map์„ ์ธ์ž๋กœ ์ฃผ๋Š” ๊ฒฝ์šฐ
	@Override
	public boolean update(SerialDTO serialDTO) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("serialStatus", serialDTO.getSerialStatus());
		map.put("serialPK", serialDTO.getSerialPK());
		if (serialDAO.update(map) <= 0) {
			return false;
		}
		return true;
	}

//	@Override
//	public boolean delete(SerialDTO serialDTO) {
//		return false;
//	}

}

'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Boot_Validation  (0) 2024.03.13
Spring Boot_Lombok_@Data  (0) 2024.03.12
Spring Boot_MVC data ์ „๋‹ฌ, +@PathVariable  (0) 2024.03.11
Spring Boot_Gradle Project  (0) 2024.03.07
Spring Framework_์ปค๋งจ๋“œ ๊ฐ์ฒด(Command Object)  (0) 2024.03.07