오늘은 객체 지향 프로그래밍의 세계에서 데이터베이스와 매핑되는 클래스, 즉 엔티티 클래스(Entity Class)에 대해 알아보겠다. 누군가는 엔티티 클래스를 객체와 데이터베이스 사이의 로맨틱한 브리지라고 불렀다고 한다. 그러면 이 로맨스가 어떻게 이루어지는지 함께 살펴보자.

 

JPA에서의 엔티티 클래스
JPA(Java Persistence API)에서는 엔티티 클래스를 사용하여 데이터베이스 테이블과 매핑을 수행한다. 이렇게 함으로써, JPA는 객체와 데이터베이스 간의 변환을 자동으로 수행할 수 있다.

이름은 좀 어렵게 들릴 수 있지만, 사실 엔티티 클래스는 마치 영화에서 주인공과 그의 사랑하는 사람 사이에 서는 코미디 캐릭터 같은 역할을 한다. 그들 사이를 이어주는 역할이라고 생각하면 된다!

다음과 같은 엔티티 클래스를 살펴보겠다.

@Entity
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "price")
    private int price;

    // ... 생성자, getter, setter 등의 메서드
}

위 코드에서는 @Entity 어노테이션을 사용하여 Product 클래스를 엔티티 클래스로 지정하고 있다. @Table 어노테이션을 사용하여 해당 엔티티가 매핑되는 데이터베이스의 테이블을 지정하고, @Id, @GeneratedValue, @Column 어노테이션을 사용하여 해당 엔티티의 필드와 데이터베이스 테이블의 컬럼을 매핑하고 있다.

이제 이 로맨스를 좀 더 편하게 즐길 수 있는 방법에 대해 알아보자.

 

스프링 부트와 JPA의 환상적인 만남


스프링 부트를 사용하면 JPA의 트랜잭션 처리를 더욱 쉽게 할 수 있다. 스프링 부트는 스프링 프레임워크의 기능을 확장하여 개발자들이 보다

위 코드에서는 ProductService 클래스의 updateProductName 메서드에 @Transactional 애노테이션을 추가하여, 해당 메서드에서 수행되는 모든 데이터 변경 작업이 하나의 트랜잭션으로 처리됨을 보장한다. 이렇게 함으로써, 트랜잭션 처리를 보다 간편하게 할 수 있다.

 

트랜잭션 처리 간편화
스프링 부트에서 JPA를 사용할 때는, 트랜잭션 처리를 위한 코드를 별도로 작성할 필요가 없다. 스프링 프레임워크에서 제공하는 @Transactional 애노테이션을 사용하여 간단하게 트랜잭션 처리를 할 수 있다.

예를 들어, ProductService 클래스에서 Product 엔티티를 저장하는 메서드를 작성한다고 가정해 보겠다.

@Service
public class ProductService {
    @Autowired
    private EntityManager entityManager;

    @Transactional
    public void saveProduct(String name, int price) {
        Product product = new Product();
        product.setName(name);
        product.setPrice(price);

        entityManager.persist(product);
    }
}

 

여기서 @Transactional 애노테이션을 사용하여 saveProduct 메서드에 트랜잭션 처리를 적용하고 있다. 이제 이 메서드를 호출하면, 스프링 프레임워크가 자동으로 트랜잭션을 시작하고, 메서드가 정상적으로 종료되면 트랜잭션을 커밋하게 된다. 만약 메서드 실행 중 예외가 발생하면, 트랜잭션은 자동으로 롤백된다.

레포지토리 사용의 편리성
또한 스프링 부트에서는 JpaRepository 인터페이스를 상속받는 레포지토리 클래스를 생성하여, 데이터베이스 작업을 보다 쉽게 처리할 수 있다. JpaRepository 인터페이스는 기본적인 CRUD 작업을 추상화하고 있어, 별도의 구현 없이도 사용할 수 있다.

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

이렇게 ProductRepository 인터페이스를 생성한 후, ProductService 클래스에서 이를 사용하면 된다.

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

    public void saveProduct(String name, int price) {
        Product product = new Product();
        product.setName(name);
        product.setPrice(price);

        productRepository.save(product);
    }
}

이제 ProductService 클래스에서 JpaRepository를 통해 제공되는 기본 CRUD 메서드를 사용하여 데이터베이스 작업을 쉽게 처리할 수 있다.

정리하자면, 엔티티 클래스는 객체와 데이터베이스 사이의 로맨스를 이루는 중요한 요소입니다. 스프링 부트를 사용하면 JPA를 통해 엔티티 클래스와 데이터베이스 작업을 더욱 쉽게 처리할 수 있다. 트랜잭션 처리를 간편하게 적용할 수 있는 @Transactional 애노테이션과 JpaRepository 인터페이스를 사용하면, 코드의 가독성과 유지보수성이 높아진다.

 

 

+ Recent posts