1. JPA란 무엇인가?
JPA는 자바 애플리케이션에서 관계형 데이터베이스를 손쉽게 사용할 수 있게 해주는 ORM(Object-Relational Mapping) 기술입니다. 객체지향 프로그래밍 언어인 자바와 관계형 데이터베이스 간의 데이터를 쉽게 전송할 수 있도록 돕습니다.
- ORM(Object-Relational Mapping): 객체 지향적인 자바 코드와 관계형 데이터베이스 간의 변환을 자동으로 처리합니다. 이를 통해 개발자는 SQL을 직접 작성하지 않아도 데이터베이스와 상호작용할 수 있습니다.
- 엔티티(Entity): JPA에서 데이터베이스 테이블과 매핑되는 자바 클래스를 의미합니다. 이 클래스를 통해 데이터베이스의 레코드를 자바 객체로 쉽게 다룰 수 있습니다.
- 엔티티 매니저(EntityManager): 데이터베이스 작업(삽입, 삭제, 갱신, 조회 등)을 관리합니다. 스프링 데이터 JPA를 사용하면 이 엔티티 매니저를 직접 사용할 필요가 없습니다.
2. 스프링 데이터 JPA 설정하기
스프링 데이터 JPA는 스프링 부트와 JPA를 결합하여 데이터베이스와의 상호작용을 단순화해주는 강력한 라이브러리입니다. 스프링 데이터 JPA를 사용하여 기본적인 CRUD 작업을 매우 간단하게 구현할 수 있습니다.
- 의존성 추가: build.gradle 또는 pom.xml에 다음과 같이 스프링 데이터 JPA 의존성을 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId> <!-- 기본 H2 데이터베이스 사용 예시 -->
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
- 엔티티 클래스 작성:@Entity는 이 클래스가 JPA 엔티티임을 나타내고, @Table은 해당 클래스가 매핑되는 데이터베이스 테이블 이름을 지정합니다.
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
// 기본 생성자와 getter, setter 생략
}
- Repository 인터페이스 작성: 스프링 데이터 JPA에서는 Repository 인터페이스를 정의하여 데이터베이스와의 상호작용을 처리합니다.JpaRepository를 상속하면, findAll(), findById(), save(), delete() 등의 CRUD 메소드를 사용할 수 있습니다. 또한 findByEmail과 같은 사용자 정의 메소드도 추가할 수 있습니다.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
3. 주요 JPA 어노테이션
- @Entity: 해당 클래스가 JPA 엔티티임을 나타냅니다.
- @Id: 엔티티의 기본 키를 지정합니다.
- @GeneratedValue: 기본 키의 생성 전략을 정의합니다. IDENTITY, SEQUENCE, TABLE, AUTO 등이 있습니다.
- @Column: 필드를 데이터베이스의 컬럼과 매핑합니다. nullable, unique와 같은 속성으로 제약 조건을 추가할 수 있습니다.
4. 기본적인 CRUD 예제
서비스 계층에서 UserRepository를 이용하여 CRUD를 구현하는 간단한 예제를 살펴보겠습니다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User createUser(User user) {
return userRepository.save(user);
}
public Optional<User> getUserByEmail(String email) {
return userRepository.findByEmail(email);
}
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
UserService 클래스는 사용자 관련 비즈니스 로직을 담당하며, UserRepository를 사용하여 데이터베이스와 상호작용합니다.
5. JPQL(Java Persistence Query Language)
JPQL은 JPA에서 제공하는 쿼리 언어로 SQL과 유사하지만, 데이터베이스 테이블 대신 엔티티 객체를 대상으로 합니다. 특정 조건을 만족하는 모든 사용자들을 조회하려면 다음과 같이 작성할 수 있습니다.
@Query("SELECT u FROM User u WHERE u.name = ?1")
List<User> findUsersByName(String name);
6. 트랜잭션 관리와 캐시
- 트랜잭션 관리: 스프링 부트에서는 @Transactional 어노테이션을 사용하여 트랜잭션을 쉽게 관리할 수 있습니다.
- 캐시 사용: JPA는 1차 캐시를 통해 동일한 트랜잭션 내에서 동일한 객체를 여러 번 조회할 때, 데이터베이스에 반복적으로 쿼리를 보내지 않고 캐시된 객체를 반환합니다.
7. 결론
스프링 부트에서 JPA를 사용하면 데이터베이스와의 상호작용이 매우 간단해지고, 객체 지향적인 접근을 통해 생산성을 크게 향상시킬 수 있습니다. 복잡한 SQL 쿼리 작성의 부담을 줄이고, 데이터베이스 독립성을 유지하면서 더 효율적인 애플리케이션 개발이 가능해집니다.
스프링 부트(Spring Boot)와 JPA(Java Persistence API)를 함께 사용하면 관계형 데이터베이스와의 상호작용을 매우 쉽게 구현할 수 있습니다. 이 글에서는 JPA의 기본 개념부터 스프링 데이터 JPA를 사용하는 방법, 그리고 실제 애플리케이션에 적용하는 예제까지 자세히 설명하겠습니다.
'개발일지 > 자바' 카테고리의 다른 글
Virtual Thread, 기존 스레드 모델 차이점 (1) | 2024.11.08 |
---|---|
네이버 날씨 크롤링해서 현재 지역 날씨 조회하기 (1) | 2023.12.22 |
웹 클롤링 원하는 요소 접근하기 (0) | 2023.12.22 |
Request시 URL 파라미터 아스키코드 디코딩 하는법 (1) | 2023.12.22 |
크롤링해서 이미지 파일 다운받기 (0) | 2023.12.21 |
댓글