Mybatis๋ฅผ ํ™œ์šฉํ•œ CRUD (CRUD with Mybatis)

JOY๐ŸŒฑยท2023๋…„ 1์›” 26์ผ
1

๐Ÿฆ MyBatis

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail

๐Ÿ’โ€โ™€๏ธ CRUD๋ž€,
๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ธ Create(์ƒ์„ฑ), Read(์ฝ๊ธฐ), Update(๊ฐฑ์‹ ), Delete(์‚ญ์ œ)๋ฅผ ๋ฌถ์–ด์„œ ์ผ์ปซ๋Š” ๋ง


๐Ÿ“Œ ์ดˆ๊ธฐ Setting

  • lib ํด๋”์— ojdbc8.jar / mybatis-3.5.11.jar ํŒŒ์ผ ์‚ฝ์ž…
  • Classpath์— ojdbc8.jar / mybatis-3.5.11.jar ํŒŒ์ผ ์ถ”๊ฐ€

๐Ÿ“Œ Ref. mybatis.jar ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
mybatis-3.5.11.jar


๐Ÿ‘€ XMLconfig ๋ฐฉ์‹

๐Ÿ’โ€ ๋‚˜์—ด๋œ ํด๋ž˜์Šค ๋ฐ ํŒŒ์ผ ์ˆœ์„œ๊ฐ€ ๊ณง ์ž‘์„ฑ ์ˆœ์„œ์ด๋ฏ€๋กœ, ํ๋ฆ„ ์ž˜ ํŒŒ์•…ํ•˜๊ธฐ ๐Ÿ”ฅ์ค‘์š”๐Ÿ”ฅ
(์ž์„ธํ•œ ์ž‘์„ฑ ์ˆœ์„œ๋Š” [ ] ์•ˆ์— ์žˆ๋Š” ์„ค๋ช…์„ ์ฐธ๊ณ ํ•  ๊ฒƒ)

๐Ÿ‘‰ mybatis-config.xml

Mybatis์—์„œ '์‹œ์ž‘ํ•˜๊ธฐ' > 'XML์—์„œ SqlSessionFactory ๋นŒ๋“œํ•˜๊ธฐ' ํƒญ ์•„๋ž˜์˜ ํ…œํ”Œ๋ฆฟ์„ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ’ ์ฑ„์›Œ๋„ฃ๊ธฐ

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="dev">
    <environment id="dev">
    
      <transactionManager type="JDBC"/>	<!-- JDBC์™€ MANAGED ์„ ํƒ ๊ฐ€๋Šฅ
    										JDBC : ์ˆ˜๋™ ์ปค๋ฐ‹, MANEGED : ์ž๋™ ์ปค๋ฐ‹ -->
     
      <dataSource type="POOLED">  <!-- POOLED์™€ UNPOOLED ์„ ํƒ ๊ฐ€๋Šฅ
      								POOLED : ์ปค๋„ฅ์…˜ ํ’€ ์‚ฌ์šฉ, UNPOOLED : ์ปค๋„ฅ์…˜ํ’€ ๋ฏธ์‚ฌ์šฉ -->
                                    
        <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
        <property name="username" value="C##GREEDY"/>
        <property name="password" value="GREEDY"/>
        
      </dataSource>
    </environment>
  </environments>
  <mappers> <!-- ๋งคํ•‘์„ ์œ„ํ•ด mapper ๋“ฑ๋ก -->
  <mapper resource="com/greedy/section01/xmlconfig/menu-mapper.xml"/>
  </mappers>
  
</configuration>

๐Ÿ‘‰ Template

public class Template {
	
	>>> 'SqlSessionFactory'๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์กด์žฌํ•ด์•ผํ•จ
	>>> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ๋˜๋Š” ๋™์•ˆ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ SqlSessionFactory๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ํ˜•ํƒœ
	>>> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ฝ”ํ”„๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ '์‹ฑ๊ธ€ํ†ค ํŒจํ„ด'์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ
    
    // '์‹ฑ๊ธ€ํ†คํŒจํ„ด'์„ ์œ„ํ•ด ํ•„๋“œ(๊ณต๊ฐ„) ์ƒ์„ฑ
	private static SqlSessionFactory sqlSessionFactory;

