[Spring]그림으로 배우는 스프링 6 - 8장 스프링 JDBC : JdbcTemplate 클래스 (2)

Gaeng·2024년 11월 18일

[Spring] 공부

목록 보기
8/21
post-thumbnail

JdbcTemplate클래스?

JdbcTemplateSpring Framework에서 제공하는 JDBC 작업을 간소화하는 핵심 클래스입니다. 데이터베이스 작업 중 반복적이고 번거로운 작업(예: 연결 관리, 예외 처리, 자원 해제)을 자동화하여 개발자가 SQL 작성과 비즈니스 로직에 집중할 수 있도록 도와주는 클래스

JdbcTemplate 주요 기능

  • SQL 실행
    SQL 쿼리를 작성하고 실행하여 데이터베이스와 상호작용.
  • 결과 매핑
    데이터베이스 쿼리 결과를 Java 객체로 변환하는 기능 제공.
  • 자원 관리 자동화
    연결과 리소스를 자동으로 열고 닫아줌(개발자가 직접 관리하지 않아도 됨).
  • 예외 처리
    JDBC 예외를 Spring의 데이터 접근 예외로 변환(DataAccessException).

JdbcTemplate 객체 준비

  @Bean
  public DataSource dataSource() {
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
      dataSource.setUsername("your_username");
      dataSource.setPassword("your_password");
      return dataSource;
  }
	JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

검색 계열 처리

예시 데이터

1)하나의 컬럼을 가져오는 경우

  • 하나의 컬럼을 가져오는 경우
    queryForObject를 사용하여 특정 컬럼의 값을 가져옵니다.
	String title = jdbcTemplate.queryForObject(
    "SELECT title FROM trainning WHERE id = ?", String.class, "t01");
  • 설명:
    첫번째 인수는 ? / 두번째 인수는 반환 할 객체의 타입 / 세번째 인수는 ?에 인수에 맞는 값을 지정(세번 째 이후부터는 가변 -> ? 갯수만큼 파라미터 값을 지정.
  • 여러 개의 파라미터 지정
	String title = jdbcTemplate.queryForObject(
    "SELECT title FROM trainning WHERE id = ? AND title = ?", String.class, "t01", "비즈니스");
  • 날짜형식으로 가져오기
	LocalDateTime date = jdbcTemplate.queryForObject(
    "SELECT date_result FROM trainning WHERE id = ?", LocalDateTime.class, "t01");
  • 여러 레코드에서 한 컬럼 가져오기
	List<Integer> reversed = jdbcTemplate.queryForList(
    "SELECT reserved FROM trainning", Integer.class);

2)레코드를 Map 객체로 변환

  • 레코드를 Map 객체로 변환
    queryForMap을 사용하여 레코드를 키-값 쌍으로 가져옵니다.
Map<String, Object> map = jdbcTemplate.queryForMap(
"SELECT * FROM training WHERE id = ?", "t01");
  • 설명:
    • SQL 쿼리: 특정 ID에 해당하는 전체 레코드를 가져옴.
    • queryForMap: 결과를 Map으로 반환하며, 키는 컬럼 이름이고 값은 해당 컬럼의 데이터.
  • 여러 레코드를 Map으로 가져오기
    List<MAP<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM training");
  • 설명
    - 리스트의 형태로 Map의 값을 불러올 수 있음

3)레코드를 Entity 객체로 변환하여 가져오기

query 또는 queryForObject를 사용해 결과를 사용자 정의 객체로 매핑.

public YourEntity getRecordAsEntity(int id) {
    String sql = "SELECT id, name, age FROM your_table WHERE id = ?";
    return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> 
        new YourEntity(
            rs.getInt("id"),
            rs.getString("name"),
            rs.getInt("age")
        )
    );
}
  • 설명:
    • SQL 쿼리: 특정 ID에 해당하는 레코드를 가져옴.
    • queryForObject: 한 개의 레코드만 매핑.
    • 람다식 또는 RowMapper를 사용하여 결과를 YourEntity 객체로 변환.
  • Entity 클래스 예시
public class YourEntity {
    private int id;
    private String name;
    private int age;

    public YourEntity(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // Getter & Setter 생략
}

갱신 계열 처리

갱신 계열 처리는 Insert(추가), Update(변경), Delete(삭제)로 나뉨

Insert

jdbcTemplate.update("INSERT NITO training VALUES (?,?,?,?,?,?)",
"t03", "Spring 교육", StartDateTime, endDateTime, 0, 8);

UPDATE

int count = jdbcTemplate.update(
"UPDATE 
	training 
SET 
	title=?, start_date_time=?,end_date_time=?, reserved=?, capacity = ? 
WHERE 
	id = ?"Spring 교육",startDateTime, endDateTime, 0, 8, "t03");

DELETE

int count = jdbcTemplate.update("DELETE FROM training WHERE id=?", "t03");

JDBC 클래스의 Bean 정의

JdbcTemplate 객체는 하나의 객체를 여러 곳에서 재사용 가능.
애플리케이션이 DI 컨테이너를 사용하는 경우 DI 컨테이너를 JdbcTemplate 객체를 Bean으로 등록하는 것이 좋음.(스프링 부트에서는 자동 정의 임으로 정의할 필요가 없음)

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource); }

@Bean 메소드를 정의하고 반환 값으로 JdbcTemplate 객체를 반환하고, DataSOurce로 객체를 넘겨줌.
그리고 JdbcTemplate를 사용하고 싶은 곳에 DI를 하면 됨.

//예시코드
@Repository
public class JdbcTrainingRepository implements TrainingRepository {
	private final JdbcTemplate jdbcTemplate;
	public JdbcTrainingRepository(JdbcTemplate jdbcTemplate) {
    	this.jdbcTemplate = jdbcTemplate; 
      }
	public Training selectById(String id) { 
    return jdbcTemplate.queryForObject...);
	} 
}

요약

JdbcTemplate은 데이터베이스 작업을 간편하게 도와주는 클래스이고, Spring에서는 이를 DI를 통해 관리
@Bean을 사용하여 JdbcTemplate을 Bean으로 등록하고, 필요한 클래스에서는 DI를 통해 이를 주입받아 사용
이를 통해 코드의 재사용성과 관리 편의성이 높아.

profile
문제를 해결하면서 나온 문제를 기록하는 노트

0개의 댓글