
JDBC 드라이버 : 각 DB마다 JDBC를 구현해서 라이브러리로 제공하는 것java.sql.Connection : 연결java.sql.Statement : SQL을 담은 내용Statement : sql을 그대로 넣는 것preparedStatement : 파라미터를 바인딩해서 sql로 넣는 것, Statement를 상속받은 것java.sql.ResultSet : SQL 요청 응답excuteUpdate : 등록, 수정, 삭제 (int 반환 -> 변경된 데이터 수, 여기선 pk이므로 1아니면 0임)excuteQuery : select -> 조회 (여기서 rs씀->반환값이 ResultSet임)public Member findById(String memberId) throws SQLException {
String sql = "select * from member where member_id = ?";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
con=getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1,memberId);
rs = pstmt.executeQuery();
if (rs.next()){
Member member = new Member();
member.setMemberId(rs.getString("member_id"));
member.setMoney(rs.getInt("money"));
return member;
} else {
throw new NoSuchElementException("member not found memberId=" + memberId);
}
} catch (SQLException e) {
log.error("db error",e);
throw e;
} finally {
close(con,pstmt,rs);
}
}
물론, JDBC는 db의 연결측면에서 여러 db 기술들의 표준 인터페이스를 제공하는데 아주 큰 의의가 있다
- 하지만, JDBC는 코드가 매우 길고... 반복이 많다
- 또한, 예외를 계속 다음 계층으로 넘겨주는 문제도 있다...
- 또한, db 마다 문법이 조금씩 달라 완벽한 통합은 어렵다!

SQL Mapper
스프링 JdbcTemplate, MyBatis
ORM 기술
JPA, 하이버네이트, 이클립스링크중요
이런 기술들도 내부에서는 모두 JDBC를 사용한다. 따라서 JDBC를 직접 사용하지는 않더라도, JDBC가 어떻게 동작하는지 기본 원리를 알아두어야 한다. 그래야 해당 기술들을 더 깊이있게 이해할 수 있고, 무엇보다 문제가 발생했을 때 근본적인 문제를 찾아서 해결할 수 있다 JDBC는 자바 개발자라면 꼭 알아두어야 하는 필수 기본 기술이다
ORM : 객체와 데이터베이스의 관계를 매핑하는 방법JPA : JAVA ORM 기술에 대한 인터페이스Hibernate : JAP 인터페이스를 구현한 라이브러리@Transactional
public User save(User user) {
return userRepository.save(user);
}
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null.");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}

핵심은 결국 JPA이다!
- JPA를 잘 알아야지, 다음 기술들을 잘 사용할 수 있는 것이다
spring:
jpa:
show-sql: true
properties:
format_sql: true
dialect: org.hibernate.dialect.MySQLDialect
hibernate:
ddl-auto: validate
datasource:
url: jdbc:mysql://localhost:3307/book_store?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ~~~~~
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity(name = "user")
public class UserEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int score;
}
public interface UserRepository extends JpaRepository<UserEntity,Long> {}
Spring Data JPA 공식문서
https://docs.spring.io/spring-data/jpa/docs/current-SNAPSHOT/reference/html/#reference
3.1.3 Query Method가 부분이 있는데, 여기 나오는 규칙을 이용해 우리가 db에서 특정 쿼리를 메서드의 이름을 가지고 생성할 수 있다
public interface UserRepository extends JpaRepository<UserEntity,Long> {
// select * from user where score >= [??];
public List<UserEntity> findAllByScoreGreaterThanEqual(int score);
// select * from user where score >= ?? and score <= ??
public List<UserEntity> findAllByScoreGreaterThanEqualAndScoreLessThanEqual(int min, int max);
// 네이티브 쿼리 활용법
@Query(
// value = "select u from user u where u.score >= ?1 AND u.score <= ?2",
value = "select * from user as u where u.score >= :min AND u.score <= :max",
nativeQuery = true
)
List<UserEntity> score(
@Param(value= "min") int min,
@Param(value = "max") int max);
@Query : 어노테이션을 이용해 네이티브 쿼리를 날릴 수 있다!nativeQuery = true : default = falsepublic List<UserEntity> filterScore(int min,int max){
userRepository.findAllByScoreGreaterThanEqualAndScoreLessThanEqual(min, max);
return userRepository.score(min, max);
}
@GetMapping("/score")
public List<UserEntity> filterScore(
@RequestParam("score") int score
){
return userService.filterScore(score);
}
@GetMapping("/min_max")
public List<UserEntity> filterScore(
@RequestParam("min") int min,
@RequestParam("max") int max
){
return userService.filterScore(min,max);
}
다음 코드를 통해, 쿼리 파라미터인 score을 이용해 요청을 한 결과를 보면


모두 90점이 넘는 user만 반환된 것을 알 수 있다!