티스토리 뷰

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