Spring/Maven Project

Spring에 DAO - Interface, Implement 추가

carrotweb 2022. 10. 3. 21:31
728x90
반응형

MyBatis의 Configuration과 Mapper XML 파일을 통해 생성된 SqlSession과 Board Model를 사용하여 데이터를 처리하는 DAO(Data Access Object - 데이터 접근 객체, 다오) Interface(인터페이스)와 Implements(구현체)를 만들겠습니다.

 

먼저 DAO에 대해 알아보겠습니다.

 

DAO

DAO(Data Access Object - 데이터 접근 객체, 다오)는 J2EE(Java 2 Platform, Enterprise Edition) Patterns(패턴) 중 하나로 비즈니스 로직과 데이터베이스를 분리하여 처리할 수 있는 방법을 제시합니다.

 

 

DAO는 DataSource(데이터소스)와 연결하여 데이터를 등록(insert), 조회(select), 수정(update), 삭제(delete)를 처리할 수 있도록 캡슐화(Encapsulate)하고 인터페이스를 생성합니다.

비즈니스 로직은 DAO에서 제공하는 인터페이스를 사용하여 처리합니다.

 

이처럼 DAO는 인터페이스와 DataSource(데이터소스)와 연결하여 처리되는 부분을 분리시켜 데이터베이스가 변경(다른 데이터베이스로 변경, 테이블 변경, 칼럼 변경) 되거나 처리 방식이 변경(쿼리 변경) 되더라도 인터페이스는 변경되지 않기 때문에 비즈니스 로직에는 영향을 주지 않습니다.

 

DAO는 Interface(인터페이스)로 생성하여 비즈니스 로직에게 제공합니다.

DAO는 Interface(인터페이스)을 구현한 구현체 Class를 생성합니다. 이 구현체 Class는 DataSource(데이터소스)와 연결하여 데이터 객체와 쿼리를 사용하여 처리합니다.

DAO에서 비즈니스 로직으로부터 데이터를 전달받거나 조회(select) 결과를 넘겨주기 위해 데이터 객체를 생성합니다.

 

DAO에 대한 자세한 설명은 Java Technical Details(https://www.oracle.com/java/technologies/dataaccessobject.html)를 참고하시기 바랍니다.

 

우리는 이전에 Spring-MyBatis를 사용하여 DataSource(데이터소스)와 연결하고 Mapper XML로 Query(쿼리)를 처리하였습니다. 그래서 DAO 구현체 Class를 생성할 때는 DataSource(데이터소스)를 직접 연결하지 않고 Spring-MyBatis의 SqlSession를 사용하겠습니다. 그리고 데이터 객체는 이전에 생성한 Board Model(모델)를 사용합니다.

 

그럼, DAO를 생성하여 MariaDB에서 study Database에 있는 INT_BOARD_TB(게시판) Table의 데이터(게시물)를 조회(select)하도록 하겠습니다.

 

 

Maven Spring Project에 DAO - Board Interface 추가하기

 

1. Java Resource > src/main/java에 com.home.study.test1.board 패키지에 dao 패키지를 생성합니다.

 

2. com.home.study.test1.board.dao 패키지에 IBoardDao Interface(인터페이스)를 생성합니다. (IBoardDao.java)

  1. INT_BOARD_TB(게시판) Table에서 전체 데이터(게시물)를 조회(select)하여 리스트(List<Board>)로 리턴하는 selectBoardList 메서드를 선언합니다. (Interface(인터페이스)의 메서드는 "public abstract"으로 선언되어야 합니다. 생략할 수 있습니다.)
package com.home.study.test1.board.dao;

import java.util.List;

import com.home.study.test1.board.model.Board;

public interface IBoardDao {

	List<Board> selectBoardList();
}

 

 

Maven Spring Project에 DAO - Board Implement 추가하기

 

1. Java Resource > src/main/java에 com.home.study.test1.board.dao 패키지에 impl 패키지를 생성합니다.

 

2. com.home.study.test1.board.dao.impl 패키지에 BoardDaoImpl 클래스를 생성합니다. (BoardDaoImpl.java)

  1. BoardDaoImpl 클래스에 IBoardDao Interface(인터페이스)가 구현(implements)되도록 class에 implements로 IBoardDao를 입력합니다.
  2. BoardDaoImpl 클래스에서 IBoardDao Interface(인터페이스)의 selectBoardList 메서드를 구현합니다. Interface(인터페이스)를 구현한 클래스(Class)의 메서드 위에 @Override를 붙여줍니다. (이클립스에서는 마우스를 BoardDaoImpl 클래스 위로 이동합니다. 콘텍스트 메뉴에서 "Add unimplemented methods"(구현되지 않은 메서드 추가)를 클릭하면 자동으로 메서드를 생성해 줍니다.)
package com.home.study.test1.board.dao.impl;

import java.util.List;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;

public class BoardDaoImpl implements IBoardDao {

	@Override
	public List<Board> selectBoardList() {
		// TODO Auto-generated method stub
		return null;
	}
}

 

3. BoardDaoImpl 클래스에 Spring-MyBatis를 사용하여 생성한 SqlSession를 변수로 선언합니다.

  1. Java Resource > src/main/resource > com/home/study/test1/config 폴더에 있는 context-mapper-mariadb.xml 파일에서 MyBatis의 SqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)으로 생성한 SqlSession Bean의 qualifier 속성 값(sqlSessionMariaDB)을 변수 위에 @Qualifier Annotation(어노테이션)으로 입력합니다.
  2. 의존성 주입(Dependency Injection)을 위해서 @Autowired Annotation(어노테이션)를 변수 위에 붙여줍니다. (SqlSession 변수에 MyBatis의 SqlSessionTemplate으로 생성한 SqlSession Bean의 자동으로 주입됩니다.)
