상세 컨텐츠

본문 제목

[스프링] JDBC template datosupport 개어려움...

카테고리 없음

by esoesmio 2023. 6. 7. 01:15

본문

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->


    <!-- Rootcontext.xml 파일을 읽어서 스프링테이너 구동시 bean 태그로 된 클래스의 객체 자동 생 -->
    <!-- bean객체 : bean 태그로 등록된 클래스의 객체. bean 객체로 등록하는 클래스들은 라이브러리들의 객체를 생성할
        때 등록. 라이브러리들에는 개발자가 어노테이션으로 객체생성이 불가능하기 때문. -->

    <!-- initmethod : 자동객체 생성시 초기화 필요한 객체들은 초기화 메소드를 만들어 매핑 -->
    <!-- destroy method : 스프링 컨테이너에 의해 객체가 삭제되기 전에 수행할 동작을 작성한 메소드 매핑 자동삭제되기전에
        수행할 동작들을 매핑을 해높을수 있다. -->

    <!-- scope : 객체의 생성 방식을 지정. singleton, prototype인지 지정가능.생성된 하나의 객체를 공유할
        것인지 요청때마다 객체를 새로 생성할 것인지 결정. --><!-- 레이지이닛 : 객체의 생성 시점을 설정. 트루 설정시 객체 요청 시에 객체 생 -->
    <!-- IOC 제어의 역전 : 개발자가 직접 생성하던 객체를 스프링 설정 파일응ㄹ 통해 스프링에 위임 -->
    <!-- <bean id="kcar" class="com.bit.springboard.coupling.kiacar"></bean> -->

    <!-- constructor-arg: 생성자 호출에 넘겨줄 파라미터지정 constructor-arg 앨리먼트 개수만큼에 알맞는
        생성자를 찾아서 호출 -->

    <!-- property : name 속성의 값과 동일한 변수명에 해당하는 변수의 setter 메소드를 자동 호출. -->


    <!-- namespace탭에서 p 선택. -->
    <!-- property 엘리먼트 더 편하게 사용하 p: property의 약자 p:변수명 => 해당 변수에 대한 세터 메소드 호출
        ref : 변수가 클래스 타입일 경우 bean객체랑 매핑 아니면 그냥 일반 값으로.. -->

    <!-- <bean id="hcar" class="com.bit.springboard.coupling.hyundaicar" p:caraudio-ref="sonycaraudio"
        p:model="gv70"></bean> -->
    <!-- <property name = "caraudio" ref = "sonycaraudio"></property> <property
        name = "model" value = "gv70"></property> -->


    <!-- <bean id="caraudio" class="com.bit.springboard.coupling.caraudio"></bean> -->
    <!-- <bean id="applecaraudio" class="com.bit.springboard.coupling.applecaraudio"></bean> -->
    <!-- <bean id="sonycaraudio" class="com.bit.springboard.coupling.sonycaraudio"></bean> -->
    <!-- 생성자로 하는거 -->

    <context:component-scan base-package="com.bit.springboard"></context:component-scan>

<context:property-placeholder location="classpath:config/db.properties"></context:property-placeholder>

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driver}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.password}"></property>
    
</bean>
    <bean id="jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
</beans>
package com.bit.springboard.service.impl;

import java.util.List;

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

import com.bit.springboard.dto.BoardDTO;

//DAO(Data Access Object): DB에 직접 접근하는 객체 
//					=> Boot에서는 Mapper 인터페이스나 Repository  인터페이스 사용 
//JDBC Template 사용방식2
//JDBC Template 필드로 선언후 의존성 주입 받아서 사용
@Repository("boardDAO")
public class BoardDAO {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	//쿼리등록
	private final String INSERT_BOARD = "INSERT INTO T_BOARD ("
			+ "				BOARD_TITLE, "
			+ "				BOARD_CONTENT, "
			+ "				BOARD_WRITER"
			+ "			) VALUES ("
			+ "				?,"
			+ "				?,"
			+ "				?"
			+ "			)";
	
