개발/스프링

9. 스프링 프레임 워크 - jdbcTemplate 클래스 이용[자바웹을 다루는 기술]

괴발자-K 2022. 5. 19. 11:02

JDBC? 

Java Database Connectivity의 약자로 말 그대로 자바에서 데이터베이스에(Oracle, MySQL 등) 접속할 수 있도록 

하는 자바 API 입니다.  

*API란 Application Programming Interface의 줄임 말로, 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍

언어가 제공하는 기능을 제어 할 수 있게 만든 인터페이스를 뜻합니다. - 위키백과 -

브로커 같은 역할을 한다고 생각 하시면 됩니다.

 

jdbcTemplate?

책에는 'DAO 클래스에서 실제 스프링의 JDBC 기능을 제공하는 클래스는 JdbcTemplate 입니다' 라고 정의 한다.

매우 간단하고 명료한 정의라고 생각한다. 이 API에 대해 이해를 하고 있다면..

 

전에 

1. Connection으로 연결

2. query 작성 및 PrepareStatement 또는 Statement 실행

3. 결과값을 처리하기 위해 ResultSet 이용

4. close() 메서드를 통해 Connection 닫기,  PrepareStatement  닫기 등

 

이러한 과정을 좀 더 간단하게 해주는 API라고 생각하면 됩니다.

 

아래 기능은 한번 보고 넘어가겠습니다.

JDBC Template 클래스에서 제공하는 SQL 관련 메서드

기능 메서드
insert, update, delete
관련 메서드
int update(String query)
int update(String query, Object[] args)
int update(String query, Object[] args, int[] argTypes)
select 기능 메서드 int queryForInt(String query)
int queryForInt(String query, Object[] args)
long queryForLong(String query)
long queryForLong(String query, Object[] args)
Object queryForObject(String query, Class requiredType)
List queryForList(String query)
List queryForList(String query, Object[] args)

 

실습

간단한 실습으로 이해 해보도록 하겠습니다.

** XML 빈 설정 및 스프링에 관련된 라이브러리 설정과, DBMS 연결 할 기본 설정(USERID, PASSWORD)은 생략

 

실습파일

MVC 맞춰 Controller, DAO, Service, vo 및 view 파일을 생성 합니다.

 

 

MemberControllerImpl.java

 

package com.spring.member.controller;

import java.util.List;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.spring.member.service.MemberService;

public class MemberControllerImpl extends MultiActionController implements MemberController{
      
	 private MemberService memberService;
    
	//memberrService 빈을 주입하기 위해 반드시 setter를 구현
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
	}
	
	public ModelAndView listMembers(HttpServletRequest request,
			                        HttpServletResponse response) throws Exception{
		
		String viewName = getViewName(request);
		List membersList = memberService.listMembers();
		ModelAndView mav = new ModelAndView(viewName);
		mav.addObject("membersList", membersList);
		
		return mav;
	}
	
	
    //요청하는 URL 중 viewName만 가지고 옮
	private String getViewName(HttpServletRequest request) throws Exception {
		String contextPath = request.getContextPath();
		String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
		if (uri == null || uri.trim().equals("")) {
			uri = request.getRequestURI();
		}

		int begin = 0;
		if (!((contextPath == null) || ("".equals(contextPath)))) {
			begin = contextPath.length();
		}

		int end;
		if (uri.indexOf(";") != -1) {
			end = uri.indexOf(";");
		} else if (uri.indexOf("?") != -1) {
			end = uri.indexOf("?");
		} else {
			end = uri.length();
		}

		String fileName = uri.substring(begin, end);
		if (fileName.indexOf(".") != -1) {
			fileName = fileName.substring(0, fileName.lastIndexOf("."));
		}
		if (fileName.lastIndexOf("/") != -1) {
			fileName = fileName.substring(fileName.lastIndexOf("/"), fileName.length());
		}
		return fileName;
	}
	 
}

1. 여기서 중요한건 빈을 등록하는 xml 파일에서 MemberControllerImpl에 memberService 빈을 속성으로 설정하였습니 다.  빈을 주입 하기 위해서는 반드시 setter를 구현해야합니다.

 

2. getViewName 메서드를 호출하여 request로 값을 파라미터로 사용하여 return값으로 viewName을 반환 합니다.

 

3. ModelAndView에 viewName과 조회한 회원정보(membersList)를 바인딩하여 설장한 viewName으로 포워딩 합니다.

 

MemberServiceImpl.java

package com.spring.member.service;

import java.util.List;

import com.spring.member.dao.MemberDAO;

public class MemberServiceImpl implements MemberService {

	private MemberDAO memberDAO;
    // memberDAO 속성에 setter를 이용하여 설정 파일에서 생성된 memberDAO 빈을 주입
	public void setMemberDAO(MemberDAO memberDAO) {
		this.memberDAO = memberDAO;
	}

	@Override
	public List listMembers() throws Exception {
		List membersList = null;
		membersList = memberDAO.selectAllMembers();
		
		return membersList;
	}
      
}

1. Controller와 동일한 방법으로 memberDAO 속성에 setter를 이용하여 설정 파일에서(xml) 생성된 memberDAO

빈을 주입 합니다.

2. MemberDAO에 회원 정보를 조회 할 수 메서드를 호출 합니다.

 

package com.spring.member.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.spring.member.vo.MemberVO;

public class MemberDAOImpl implements MemberDAO{
   
	private JdbcTemplate jdbcTemplate;
	//설정 파일에서 생성한 dataSource 빈을 setter를 이용해 JdbcTemplate 클래스 생성자의 인자로 입력
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	 
	@SuppressWarnings("unchecked")
	@Override
	public List selectAllMembers() throws DataAccessException {
		String query = "select id,pwd,name,email,joinDate"
			          + " from t_member "
				      + " order by joinDate desc";
		//Jdbc Template 클래스의 query() 메서드 인자로 select문을 전달해 조회한 레코드의 개수만큼
		//MemberVO 객체를 생성 각 레코드의 값을 속성에 저장하고 다시 memberList에 저장
		List membersList = new ArrayList();
		membersList = jdbcTemplate.query(query, new RowMapper() {
			@Override
			public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
				MemberVO memberVO = new MemberVO();
				memberVO.setId(rs.getString("id"));
				memberVO.setPwd(rs.getString("pwd"));
				memberVO.setName(rs.getString("name"));
				memberVO.setEmail(rs.getString("email"));
				memberVO.setJoinDate(rs.getDate("joinDate"));
				
				return memberVO;
			}

		});
		return membersList;
	}
  }

listMembers.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 정보 창</title>
</head>
<body>
     <table border="1" align="center" width="80%">
        <tr align="center" bgcolor="lightgreen">
           <td><b>아이디</b></td>
           <td><b>비밀번호</b></td>
           <td><b>이름</b></td>
           <td><b>이메일</b></td>
           <td><b>가입잃</b></td>
        </tr>
        
        <c:forEach var="member" items="${membersList }">
          <tr align="center">
              <td>${member.id }</td>
              <td>${member.pwd }</td>
              <td>${member.name }</td>
              <td>${member.email }</td>
              <td>${member.joinDate }</td>
          </tr>
        </c:forEach>
     
     </table>
     
     
     
</body>
</html>

Controller에서 바인딩한  membersList를 EL태그를 이용하여 값을 출력합니다.

조회한 회원정보다 1개 이상이기 때문에 <c:forEach></c:forEach> 분기문을 통해 반복적으로 출력합니다.

 

암기하기 보다는 논리적으로 생각하여 흐름을 따라가는게 중요합니다. 

이상으로 JDBCTEMPLATE 실습을 마치겠습니다.