JDBC로 배우는 단계별 프로젝트 개발: Ver 3과 Ver 4를 통해 얻은 깨달음 🚀

2025. 1. 6. 23:02·DB

프로젝트 개요: NewShop

https://github.com/GEISHAz/NewShop-jdbc-jpa-compare

 

GitHub - GEISHAz/NewShop-jdbc-jpa-compare: 👀 JDBC와 JPA성능을 비교하기위한 간단 쇼핑몰 프로젝트 : A projec

👀 JDBC와 JPA성능을 비교하기위한 간단 쇼핑몰 프로젝트 : A project to compare CRUD performance between JDBC and JPA using MySQL. - GEISHAz/NewShop-jdbc-jpa-compare

github.com

이번 프로젝트는 옷 쇼핑몰 시스템인 NewShop을 단계적으로 구현하며,

JDBC와 JPA의 특징과 차이를 학습하는 데 초점을 맞췄습니다.
 Ver 1과 Ver 2 단계에서는 JDBC를 활용해 기본적인 데이터베이스 연결과 CRUD 작업을 구현하며

여러 깨달음을 얻을 수 있었습니다.
이번에 진행한 Ver 3 와 Ver 4 단계에서는 JPA를 활용해 기본적인 데이터베이스 연결과 CRUD 작업을 구현하고
실제 JDBC와 JPA의 성능테스트를 System.currentMillis() 를 활용하여 진행하면서 여러가지를 배울 수 있었습니다.


Ver 3: JPA를 사용한 CRUD 기능 구현

구현 내용

 

  • JPA를 사용해 CRUD 기능을 객체 지향적으로 재구현했습니다.
  • Clothes 엔티티와 데이터베이스 테이블을 매핑하여 SQL 작성 없이 데이터를 다룰 수 있었습니다.
  • EntityManager를 통해 데이터베이스와 상호작용하고, JPQL을 활용하여 데이터를 조회했습니다.

코드 주요 부분

private static void createClothes(String title, String brand, int prices) {
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    try {
        tx.begin();
        Clothes clothes = new Clothes();
        clothes.setTitle(title);
        clothes.setBrand(brand);
        clothes.setPrices(prices);
        em.persist(clothes);
        tx.commit();
        System.out.println("Clothes 저장 성공");
    } catch (Exception e) {
        tx.rollback();
        e.printStackTrace();
    } finally {
        em.close();
    }
}
    
private static void readClothes() {
    EntityManager em = emf.createEntityManager();
    try {
        List<Clothes> clothesList = em.createQuery("SELECT c FROM Clothes c", Clothes.class).getResultList();
        for (Clothes clothes : clothesList) {
            System.out.printf("ID: %d, Title: %s, Brand: %s, Prices: %d\n",
                    clothes.getId(), clothes.getTitle(), clothes.getBrand(), clothes.getPrices());
        }
    } finally {
        em.close();
    }
}

 

깨달은 점

 

  • 객체 중심의 데이터베이스 작업
    • 엔티티와 데이터베이스를 매핑하여 객체를 다루듯 데이터 작업을 할 수 있었습니다.
    • SQL 대신 JPQL을 사용해 객체 지향적 쿼리를 작성하는 경험이 흥미로웠습니다.
  • 코드 생산성
    • JPA는 JDBC에 비해 코드량이 줄어들고, 가독성과 유지보수성이 크게 향상되었습니다.
    • 특히 반복적인 자원 해제 코드가 필요 없어졌고, 트랜잭션 관리도 더 간단해졌습니다.
  • 러닝 커브
    • JPA의 러닝 커브가 JDBC보다 높은 것을 느꼈습니다. 엔티티 설계, 매핑, JPQL 문법 등 학습해야 할 내용이 많았습니다.

Ver 4: JDBC와 JPA의 성능 비교

구현 내용

 

JDBC와 JPA를 사용하여 동일한 CRUD 작업을 실행하고 성능을 비교했습니다. 작업별로 대량 데이터를 처리하며 각각의 소요 시간을 측정했습니다.

 

코드 주요 부분

