본문 바로가기
Spring/study

spring 6강 Oracle과 mybatis 연동 실습(자바 코드에 SQL 명령어를 함께 작성하는 방식)

by avvin 2019. 6. 6.

spring 6강 Oracle과 mybatis 연동 실습(자바 코드에 SQL 명령어를 함께 작성하는 방식)


sample이나 spring01에서 프로젝트에서 파일 복사해올때 수정해야할 부분


pom.xml reference부터만 복사해오기 


web.xml 한글 인코딩 처리


servelt-context 컴포넌트 스캔 패키지 spring02로 수정


mapper 패키지의 log4j.xml 애플리케이션 로거 컨트롤러경로에서 프로젝트 이름 spring02로 수정


root-context.xml 에서 datasource bean부분 


id / password 수정

"jdbc:log4jdbc:oracle:thin@localhost:1521/xe"  // :xe 가 낮은버전에선 될수도있음


home.jsp 한글깨짐 처리해주는 코드 추가


root-context.xml 에 mybatis mapper interface bean을 자동으로 검색하여 생성해주는 코드 추가

<mybatis-spring:xcan base-package="com.example.spring02.model.memo">


( 프로젝트 서버로 실행할때 프로젝트 하나씩만 등록해놓는게 좋다. )


memo 테이블 만들기




mybatis mapper interface - mybatis 에서 sql query를 작성하는 법


1) mapper xml 파일에 작성하는 경우


- MemoDAO.java ( 인터페이스 )

- MemoDAOImpl.java ( 구현클래스 )

- memoMApper.xml ( mapper )



2) mapper interface에 작성하는 경우


MemoDAO.java : SQL 포함하는 인터페이스


//많이 사용되는 방식은 아님




MemoDAO.java

1
2
3
4
public interface MemoDAO {
 
    @Select("select * from memo order by idx desc")
    public List<MemoDTO> list();
cs


model은 클래스 상단에 @Repository 있어야 컴포넌트 스캔되어 빈으로 등록되지만

MemoDAO를 인터페이스로 만들고 구현클래스를 만들 필요 없이 추상메서드에 @Select 어노테이션을 붙여주면

root-context에서 설정한대로 model.memo패키지에 포함된 파일들을 빈으로 읽어들인다.

이렇게 추상메서드에 @Select를 붙여주는 것만으로도 DAO 인터페이스가 빈으로 등록되기때문에 

ServiceImpl에 주입하여 사용이 가능하다. 

( cf. 구현클래스가 있는 단순 인터페이스는 빈으로 등록할 필요가 없다.  ServiceImple만 @Service붙여주면 됨 )


1
2
3
4
5
6
7
<!-- mybatis mapper 코드(ex.@select)가 포함된 클래스를 찾아서 
    bean으로 등록하도록 설정해야함 -->    
 
    <mybatis-spring:scan //mybatis 매퍼 코드 스캔
    base-package="com.example.spring02.model.memo" />
 
</beans>
cs




URL 공통적인 부분 묶어서 매핑하기


URL 매핑된 메서드들의 URL 경로가 공통인 부분이 있다면 

컨트롤러 클래스 자체에 @RequestMapping으로 공통부분 매핑을 해준다. 


MemoController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller //현재 클래스를 컨트롤러 bean으로 등록  
@RequestMapping("/memo/*"//공통적인 매핑
public class MemoController {
    
    @Inject //의존관계 주입
    MemoService memoService; //스프링이 만든 서비스 객체가 연결됨
    
    @RequestMapping("list.do"//세부적인 매핑    /memo/list.do
    public ModelAndView list(ModelAndView mav) {
        List<MemoDTO> items=memoService.list(); //메모 리스트 리턴
        mav.setViewName("memo/memo_list"); //출력 페이지의 이름
        mav.addObject("list",items); //출력 페이지에 전달할 변수
        return mav; //페이지로 이동 
    }
cs


//Model보다 ModelAndView를 더 많이 쓴다.


객체 생성시에 view와 key와 value값을 주어 바로 리턴해주는 방식도 있고

위 코드처럼 매개 변수로 먼저 지정한 경우 (@RequestMapping으로 실행되는 메서드이기때문에 매개변수는 중요하지 않다.)

MAV변수에 setViewName 메서드와 addObject 메서드로 뷰와 오브젝트를 저장해주는 방식도 있다.




jsp


header.jsp

1
2
3
4
5
6
7
<%@ 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="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="path" value="${pageContext.request.contextPath}" />
<script src="http://code.jquery.com/jquery-3.3.1.js"></script>
<link rel="stylesheet" href="${path}/include/style.css" />
cs


fmt : 날짜와 숫자의 출력 형식을 지원해주는 태그



memo_list.jsp

1
2
3
4
5
6
<script>
function memo_view(idx){
    location.href="${path}/memo/view/"+idx;
// 파라미터가 아니라 고유 주소로 넘어간다. //@PathVariable로 받을 수 있다.
  //?를 사용하면 같은 주소로 이동하여 ?이하는 파라미터로 넘어가고 고유 주소
</script>
cs


MemoController.java

1
2
3
4
5
6
7
8
//http://localhost/spring02/memo/view/6 => @PathVariable     
    @RequestMapping("view/{idx}")
    public ModelAndView view(@PathVariable int idx,
            ModelAndView mav) {
        mav.setViewName("memo/view"); //출력 페이지 지정
        mav.addObject("dto",memoService.memo_view(idx)); //데이터 저장
        return mav; //출력 페이지로 이동 
    }
cs