안녕하세요. 쭈피셜입니다!
9기 여러분 모두 개발은 잘하고 계신가요?
Spring 수업도 끝이 나고 이제 대망의 프론트수업만 남아 있습니다.
점점 종강이 가까워지고 있습니다.
종강이 가까워진다는 것은 파이널 프로젝트도 가까워지고 있다는 뜻이겠죠?ㅎㅎ
모두 건강도 잘 챙기시고 저처럼 감기 걸리지마세요🥶
관통 프로젝트 열정적으로 임해서 모두 자랑스러운 여러분만의 프로젝트를 만드셨으면 좋겠습니다~
오늘은 JPARepository에 대해 알아보겠습니다!!
JPA(Java Persistence API)란
JPA는 "Java Persistence API"의 약자로, 자바 객체를 관계형 데이터 베이스에 영속적으로 저장하고 조회할 수 있는 ORM 기술에 대한 표준 명세를 의미합니다.
JPA를 통해 개발자는 SQL쿼리를 작성하지 않고도 객체를 통해 데이터베이스를 조작할 수 있으며, 객체 지향적인 코드 작성과 유지 보수성이 향상됩니다.
기본적으로 Entity클래스를 작성한 후 Repository 인터페이스를 생성해야하는데요.
Springboot에서 기본적인 작업을 도와주는 JPARepository 인터페이스가 있습니다!
package: org.springframework.data.jpa.repository
JPARepository란
Spring Data JPA에서 제공하는 인터페이스 중 하나로, JPA를 사용하여 데이터베이스를 조작하기 위한 메서드들을 제공합니다.
JPARepository 인터페이스를 상속받는 인터페이스를 정의하면, 해당 인터페이스를 구현하는 클래스는 JPA에서 제공하는 메서드들을 사용할 수 있습니다.
데이터베이스의 추가, 조회, 수정, 삭제의 findAll(), findById(), save() 등의 메서드들을 사용할 수 있습니다. 제공되는 메서드들 이용하여 쉽고 간편하게 CRUD 조작을 할 수 있습니다.
즉, JpaRepository를 사용하면, 복잡한 JDBC(Java DataBase Connectivity) 코드를 작성하지 않아도 간단하게 DB와의 데이터 접근 작업을 처리할 수 있습니다.
JPARepository 인터페이스는 제네릭 타입을 사용하여 Entity클래스와 복합키를 사용하고 있다면 해당 Entity의 ID클래스를 명시합니다. 이를 통해 해당 인터페이스를 상속받는 구현체는 Entity클래스와 ID클래스에 대한 정보를 알고 있어서, 런타임 시점에 적절한 쿼리를 생성하고 실행할 수 있습니다.
@Getter @Setter
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.age >= :age")
List<User> findByAgeGreaterThanEqual(@Param("age") Integer age);
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// ...
}
@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);
}
}
JPARepository는 CrudRepository인터페이스를 상속받습니다.
count, delete, deleteAll, deleteAllById, deleteById, existsById, findById, save 등의 기본적인 메서드를 제공합니다.
JPARepository는 ListCrudRepository인터페이스도 상속받습니다.
List<T> findAllById(Iterable<ID> ids)
<S extends T> List<S> saveAll(Iterable<S> entities)
JPARepository는 QueryByExampleExecutor 인터페이스도 상속받습니다.
QBE는 Spring Data JPA에서 제공하는 기능으로, 동적으로 쿼리를 생성할 수 있습니다.
QueryByExampleExecutor는 QBE를 구현한 인터페이스입니다.
findOne
<S extends T> Optional<S> findOne(Example<S> example)
주어진 조건에 맞는 엔티티 하나를 반환합니다.
findAll
<S extends T> Iterable<S> findAll(Example<S> example)
주어진 조건에 해당하는 모든 엔티티를 반환합니다.
findBy
<S extends T,R> R findBy(Example<S> example, Function<FluentQuery.FetchableFluentQuery<S>,R> queryFunction)
주어진 조건에 맞는 쿼리를 생성하여 쿼리 실행 결과를 반환하는 메서드입니다.
Example<User> example = Example.of(new User(null, null, 30));
List<User> users = userRepository.findBy(example, query -> query.where(QUser.user.age.goe(30)).orderBy(QUser.user.name.asc()));
exists
<S extends T> boolean exists(Example<S> example)
주어진 조건에 맞는 엔티티가 존재하는지 확인합니다.
count
<S extends T> long count(Example<S> example)
주어진 조건에 해당하는 엔티티의 수를 반환합니다.
*Example객체 : 원하는 쿼리조건을 기반으로 만들어진 엔티티 객체
public void updateUser(Long userId, String email) {
User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("Invalid user id"));
user.setEmail(email);
userRepository.flush(); // 영속성 컨텍스트의 변경 내용을 즉시 데이터베이스에 반영합니다.
}
<S extends T> S saveAndFlush(S entity)
이외에도 더 많은 메소드들이 궁금하다면
Spring DOCS: JpaRepository
에서 확인하시기 바랍니다.
그럼, 다음 쌒다지식으로 돌아오겠습니다!
우와 나도 JPA로 할걸 마이바티스 너무 귀찮아요ㅠㅠ