Spring JdbcTemplate

johaS2·2025년 2월 4일

JdbcTemplate 이란?

Spring에서 제공하는 JDBC 도구이다.

기존 JDBC는 DB 연결, SQL 실행, 예외 처리, 자원 반환을 직접 처리했다.
근데 ! JdbcTemplate을 사용하면 DB 연결, 해제 자동 처리되고 예외 처리를 따로 안해도 된다 !

JdbcTemplate 사용법

  1. DB 설정(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/memo
spring.datasource.username=root
spring.datasource.password=wjd9160827
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  1. build.gradle에 JDBC 라이브러리와 MySQL을 등록
// MySQL
	implementation 'mysql:mysql-connector-java:8.0.28'
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
  1. JdbcTemplate 주입받기 (DB와 연결)
private final JdbcTemplate jdbcTemplate;

public MemoController(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

CREATE

@PostMapping("/memos")
    public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto){
        // RequestDto -> Entity
        Memo memo = new Memo(requestDto);

        // DB 저장
        KeyHolder keyHolder = new GeneratedKeyHolder(); // 기본 키를 반환 받기 위한 객체

        String sql = "insert into memo (username, contents) values(?, ?)";
        jdbcTemplate.update(con->{
            PreparedStatement preparedStatement = con.prepareStatement(sql,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            preparedStatement.setString(1, memo.getUsername());
            preparedStatement.setString(2, memo.getContents());
            return preparedStatement;
        }, keyHolder);

        // DB insert 후 받아온 기본키 확인
        Long id = keyHolder.getKey().longValue();
        memo.setId(id);

        // Entity -> ResponseDto
        MemoResponseDto memoResponseDto = new MemoResponseDto(memo);

        return memoResponseDto;
    }

READ

 @GetMapping("/memos")
    public List<MemoResponseDto> getMemos() {
        // DB 조회
        String sql = "SELECT * FROM memo";

        return jdbcTemplate.query(sql, new RowMapper<MemoResponseDto>() {
            @Override
            public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
                // SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
                Long id = rs.getLong("id");
                String username = rs.getString("username");
                String contents = rs.getString("contents");
                return new MemoResponseDto(id, username, contents);
            }
        });
    }

UPDATE

@PutMapping("/memos/{id}")
    public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
        // 해당 메모가 DB에 존재하는지 확인
        Memo memo = findById(id);
        if(memo != null) {
            // memo 내용 수정
            String sql = "UPDATE memo SET username = ?, contents = ? WHERE id = ?";
            jdbcTemplate.update(sql, requestDto.getUsername(), requestDto.getContents(), id);

            return id;
        } else {
            throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
        }
    }

DELETE

@DeleteMapping("/memos/{id}")
    public Long deleteMemo(@PathVariable Long id) {
        // 해당 메모가 DB에 존재하는지 확인
        Memo memo = findById(id);
        if(memo != null) {
            // memo 삭제
            String sql = "DELETE FROM memo WHERE id = ?";
            jdbcTemplate.update(sql, id);

            return id;
        } else {
            throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
        }
    }

ORM(JPA) 등장

여전히 SQL을 직접 작성해야 해서 복잡하다
그래서 ORM 기술이 등장함 ㅎㅎ

profile
passionate !!

0개의 댓글