반응형

JPA 란

JPA(Java Persistence API)는 자바 애플리케이션에서 관계형 데이터베이스와 객체 간의 매핑을 관리하는 표준 API입니다.

 

객체-관계 매핑(Object-Relational Mapping, ORM): 객체 지향 프로그래밍의 객체를 관계형 데이터베이스의 테이블에 매핑.

표준 인터페이스: JPA는 인터페이스를 제공하고, Hibernate, EclipseLink 등의 구현체를 통해 사용할 수 있음.

데이터베이스 독립성: 코드 변경 없이 다양한 데이터베이스에서 동작.

 

하이버네이트란

Hibernate는 자바 환경에서 객체 관계 매핑(Object-Relational Mapping, ORM) 프레임워크입니다. 이를 통해 자바 객체와 관계형 데이터베이스 간의 변환을 자동화할 수 있습니다. Hibernate는 JPA(Java Persistence API)의 주요 구현체 중 하나로, 객체 지향적인 방식으로 데이터베이스 작업을 수행할 수 있도록 도와줍니다.

 

1. 객체-관계 매핑 (ORM):

Hibernate는 자바 객체를 데이터베이스 테이블에 매핑하여, 객체 지향 프로그래밍과 관계형 데이터베이스의 패러다임을 연결합니다.

2. 자동화된 CRUD 작업:

Hibernate는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 자동으로 처리합니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않아도 됩니다.

3. 데이터베이스 독립성:

Hibernate는 다양한 데이터베이스를 지원하며, 데이터베이스에 종속되지 않는 코드를 작성할 수 있게 도와줍니다.

4. HQL (Hibernate Query Language):

SQL과 유사한 쿼리 언어를 제공하여 객체를 대상으로 쿼리를 작성할 수 있습니다.

5. 캐싱:

Hibernate는 1차 캐시(세션 수준 캐시)와 2차 캐시(전역 캐시)를 지원하여 데이터베이스 액세스를 최적화합니다.

6. 트랜잭션 관리:

Hibernate는 트랜잭션 관리를 지원하여 데이터 일관성과 무결성을 유지할 수 있도록 합니다.

 

 

 

jpa 사용방법

라이브러리 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

 

Entity 정의

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    // Getters and Setters
}

 

Repository 정의

import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
}

 

Service 클래스에서 사용

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public List<Product> getAllProducts() {
        return productRepository.findAll();
    }

    public Product saveProduct(Product product) {
        return productRepository.save(product);
    }
}

 

JPA와 JDBC의 관계

JPA를 사용하면 일반적으로 직접적인 JDBC 라이브러리를 사용할 필요가 없습니다. JPA는 JDBC를 추상화하여 객체 지향적인 방식으로 데이터베이스와 상호작용할 수 있게 해주기 때문입니다. 그러나 JPA는 내부적으로 JDBC를 사용하여 데이터베이스와 통신합니다.

 

JPA와 JDBC의 관계

 

JPA: Java Persistence API는 자바 객체를 관계형 데이터베이스의 테이블에 매핑하는 프레임워크입니다. 개발자는 객체 지향적인 방식으로 데이터베이스 작업을 수행할 수 있습니다.

JDBC: Java Database Connectivity는 자바에서 데이터베이스에 접속하고 SQL 쿼리를 실행하기 위한 API입니다. JDBC는 데이터베이스와의 저수준 통신을 처리합니다.

 

JPA는 내부적으로 JDBC를 사용하지만, 개발자가 직접 JDBC 코드를 작성할 필요는 없습니다. 대신 JPA의 리포지토리, 엔터티 매니저 등을 사용하여 데이터베이스 작업을 처리합니다.

 

JDBC 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class Product {
    private Long id;
    private String name;
    private double price;

    // Getters and Setters
}

public class ProductDAO {
    private String jdbcURL = "jdbc:h2:mem:testdb";
    private String jdbcUsername = "sa";
    private String jdbcPassword = "password";

    private static final String INSERT_PRODUCTS_SQL = "INSERT INTO products (name, price) VALUES (?, ?)";
    private static final String SELECT_ALL_PRODUCTS = "SELECT * FROM products";

    public ProductDAO() {}

    protected Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    public void insertProduct(Product product) {
        try (Connection connection = getConnection();
             PreparedStatement preparedStatement = connection.prepareStatement(INSERT_PRODUCTS_SQL)) {
            preparedStatement.setString(1, product.getName());
            preparedStatement.setDouble(2, product.getPrice());
            preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<Product> selectAllProducts() {
        List<Product> products = new ArrayList<>();
        try (Connection connection = getConnection();
             PreparedStatement preparedStatement = connection.prepareStatement(SELECT_ALL_PRODUCTS)) {
            ResultSet rs = preparedStatement.executeQuery();
            while (rs.next()) {
                Long id = rs.getLong("id");
                String name = rs.getString("name");
                double price = rs.getDouble("price");
                products.add(new Product(id, name, price));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return products;
    }
}

public class ProductService {
    private ProductDAO productDAO = new ProductDAO();

    public List<Product> getAllProducts() {
        return productDAO.selectAllProducts();
    }

    public void saveProduct(Product product) {
        productDAO.insertProduct(product);
    }
}

public class ProductController {
    private ProductService productService = new ProductService();

    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }

    public void saveProduct(Product product) {
        productService.saveProduct(product);
    }
}

 

 

요약

 

JPA 사용: JPA는 내부적으로 JDBC를 사용하지만, 개발자가 직접 JDBC 코드를 작성할 필요가 없습니다. JPA의 엔터티, 리포지토리, 서비스 계층을 통해 데이터베이스 작업을 쉽게 수행할 수 있습니다.

JDBC 사용: JDBC는 저수준의 데이터베이스 접근 방법으로, 개발자가 직접 SQL 쿼리와 데이터베이스 연결을 관리해야 합니다.

 

따라서 JPA를 사용하면 직접적인 JDBC 라이브러리 사용을 피할 수 있으며, 코드의 유지보수성과 생산성을 높일 수 있습니다.

반응형

+ Recent posts