javaboiii의 Spring

Spring - 성능 개선(Model 맛)

javaboiii 2024. 10. 18. 16:34

Spring

DAO 성능 개선 및 고도화

현재의 DAO

selectAll 메서드 1개

public List<BoardDTO> selectAll(BoardDTO boardDTO) {
    System.out.println("BoardDAO.java selectAll 호출됨");
    System.out.println("BoardDAO.java selectAll condition : [ "+boardDTO.getBoard_condition()+" ]");
    System.out.println("BoardDAO.java selectAll content : [ "+boardDTO.getSearch_content()+" ]");
    List<BoardDTO> datas=new ArrayList<BoardDTO>();

    Connection conn=JDBCUtil.connect();
    PreparedStatement pstmt = null;
    try {
        if(boardDTO.getBoard_condition().equals("ALL")) {
            pstmt = conn.prepareStatement(SELECTALL);
        }
        else if(boardDTO.getBoard_condition().equals("SELECT_BY_WRITER")) {
            pstmt = conn.prepareStatement(SELECT_BY_WRITER);
            pstmt.setString(1, boardDTO.getSearch_content());
        }
        else if(boardDTO.getBoard_condition().equals("SELECT_BY_CONTENT")) {
            pstmt = conn.prepareStatement(SELECT_BY_CONTENT);
            pstmt.setString(1, boardDTO.getSearch_content());
        }
        ResultSet rs=pstmt.executeQuery();
        while(rs.next()) {
            BoardDTO data=new BoardDTO();
            data.setBoard_num(rs.getInt("BOARD_NUM"));
            data.setBoard_content(rs.getString("BOARD_CONTENT"));
            data.setBoard_writer_id(rs.getString("BOARD_WRITER_ID"));
            datas.add(data);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    JDBCUtil.disconnect(pstmt, conn);

    return datas;
}

성능 개선의 필요성

DAO에서 발생하는 코드 중복과 복잡성을 줄이기 위해 성능 개선이 필요

 

[템플릿 패턴]을 이용한 DAO 고도화

템플릿 이란
반복된 로직을 캡슐화 한 것
어려운(복잡한) 로직을 캡슐화
재사용성이 높음
JDBC가 아주 대표적인 템플릿 적용하기 좋은 실습
Util 클래스 또한 일종의 템플릿이라고 볼 수 있음

 

템플릿 패턴은 반복적인 로직을 캡슐화하여 코드의 재사용성을 높이고 복잡성을 줄이는 디자인 패턴


패턴) MVC, 템플릿, 싱글톤, 팩토리, ...

 

Spring에서 지원하는 Template 클래스를 이용해 JDBCUtil 성능 개선

(반복되는 코드 패턴을 간소화)을 위한 xml 설정

 

DataSource 설정

<bean class="org.apache.commons.dbcp.BasicDataSource" id="ds" destroy-method="close">
  <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/YOUR-DB" />
  <property name="username" value="USERNAME" />
  <property name="password" value="PASSWORD" />
</bean>

성능을 조금이라도 더 개선 시키기 위해

destroy-method="close" 작성

이 설정에서는 BasicDataSource 객체가 소멸될 때 close()
메서드가 호출되어 데이터베이스 커넥션을 적절히 종료시킴

 

JDBC Template 설정

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

 

 

DAO 클래스 구현

@Repository
public class BoardDAO2 {
	@Autowired
	private JdbcTemplate jdbcTemplate;

	public List<BoardDTO> selectAll(BoardDTO boardDTO) {
		return jdbcTemplate.query(SELECTALL,new BoardRowMapper());
	}
	public BoardDTO selectOne(BoardDTO boardDTO) {
		Object[] args= {boardDTO.getBoard_num(), boardDTO.getBoard_condition()};
		return jdbcTemplate.queryForObject(SELECTONE,args,new BoardRowMapper());
	}
	public boolean insert(BoardDTO boardDTO) {
		int result=jdbcTemplate.update(INSERT, boardDTO.getBoard_content(), boardDTO.getBoard_writer_id());
		if(result<=0) {
			return false;
		}
		return true;
	}
	public boolean update(BoardDTO boardDTO) {
		return false;
	}
	public boolean delete(BoardDTO boardDTO) {
		return false;
	}
}

class BoardRowMapper implements RowMapper<BoardDTO> {

	@Override
	public BoardDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
		BoardDTO data=new BoardDTO();
		data.setBoard_num(rs.getInt("BOARD_NUM"));
		data.setBoard_content(rs.getString("BOARD_CONTENT"));
		data.setBoard_writer_id(rs.getString("BOARD_WRITER_ID"));
		return data;
	}

}

 

 

XML 설정 파일을 사용하여 Spring에서 JDBC 템플릿을 구성함으로써 DAO의 성능을 개선할 수 있음

템플릿 패턴을 적용하여 중복 코드를 줄이고, 데이터베이스 작업을 효율적으로 수행할 수 있음

== 이를 통해 유지보수성과 가독성이 향상