	public static SqlSession getSqlSession() {
		
		if(sqlSessionFactory == null) { // ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด 
										// try-catch๋ฌธ์„ ์ด ์กฐ๊ฑด์˜ if๋ฌธ์œผ๋กœ ๊ฐ์‹ธ๊ธฐ 
										// ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ ์ดํ›„๋กœ๋Š” null์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์‹œ build๋ฅผ ์ˆ˜ํ–‰ X
                                        >>> '์‹ฑ๊ธ€ํ†คํŒจํ„ด'
			try {
				String resource = "com/greedy/section01/xmlconfig/mybatis-config.xml";
				InputStream inputStream = Resources.getResourceAsStream(resource);
		
				>>> 'SqlSessionFacoryBuilder๋Š” ์ƒ์„ฑ ํ›„ ์œ ์ง€ํ•  ํ•„์š” X
				>>> ๋”ฐ๋ผ์„œ '๋ฉ”์†Œ๋“œ ์Šค์ฝ”ํ”„'๋กœ ์ƒ์„ฑ
                
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	>>> 'SqlSession'์€ ์š”์ฒญ ์‹œ๋งˆ๋‹ค ์ƒ์„ฑํ•ด์•ผํ•จ
	>>> SqlSession์€ ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ ๋˜์ง€ ์•Š์•„์•ผํ•จ
	>>> ์š”์ฒญ ์‹œ ์ƒ์„ฑํ•˜๊ณ  ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด closeํ•˜๋Š” HTTP์š”์ฒญ๊ณผ ์œ ์‚ฌํ•œ ์Šค์ฝ”ํ”„์— ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•
    >>> (๋”ฐ๋ผ์„œ Service์—์„œ getSqlSession()๋ฉ”์†Œ๋“œ๋กœ SqlSession๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‚ฌ์šฉํ•œ ๋’ค, ๊ทธ ์Šค์ฝ”ํ”„์—์„œ ๋ฐ˜๋‚ฉ)
    
	SqlSession sqlSession = sqlSessionFactory.openSession(false);
	
    // sqlSession ์‚ฌ์šฉํ•œ ํ›„ ๋ฐ˜๋‚ฉ
 	return sqlSession; 
	}
}

๐Ÿ“Œ Ref.

* singleton(์‹ฑ๊ธ€ํ†ค)
  : ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณด์žฅ

๐Ÿ‘‰ MenuDTO

private int menuCode;
private String menuName;
private int menuPrice;
private int categoryCode;
private String orderableStatus;

/* ๊ธฐ๋ณธ ์ƒ์„ฑ์ž, ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒ์„ฑ์ž */
...

/* getter & setter */
...

/* toString */
...

๐Ÿ‘‰ Application

Scanner sc = new Scanner(System.in);
MenuController menucontroller = new MenuController();
		
do {
	System.out.println("===== ๋ฉ”๋‰ด ๊ด€๋ฆฌ =====");
	System.out.println("1. ๋ฉ”๋‰ด ์ „์ฒด ์กฐํšŒ");
	System.out.println("2. ๋ฉ”๋‰ด ์ฝ”๋“œ๋กœ ๋ฉ”๋‰ด ์กฐํšŒ");
	System.out.println("3. ์‹ ๊ทœ ๋ฉ”๋‰ด ์ถ”๊ฐ€");
	System.out.println("4. ๋ฉ”๋‰ด ์ˆ˜์ •");
	System.out.println("5. ๋ฉ”๋‰ด ์‚ญ์ œ");
	System.out.print("๋ฉ”๋‰ด ๊ด€๋ฆฌ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ : ");
	int no = sc.nextInt();
			
	switch(no) {
	case 1: menucontroller.selectAllMenu(); break; // [MenuController ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ selectAllMenu()๋ฉ”์†Œ๋“œ ์ƒ์„ฑ]
	case 2: menucontroller.selectMenuByCode(inputMenuCode()); break; 
    		// ์•„๋ž˜์˜ inputMenuCode() ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด selectMenuByCode()์˜ ์ธ์ž๋กœ ๋„˜์–ด๊ฐ 
	case 3: menucontroller.registMenu(inputMenu()); break;
	case 4: menucontroller.updateMenu(inputModifyMenu()); break;
	case 5: menucontroller.deleteMenu(inputMenuCode()); break;
	default : System.out.println("์ž˜๋ชป ๋œ ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•˜์…จ์Šต๋‹ˆ๋‹ค.");
	}
} while(true);	
}

โ—ผ ๋ฉ”๋‰ด ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ Map์œผ๋กœ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ MenuController๋กœ ๋„˜๊ธฐ๋Š” ๋ฉ”์†Œ๋“œ

	private static Map<String, String> inputMenuCode(){
		
		Scanner sc = new Scanner(System.in);
		System.out.print("๋ฉ”๋‰ด ์ฝ”๋“œ ์ž…๋ ฅ : ");
		String code = sc.nextLine();
		
		Map<String, String> parameter = new HashMap<>();
		parameter.put("code", code);
		
		return parameter;
	}

โ—ผ ๋ฉ”๋‰ด ์ด๋ฆ„, ๊ฐ€๊ฒฉ, ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ Map์œผ๋กœ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ MenuController๋กœ ๋„˜๊ธฐ๋Š” ๋ฉ”์†Œ๋“œ

	private static Map<String, String> inputMenu() {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("๋ฉ”๋‰ด ์ด๋ฆ„ : ");
		String name = sc.nextLine();
		System.out.print("๋ฉ”๋‰ด ๊ฐ€๊ฒฉ : ");
		String price = sc.nextLine();
		System.out.print("์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ : ");
		String CategoryCode = sc.nextLine();
		
		Map<String, String> parameter = new HashMap<>();
		parameter.put("name", name);
		parameter.put("price", price);
		parameter.put("categoryCode", CategoryCode);
		
		return parameter;
	}

โ—ผ ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”๋‰ด์˜ ๋ฉ”๋‰ด ์ฝ”๋“œ ๋ฐ ์ด๋ฆ„, ๊ฐ€๊ฒฉ, ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ Map์œผ๋กœ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ MenuController๋กœ ๋„˜๊ธฐ๋Š” ๋ฉ”์†Œ๋“œ

	private static Map<String, String> inputModifyMenu() {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("์ˆ˜์ •ํ•  ๋ฉ”๋‰ด์˜ ๋ฉ”๋‰ด ์ฝ”๋“œ : ");
		String code = sc.nextLine();
		System.out.print("์ˆ˜์ •ํ•  ๋ฉ”๋‰ด ์ด๋ฆ„ : ");
		String name = sc.nextLine();
		System.out.print("์ˆ˜์ •ํ•  ๋ฉ”๋‰ด ๊ฐ€๊ฒฉ : ");
		String price = sc.nextLine();
		System.out.print("์ˆ˜์ •ํ•  ์นดํ…Œ๊ณ ๋ฆฌ ์ฝ”๋“œ : ");
		String CategoryCode = sc.nextLine();
		
		Map<String, String> parameter = new HashMap<>();
		parameter.put("code", code);
		parameter.put("name", name);
		parameter.put("price", price);
		parameter.put("categoryCode", CategoryCode);
		
		return parameter;
	}

๐Ÿ‘‰ MenuController

๐Ÿ’โ€ Controller์˜ ์—ญํ• 

  • View์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ •๋ณด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์œผ๋ฉด ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’๋“ค์„ ๊ฒ€์ฆ / ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ€๊ณต
  • Service๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค์— ๋‹ด๊ณ  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  • ํ˜ธ์ถœํ•œ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์•„ ์–ด๋– ํ•œ View๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •
public class MenuController {

	/* final๋กœ ์„ ์–ธ ํ›„ ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•  ๊ฒƒ */
	private final MenuService menuService;	// [MenuService ํ•„๋“œ ์„ ์–ธ ํ›„ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ]
	private final PrintResult printResult;	// [PrintResult ํ•„๋“œ ์„ ์–ธ ํ›„ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ]
	
    /* ์ž‘์„ฑ๋œ ํ•„๋“œ ์ดˆ๊ธฐํ™” */
	public MenuController() {
		menuService = new MenuService();
		printResult = new PrintResult();
	}

โ—ผ '1. ๋ฉ”๋‰ด ์ „์ฒด ์กฐํšŒ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public void selectAllMenu() {
		
		List<MenuDTO> menuList = menuService.selectAllMenu(); 
        // [menuService ํด๋ž˜์Šค ์ƒ์„ฑํ•˜์—ฌ selectAllMenu()๋ฉ”์†Œ๋“œ ์ƒ์„ฑ]
		