	private final String GET_BOARD = "SELECT "
			+ "		BOARD_NO"
			+ "	  , BOARD_TITLE"
			+ "	  , BOARD_CONTENT"
			+ "   , BOARD_WRITER"
			+ "   , BOARD_REGDATE"
			+ "   , BOARD_CNT"
			+ "  FROM T_BOARD"
			+ "  WHERE BOARD_NO = ?";
	
	private final String UPDATE_BOARD = "UPDATE T_BOARD SET"
			+ "		BOARD_TITLE = ?,"
			+ "		BOARD_CONTENT = ?"
			+ "	  WHERE BOARD_NO = ?";
	
	private final String DELETE_BOARD = "DELETE FROM T_BOARD WHERE BOARD_NO = ?";
	
	private final String GET_BOARDLIST = "SELECT * FROM T_BOARD";
	
	//글 등록
	public void insertBoard(BoardDTO boardDTO) {
		System.out.println("insertBoard 실행");
		
		jdbcTemplate.update(INSERT_BOARD, boardDTO.getBoardTitle(),
				boardDTO.getBoardContent(), boardDTO.getBoardWriter());
	}
	
	//글 수정
	public void updateBoard(BoardDTO boardDTO) {
		System.out.println("updateBoard 실행");
		
		jdbcTemplate.update(UPDATE_BOARD, boardDTO.getBoardTitle(),
				boardDTO.getBoardContent(), boardDTO.getBoardNo());
	}
	
	//글 삭제
	public void deleteBoard(int boardNo) {
		System.out.println("deleteBoard 실행");
		
		jdbcTemplate.update(DELETE_BOARD, boardNo);
	}
	
	//글 상세 조회
	public BoardDTO getBoard(int boardNo) {
		System.out.println("getBoard 실행");
		
		//queryForObject의 두 번째 매개변수는 Object[]형태여야 한다.
		Object[] args = {boardNo};
		
		return jdbcTemplate.queryForObject(GET_BOARD, args,
				new BoardRowMapper());
	}
	
	//글 목록 조회
	public List<BoardDTO> getBoardList() {
		System.out.println("getBoardList 실행");
		
		return jdbcTemplate.query(GET_BOARDLIST, 
				new BoardRowMapper());
	}
	
	
	
	
	
	
}
package com.bit.springboard.service.impl;

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.bit.springboard.dto.BoardDTO;

//DAO(Data Access Object): DB에 직접 접근하는 객체 
//					=> Boot에서는 Mapper 인터페이스나 Repository  인터페이스 사용 
//JDBC Template 사용방식1
//JdbcDaoSupport 클래스를 상속받아서 사용하는 방식
@Repository("boardDAOJdbcDaoSupport")
public class BoardDAOJdbcDaoSupport extends JdbcDaoSupport {
	@Autowired
	public void setSuperDataSource(DataSource dataSource) {
		super.setDataSource(dataSource);
	}
	
	//쿼리등록
	private final String INSERT_BOARD = "INSERT INTO T_BOARD ("
			+ "				BOARD_TITLE, "
			+ "				BOARD_CONTENT, "
			+ "				BOARD_WRITER"
			+ "			) VALUES ("
			+ "				?,"
			+ "				?,"
			+ "				?"
			+ "			)";
	
	private final String GET_BOARD = "SELECT "
			+ "		BOARD_NO"
			+ "	  , BOARD_TITLE"
			+ "	  , BOARD_CONTENT"
			+ "   , BOARD_WRITER"
			+ "   , BOARD_REGDATE"
			+ "   , BOARD_CNT"
			+ "  FROM T_BOARD"
			+ "  WHERE BOARD_NO = ?";
	
	private final String UPDATE_BOARD = "UPDATE T_BOARD SET"
			+ "		BOARD_TITLE = ?,"
			+ "		BOARD_CONTENT = ?"
			+ "	  WHERE BOARD_NO = ?";
	