public static void main(String[] args) {
        System.out.println("=== JDBC vs JPA Performance Test ===");

        // CREATE 테스트
        System.out.println("\n[CREATE]==================");
//        testJDBCCreate();
        testJPACreate();
        System.out.println("==========================");

        // READ 테스트
        System.out.println("\n[READ]==================");
//        testJDBCRead();
        testJPARead();
        System.out.println("==========================");

        // UPDATE 테스트
        System.out.println("\n[UPDATE]==================");
//        testJDBCUpdate();
        testJPAUpdate();
        System.out.println("==========================");

        // DELETE 테스트
        System.out.println("\n[DELETE]==================");
//        testJDBCDelete();
        testJPADelete();
        System.out.println("==========================");

        emf.close();
    }

성능 비교 과정

성능 비교 과정은 성능 테스트를 진행함에 앞서 Clothes table을 drop 하고 
JDBC test를 진행후
다시 Clothes table을 drop 후

JPA test를 진행하였습니다.

 

성능 비교 결과

 

 

깨달은 점

 성능 차이의 원인

  • JDBC는 쿼리를 직접 실행하며, 중간 계층 없이 데이터베이스와 바로 상호작용하기 때문에 JPA보다 빠른 성능을 보였습니다.
  • JPA는 내부적으로 엔티티 매핑과 영속성 컨텍스트를 관리하기 위한 추가 작업을 수행하므로 약간의 오버헤드가 발생했습니다.

 JPA의 강점

  • 생산성 및 유지보수성: JPA를 사용하면 SQL 작성 없이도 데이터베이스 작업이 가능했으며, 코드의 간결성과 재사용성이 크게 향상됨을 체감했습니다.
  • 트랜잭션 관리: JPA는 트랜잭션 관리를 간소화하여 안정성을 높이는 데 유리했습니다.

 JDBC의 강점

  • 성능: CRUD 작업 전반에서 JPA보다 빠른 성능을 보여주었습니다. 특히 READ 작업에서 큰 차이를 보였습니다.
  • 직접적인 데이터 제어: JDBC는 SQL을 직접 작성하므로, 세밀한 데이터 제어가 가능함을 체감했습니다.

실전에서의 적용

  • JDBC는 성능이 중요한 작업(대량 데이터 처리, 실시간 시스템)에서 적합합니다.
  • JPA는 유지보수성과 생산성이 중요한 프로젝트, 복잡한 도메인 모델을 다루는 애플리케이션에 적합합니다.

Ver 1, Ver 2를 통해 얻은 교훈

이번 테스트를 통해 JDBC와 JPA의 특성과 차이를 명확히 알 수 있었습니다.

 

JDBC는 성능에서 우수하지만, 코드가 복잡해지고 유지보수성이 떨어지는 단점이 있음을 체감했습니다.

JPA는 상대적으로 JDBC 보다 느리지만, 객체지향적인 접근과 높은 생산성으로 대규모 프로젝트에 적합합니다.

 

실제 프로젝트에서 두 기술 중 하나를 선택할 때는 프로젝트의 요구사항과 우선순위를 고려하여 적절히 사용해야겠습니다. 😊

'DB' 카테고리의 다른 글

JDBC로 배우는 단계별 프로젝트 개발: Ver 1과 Ver 2를 통해 얻은 깨달음 🚀  (1) 2024.12.19
데이터 베이스 정규형  (0) 2024.07.24
SQLD ) 데이터 모델링  (1) 2023.11.09
'DB' 카테고리의 다른 글
  • JDBC로 배우는 단계별 프로젝트 개발: Ver 1과 Ver 2를 통해 얻은 깨달음 🚀
  • 데이터 베이스 정규형
  • SQLD ) 데이터 모델링
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (314) N
      • Algorithm & Data Structures (236) N
        • BOJ (94) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    baekjoon
    Stack
    동적계획법
    dfs
    알고리즘
    후위순회
    unionfind
    PriorityQueue
    binarySearch
    SQL
    경로압축
    Union-Find
    전위순회
    다익스트라
    유니온파인드
    골드
    스택
    Dijkstra
    백준
    구현
    이분탐색
    백트래킹
    Java
    DynamicProgramming
    프로그래머스
    programmers
    BFS
    투포인터
    algorithm
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
JDBC로 배우는 단계별 프로젝트 개발: Ver 3과 Ver 4를 통해 얻은 깨달음 🚀
상단으로

티스토리툴바