[Spring Boot] 데이터베이스 연동 방식 비교(JDBC와 JPA)

KUKJIN LEE's profile picture

KUKJIN LEE2주 전 작성

1. JDBC란?

JDBC(Java Database Connectivity)는 Java 애플리케이션이 데이터베이스와 직접 연결하고 SQL 쿼리를 실행하며 데이터베이스와 상호 작용할 수 있도록 돕는 Java 표준 API입니다.
Spring에서는 JDBC 작업을 보다 간단히 처리하기 위해 JdbcTemplate을 제공합니다.

 

2. JPA란?

JPA(Java Persistence API)는 객체-관계 매핑(ORM)을 지원하는 Java 표준 API로, SQL을 직접 작성하지 않고도 객체 중심으로 데이터를 관리할 수 있도록 돕습니다. Spring에서는 JPA 구현체로 Hibernate를 기본 사용합니다.

 

※ 요약

JDBC vs JPA 선택 가이드

  • JDBC를 선택해야 할 때

    • 데이터베이스에 대한 세밀한 제어가 필요할 때

    • 성능 최적화가 매우 중요한 애플리케이션

    • 단순한 데이터 연동 작업만 필요한 경우

  • JPA를 선택해야 할 때

    • 개발 생산성을 우선시할 때

    • 객체 지향적인 데이터 관리가 필요할 때

    • 관계형 데이터베이스와의 연동이 복잡한 경우

 

3. JDBC와 JPA의 주요 차이점

항목

JDBC

JPA

코드 작성 방식

SQL을 직접 작성

ORM 방식으로 SQL 자동 생성

학습 곡선

간단하지만, SQL 작성과 관리가 필요

비교적 복잡하지만 생산성 향상 가능

성능

경량이며 직접적인 데이터베이스 접근 가능

적절히 설정하면 효율적이나, 초기 오버헤드 존재

유연성

SQL 자유도 높음

ORM에 의존, 복잡한 쿼리는 JPQL/HQL로 작성

자동화

수동 매핑 필요

데이터베이스 스키마 자동 생성 지원

 

4. Spring Boot에서 JDBC 설정

4-1. 의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    runtimeOnly 'mysql:mysql-connector-java'
}

4-2. application.properties 예제

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

4-3. JdbcTemplate 활용

@Service
public class UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> findAll() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    public void save(User user) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }
}

 

5. Spring Boot에서 JPA 설정

5.1 의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'mysql:mysql-connector-java'
}

 

5.2 application.properties 예제

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

 

5.3 엔티티 클래스 정의

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    // Getters and Setters
}

 

5.4 Repository 생성

public interface UserRepository extends JpaRepository<User, Long> {
}

 

5.5 Service 계층에서 JPA 사용

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    public List<User> findAll() {
        return userRepository.findAll();
    }
    public User save(User user) {
        return userRepository.save(user);
    }
    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
    public void delete(Long id) {
        userRepository.deleteById(id);
    }
}

 

6. 기타

한국과 중국은 여전히 JDBC의 사용 비율이 높게 나타납니다. JetBrains의 2021년 개발자 에코시스템 현황에 따르면, 한국과 중국은 Java를 주요 프로그래밍 언어로 사용하고 있습니다. 이러한 Java의 높은 사용률은 JDBC의 지속적인 활용과도 연관이 있을 수 있습니다. 반면, 미국과 유럽 등 다른 지역에서는 JPA와 같은 ORM 기술의 도입이 활발하게 이루어지고 있습니다. 이는 개발 생산성 향상과 유지보수의 용이성 등을 이유로 ORM 기술을 선호하는 경향이 반영된 결과로 볼 수 있습니다. 따라서, 한국과 중국에서 JDBC의 사용 비율이 상대적으로 높다는 것은 사실이지만, 이는 각 지역의 개발 문화와 기술 선호도의 차이에서 기인한 것으로 이해할 수 있습니다.

jdbc and jpa

New Tech Posts