티스토리 뷰

Framework/Spring

Spring JDBC

Seogineer 2021. 1. 4. 10:39

Spring JDBC 개발자가 할 일

  • connection 파라미터 정의
  • SQL문 지정
  • 파라미터 선언과 파라미터 값 제공
  • 각 이터레이션에 대한 작업 수행

 

Spring이 해주는 일

  • connection 오픈
  • statement 준비와 실행
  • (존재한다면)결과를 반복하는 루프 설정
  • 모든 예외 처리
  • 트랜잭션 제어
  • connection, statement, resultset 닫기

 

JDBC와 Spring JDBC 소스 비교

// JDBC
public Role getRole(Integer roleId) {
	Role role = null;
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
		
	try {
		Class.forName("org.mariadb.jdbc.Driver");
		conn = DriverManager.getConnection(dburl, dbUser, dbPasswd);
		String sql = "SELECT role_id,description FROM role WHERE role_id = ?";
		ps = conn.prepareStatement(sql);
		ps.setInt(1, roleId);
		rs = ps.executeQuery();
		if(rs.next()) {
			int id = rs.getInt("role_id");
			String description = rs.getString("description");
			//String description = rs.getString(2);
			role = new Role(id, description);
		}
			
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
            }
		}
		if(ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
		
	return role;
}
// Spring JDBC
@Repository
public class RoleDao {
	private NamedParameterJdbcTemplate jdbc;
	private SimpleJdbcInsert insertAction;
	private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);
	
	public RoleDao(DataSource dataSource) {
		this.jdbc = new NamedParameterJdbcTemplate(dataSource);
		this.insertAction = new SimpleJdbcInsert(dataSource).withTableName("role");
	}
	
	public Role selectById(Integer id) {
		try {
			Map<String, ?> params = Collections.singletonMap("roleId", id);
			return jdbc.queryForObject("SELECT role_id, description FROM role WHERE role_id = :roleId", params, rowMapper);
		} catch (EmptyResultDataAccessException e) {
			return null;
		}
	}
	
	
}

 

Spring JDBC 클래스

  1. JDBC Template
    • org.springframework.jdbc.core에서 가장 중요한 클래스입니다.
    • 리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 합니다.
    • Statement의 생성과 실행을 처리합니다.
    • SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행합니다.
    • JDBC 예외가 발생할 경우 org.springframework.dao 패키지에 정의되어 있는 일반적인 예외로 변환시킵니다.
  2. NamedParameterJdbcTemplate
    • JdbcTemplate에서 JDBC statement 인자를 ?를 사용하는 대신 파라미터명을 사용하여 작성하는 것을 지원
  3. SimpleJdbcInsert
    • 테이블에 쉽게 데이터 insert 기능을 제공

DTO

  • Data Transfer Object의 약자
  • 계층간 데이터 교환을 위한 JavaBeans 입니다.
  • 계층이란 컨트롤러 계층, 비즈니스-로직 계층, 퍼시스턴스 계층을 의미한다.
  • 일반적으로 DTO는 로직을 가지고 있지 않고 순수한 데이터 객체입니다.
  • 필드와 getter, setter를 가진다. 추가적으로 toString(), equals(), hashCode() 등의 Object 메소드를 오버라이딩 할 수 있다.

 

DAO

  • Data Access Object의 약자
  • 퍼시스턴스 계층에 해당한다.
  • 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체이다.
  • 데이터베이스를 조작하는 기능을 전담하는 목적으로 만들어진다.

 

Connection Pool

  • 미리 커넥션을 여러 개 맺어 둔 다음 커넥션이 필요하면 커넥션 풀에게 빌려서 사용한 후 반납한다.

 

DataSource

  • DataSource는 Connection Pool을 관리하는 목적으로 사용되는 객체입니다.
  • Connection을 얻어오고 반납하는 등의 작업을 수행한다.

 

참조

www.boostcourse.org/web316/lecture/20660

www.boostcourse.org/web316/lecture/254337/

'Framework > Spring' 카테고리의 다른 글

Spring MVC  (0) 2021.01.06
Spring JDBC 실습  (0) 2021.01.04
Inversion of Control / Dependency Injection  (0) 2021.01.01
Spring Container metadata 설정 방법  (0) 2021.01.01
이클립스 maven 프로젝트에서 spring 라이브러리 추가  (0) 2021.01.01
댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글