<bean id="sqlSessionMariaDB" class="org.mybatis.spring.SqlSessionTemplate">
	<qualifier value="sqlSessionMariaDB" />
	<constructor-arg index="0" ref="sqlSessionFactoryMariaDB" />
</bean>
package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;

public class BoardDaoImpl implements IBoardDao {

	@Autowired
	@Qualifier("sqlSessionMariaDB")
	private SqlSession sqlSession;

	@Override
	public List<Board> selectBoardList() {
		// TODO Auto-generated method stub
		return null;
	}
}

 

4. selectBoardList 메서드에서 조회(select) 하기 위해 SqlSession의 selectList 메서드로 MyBatis의 Mapper XML 파일에서 등록한 select(SELECT 쿼리문)을 호출합니다.

 

SqlSession의 selectList 메서드의 첫 번째 파라미터인 statement는 실행 구문의 고유 식별자로 MyBatis의 Mapper XML 파일에서 <mapper>의 namespace(네임스페이스)와 <select>의 id 속성 값을 결합한 값입니다. 두 번째 파라미터인 parameter는 실행 구문에 전달할 객체입니다. 여기서는 조건 없이 전체를 조회하기 위해서 사용하지 않습니다.

org.apache.ibatis.session.SqlSession.selectList(String statement, Object parameter)
@Override
public List<Board> selectBoardList() {
	return sqlSession.selectList("com.home.study.test1.board.mapper.mariadb.BoardMapper.selectBoardList");
}

 

SqlSession의 selectList 메서드의 첫 번째 파라미터에 항상 MyBatis의 Mapper XML 파일에서 <mapper>의 namespace(네임스페이스)를 입력해야 하기 때문에 번거로움이 있습니다. 그래서 <mapper>의 namespace(네임스페이스)를 문자열 변수(SQL_FILE_PATH)로 선언하고 사용하면 편리해집니다.

package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;

public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = "com.home.study.test1.board.mapper.mariadb.BoardMapper.";

	@Autowired
	@Qualifier("sqlSessionMariaDB")
	private SqlSession sqlSession;

	@Override
	public List<Board> selectBoardList() {
		return sqlSession.selectList(SQL_FILE_PATH + "selectBoardList");
	}
}

 

 

5. BoardDaoImpl 클래스가 Service 클래스나 Controller 클래스에서 의존성 주입(Dependency Injection)되기 위해서는 DispatcherServlet에서 <component-scan>하여 자동으로 Bean으로 생성되어야 합니다. 그래서 BoardDaoImpl 클래스 위에 @Repository Annotation(어노테이션)를 붙여줍니다. (<component-scan>은 base-package에 설정된 네임스페이스 이하의 모든 클래스를 스캔하여 클래스에 @Component, @Controller, @service, @Repository와 같은 Annotation(어노테이션)이 있으면 자동으로 Bean으로 생성해 줍니다.)

