오늘은 객체 지향 프로그래밍의 세계에서 데이터베이스와 매핑되는 클래스, 즉 엔티티 클래스(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 인터페이스를 사용하면, 코드의 가독성과 유지보수성이 높아진다.
'스프링부트' 카테고리의 다른 글
@Bean Annotation @Configuration @Autowired (0) | 2023.04.13 |
---|---|
파일 처리에 유용한 Generic type ex code (0) | 2023.04.13 |
김영한 Springboot course/자바 ORM 표준 JPA 프로그래밍 데이터베이스 방언 (0) | 2023.04.13 |
Containerless에 대해서 알아보기 (0) | 2023.04.13 |
@Controller에서의 다양한 return 타입들 (0) | 2023.04.11 |