<?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 + "()는 매개변수가 없습니다.");
}
}
댓글 영역