package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;

@Repository("BoardDaoImpl")
public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = "com.home.study.test1.board.mapper.mariadb.BoardMapper.";

	@Autowired
	@Qualifier("sqlSessionMariaDB")
	private SqlSession sqlSession;

	@Override
	public List<Board> selectBoardList() {
		return sqlSession.selectList(SQL_FILE_PATH + "selectBoardList");
	}
}

 

 

Maven Spring Project의 Controller에 DAO 주입하기

 

1. Java Resource > src/main/java > com.home.study.test1.main.controller에서 MainController 클래스를 오픈합니다. (MainController.java)

 

2. IBoardDao Interface(인터페이스)를 선언하고 의존성 주입(Dependency Injection)을 위해서 @Autowired Annotation(어노테이션)를 변수 위에 붙여줍니다.

 

3. mainIndex 메서드를 defaultIndex 메서드로 변경하고 @RequestMapping Annotation(어노테이션)도 "/default"로 변경합니다.

 

4. mainIndex 메서드를 생성하여 boardDao의 selectBoardList 메서드를 사용하여 INT_BOARD_TB(게시판) Table에 있는 전체 데이터(게시물)를 조회(select)하여 Model의 boardList 속성으로 조회된 결과 리스트(List)를 넣어줍니다.

package com.home.study.test1.main.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.dao.IBoardDao;

@Controller
public class MainController {

	@Autowired
	IBoardDao boardDao;

	@RequestMapping("/index")
	public String mainIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
		
		List<Board> boardList = boardDao.selectBoardList();
		model.addAttribute("boardList", boardList);
		return "main/main";
	}

	@RequestMapping("/default")
	public String defaultIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
		List<String> memberIDList = new ArrayList<String>();
		memberIDList.add("testid1");
		memberIDList.add("testid2");
		memberIDList.add("testid3");
		memberIDList.add("testid4");
		memberIDList.add("testid5");
		model.addAttribute("memberList", memberIDList);
		return "main/main";
	}

}

 

 

Maven Spring Project의 main.jsp 수정하기

 

1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈합니다.

 

2. Model의 boardList가 게시물임으로 <style>와 <table>로 UI를 구성합니다.

  1. Model의 boardList에는 Board 객체 리스트는 게시판 시퀀스(sequence), 게시판 제목(subject), 게시판 내용(content), 등록자 아이디(registrationId), 등록 일자(registrationDateTime) 등의 정보를 가지고 있습니다. 그래서 <table>의 칼럼을 번호, 제목, 작성자, 작성일로 구성합니다.
  2. JSTL의 반복문인 <c:forEach> 태그로 Model의 boardList에서 Board 객체를 가져와서 처리합니다.
  3. 번호는 내림차순으로 표시되게 처리합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>게시판</title>
		<style>
		.board { width:800px; margin: 20px auto; }
		.board table { width:100%; border-top:2px solid #1d4281; border-spacing:0; }
		.board table thead th { padding:8px 10px 10px 10px; vertical-align:middle; color:#1d4281; font-size:14px; border-bottom:1px solid #ccc; background:#f8f8f8; }
		.board table tbody td { padding:7px 10px 9px 10px; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc; font-size:14px; line-heighT:150%; }
		.board table tbody td:nth-child(2) { text-align:left;}
		</style>
	</head>
	<body>
		<div class="board">
			<table>
				<colgroup>
					<col style="width:10%">
					<col style="width:*">
					<col style="width:15%">
					<col style="width:25%">
				</colgroup>
				<thead>
					<tr>
						<th scope="col">번호</th>
						<th scope="col">제목</th>
						<th scope="col">작성자</th>
						<th scope="col">작성일</th>
					</tr>
				</thead>
				<tbody>
					<c:forEach var="boardItem" items="${boardList}" varStatus="status">
					<tr>
						<td>${fn:length(boardList) - status.count + 1}</td>
						<td>${boardItem.subject}</td>
						<td>${boardItem.registrationId}</td>
						<td>${boardItem.registrationDateTime}</td>
					</tr>
					</c:forEach>
				</tbody>
			</table>
		</div>
	</body>
</html>

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력합니다.

728x90
반응형