		/* ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ Result View */
		if(menuList != null) {
			printResult.printMenuList(menuList);
		} else {
			printResult.printErrorMessage("selectList");
		}
		
	}

โ—ผ '2. ๋ฉ”๋‰ด ์ฝ”๋“œ๋กœ ๋ฉ”๋‰ด ์กฐํšŒ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public void selectMenuByCode(Map<String, String> parameter) {
		
		/* ์ „๋‹ฌ๋˜๋Š” parameter๋Š” String์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— int๋กœ parsing */
		int code = Integer.parseInt(parameter.get("code"));
		
		MenuDTO menu = menuService.selectMenuByCode(code); 
        // [menuService์— selectMenuByCode() ๋ฉ”์†Œ๋“œ ๋งŒ๋“ค๋ฉด์„œ ์ธ์ž์ „๋‹ฌ]
		
		if(menu != null) {
			printResult.printMenu(menu);
		} else {
			printResult.printErrorMessage("selectOne");
		}
	}

โ—ผ '3. ์‹ ๊ทœ ๋ฉ”๋‰ด ์ถ”๊ฐ€'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public void registMenu(Map<String, String> parameter) {
		
		/* ์ „๋‹ฌ๋˜๋Š” parameter๋Š” String์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— int๋กœ parsing */
		/* ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฏ€๋กœ MenuDTO๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌ */
		MenuDTO menu = new MenuDTO();
		menu.setMenuName(parameter.get("name"));
		menu.setMenuPrice(Integer.parseInt(parameter.get("price")));
		menu.setCategoryCode(Integer.parseInt(parameter.get("categoryCode")));
		
		if(menuService.registMenu(menu)) { // [menuService์— registMenu()๋ฉ”์†Œ๋“œ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ธ์ž์ „๋‹ฌ]
			printResult.printSuccessMessage("insert"); // [printResult์— printSuccessMessage() ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ]
		} else {
			printResult.printErrorMessage("insert");
		}
		
	}

โ—ผ '4. ๋ฉ”๋‰ด ์ˆ˜์ •'์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public void updateMenu(Map<String, String> parameter) {
		
		/* ์ „๋‹ฌ๋˜๋Š” parameter๋Š” String์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— int๋กœ parsing */
		/* ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฏ€๋กœ MenuDTO๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌ */
		MenuDTO menu = new MenuDTO();
		menu.setMenuCode(Integer.parseInt(parameter.get("code")));
		menu.setMenuName(parameter.get("name"));
		menu.setMenuPrice(Integer.parseInt(parameter.get("price")));
		menu.setCategoryCode(Integer.parseInt(parameter.get("categoryCode")));
		
		if(menuService.modifyMenu(menu)) {
			printResult.printSuccessMessage("update"); 
		} else {
			printResult.printErrorMessage("update");
		}
		
	}

โ—ผ '5. ๋ฉ”๋‰ด ์‚ญ์ œ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public void deleteMenu(Map<String, String> parameter) {
		
        /* ์ „๋‹ฌ๋˜๋Š” parameter๋Š” String์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— int๋กœ parsing */
		int code = Integer.parseInt(parameter.get("code"));
        
        /* DELETE๋Š” DTO๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” X */
		
		if(menuService.deleteMenu(code)) {
			printResult.printSuccessMessage("delete"); 
		} else {
			printResult.printErrorMessage("delete");
		}
	}
}

๐Ÿ‘‰ MenuService

๐Ÿ’โ€ Service์˜ ์—ญํ• 

  • SqlSession(Connection) ์ƒ์„ฑ
  • DAO์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
    : ๋…ผ๋ฆฌ์ ์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ฌถ์ธ ๋ฉ”์†Œ๋“œ๋“ค์„ ๋ชจ๋‘ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ ํ•  ์ˆ˜๋„ ์žˆ์Œ
  • ํŠธ๋žœ์žญ์…˜ ์ œ์–ด (commit, rollback)
  • SqlSession(Connection) ๋ฐ˜๋‚ฉ
public class MenuService {
	
	private final MenuDAO menuDAO; // [MenuDAO ํด๋ž˜์Šค ์ƒ์„ฑ]
	
	public MenuService() {
		menuDAO = new MenuDAO();
	}

โ—ผ '1. ๋ฉ”๋‰ด ์ „์ฒด ์กฐํšŒ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public List<MenuDTO> selectAllMenu() {
		
		/* SqlSession ํ˜ธ์ถœ (getConnection()๊ณผ ๊ฐ™์Œ) */
		SqlSession sqls = getSqlSession();
	
		List<MenuDTO> menuList = menuDAO.selectAllMenu(sqls); 
        // [menuDAO์— selectAllMenu()๋ฉ”์†Œ๋“œ ์ƒ์„ฑ ๋ฐ ์ธ์ž ์ „๋‹ฌ]
        >>> Service๋Š” ํ•ญ์ƒ DAO์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ SqlSession(Connection) ์ „๋‹ฌ
		
		/* SELECT์ด๋ฏ€๋กœ ํŠธ๋žœ์žญ์…˜(commit, rollback) ํ•„์š” X */
		
		/* ๋ฐ˜๋‚ฉ */
		sqls.close();
		
		/* ๋ฐ˜ํ™˜(์ „๋‹ฌ) */
		return menuList;
	}

โ—ผ '2. ๋ฉ”๋‰ด ์ฝ”๋“œ๋กœ ๋ฉ”๋‰ด ์กฐํšŒ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public MenuDTO selectMenuByCode(int code) {
		
		SqlSession sqls = getSqlSession();
		
		MenuDTO menu = menuDAO.selectMenuByCode(sqls, code);
		
		sqls.close();
		
		return menu;
	}

โ—ผ '3. ์‹ ๊ทœ ๋ฉ”๋‰ด ์ถ”๊ฐ€'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public boolean registMenu(MenuDTO menu) { >>> ๋ฐ˜ํ™˜๊ฐ’์ด true or false์ด๋ฏ€๋กœ booleanํƒ€์ž…
		
		SqlSession sqls = getSqlSession();
		
		/* INSERT ์ด๋ฏ€๋กœ int๋กœ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ */
		int result = menuDAO.insertMenu(sqls, menu); 
        // [menuDAO์— insertMenu()๋ฉ”์†Œ๋“œ ์ƒ์„ฑ ๋ฐ ์ธ์ž๋“ค ์ „๋‹ฌ]
		
		/* ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ */ 
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		} 
         >>> ๋”ฐ๋กœ ํ…œํ”Œ๋ฆฟ์— commit, rollback์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ Mybatis์˜ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ !
		
		sqls.close();
		
		return result > 0 ? true : false;
	}

