프로젝트 개요: 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 |