📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[리메이크] DB의 기술 본문

CS

[리메이크] DB의 기술

seung_ho_choi.s 2025. 5. 30. 00:07
728x90

필자가 약 1년 6개월 전에 작성한 내용을 리메이크 해봤다. 

https://balhae.tistory.com/118

 

섹션1 JDBC 이해

최코딩의 개발 섹션1 JDBC 이해 본문 스프링/스프링 DB 섹션1 JDBC 이해 seung_ho_choi.s 2023. 10. 22. 00:26

balhae.tistory.com

https://balhae.tistory.com/121

 

섹션2 커넥션풀과 데이터소스 이해

최코딩의 개발 섹션2 커넥션풀과 데이터소스 이해 본문 스프링/스프링 DB 섹션2 커넥션풀과 데이터소스 이해 seung_ho_choi.s 2023. 10. 27. 22:56

balhae.tistory.com

 

☑️ 1. JDBC가 등장하기 전과 후

✔️ JDBC 등장 전

과거에는 DB 벤더마다 각자 다르게 연결해야 했음.
예를 들어, MySQL은 MysqlConnection, Oracle은 OracleConnection을 사용했기 때문에
DB가 바뀌면 코드도 죄다 바꿔야 했음.

개발자는 DB 종류에 종속되어 있었고, 유지보수가 매우 힘들었음.


✔️ JDBC 등장 후

JDBC는 **DB 벤더와 상관없이 동작하는 "표준 인터페이스"를 제공함.

개발자는 오직 아래의 인터페이스만 알면 됨:

  • Connection
  • Statement
  • ResultSet
 
Connection conn = DriverManager.getConnection(...);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(...);

 

이 인터페이스에 맞춰서

MySQL은 MysqlDriver, Oracle은 OracleDriver를 자바에서 자동으로 호출함.

즉, 개발자는 DB가 뭐든 상관없이 JDBC 표준만 사용하면 된다!


☑️ 2. SQL Mapper vs ORM 기술 비교

자바 애플리케이션에서 DB와 통신하는 대표적인 두 가지 방식은:

✔️ SQL Mapper (대표: MyBatis)

  • SQL을 직접 XML이나 어노테이션으로 작성
  • 프레임워크가 커넥션을 열고 SQL을 실행해줌
  • 결과는 자동으로 자바 객체에 매핑됨
<select id="getUser" resultType="User">
  SELECT * FROM users WHERE id = #{id}
</select>

 

비유:

너가 직접 쓴 쿼리를 전달하면, 대신 전화 걸고 처리해주는 통역사 느낌


✔️ ORM (대표: JPA + Hibernate)

  • SQL을 직접 쓰지 않고, 객체만 다룬다
  • User 객체를 저장하면 → Hibernate가 INSERT SQL을 만들어 DB에 전달
  • JPA는 표준 인터페이스, Hibernate는 실 구현체
User user = new User("홍길동");
entityManager.persist(user);

 

비유:

"피자 먹고 싶어요!"라고 말하면, 비서(Hibernate)가 알아서 전화 걸고 메뉴 고르고 주문까지 다 해줌


✔️ SQL Mapper vs ORM 비교 표

구분 SQL Mapper (MyBatis) ORM (JPA + Hibernate)
SQL 작성 개발자가 직접 작성 Hibernate가 자동 생성
제어 권한 쿼리 하나하나 직접 제어 가능 추상화된 트랜잭션 처리
러닝 커브 상대적으로 쉬움 처음엔 어려움, 익숙해지면 생산성 ↑
유지보수 복잡한 쿼리 유리 도메인 중심 모델 유리
대표 예시 Mapper.xml @Entity, @Repository
 

☑️ 3. 커넥션 풀과 그 필요성

✔️ 기본 커넥션 흐름

  • 애플리케이션은 DB 드라이버를 통해 커넥션(Connection) 을 생성
  • 이때 DB와 TCP/IP 3-way handshake가 일어남

3-way handshake란?

클라이언트와 서버가 서로 “연결할게요” → “오케이” → “진짜 시작하자”
라는 3단계 통신 확인 과정