โ—ผ '4. ๋ฉ”๋‰ด ์ˆ˜์ •'์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public boolean modifyMenu(MenuDTO menu) {
		
		SqlSession sqls = getSqlSession();
		
		/* UPDATE ์ด๋ฏ€๋กœ int๋กœ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ */
		int result = menuDAO.updateMenu(sqls, menu);
		
		/* ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ */
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		sqls.close();
		
		return result > 0 ? true : false;
	}

โ—ผ '5. ๋ฉ”๋‰ด ์‚ญ์ œ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public boolean deleteMenu(int code) {
		
		SqlSession sqls = getSqlSession();
		
		/* DELETE ์ด๋ฏ€๋กœ int๋กœ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ */
		int result = menuDAO.deleteMenu(sqls, code);
		
		/* ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ */
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		sqls.close();
		
		return result > 0 ? true : false;
	}
}

๐Ÿ‘‰ MenuDAO

๐Ÿ’โ€ DAO์˜ ์—ญํ• 

  • ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ทธ์— ์ƒ์‘ํ•˜๋Š” Mybatis์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ mapper.xmlํŒŒ์ผ ํ˜ธ์ถœํ•œ ๋’ค, ๊ทธ๊ฒƒ์„ ๋ฐ˜ํ™˜

Mybatis์˜ ์ž์ฒด ๋ฉ”์†Œ๋“œ๋กœ ์ธํ•ด DAO์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ ์„ ์ผ์ด ํ˜„์ €ํžˆ ์ค„์–ด๋“ค์—ˆ์Œ (ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ์˜ ์žฅ์ )

public class MenuDAO { 

	public List<MenuDTO> selectAllMenu(SqlSession sqls) {

	 /* return sqls.selectList("namespace.id"); */ >>> ์ ‘๊ทผ ๋ฐฉ์‹
		return sqls.selectList("MenuMapper.selectAllMenu"); 
        // ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด MenuDTO์˜ ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ selectList()๋ฉ”์†Œ๋“œ ํ™œ์šฉ
		// ๊ด„ํ˜ธ ์•ˆ์—๋Š” ์–ด๋–ค ์ฟผ๋ฆฌ๋ฌธ์„ ์ „๋‹ฌํ•  ๊ฒƒ์ธ์ง€ ์ž‘์„ฑ ("namespace.id") *menu-mapper.xml ์ฐธ๊ณ 
	}

	public MenuDTO selectMenuByCode(SqlSession sqls, int code) {
		
		return sqls.selectOne("MenuMapper.selectMenuByCode", code); 
        // "MenuMapper.selectMenuByCode" : ์กฐํšŒํ•˜๊ณ ์žํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ
		// code : ์ˆ˜ํ–‰ ์‹œ, ์‚ฌ์šฉ๋ ๋งŒํ•œ ์ถ”๊ฐ€์ ์ธ ๊ฐ’
	}

	public int insertMenu(SqlSession sqls, MenuDTO menu) {

		return sqls.insert("MenuMapper.insertMenu", menu); 
	}

	public int updateMenu(SqlSession sqls, MenuDTO menu) {

		return sqls.update("MenuMapper.updateMenu", menu);
	}

	public int deleteMenu(SqlSession sqls, int code) {

		return sqls.delete("MenuMapper.deleteMenu", code);
	}
}

