티스토리 뷰
JPA란?
JPA는 Java Persistence API의 약자로, 자바 객체를 관계형 데이터베이스에 영속적으로 저장하고 조회할 수 있는 ORM 기술에 대한 표준 명세를 의미합니다.
JPA를 통해 개발자는 SQL 쿼리를 작성하지 않고도 객체를 통해 데이터베이스를 조작할 수 있으며, 객체 지향적인 코드 작성과 유지 보수성이 향상됩니다.
Spring Data JPA
인터페이스인 JPA를 사용하기 위해선 구현체가 필요합니다. 대표적으로 Hibernate, Eclipse Link 등이 있습니다. 하지만, Spring에서는 JPA를 사용할 때 이 구현체들을 직접 다루지 않고, 구현체들을 좀 더 쉽게 사용하고자 추상화 시킨 Spring Data JPA라는 모듈을 이용하여 JPA 기술을 다룹니다.
- JPA → Hibernate → Spring Data JPA
- 구현체 교체의 용이성: Hibernate 구현체에서 다른 구현체로 교체하기 편합니다.
- 저장소 교체의 용이성: 관계형 데이터베이스 외에 다른 저장소로 옮길 때 교체하기 편합니다.
JPA Repository란?
Spring Data JPA에서 제공하는 인터페이스 중 하나로, JPA를 사용하여 데이터베이스를 조작하기 위한 메서드를 제공합니다.
JPA Repository 인터페이스를 상속받는 인터페이스를 정의하면, 해당 인터페이스를 구현하는 클래스는 JPA에서 제공하는 메서드들을 이용할 수 있습니다. 메서드에는 데이터베이스의 추가, 조회, 수정, 삭제의 기능을 하는 findAll(), findById(), save() 등이 있습니다.
따라서, JPA Repository를 사용하면, 복잡한 JDBC 코드를 작성하지 않아도 간단하게 DB와의 데이터 접근 작업을 처리할 수 있습니다.
Spring Data JPA 사용하기
1. 의존성 추가
Spring Data JPA를 사용하기 위해 build.gradle 파일에 spring-data-starter-jpa 라이브러리의 의존성을 추가해야 합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
2. 엔티티 클래스 생성
JPA Repository를 사용하여 액세스할 엔티티 클래스를 생성합니다.
@Getter
@Setter
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
}
- @Entity
- 테이블과 링크될 클래스임을 나타냅니다.
- @Id
- 해당 테이블의 PK 필드를 나타냅니다.
- @GeneratedValue
- PK 생성 규칙을 나타냅니다.
- SpringBoot 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 됩니다.
- @Column
- 테이블의 칼럼을 나타내며 선언하지 않더라도 해당 클래스의 필드는 모두 컬럼이 됩니다.
- 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용합니다.
3. Repository 인터페이스 생성
DAO라고 불리는 DB Layer 접근자로, JPA에서는 Repository라고 부르며 인터페이스로 생성합니다. 단순하게 인터페이스 생성 후, JpaRepository<Entity 클래스, PK 타입>을 상속하면 기본적인 CRUD 메소드가 자동으로 생성됩니다.
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.age >= :age")
List<User> findByAgeGreaterThanEqual(@Param("age") Integer age);
}
JpaRepository 메서드 설명
- JpaRepository는 CrudRepository, QueryByExampleExcutor, ListCrudRepository 인터페이스를 상속받고 있으며, PersistenceContext 관련 메서드를 제공합니다.
- CrudRepository 인터페이스에는 기본적인 CRUD 메서드를 제공합니다.
→ save(), findById(), existsById(), count(), deleteById(), delete(), deleteAll()
- QueryByExampleExecutor 인터페이스에는 더 다양한 CRUD 메서드를 제공합니다.
→ findOne(), findAll(), count(), exists(), findBy()
- ListCrudRepository 인터페이스는 List 형태 객체를 주로 다루는데 사용합니다.
→ findAll(), findAllId(), saveAll()
- PersistenceContext 관련 메서드
→ flush(), saveAndFlush(), deleteAllInBatch()
4. Spring Bean으로 등록
JPA Repository를 사용하여 데이터 액세스를 수행하는 EntityManager가 필요하므로, JPA Repository를 사용하는 클래스는 빈으로 등록 되어야 합니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// ...
}
5. JPA Repository 메서드 사용
JPA Repository 인터페이스에 정의된 메서드를 호출하거나 구현한 메서드를 호출합니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User saveUser(User user) {
return userRepository.save(user);
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public Optional<User> getUserById(Long id) {
return userRepository.findById(id);
}
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
public List<User> getUsersByAge(Integer age) {
return userRepository.findByAgeGreaterThanEqual(age);
}
}
'Spring' 카테고리의 다른 글
[Spring]DAO와 DTO, VO (0) | 2024.09.12 |
---|---|
[Spring]@No/All/RequiredArgsConstructor (0) | 2024.09.12 |
[Spring Data JPA]JPA 복합키 사용하기 (0) | 2024.09.10 |
[Spring]IoC Container (0) | 2024.09.09 |
[Spring]DI(Dependeny Injection) - 의존 관계 주입 (0) | 2024.09.09 |
- Total
- Today
- Yesterday