JDBC란 무엇일까?
애플리케이션 서버를 개발하다 보면 필수적으로 데이터베이스와 통신해야 한다.
Java 진영에서 이 역할을 담당하는 표준 기술이 바로 JDBC이다.
JDBC는 Java Database Connectivity의 약자로, 자바 애플리케이션과 관계형 데이터베이스(RDBMS)를 연결해주는 표준 API이다.
1. JDBC의 역할
JDBC는 자바 코드에서 SQL을 실행하고, 그 결과를 자바 객체로 받아올 수 있게 해준다.
동작 흐름은 다음과 같다.
- 자바 애플리케이션이 JDBC API를 호출한다.
- JDBC Driver가 실제 데이터베이스와 통신한다.
- SQL 실행 결과를 자바 객체(ResultSet) 형태로 반환한다.
즉, JDBC는 자바와 데이터베이스 사이의 다리 역할을 한다.
2. JDBC Driver란 무엇인가?
JDBC는 인터페이스(표준)일 뿐이고, 실제 데이터베이스와 통신하는 구현체는 각 DB 벤더가 제공하는 Driver이다.
예를 들어:
- MySQL → mysql-connector-java
- PostgreSQL → postgresql 드라이버
- Oracle → ojdbc
데이터베이스를 MySQL에서 PostgreSQL로 변경하더라도,
애플리케이션 코드를 크게 수정할 필요 없이 Driver와 설정만 변경하면 된다.
Gradle 예시:
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
그리고 application.yml 또는 application.properties에 접속 정보만 변경하면 된다.
이것이 JDBC의 가장 큰 장점 중 하나이다.
자바 애플리케이션과 DB 사이에 표준 계층이 존재하기 때문에 DB 교체가 비교적 수월하다.
3. 순수 JDBC의 한계
JDBC를 직접 사용할 경우 다음과 같은 반복 작업이 발생한다.
- Connection 생성
- PreparedStatement 생성
- SQL 실행
- ResultSet 매핑
- 자원 해제
코드가 길어지고, 예외 처리도 복잡해진다.
이러한 불편함을 줄이기 위해 등장한 것이 Spring의 JdbcTemplate이다.
4. JdbcTemplate이란?
JdbcTemplate은 Spring에서 제공하는 JDBC 추상화 클래스이다.
- Connection 관리 자동 처리
- 예외 처리 일관성 제공
- 반복 코드 제거
개발자는 핵심 로직(SQL과 매핑)에만 집중할 수 있다.
주요 메서드:
- update() → insert, update, delete
- query() → select (다중 결과)
- queryForObject() → select (단일 결과)
5. JdbcTemplate 예제 코드 분석
다음은 간단한 메모 CRUD 예제이다.
1) 메모 생성
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
KeyHolder keyHolder = new GeneratedKeyHolder();
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(con -> {
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, memo.getUsername());
ps.setString(2, memo.getContents());
return ps;
}, keyHolder);
Long id = keyHolder.getKey().longValue();
memo.setId(id);
return new MemoResponseDto(memo);
}
핵심 포인트:
- ? 바인딩을 통해 SQL Injection 방지
- GeneratedKeyHolder를 통해 auto increment PK 반환
- DTO → Entity → ResponseDto 흐름 유지
2) 메모 조회
@GetMapping("/memos")
public List<MemoResponseDto> getMemos() {
String sql = "SELECT id, username, contents FROM memo";
return jdbcTemplate.query(sql, (rs, rowNum) ->
new MemoResponseDto(
rs.getLong("id"),
rs.getString("username"),
rs.getString("contents")
)
);
}
- query()는 여러 행을 반환
- RowMapper를 통해 ResultSet → DTO 변환
- 람다식을 사용하면 코드가 훨씬 간결해진다
3) 수정
@PutMapping("/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
String sql = "UPDATE memo SET username = ?, contents = ? WHERE id = ?";
int updated = jdbcTemplate.update(sql,
requestDto.getUsername(),
requestDto.getContents(),
id);
if (updated == 0) {
throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
}
return id;
}
기존 코드에서는 먼저 select로 존재 여부를 확인했지만,
실제로는 update 결과 행 개수로 판단하는 것이 더 효율적이다.
4) 삭제
@PutMapping("/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
String sql = "UPDATE memo SET username = ?, contents = ? WHERE id = ?";
int updated = jdbcTemplate.update(sql,
requestDto.getUsername(),
requestDto.getContents(),
id);
if (updated == 0) {
throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
}
return id;
}
update()는 영향을 받은 행 개수를 반환한다는 점이 중요하다.
6. 객체와 테이블 매핑 개념
RDBMS와 자바 객체의 관계는 다음과 같다.
- 테이블 1개 ↔ 클래스 1개
- 행(row) 1개 ↔ 객체 1개
- 컬럼(column) 1개 ↔ 필드 1개
하지만 JDBC는 단순히 데이터를 옮겨줄 뿐, 객체 매핑을 자동으로 해주지는 않는다.
개발자가 직접 RowMapper로 변환해야 한다.
이러한 불편함을 해결하기 위해 등장한 기술이 ORM이다.
7. JDBC와 ORM의 차이
JDBC (또는 JdbcTemplate)
- SQL을 직접 작성
- 명확하고 제어가 쉬움
- 세밀한 튜닝 가능
- 코드량이 많아질 수 있음
ORM (JPA, Hibernate)
- 객체 중심 개발
- SQL 자동 생성
- 생산성 높음
- 내부 동작 이해 없으면 성능 문제 발생 가능
결론적으로:
- 단순 조회나 복잡한 쿼리 → JDBC가 유리할 수 있음
- 도메인 중심 설계, 생산성 중요 → ORM이 유리
실무에서는 두 방식을 함께 사용하는 경우도 많다.
8. 정리
JDBC는 자바와 관계형 데이터베이스를 연결해주는 표준 API이다.
- JDBC는 인터페이스이고, 실제 통신은 Driver가 담당한다.
- DB를 변경하더라도 Driver와 설정만 교체하면 된다.
- 순수 JDBC는 반복 코드가 많다.
- Spring의 JdbcTemplate은 이를 간결하게 만들어준다.
- JDBC는 SQL 중심 개발 방식이다.
- ORM은 객체 중심 개발 방식이다.
JDBC를 이해하면 ORM의 동작 원리도 더 깊이 이해할 수 있다.
데이터 접근 기술의 기본은 결국 JDBC이기 때문이다.
'BackEnd > 내일배움캠프' 카테고리의 다른 글
| 글을 올리지 않은 이유 (0) | 2026.03.13 |
|---|---|
| 17. 숙제 및 해설 (0) | 2026.02.11 |
| 15. SQL (0) | 2026.02.11 |
| 14. Database (0) | 2026.02.10 |
| 13-2. Update, Delete 구현하기 (0) | 2026.02.10 |