๐Ÿ‘‰ menu-mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MenuMapper">

	<!-- ์กฐํšŒํ•œ ์ปฌ๋Ÿผ๊ณผ DTO๋ฅผ ๋งคํ•‘(์—ฐ๊ฒฐ)์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์„ค์ •์œผ๋กœ resultMap์„ ์„ ์–ธ -->
	<resultMap type="com.greedy.section01.xmlconfig.MenuDTO" id="menuResultMap">
		<id property="menuCode" column="MENU_CODE"/> <!-- property="DTO์˜ ํ•„๋“œ ๋ช…์นญ" -->
		<result property="menuName" column="MENU_NAME"/> <!-- result์—๋Š” id์— ์ž…๋ ฅํ•˜์ง€์•Š์€ ๋‚˜๋จธ์ง€ ๋ชจ๋‘ ์ž…๋ ฅ -->
		<result property="menuPrice" column="MENU_PRICE"/>
		<result property="categoryCode" column="CATEGORY_CODE"/>
		<result property="orderableStatus" column="ORDERABLE_STATUS"/>
	</resultMap>

  <select id="selectAllMenu" resultMap="menuResultMap"> <!-- ๊ฒฐ๊ณผ๊ฐ’์„ "menuResultMap"๋ฅผ ์ด์šฉํ•ด์„œ ๋งคํ•‘์‹œํ‚ฌ ๊ฒƒ-->
    SELECT
    		MENU_CODE
    	,	MENU_NAME
    	,	MENU_PRICE
    	,	CATEGORY_CODE
    	,	ORDERABLE_STATUS
    	FROM TBL_MENU
    	WHERE ORDERABLE_STATUS = 'Y'
    	ORDER BY MENU_CODE
  </select>
  
  <select id="selectMenuByCode" parameterType= "_int" resultMap="menuResultMap"> 
  <!-- ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ DTO์—์„œ ์ฐธ์กฐํ•ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— resultMap์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑ -->
  <!-- parameterType= "_int" : ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ณ„์นญ์œผ๋กœ ํ‘œ๊ธฐ. int๋Š” '_int' (๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋™์ž‘์— ๋ฌธ์ œ X) -->
  <!-- ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•œ ๊ฐœ์ธ ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ์ด๋ฆ„(ex:code)์€ ๋ฌด์—‡์„ ์ž‘์„ฑํ•ด๋„ ์ƒ๊ด€ X. parameterType ๋˜ํ•œ ์ง€์ •ํ•˜์ง€์•Š์•„๋„ ๋จ.
  		resultMap : ์œ„์—์„œ ์ •์˜ํ•œ resultMap์„ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  		resultType : ์ด๋ฏธ ์ •์˜๋˜์–ด์žˆ๋Š” ํƒ€์ž…์„ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ 
  -->
  	SELECT
    		MENU_CODE
    	,	MENU_NAME
    	,	MENU_PRICE
    	,	CATEGORY_CODE
    	,	ORDERABLE_STATUS
    	FROM TBL_MENU
    	WHERE ORDERABLE_STATUS = 'Y'
    	AND MENU_CODE = #{ code } <!-- code ๋Œ€์‹  ๋‹ค๋ฅธ ๋ฌธ์ž ๊ฐ€๋Šฅ -->
    	<!-- ?(์œ„์น˜ํ™€๋”)๊ฐ€ ์•„๋‹Œ #{ code }์ฒ˜๋Ÿผ ์–ด๋–ค ๊ฐ’์„ ๋„ฃ์„์ง€ ํ™•์‹คํžˆ ๋ช…์‹œํ•ด์•ผํ•จ
			(์œ„์น˜ํ™€๋”์— ๊ฐ’์„ ๋„ฃ๋Š” ์ฝ”๋“œ๋ฅผ MyBatis๊ฐ€ ๋Œ€์‹  ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋”ฐ๋กœ ๊ฐ’์„ ๋„ฃ์„ ๊ธฐํšŒ X) -->
  </select>
  

  <!-- insert, update, delete์˜ ๊ฒฝ์šฐ resultType ์ž‘์„ฑ X. 
		๊ธฐ๋ณธ _int๋กœ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ํ–‰์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ด. parameterType์€ ์ƒ๋žต ๊ฐ€๋Šฅ
  		ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๋œ DTO์˜ ํ•„๋“œ๋ช…์œผ๋กœ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉ ํ•ด์ค˜์•ผํ•œ๋‹ค. getter๋ฅผ ์ด์šฉํ•˜๋ฉฐ gertter๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ-->
  <insert id="insertMenu" parameterType="com.greedy.section01.xmlconfig.MenuDTO"> 
  <!-- parameterType์— MenuDTO์˜ ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ž…(๋ช…์‹œ ํ•„์ˆ˜X)-->
  	INSERT
  		INTO TBL_MENU
  	(
  		MENU_CODE
  	,	MENU_NAME
  	,	MENU_PRICE
  	,	CATEGORY_CODE
  	,	ORDERABLE_STATUS
  	)
  	VALUES
  	(
  		SEQ_MENU_CODE.NEXTVAL
    <!-- Mybatis์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ, ํ•„๋“œ๋ช…๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๊ฒŒ ์ž‘์„ฑ ๋ฐ DTO์— getter ๋ฉ”์†Œ๋“œ ์กด์žฌํ•ด์•ผํ•จ --> 
  	, #{ menuName } 
  	, #{ menuPrice }
  	, #{ categoryCode }
  	, 'Y' <!-- ์ด๋ฏธ 'Y'๋กœ fix๋œ ๊ฐ’์ž„ -->
  	)
  </insert>
  
  <update id="updateMenu" parameterType="com.greedy.section01.xmlconfig.MenuDTO">
  	UPDATE
  			TBL_MENU
  		SET MENU_NAME = #{ menuName }
  		,	MENU_PRICE = #{ menuPrice }
  		,	CATEGORY_CODE = #{ categoryCode }
  		WHERE MENU_CODE = #{ menuCode }
  </update>
  
  <delete id="deleteMenu" parameterType="_int">
  	DELETE
  		FROM TBL_MENU
  		WHERE MENU_CODE = #{ menuCode } 
    	<!-- ๊ฐ’์ด ํ•˜๋‚˜์ด๋ฏ€๋กœ, ์—ฌ๊ธฐ์„œ๋Š” ์•„๋ฌด ๋‹จ์–ด๊ฐ€ ๋“ค์–ด๊ฐ€๋„ ์ƒ๊ด€ X -->
  </delete>
  
</mapper>

๐Ÿ‘‰ PrintResult

public class PrintResult {

	/* ์ „๋‹ฌ ๋œ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ */
	public void printMenuList(List<MenuDTO> menuList) {
		for(MenuDTO menu : menuList) {
			System.out.println(menu);
		}
		
	}
	
	/* ์ „๋‹ฌ ๋œ ๋ฌธ์ž์—ด ์ถœ๋ ฅ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ */
	public void printMenu(MenuDTO menu) {
		System.out.println(menu);
	}

	/* ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ํ˜ธ์ถœ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ */
	public void printErrorMessage(String errorCode) { >>> ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ errorCode ์˜ฌ ์˜ˆ์ •
		
		String errorMessage = "";
		switch(errorCode) {
		case "selectList" : errorMessage = "๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;
		case "selectOne" : errorMessage = "๋ฉ”๋‰ด ์กฐํšŒ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;
		case "insert" : errorMessage = "๋ฉ”๋‰ด ๋“ฑ๋ก์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;
		case "update" : errorMessage = "๋ฉ”๋‰ด ์ˆ˜์ •์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;
		case "delete" : errorMessage = "๋ฉ”๋‰ด ์‚ญ์ œ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;
		
		}
		
		System.out.println(errorMessage);
		
	}

	/* ์„ฑ๊ณต ๋ฉ”์„ธ์ง€ ํ˜ธ์ถœ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ */
	public void printSuccessMessage(String successCode) {
		
		String successMessage = "";
		switch(successCode) {
		case "insert" : successMessage = "๋ฉ”๋‰ด ๋“ฑ๋ก์— ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;
		case "update" : successMessage = "๋ฉ”๋‰ด ์ˆ˜์ •์— ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;		
		case "delete" : successMessage = "๋ฉ”๋‰ด ์‚ญ์ œ์— ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค."; break;		
		}
		
		System.out.println(successMessage);
	}
}

๐Ÿ‘€ JAVAconfig ๋ฐฉ์‹

๐Ÿ’โ€โ™€๏ธ JAVAconfig ๋ฐฉ์‹์€ XMLconfig ๋ฐฉ์‹๊ณผ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์™„์ „ํžˆ ๋™์ผํ•˜๋‚˜, ์ฝ”๋“œ ์ž‘์„ฑ ๋ถ€๋ถ„์—์„œ ์•ฝ๊ฐ„์˜ ์ฐจ์ด ์กด์žฌ

  • MenuDTO, Application, MenuController, PrintResult ํด๋ž˜์Šค๋Š” XMLconfig ๋ฐฉ์‹๊ณผ ์™„๋ฒฝํžˆ ๋™์ผ
  • MenuService์—์„œ MenuDAO๊ฐ€ ์•„๋‹Œ MenuMapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ MenuDAO ํด๋ž˜์Šค ์กด์žฌ X
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ menu-mapper.xmlํŒŒ์ผ์ด ์•„๋‹Œ MenuMapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ mybatis-config.xmlํŒŒ์ผ ์กด์žฌ X

