72일차_Spring

서창민·2023년 6월 22일
0

Spring

목록 보기
3/15
post-thumbnail

23.06.22 목 72일차

Spring

DAO 클래스를 구성하는 방법

  • 방법 1 JdbcDaoSupport 클래스 상속
package com.springbook.biz.board.impl;

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

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardDao;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;



// DAO
@Repository("boardDao")
public class BoardDaoImpl extends JdbcDaoSupport implements BoardDao{
	
	public BoardDaoImpl() {
		System.out.println("==> BoardDaoImpl 객체 생성");
	}
	
	Connection conn = null;
	PreparedStatement pstmt=null;
	private ResultSet rs;
	
	private final String BoardInsert = "insert into board(seq, title, writer, content)"
			+ " values((select nvl(max(seq), 0)+1 from board), ?, ?, ?)";
	
	private final String BoardUpdate = "update board set title=?, writer=?, content=? where seq=?";
	
	private final String BoardDelete = "delete from board where seq=?";
	
	private final String BoardSelectAll = "select * from board order by seq asc";
	private final String BoardSelectTitle = "select * from board where title like ? order by seq asc";
	private final String BoardSelectWriter = "select * from board where writer like ? order by seq asc";

	// set 인잭션(super를 사용해 상속받아 사용, applicationContext.xmp 동일한 id에서 실행
	@Autowired
	public void setSuperDataSource(DataSource dataSource) {
		super.setDataSource(dataSource);
	}
	
	
	@Override
	public void insertBoard(BoardVO vo) {
		Object args [] = {vo.getTitle(), vo.getWriter(), vo.getContent()};
		getJdbcTemplate().update(BoardInsert, args);
	}

	@Override
	public void updateBoard(BoardVO vo) {
		Object args [] = {vo.getTitle(), vo.getWriter(), vo.getContent(), vo.getSeq()};
		getJdbcTemplate().update(BoardUpdate, args);
	}

	@Override
	public void deleteBoard(BoardVO vo) {
		Object args [] = {vo.getSeq()};
		getJdbcTemplate().update(BoardDelete, args);
	}

테이블의 쿼리문을 실행하기 위해 JdbcDaoSupport를 상속받아 DAO 클래스를 구성할 수 있다.
쿼리문의 변수는 오브젝트로 arg의 배열값으로 받아 처리했다.

  • RomMapper
selectOne과 selectAll
	
    @Override
	public BoardVO getBoard(BoardVO vo) {
		Object args [] = {vo.getSeq()};
		return getJdbcTemplate().queryForObject(BoardSelectOne, new BoardRomMapper(), args);
	}

	@Override
	public List<BoardVO> getBoardList(BoardVO vo) {
		if(vo.getCh1() == null || vo.getCh2()=="" || vo.getCh2().equals("")) {
			return getJdbcTemplate().query(BoardSelectAll, new BoardRomMapper() );
		}else if(vo.getCh1().equals("title")) {
			return getJdbcTemplate().query(BoardSelectTitle, new BoardRomMapper(), "%" + vo.getCh2() + "%");	
		}else if(vo.getCh1().equals("writer")) {
			return getJdbcTemplate().query(BoardSelectWriter, new BoardRomMapper(), "%" + vo.getCh2() + "%");	
		}
		return null;
	}

}

// BoardRomMapper 만들기
class BoardRomMapper implements RowMapper<BoardVO>{

	//BoardVO의 객체값을 동작 후 리턴한다.
	@Override
	public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
		BoardVO board = new BoardVO();
			board.setSeq(rs.getInt("seq"));
			board.setTitle(rs.getString("title"));
			board.setWriter(rs.getString("writer"));
			board.setContent(rs.getString("content"));
			board.setRegDate(rs.getDate("regDate"));
			board.setCnt(rs.getInt("cnt"));
		return board;
	}

select 쿼리문을 실행하기 위해 RomMapper 클래스를 따로 작성해주어 쿼리문을 실행하기 위한 BoardVO의 객체값을 받아와 작성한 뒤 다시 리턴 해준다.(public은 한 파일당 하나의 클래스만 존재할 수 있음으로 class로만 작성!)

  • JdbcTemplate 사용
package com.springbook.biz.user.Impl;

import java.sql.*;
import java.util.List;

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

import com.springbook.biz.user.UserDao;
import com.springbook.biz.user.UserVO;

@Repository
public class UserDaoImpl  extends JdbcDaoSupport   implements UserDao{
	
	public UserDaoImpl() {
		System.out.println("==> UserDaoImpl 객체생성 ");
	}
	
	Connection conn =null;
	PreparedStatement pstmt=null;
	ResultSet rs = null;
	private final String  SQL ="select  *  from users where id=? and password = ? ";
	
	// JdbcTemplate 사용
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	@Override
	public List<UserVO> getUser(UserVO vo) {
		
		String id = vo.getId();
		String password = vo.getPassword();
		Object args [] = { id, password } ;
				
		return  jdbcTemplate.query(SQL, new UserRowMapper(), args);

	}

JdbcTemplate 을 사용하여 XML파일의 ID값을 정한 리소스를 불러와 데이터를 연동하여 사용할 수 있다.

  • 트랜잭션
<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
 		destroy-method="close"> 
 	<property name="driverClassName" value="${jdbc.driver}"/>
 	<property name="url" value="${jdbc.url}"/>
 	<property name="username" value="${jdbc.username}"/>
 	<property name="password" value="${jdbc.password}"/>
</bean>
 
 <!-- Spring JDBC 설정 -->
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 	<property name="dataSource" ref="dataSource"/>
</bean>

<!-- Transaction 설정 -->
<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- Transaction advice 설정 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
	<tx:attributes>
		<tx:method name="get*" read-only="true"/>
		<tx:method name="*"/>
	</tx:attributes>
</tx:advice>

<!-- AOP 설정을 통한 Transaction 적용 -->
<aop:config>
	<aop:pointcut id="txPointcut" expression="execution(* com.springbook.biz..*(..))" />
	<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>

<bean id="log" class="com.springbook.biz.common.LogAdvice"/>
 	<aop:config>
	 	<aop:pointcut id="allPointcut"
	 		expression="execution(* com.springbook.biz..*Impl.*(..))" />
	 	<aop:aspect ref="log">
	 		<aop:before method="printLog" pointcut-ref="allPointcut" />
	 	</aop:aspect>
	 </aop:config>

xml 파일에서 트랜잭션을 적용하는 방법이다.
데이터소스, Jdbc, 트랜잭션설정, 트랜잭션 어드바이스설정, aop 트랜잭션 적용을 통해 상호간의 호출 방법에 대해 알아볼수 있다.
정확하게 어디로 이동하는지를 확인하도록 !

profile
Back-end Developer Preparation Students

0개의 댓글