Java - Spring &&n SpringBoot

Spring Boot && MyBatis without xml : 스프링 부트와 마이 바티스 연동(xml 설정 빼고!)

TerianP 2022. 7. 12.
728x90

공부하면서 꼭 조심해야하는 부분!

  • SPRING BOOT 의 경우 CONTROLLER 을 포함한 모든 어노테이션이 달린 패키지들은 @SpringBootApplication 가 달린 클래스가 있는 패키지의 밑에, 즉 기본적으로 가장 먼저 생성되는 클래스 패키지의 밑에 위치해야한다! ⇒ 이거 땜시오류가 잡는데 오래걸렸습니다ㅠ
  • MY BATIS 에서 LIKE 문을 사용하는 경우 DB 종류에 따라서 서로 다른 문법을 사용한다.
    • MySQL
    SELECT * FROM DEPT WHERE dname like LIKE CONCAT(‘%’, #{dname}, ‘%’)
    
    • ORACLE
    SELECT * FROM DEPT WHERE dname like '%'||#{dname}||'%'
    
    • MS-SQL
    SELECT * FROM DEPT WHERE dname like '%'+#dname#+'%'
    

 

1. application.properties

  • driver 설정과 url 설정, username 과 password 설정 은 꼭 주의해야한다
  • 또한 aliases 는 꼭 설정해야 추후 mapper 에서 패키지명 생략후 클래스 파일로만 쉽게 사용 가능하다
# jsp
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

#OracleDB
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=scott
spring.datasource.password=tiger

# connection POOLING
#HiKari
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-test-query=select * from dual

#type -aliases 패키지명까지 작성한다면 mapper에서 패키지명 생략후 클래스 파일만 사용 가능
mybatis.type-aliases-package=kr.kro.hjproject.dto

#mapper.xml

### .xml 파일이 필용없기 때문에 설정 안해도 상관없음 ###
# **은 하위 폴더 레벨에 상관없이 모든 경로
# mybatis/aaa/a.xml, mybatis/bbb/ccc.xml
#mybatis.mapper-locations=mybatis/**/*.xml

#custom error page
server.error.whitelabel.enabled=false

# 포트번호 바꿔서 사용하기
#server.port=80

controller

  • Main
package kr.kro.hjproject.web.control;

import java.net.http.HttpRequest;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import kr.kro.hjproject.web.dto.DeptDTO;
import kr.kro.hjproject.web.service.DeptService;

@Controller
public class MainController {

	@Autowired
	DeptService service; // 서비스 클래스 di

	@RequestMapping("list") // list 로 요청시
	public String list(Model model) {
		// System.out.println("여기");
		// getAll 메서드 실행 후 내용 담아서 list 파일로 전달
		// getAll 은 DB의 내용을 가져오는 메서드
		model.addAttribute("list", service.getAll()); 

		return "list";
	}

	// search 로 요청이 왓을때 처리
	// requestParam 은 요청 파라미터를 의미하며, defaultvalue 는 기본 요청 파라미터, 즉 요청 파라미터가 null 값일때 대신해줄 값
	@PostMapping("search")
	public String search(@RequestParam(value = "word", defaultValue = "all") String word, Model model) {
		// 요청 파라미터의 기본값은 all
		if(word.equals("all")) {
			model.addAttribute("list", service.getAll());
		}else { 
			// 검색 단어가 들어왔을 땐 해당 단어로 DB 에서 like sql 문 사용후
			// 내용을 담아서 전달
			//System.out.println(service.getOne(word));
			model.addAttribute("list", service.getOne(word));
		}
		return "list";
	}

}

 

DTO

  • 아주 기본적이고 간단한 DeptDTO
package kr.kro.hjproject.web.dto;

import org.apache.ibatis.annotations.Mapper;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class DeptDTO {
	int deptno;
	String dname;
	String loc;
}

 

Service

- 역시나 아주아주 기본적은 Service

package kr.kro.hjproject.web.service;

import java.util.List;

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

import kr.kro.hjproject.web.dao.CommonDAO;
import kr.kro.hjproject.web.dto.DeptDTO;

@Service
public class DeptService {
	// DAO 를 DI
	// 다만 CommonDAO 는 이름에서 느낌이 가듯이 interface 이다.
	// 왜 인터페이스인지는 해당 코드를 보면 알 수 있을 듯
	@Autowired
	CommonDAO dao; 
	
	// dao 의 selectAll 메서드 실행
	public List<DeptDTO> getAll(){
		return dao.selectAll();
	}
	
	// 넘겨받은 dname 파라미터로 selectOne 메서드 실행
	public List<DeptDTO> getOne(String dname) {
		return dao.selectOne(dname);
	}
}

 

DAO

  • 아주아주 중요한 DAO
  • mybatis 에서는 보통 xml 파일이 따로 필요했는데 spring 3.0 부터는 필요없고 대신 @Mapper 어노테이션을 사용하면 아주 쉽게 Mappering 이 가능하다.
  • 심지어 DAO 는 그냥 interface 로 만들어둔 후 이를 구현하는 클래스 없이 바로 spring 을 통해 DI 후 사용가능하다!  - Service 클래스를 보면 알 수 있다 
  • 기존과 달라져서 기억해야하는 부분은 다음과 같다
    • xml 에서 태그로 달았던 CRUD 에 대한 것을 어노테이션으로 달아둔다 ⇒ @SELECT, @INSERT, @DELETE, @UPDATE
    • 동적 바인딩 → SQL 문 자체에서 동적인 변수를 지정하는 방법은 기존과 동일하다 ⇒ #{변수명} 사용
    • 동적 바인딩 → SQL 문에 동적인 변수를 할당하는 방법 - 기존에 parameterType - 은 기존과는 다르게 메서드의 매개변수로 받게 된다. 이때 사용하는 어노테이션은 @Param
    • 즉 동적 바인딩 시에는 SQL 문에서는 #{~~} 를 사용하고 변수는 메서드의 매개변수를 사용하며, 어노테이션은 @Param 을 사용한다
    • @Param 안에 오는 변수명은 SQL에 들어가야하는 변수명과 동일하게 해야하는듯? ⇒ 아무래도 기존의 parameterType 을 대체하는 것이기 때문으로 생각된다
  • 추가적으로 Options 등을 사용하면 PK 를 return 받을 수도 있고 더 편리한 부분이 많은듯?
package kr.kro.hjproject.web.dao;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import kr.kro.hjproject.web.dto.DeptDTO;

@Mapper
public interface CommonDAO {
	
	// 전체 조회
	@Select("SELECT * FROM DEPT")
	public List<DeptDTO> selectAll();
	
	// 일부 조회
	// 동적으로 변수를 정해줘야하는 경우 mapper 와 마찬가지로 # 을 사용함
	// 이때 변수는 매개변수로 받아오는 변수가 곧 SQL 문에 들어갈 변수가 됨
	@Select("SELECT * FROM DEPT WHERE dname like '%'||#{dname}||'%'")
	public List<DeptDTO> selectOne(@Param("dname") String dname);
	
	// Insert : 마찬가지로 동적바인딩이 필요한 경우 # 을 사용
	// 여기에 SQL 에서 사용하는 Auto Increment == 오라클은 sequence 도 그대로 사용 가능하다
	// 추가로 만약 AI 값을 확인하고 싶다면
	// @Options 어노테이션을 과 useGeneratedKeys, keyproperty 를 사용하면 int 값을 반환 가능하다
	// useGeneratedKeys : 자동 키생성 여부?
	// keyproperty : PK가(보통 PK니까) 어떤 컬럼인지 컬럼명 작성
	@Insert("INSERT INTO DEPT VALUES(DEPT_DEPTNO_SEQ, ${dname}, ${loc}")
	@Options(useGeneratedKeys = true, keyProperty = "deptno")
	public int insertOne();
	
}

 

list.jsp

  • Dept 리스트를 출력하는 list.jsp
  • 사실 쉽게쉽게 가려다가 추후 게시판 만들 때 어떻게 이용해볼 수 있지 않을까 싶어서 결국 검색기능까지 구현 완료!
  • 원래는 ajax 를 통해서 body 의 list 부분만 재할당해서 검색된 내용을 보여주고 보여주고…그러고 싶었는데 아무래도 안되서 결국 포기ㅠ.ㅠ
  • 최종적으로는 기존에 사용하던 방법과 JSTL JQUERY 등을 합쳐서 POST 방식으로 요청하고 응답받는 것으로 우회했다
<%@page import="java.util.ArrayList"%>
<%@page import="kr.kro.hjproject.web.dto.DeptDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>"%>
<%@ taglib prefix="fn" uri="<http://java.sun.com/jsp/jstl/functions>"%>







	$(document).ready(function() {

		$('#search').click(function() {
			//console.log("확인");
			var word = $('#searchWord').val();
			//console.log("$('#searchWord').val() : "+$('#searchWord').val())
			if (word == '') {
				//console.log("HH")
				word = 'all';
			}

			/* $.ajax({
				type : "GET",
				url : "search",
				data : {
					"word" : word
				},
				success : function(result) {
					//console.log(result)
				}
			}) */
			search(word);
		})

	})

	function search(word) {
		// POST 방식으로 요청하는 방법
		let f = document.createElement('form');

		let obj;
		obj = document.createElement('input');
		obj.setAttribute('type', 'hidden');
		obj.setAttribute('name', 'word');
		obj.setAttribute('value', word);

		f.appendChild(obj);
		f.setAttribute('method', 'post');
		f.setAttribute('action', 'search');
		document.body.appendChild(f);
		f.submit();
	}

 

 

전체 리스트 확인

 

검색시

 


- Reference

[Spring Boot] 스프링부트에서 Mybatis 사용하기

 

[Spring Boot] 스프링부트에서 Mybatis 사용하기

먼저 Mybatis를 얘기하기 전에 JAVA의 ORM이 무엇이 있는지 어떤 것인지에 대해서 정리해보자. ORM(Object Relational Mapping)이란? ORM에서 Object는 객체지향 언어의 객체를 의미한다. Relational은 관계형 데..

devlog-wjdrbs96.tistory.com

 

Post 방식으로 페이지 이동하기

 

Post 방식으로 페이지 이동하기

jsp에서 태그에 href값을 주면 get방식으로 넘어간다. 하지만 post로 넘기고 싶다면? => onClick이벤트로 자바스크립트 함수를 추가하고 그 함수안에서 post로 넘기면 된다. 1. 컨트롤러로 넘기는 값이

amongthestar.tistory.com

 

댓글