๐Ÿ‘‰ Template

public class Template {
	
    /* ์—ฐ๊ฒฐํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด๋ฅผ ํ•„๋“œ๋กœ ์ž‘์„ฑ */
	private static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	private static String URL = "jdbc:oracle:thin:@localhost:1521:xe";
	private static String USER = "C##GREEDY";
	private static String PASSWORD = "GREEDY";

	private static SqlSessionFactory sqlSessionFactory; 

	public static SqlSession getSqlSession() {
		
		if(sqlSessionFactory == null) {
				
			/* ํ™˜๊ฒฝ ๊ฐ์ฒด ์ƒ์„ฑ */
			Environment environment = new Environment("dev"
													, new JdbcTransactionFactory()
													, new PooledDataSource(DRIVER, URL, USER, PASSWORD)
                                                    );
				
			Configuration configuration = new Configuration(environment);
			
			configuration.addMapper(MenuMapper.class); 
            // [ MenuMapper ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ ]
			
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
			
	}
	
    // sqlSession ์‚ฌ์šฉํ•œ ํ›„ ๋ฐ˜๋‚ฉ (.xmlconfig ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ)
	return sqlSessionFactory.openSession(false); 
	}
}

๐Ÿ‘‰ MenuDTO

* XMLconfig ๋ฐฉ์‹์˜ MenuDTO์™€ ๋™์ผ *

๐Ÿ‘‰ Application

* XMLconfig ๋ฐฉ์‹์˜ Application์™€ ๋™์ผ *

๐Ÿ‘‰ MenuController

* XMLconfig ๋ฐฉ์‹์˜ MenuController์™€ ๋™์ผ *

๐Ÿ‘‰ MenuService

public class MenuService { 
/* MenuController๋กœ ๋ถ€ํ„ฐ ์ธ์ž๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ฉฐ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ƒ์„ฑ */

	/* ์ƒ์„ฑํ•ด๋‘” MenuMapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ•„๋“œ์— ๋จผ์ € ์„ ์–ธ */
	private MenuMapper menuMapper; 

โ—ผ '1. ๋ฉ”๋‰ด ์ „์ฒด ์กฐํšŒ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public List<MenuDTO> selectAllMenu() {
		
		/* SqlSession ํ˜ธ์ถœ */
		SqlSession sqls = getSqlSession();
		
		/* MenuMapper์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๋ฐ ๊ฐ’ ๋ฐ˜ํ™˜๋ฐ›๊ธฐ */
		menuMapper = sqls.getMapper(MenuMapper.class);
		List<MenuDTO> menuList = menuMapper.selectAllMenu(); 
        // [ menuMapper ์ธํ„ฐํŽ˜์ด์Šค์— selectAllMenu() ์ƒ์„ฑ ]
		
		sqls.close();
		
		return menuList;
	}

โ—ผ '2. ๋ฉ”๋‰ด ์ฝ”๋“œ๋กœ ๋ฉ”๋‰ด ์กฐํšŒ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public MenuDTO selectMenuByCode(int code) {
		
		/* SqlSession ๋ฐ menuMapper ํ˜ธ์ถœ */
		SqlSession sqls = getSqlSession();
		menuMapper = sqls.getMapper(MenuMapper.class);
		
		MenuDTO menu = menuMapper.selectMenuByCode(code);
        // [ MenuMapper ์ธํ„ฐํŽ˜์ด์Šค์— selectMenuByCode() ์ƒ์„ฑ ]
		
		sqls.close();
		
		return menu;
	}

โ—ผ '3. ์‹ ๊ทœ ๋ฉ”๋‰ด ์ถ”๊ฐ€'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public boolean registMenu(MenuDTO menu) {
		
		/* SqlSession ๋ฐ menuMapper ํ˜ธ์ถœ */
		SqlSession sqls = getSqlSession();
		menuMapper = sqls.getMapper(MenuMapper.class);
		
		/* INSERT์ด๋ฏ€๋กœ int๋กœ ๋ฐ˜ํ™˜๋ฐ›๊ธฐ */
		int result = menuMapper.insertMenu(menu);
		
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		sqls.close();
		
		return result > 0 ? true : false;
	}

โ—ผ '4. ๋ฉ”๋‰ด ์ˆ˜์ •'์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public boolean modifyMenu(MenuDTO menu) {
		
		/* SqlSession ๋ฐ menuMapper ํ˜ธ์ถœ */
		SqlSession sqls = getSqlSession();
		menuMapper = sqls.getMapper(MenuMapper.class);
		
		/* UPDATE์ด๋ฏ€๋กœ int๋กœ ๋ฐ˜ํ™˜๋ฐ›๊ธฐ */
		int result = menuMapper.modifyMenu(menu);
		
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		sqls.close();
		
		return result > 0 ? true : false;
	}

โ—ผ '5. ๋ฉ”๋‰ด ์‚ญ์ œ'๋ฅผ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ

	public boolean deleteMenu(int code) {
		
		/* SqlSession ๋ฐ menuMapper ํ˜ธ์ถœ */
		SqlSession sqls = getSqlSession();
		menuMapper = sqls.getMapper(MenuMapper.class);
		
		/* DELETE์ด๋ฏ€๋กœ int๋กœ ๋ฐ˜ํ™˜๋ฐ›๊ธฐ */
		int result = menuMapper.deleteMenu(code);
		
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		sqls.close();
		
		return result > 0 ? true : false;
	}
}

๐Ÿ‘‰ MenuMapper

๐Ÿ’โ€ MenuMapper์˜ ์—ญํ• 
menu-mapper.xmlํŒŒ์ผ์— ์ž…๋ ฅํ–ˆ๋˜ resultMap ๋ฐ ์ฟผ๋ฆฌ๋ฌธ์„ javaํ˜•์‹์œผ๋กœ ์ž‘์„ฑ

public interface MenuMapper {

