Spring Data JPA를 통해 데이터베이스와 통신하는 계층 구조
- JDBC
- 데이터베이스와 연결하는 기본적인 Java API로 SQL 쿼리를 직접 작성해야 하며 객체들을 수동으로 관리함
- Hibernate 또는 다른 라이브러리
- JDBC 위에서 동작하는 ORM 프레임워크로 SQL 대신 Entity와 데이터베이스 테이블을 매핑하여 Java 코드로 데이터를 다룰 수 있음
- JPA
- Java의 ORM을 위한 표준 인터페이스
- Spring Data JPA
- JPA를 추상화하여 데이터베이스 접근 로직을 간결하게 만들어주는 Spring 프레임워크
- Spring Boot Application
- 개발자는 Spring Data JPA를 사용하여 데이터 접근을 처리하며 Hibernate(JPA 구현체) ➡️ JDBC ➡️ RDBMS로 쿼리가 실햄됨
- SQL을 직접 작성하지 않아도 객체 지향적인 방식으로 데이터베이스를 다룰 수 있음
JPA는 ORM(Object Relational Mapping)을 구현하는 표준 인터페이스
// ORM: 객체와 데이터베이스의 테이블을 매핑하는 기법으로 SQL 대신 객체를 사용해 데이터를 다룰 수 있도록 함 public class User{ // User 클래스는 DB의 User 테이블과 매핑 private String name; // name은 DB의 name이라는 컬럼과 매핑 private int age; private String email; }
Spring Data JPA는 JPA를 더욱 쉽게 사용할 수 있도록 도와주는 프레임워크로 기본적인 CRUD 기능, 쿼리 메서드 등의 기능을 지원하여 데이터 접근 코드를 편리하게 만들어준다.
백엔드 개발시 Spring Data JPA를 활용하여 효율적인 데이터베이스 관리를 할 수 있다.
@Entity(name = "user")
: 해당 클래스가user
테이블과 매핑된다는 것을 나타내며name
속성으로 데이터베이스 테이블의 이름을 지정함@Id
: 테이블의 기본 키(Primary key)를 나타냄@GeneratedValue(strategy = GenerationType.IDENTITY)
: 해당 필드는 데이터베이스에서 자동으로 생성되며 MySQL과 같은 데이터베이스에서AUTO_INCREMENT
를 사용할 때 설정함
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity(name = "user") // UserEntity 클래스가 user 테이블과 매핑된다는 것을 명시
public class UserEntity {
@Id // 이 필드가 primary key임을 나타냄
@GeneratedValue(strategy = GenerationType.IDENTITY) // 데이터베이스에서 기본적으로 auto increment
private Long id;
private String name;
private Integer age;
private String email;
}
UserRepository
는JpaRepository
를 상속받은 인터페이스로Spring Data JPA
를 사용하여 데이터베이스와 상호작용함
JpaRepository
를 상속받으면 기본적인 CRUD 작업을 자동으로 제공하며 복잡한 쿼리가 필요할 경우에는@Query
어노테이션 등을 사용할 수 있음
// UserEntity 클래스를 데이터베이스와 매핑하고 Long 타입을 primary key의 타입으로 지정
public interface UserRepository extends JpaRepository<UserEntity, Long> {
}
UserApiController
클래스에서는UserRepository
를 통해 조회, 저장과 같은 기본적인 데이터베이스 작업을 간단하게 처리할 수 있음
JPA
의findAll(), save()
메소드는Hibernate
와 결합되어 SQL 쿼리를 자동으로 생성하고 실행함
findAll()
: JPA가 자동으로SELECT * FROM user
쿼리를 생성하고 실행함autoSave()
: save() 메소드는 주어진 엔티티 객체를INSERT
하거나 기존 객체가 있으면UPDATE
쿼리를 실행함
@RequiredArgsConstructor // UserRepository를 생성자로 주입받기 위한 어노테이션
@RestController
@RequestMapping("/api/user")
public class UserApiController {
private final UserRepository userRepository; // UserRepository를 통해 데이터베이스와 상호작용
@GetMapping("/find-all")
public List<UserEntity> findAll() {
// jpa repository를 상속받은 UserRepository는 findAll() 메서드를 기본 제공
// 이 메서드는 Hibernate를 사용하여 자동으로 'SELECT * FROM user' 쿼리를 생성하고 실행
// 실행된 쿼리 결과는 List<UserEntity>로 반환됨
return userRepository.findAll();
}
@GetMapping("/name")
public void autoSave(
@RequestParam String name
) {
var user = UserEntity.builder()
.name(name)
.build();
// userRepository.save()가 호출되어 insert 쿼리가 실행됨
// 같은 id의 데이터가 이미 존재하면 update가 발생함
userRepository.save(user);
}
}
이미지 출처 Spring Data JPA 간단하게 알아보기