	private final String DELETE_BOARD = "DELETE FROM T_BOARD WHERE BOARD_NO = ?";
	
	private final String GET_BOARDLIST = "SELECT * FROM T_BOARD";
	
	//글 등록
	public void insertBoard(BoardDTO boardDTO) {
		System.out.println("insertBoard 실행");
		
		getJdbcTemplate().update(INSERT_BOARD, boardDTO.getBoardTitle(),
				boardDTO.getBoardContent(), boardDTO.getBoardWriter());
	}
	
	//글 수정
	public void updateBoard(BoardDTO boardDTO) {
		System.out.println("updateBoard 실행");
		
		getJdbcTemplate().update(UPDATE_BOARD, boardDTO.getBoardTitle(),
				boardDTO.getBoardContent(), boardDTO.getBoardNo());
	}
	
	//글 삭제
	public void deleteBoard(int boardNo) {
		System.out.println("deleteBoard 실행");
		
		getJdbcTemplate().update(DELETE_BOARD, boardNo);
	}
	
	//글 상세 조회
	public BoardDTO getBoard(int boardNo) {
		System.out.println("getBoard 실행");
		
		//queryForObject의 두 번째 매개변수는 Object[]형태여야 한다.
		Object[] args = {boardNo};
		
		return getJdbcTemplate().queryForObject(GET_BOARD, args,
				new BoardRowMapper());
	}
	
	//글 목록 조회
	public List<BoardDTO> getBoardList() {
		System.out.println("getBoardList 실행");
		
		return getJdbcTemplate().query(GET_BOARDLIST, 
				new BoardRowMapper());
	}
	
	
	
	
	
	
}
package com.bit.springboard.service.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import com.bit.springboard.dto.BoardDTO;

public class BoardRowMapper implements RowMapper<BoardDTO> {
	public BoardDTO mapRow(ResultSet rs, int rowNum) {
		BoardDTO boardDTO = new BoardDTO();
		
		try {
			boardDTO.setBoardNo(rs.getInt("BOARD_NO"));
			boardDTO.setBoardTitle(rs.getString("BOARD_TITLE"));
			boardDTO.setBoardContent(rs.getString("BOARD_CONTENT"));
			boardDTO.setBoardWriter(rs.getString("BOARD_WRITER"));
			boardDTO.setBoardRegdate(rs.getDate("BOARD_REGDATE"));
			boardDTO.setBoardCnt(rs.getInt("BOARD_CNT"));
		} catch(SQLException se) {
			System.out.println(se.getMessage());
		}
		
		return boardDTO;
		
		
		
		
		
		
		
		
	}
}
package com.bit.springboard.common;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class PointcutCommon {
	@Pointcut("execution(* com.bit.springboard.service..*Impl.*(..))")
	public void allPointcut() {}
}
package com.bit.springboard.common;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service
//3. 애즈팩트 설정
@Aspect
public class BeforeLog {
	//1. 포인트컷 설정
//	@Pointcut("execution(* com.bit.springboard.service..*Impl.*(..))")
//	public void allPointcut() {}
	
	//2. 어드바이스 설정
	//같은 클래스내의 포인트컷 설정
	//@Before("allPointcut()")
	//포인트컷 클래스의 포인트컷 설정
	@Before("PointcutCommon.allPointcut()")
	public void beforeLog(JoinPoint jp) {
		//Signature 객체는 체이닝기법 가능
		//현재 실행중인 포인트컷 메소드의 이름
		String methodName = jp.getSignature().getName();
		//현재 실행중인 포인트컷 메소드의 매개변수 Object 배열로 받기
		Object[] methodArgs = jp.getArgs();
		
		if(methodArgs.length != 0)
			System.out.println("[사전 처리] " + methodName + "()의 매개변수 정보: " 
												+ methodArgs[0].toString());
		else 
			System.out.println("[사전 처리] " + methodName + "()는 매개변수가 없습니다.");
	}
}

댓글 영역