✔️ 커넥션이란?

DB와 애플리케이션(또는 드라이버) 사이의 통신 라인
하나의 Connection 객체는 DB와 직접 연결된 TCP 세션


✔️ 커넥션 생성의 문제점

  • 커넥션 생성 시마다 TCP 연결 & 인증 & 세션 초기화가 반복됨
  • 매번 커넥션을 새로 만들면 → 시간 낭비 + 리소스 낭비
  • 사용자는 쿼리 실행 외에 커넥션 생성 시간까지 기다려야 함

결과: 응답 속도 저하 + 트래픽 몰리면 서버 뻗음


☑️ 4. 커넥션 풀 등장 (성능 최적화)

✔️ 커넥션 풀이란?

미리 DB 드라이버를 통해 커넥션을 여러 개 생성해두고, 재사용하는 기술

  • 보통 기본값은 10개
  • 커넥션은 DB와 이미 연결된 상태로 대기
  • 애플리케이션은 그냥 “꺼내서 쓰고 다시 반납”만 하면 됨
 

✔️ 오픈소스 커넥션 풀 - HikariCP

  • 가장 빠르고 가벼운 커넥션 풀 오픈소스
  • Spring Boot에서 기본으로 사용됨
  • 매우 적은 지연 시간과 빠른 반환 속도를 가짐

✔️ DataSource란?

커넥션 풀로부터 커넥션을 꺼내주는 인터페이스
→ 개발자는 dataSource.getConnection()만 호출하면 됨

 


✔️ 흐름 비유:  KT 콜센터

기술 요소 실생활 비유
애플리케이션 코드 고객 (KT와 문의사항 있음)
JDBC 인터페이스 전화 통화 규칙 (표준 통신 방식)
MySQL 드라이버 KT 전화기
커넥션 전화선 한 줄 (직접 연결된 라인)
커넥션 풀 콜센터에 설치된 전화선 10줄
HikariCP 콜센터 관리자 (전화선 꺼내주고 관리)
DataSource 콜센터 접수창구 (전화선 요청 인터페이스)
DB KT 직원 (실제 주문 처리 담당)
 

🚀 서버 시작 시 (콜센터 오픈 준비)

  1. HikariCP: 전화선 10개 요청
  2. MySQL 드라이버: DB랑 커넥션 개통 (TCP 연결)
  3. 커넥션 풀: 전화선 보관 (사용 대기)

⏱ 애플리케이션 요청 발생 시

  1. 고객: “KT 문희사항 있어요!”
  2. DataSource: “전화선 꺼내드릴게요”
  3. HikariCP: 커넥션 하나 제공
  4. 애플리케이션: 쿼리 실행 (executeQuery)
  5. DB: 요청 처리
  6. close(): 전화 끊는 게 아니라 커넥션 풀에 반납

☑️ 5. JDBC / MyBatis / JPA 기술별 비교 총정리

 

기술 전화는 누가 거니? 전화선 누가 연결하나? 말은 누가 하나? 특징
JDBCTemplate 개발자가 직접 개발자가 직접 SQL 작성 수동, 반복 많음
MyBatis 프레임워크가 전화 개발자가 SQL 작성 SQL 자유도 높음
JPA + Hibernate Hibernate가 전화 Hibernate가 SQL 생성 객체 중심 추상화
 

☑️ 최종 요약

  • JDBC는 DB와 연결하는 가장 하단의 통신 계층
  • 커넥션 풀은 성능 향상을 위해 커넥션을 미리 만들어 재사용
  • MyBatis는 SQL은 내가 쓰고, 대신 전화선 연결해줘
  • JPA는 객체만 다루면 Hibernate가 알아서 다 해줌

 

다음 시간에는 JPA에 관해 구체적으로 알아보겠습니다. 

728x90

'CS' 카테고리의 다른 글

데이터베이스의 지식  (0) 2025.06.11
N+1문제  (1) 2025.06.10
SSR, CSR, SSG 등  (0) 2025.05.17
JWT vs 세션  (0) 2025.05.15
운영체제의 핵심 개념: 프로그램, 프로세스, 스레드  (0) 2025.05.13