개발자는 복사 붙여넣기 되는 코드를 줄여 성능을 개선 시켜야한다.

이때 Model DAO 고도화를 진행한다. (로직, 성능 개선, 최적화)

 

복잡한 로직을 캡슐화 및 성능을 개선하기 위해 템플릿 패턴을 사용한다.

이때 스프링 프레임워크에서 제공하는 JdbcTemplate 을 사용해서 단순화 최적화가 가능하다.

 

JdbcTemplate applicationContext.xml(설정파일)

더보기
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
	<property name="dataSource" ref="ds"/>
</bean>

 

pom.xml 의존 주입

더보기
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>3.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>

 

DAO JdbcTemplate 사용

더보기
 @Autowired
    private JdbcTemplate jdbcTemplate;

    public static String keyword_map(String keyword) {
        Map<String, String> map = new HashMap<String, String>();

        map.put("NAME", " WHERE MEMBER_NAME = ?");
        map.put("TITLE", " WHERE BOARD_TITLE LIKE CONCAT('%',?,'%')");
        map.put("CONTENT", " WHERE BOARD_CONTENT LIKE CONCAT('%',?,'%')");

        return  map.get(keyword) + " ORDER BY BOARD_NUM DESC";
    }

    public List<BoardDTO> selectAll(BoardDTO boardDTO) {
        Object[] args = {boardDTO.getBoard_search_value()};
        String result = SQL_ALL;
        if(boardDTO.getBoard_condition().equals("SQL_ALL_SEARCH")){
            System.out.println("boardDTO.getBoard_condition().equals(\"SQL_ALL_SEARCH\")){ 실행");
            result = SQL_ALL_SEARCH + keyword_map(boardDTO.getBoard_search_key());
        return jdbcTemplate.query(result, args, new BoardRowMapper());
        }
        System.out.println("SQL : ["+result+"]");
        return jdbcTemplate.query(result, new BoardRowMapper());
    }

    public BoardDTO selectOne(BoardDTO boardDTO) {
        Object[] args = {boardDTO.getBoard_num()};

        return jdbcTemplate.queryForObject(SQL_ONE, args, new BoardRowOneMapper());
    }

    public boolean insert(BoardDTO boardDTO) {
        int result = jdbcTemplate.update(SQL_INSERT, boardDTO.getBoard_title(), boardDTO.getBoard_content(), boardDTO.getBoard_writer_id());
        return result > 0;
    }

    public boolean update(BoardDTO boardDTO) {
        return false;
    }

    public boolean delete(BoardDTO boardDTO) {
        return false;
    }

 


트랜잭션

트랜잭션은 데이터 무결성 + 프로그램의 신뢰성을 추가하는 기능이다.

트랜잭션도 JdbcTemplate 과 동일하게 스프링에서 제공해준다.

 

트랜잭션 applicationContext.xml(설정파일)

더보기
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="txManager">
    <property name="dataSource" ref="ds"/>
</bean>

<tx:advice transaction-manager="txManager" id="txAdvice">
    <tx:attributes>
        <tx:method name="select*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut expression="execution(* com.nsd.app.biz..*Impl.*(..))" id="txPointcut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

 

xml 설정 설명

 

DataSourceTransactionManager

더보기
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="txManager">
    <property name="dataSource" ref="ds"/>
</bean>

 

스프링 데이터 트랜잭션을 관리한다.

BataSourceTransactionManager 를 이용해서 데이터와 트랜잭션을 관리한다.

 

tx:advice

더보기
<tx:advice transaction-manager="txManager" id="txAdvice">
    <tx:attributes>
        <tx:method name="select*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

 

트랜잭션 어드바이스는 특정 메서드가 실행될 때 트랜잭션이 적용하도록 한다.

-> 이 xml 코드에서의 2가지 설정으로는 모든 select 에 대해서는 읽어 오기만 하는 설정

다른 메서드들에 대해서는 트랜잭션을 사용한다.

 

aop:config

더보기
<aop:config>
    <aop:pointcut expression="execution(* com.nsd.app.biz..*Impl.*(..))" id="txPointcut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

 

AOP 설정을 통해 트랜잭션 어드바이스를 특정 포인트컷을 적용한다.

이때 패키지내 Impl 가 들어간 모든 메서드에 트랜잭션 어드바이스를 적용해줍니다.

 

전체 xml 코드

더보기
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="txManager">
    <property name="dataSource" ref="ds"/>
</bean>

<tx:advice transaction-manager="txManager" id="txAdvice">
    <tx:attributes>
        <tx:method name="select*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut expression="execution(* com.nsd.app.biz..*Impl.*(..))" id="txPointcut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
728x90
개발자가 되고 싶은 곰