	/* @Results : ์ด๊ณณ์— ์ •์˜๋œ ๋Œ€๋กœ ๋งคํ•‘ (์–ด๋–ค ์ปฌ๋Ÿผ์— ์–ด๋–ค ๊ฐ’(ํ•„๋“œ๋ช…)์„ ๋„ฃ์„์ง€ ์ž‘์„ฑ) */
	@Results(id = "menuResultMap", value= { 
			@Result(id = true, property = "menuCode", column = "MENU_CODE"),
			@Result(property = "menuName", column = "MENU_NAME"),
			@Result(property = "menuPrice", column = "MENU_PRICE"),
			@Result(property = "categoryCode", column = "CATEGORY_CODE"),
			@Result(property = "orderableStatus", column = "ORDERABLE_STATUS")
	}) 
	
	/* 1. ๋ฉ”๋‰ด ์ „์ฒด ์กฐํšŒ */
	@Select("SELECT \n" +
			"		MENU_CODE\n" +
			"	,	MENU_NAME\n" +
			"	,	MENU_PRICE\n" +
			"	,	CATEGORY_CODE\n" +
			"	,	ORDERABLE_STATUS\n" +
			"	FROM TBL_MENU\n" +
			"	WHERE ORDERABLE_STATUS = 'Y'\n" +
			"	ORDER BY MENU_CODE") // SELECT ๊ตฌ๋ฌธ์„ ์ž‘์„ฑ
	List<MenuDTO> selectAllMenu();
	
	/* 2. ๋ฉ”๋‰ด ์ฝ”๋“œ๋กœ ๋ฉ”๋‰ด ์กฐํšŒ */
	@ResultMap("menuResultMap") // ์œ„์—์„œ ์ž‘์„ฑํ•œ resultMap์„ ๋‹ค์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ // @ResultMap(id)
	@Select("SELECT \n" +
			"		MENU_CODE\n" +
			"	,	MENU_NAME\n" +
			"	,	MENU_PRICE\n" +
			"	,	CATEGORY_CODE\n" +
			"	,	ORDERABLE_STATUS\n" +
			"	FROM TBL_MENU\n" +
			"	WHERE ORDERABLE_STATUS = 'Y'\n" +
			"	AND MENU_CODE = #{ code }") 
	MenuDTO selectMenuByCode(int code);

	/* 3. ์‹ ๊ทœ ๋ฉ”๋‰ด ์ถ”๊ฐ€ */
	@Insert("INSERT\n" + 
			"  INTO TBL_MENU\n" +
			"(\n" +
			"  MENU_CODE\n" +
			", MENU_NAME\n" +
			", MENU_PRICE\n" +
			", CATEGORY_CODE\n" +
			", ORDERABLE_STATUS\n" +
			")\n" +
			"VALUES\n" +
			"(\n" +
			"  SEQ_MENU_CODE.NEXTVAL\n" +
			", #{ menuName }\n" +
			", #{ menuPrice }\n" +
			", #{ categoryCode }\n" +
			", 'Y'\n" +
			")")
	int insertMenu(MenuDTO menu);

	/* 4. ๋ฉ”๋‰ด ์ˆ˜์ • */
	@Update("UPDATE\n" +
			"		TBL_MENU\n" +
			"	SET MENU_NAME = #{ menuName }\n" + // #{ } ๊ฐ’์€ ํ•„๋“œ๋ช…๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์ž‘์„ฑ
			"	,	MENU_PRICE = #{ menuPrice }\n" +
			"	,	CATEGORY_CODE = #{ categoryCode }\n" +
			"	WHERE MENU_CODE = #{ menuCode }") 
	int modifyMenu(MenuDTO menu);

	
	/* 5. ๋ฉ”๋‰ด ์‚ญ์ œ */
	@Delete("DELETE\n" +
			"	FROM TBL_MENU\n" +
			"	WHERE MENU_CODE = #{ code }")
	int deleteMenu(int code);

}

๐Ÿ‘‰ PrintResult

* XMLconfig ๋ฐฉ์‹์˜ PrintResult์™€ ๋™์ผ *

๐Ÿ‘€ XMLconfig + JAVAconfig ๋ฐฉ์‹ (Remix)

๐Ÿ’โ€โ™€๏ธ XMLconfig + JAVAconfig ๋ฐฉ์‹์ด๋ž€,
JAVAconfig๋Š” XMLconfig๋ณด๋‹ค ์ ์€ ํด๋ž˜์Šค๋กœ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ. ํ•˜์ง€๋งŒ MenuMapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ž‘์„ฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์ฟผ๋ฆฌ๋ฌธ์„ ๊ฐœํ–‰ํ•˜๋ฉฐ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค๋Š” ๋‹จ์  ์กด์žฌ.
๋”ฐ๋ผ์„œ, AVAconfig ๋ฐฉ์‹์— XMLconfig์˜ menu-mapper.xmlํŒŒ์ผ์„ ์—ฐ๋™์‹œ์ผœ ๋‘ ๋ฐฉ์‹์˜ ์žฅ์ ๋งŒ์„ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์„ ์ผ์ปซ์Œ


๐Ÿ™‹โ€ ์ž ๊น ! ์–ด๋–ป๊ฒŒ ์—ฐ๋™์„ ์‹œํ‚ค๋‚˜์š” ? ๐Ÿ”ฅ์ค‘์š”๐Ÿ”ฅ
[1] ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— mappers ๋ผ๋Š” ์†Œ์Šคํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•˜์œ„์— com.greedy.section03.remix ํŒจํ‚ค์ง€ ์ƒ์„ฑ
[2] .xmlconfig์˜ menu-mapper.xml๋ฅผ ํŒจํ‚ค์ง€ ์•ˆ์— ๋ณต์‚ฌ
[3] MenuMapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด menu-mapper.xmlํŒŒ์ผ์˜ ์ด๋ฆ„์„ MenuMapper.xml๋กœ ๋ณ€๊ฒฝ
[4] MenuMapper.xml์˜ namespace๋ฅผ "com.greedy.section03.remix.MenuMapper"๋กœ ์„ค์ • (๊ฐ™์€ ๊ฒฝ๋กœ)
[5] .xmlconfig์—์„œ ๋ณต์‚ฌํ•ด์˜จ ํŒŒ์ผ์ด๋ฏ€๋กœ ๋ชจ๋“  ๋ถ€๋ถ„์„ section03.remix๋กœ ์ˆ˜์ • (ex : "com.greedy.section03.remix.MenuDTO")
๐Ÿ‘‰ ์œ„ ๊ณผ์ •์„ ๋ชจ๋‘ ์‹คํ–‰ํ•ด์ฃผ๋ฉด MenuMapper์— ํž˜๋“ค๊ฒŒ ์ฟผ๋ฆฌ๋ฌธ์„ ๊ฐœํ–‰ํ•ด๊ฐ€๋ฉฐ ์ž‘์„ฑํ•  ํ•„์š”์—†์ด .xml ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ


๐Ÿ‘‰ Template

* JAVAconfig ๋ฐฉ์‹์˜ Template์™€ ๋™์ผ *

๐Ÿ‘‰ MenuDTO

* XMLconfig ๋ฐฉ์‹ ๋ฐ JAVAconfig ๋ฐฉ์‹์˜ MenuDTO์™€ ๋™์ผ *

๐Ÿ‘‰ Application

* XMLconfig ๋ฐฉ์‹ ๋ฐ JAVAconfig ๋ฐฉ์‹์˜ Application์™€ ๋™์ผ *

๐Ÿ‘‰ MenuController

* XMLconfig ๋ฐฉ์‹ ๋ฐ JAVAconfig ๋ฐฉ์‹์˜ MenuController์™€ ๋™์ผ *

๐Ÿ‘‰ MenuService

* JAVAconfig ๋ฐฉ์‹์˜ MenuService์™€ ๋™์ผ *

๐Ÿ‘‰ MenuMapper

public interface MenuMapper { 
	/* ์›๋ž˜ ๊ตฌ๊ตฌ์ ˆ์ ˆ ์ฟผ๋ฆฌ๋ฌธ์„ ์–ด๋ ต๊ฒŒ ์ž‘์„ฑํ•ด์•ผํ–ˆ์œผ๋‚˜, ๋ฉ”์†Œ๋“œ๋งŒ ์ž‘์„ฑ */

	/* 1. ๋ฉ”๋‰ด ์ „์ฒด ์กฐํšŒ */
	List<MenuDTO> selectAllMenu();
	
	/* 2. ๋ฉ”๋‰ด ์ฝ”๋“œ๋กœ ๋ฉ”๋‰ด ์กฐํšŒ */
	MenuDTO selectMenuByCode(int code);

	/* 3. ์‹ ๊ทœ ๋ฉ”๋‰ด ์ถ”๊ฐ€ */
	int insertMenu(MenuDTO menu);

	/* 4. ๋ฉ”๋‰ด ์ˆ˜์ • */
	int updateMenu(MenuDTO menu);

	/* 5. ๋ฉ”๋‰ด ์‚ญ์ œ */
	int deleteMenu(int code);
}

๐Ÿ‘‰ MenuMapper.xml ๐Ÿ”ฅ์ค‘์š”๐Ÿ”ฅ

๐Ÿ’โ€โ™€๏ธ ๋ฐ˜๋“œ์‹œ ๊ฒฝ๋กœ๊ฐ€ MenuMapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ
(com.greedy.section03.remix.@@@)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!-- 
  		mapper๋ฅผ DAO ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ๋‘๊ณ  DAO ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ’€๋„ค์ž„์„ namespace๋กœ ์ง€์ •ํ•œ๋‹ค.
  		๋˜ํ•œ ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค์™€ XML์˜ ์ด๋ฆ„์ด ๋™์ผํ•ด์•ผํ•จ
  		์ž‘์„ฑํ•œ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„๊ณผ id๊ฐ€ ์ผ์น˜ํ•˜๋ฉฐ ๋ฆฌํ„ด ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์•ผํ•จ
  -->
<mapper namespace="com.greedy.section03.remix.MenuMapper">

	<!-- ์กฐํšŒํ•œ ์ปฌ๋Ÿผ๊ณผ DTO๋ฅผ ๋งคํ•‘(์—ฐ๊ฒฐ)์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์„ค์ •์œผ๋กœ resultMap์„ ์„ ์–ธ -->
	<resultMap type="com.greedy.section03.remix.MenuDTO" id="menuResultMap">
		<id property="menuCode" column="MENU_CODE"/>
		<result property="menuName" column="MENU_NAME"/>
		<result property="menuPrice" column="MENU_PRICE"/>
		<result property="categoryCode" column="CATEGORY_CODE"/>
		<result property="orderableStatus" column="ORDERABLE_STATUS"/>
	</resultMap>

  <select id="selectAllMenu" resultMap="menuResultMap">
    SELECT
    		MENU_CODE
    	,	MENU_NAME
    	,	MENU_PRICE
    	,	CATEGORY_CODE
    	,	ORDERABLE_STATUS
    	FROM TBL_MENU
    	WHERE ORDERABLE_STATUS = 'Y'
    	ORDER BY MENU_CODE
  </select>
  
  <select id="selectMenuByCode" parameterType= "_int" resultMap="menuResultMap"> 
  	SELECT
    		MENU_CODE
    	,	MENU_NAME
    	,	MENU_PRICE
    	,	CATEGORY_CODE
    	,	ORDERABLE_STATUS
    	FROM TBL_MENU
    	WHERE ORDERABLE_STATUS = 'Y'
    	AND MENU_CODE = #{code}
  </select>

  <insert id="insertMenu" parameterType="com.greedy.section03.remix.MenuDTO">
  	INSERT
  		INTO TBL_MENU
  	(
  		MENU_CODE
  	,	MENU_NAME
  	,	MENU_PRICE
  	,	CATEGORY_CODE
  	,	ORDERABLE_STATUS
  	)
  	VALUES
  	(
  		SEQ_MENU_CODE.NEXTVAL
  	, #{ menuName } 
  	, #{ menuPrice }
  	, #{ categoryCode }
  	, 'Y'
  	)
  </insert>
  
  <update id="updateMenu" parameterType="com.greedy.section03.remix.MenuDTO">
  	UPDATE
  			TBL_MENU
  		SET MENU_NAME = #{ menuName }
  		,	MENU_PRICE = #{ menuPrice }
  		,	CATEGORY_CODE = #{ categoryCode }
  		WHERE MENU_CODE = #{ menuCode }
  </update>
  
  <delete id="deleteMenu" parameterType="_int">
  	DELETE
  		FROM TBL_MENU
  		WHERE MENU_CODE = #{ menuCode }
  </delete>

</mapper>

๐Ÿ‘‰ PrintResult

* XMLconfig ๋ฐฉ์‹ ๋ฐ JAVAconfig ๋ฐฉ์‹์˜ PrintResult์™€ ๋™์ผ *

๐Ÿ˜ˆ Warning


profile
Tiny little habits make me

0๊ฐœ์˜ ๋Œ“๊ธ€