원인 DB에서 기본키를 자동으로 증가하는 전략을 사용할 때, 서버에서 DB에 등록된 키를 가져오지 못해서 발생하는 오류 코드 public Long enrolBoard(BoardEnrolDto boardEnrolDto) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement stmt = connection.prepareStatement("INSERT INTO Board(title, name, content, created_date, view_cnt) VALUES(?, ?, ?, ?, ?)"); stmt.setString(1, boardEnrolDto.getTitle()); st..
원인 Repository를 테스트할 때 key 값에 null이 저장되어 있어 DB 조회가 불가능한 상황이다. DB DB의 키(PK) 값은 auto_increment 전략을 사용하고 있다. Application 시점에서는 DB에 값을 저장하더라도 키 값을 알 수가 없다. 이는 테스트 코드에서 DB에 정상적으로 저장됐는지 확인하는 과정에서 문제가 발생한다. Application jdbcTemplate.update("INSERT INTO Member(login_id, name, password) VALUES(?, ?, ?)",member.getLoginId(), member.getName(), member.getPassword()); JdbcTemplate을 사용하여 DB에 Member 객체를 저장하였다. T..
본 글은 다크모드에 최적화되어 있습니다. 특정 쿼리문을 만족하는 row가 존재하는지 확인하기 위해서는 queryForObject() 메서드를 사용해야 합니다. 이 방법은 Jpa가 아닌 JdbcTemplate을 사용하는 경우에 해당합니다. queryForObject JdbcTemplate은 queryForObject() 메서드를 제공합니다. 오버로딩이 되어 있기 때문에 여러 개가 존재합니다. T queryForObject(String sql, Object[] args, Class requiredType) 다음 상황을 가정해 봅시다. 책을 대출하려고 할 때 사용자의 이름과 책의 이름을 입력해야 합니다. 이때 사용자 이름이 등록되어 있는지 확인하려면 다음과 같이 코드를 작성할 수 있습니다. public boo..
JdbcTemplate를 사용하다 보면 RowMapper 인터페이스를 본 적이 있을 것이다. 자세히 알고 쓰지 않으면 잘못된 사용을 할 수도 있으니 주의하자 JdbcTemplate 사용 전 우리는 지금까지 DB에 select문을 날려서 결과 값으로 ResultSet을 받아서 사용해 왔었다. 아래와 코드를 확인하자. ResultSet 사용 public Member findById(String memberId) throws SQLException { String sql = "select * from member where member_id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { 생략... ..
기존에 우리는 Jdbc를 통해 아래 과정을 거쳤다 커넥션 생성 및 동기화 PreparedStatement 생성 ResultSet 생성 (쿼리 실행 결과) SQLExceptionTranslator를 통해 체크 예외 -> 언체크 예외 리소스 반환(종료) DB에 저장, 조회, 삭제, 수정 즉 CRUD를 수행할 때마다 반복적인 작업을 거쳤다. JdbcTemplate은 위와 같은 반복 작업을 제거해준다. JdbcTemplate 생성 JdbcTemplate 클래스는 생성자로 DataSource를 넘겨줘야 한다. DataSource의 경우에는 Jdbc를 통하여 직접 가져오거나 커넥션풀을 사용하거나 해서 가져오면 된다. (커넥션풀 구현체로 HikariCP를 주로 사용한다고 한다) JdbcTemplate jdbcTemp..