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 사용하기
'Java - Spring &&n SpringBoot' 카테고리의 다른 글
SpringBoot 를 사용한 실시간 아이디 중복 검사(feat.ajax, jsp) (6) | 2022.08.04 |
---|---|
Spring MVC 패턴 && dispatcher (0) | 2022.07.18 |
Spring Web 기본 정리 : 원리, spring 설정, DB 연결해서 데이터 보여주기 (0) | 2022.07.04 |
spring - 로그인 기능 구현하기 (3) HTTP서블릿 세션 활용하기 (0) | 2022.01.29 |
spring - 로그인 기능 구현하기 (2) 세션으로 로그인 하기 (0) | 2022.01.18 |
댓글