[Java/Spring] JPA

Subeen·2025년 3월 29일
0

Spring

목록 보기
3/4

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

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

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;
}

UserRepositoryJpaRepository를 상속받은 인터페이스로 Spring Data JPA를 사용하여 데이터베이스와 상호작용함
JpaRepository를 상속받으면 기본적인 CRUD 작업을 자동으로 제공하며 복잡한 쿼리가 필요할 경우에는 @Query 어노테이션 등을 사용할 수 있음

// UserEntity 클래스를 데이터베이스와 매핑하고 Long 타입을 primary key의 타입으로 지정
public interface UserRepository extends JpaRepository<UserEntity, Long> {
}

UserApiController 클래스에서는 UserRepository를 통해 조회, 저장과 같은 기본적인 데이터베이스 작업을 간단하게 처리할 수 있음
JPAfindAll(), 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 간단하게 알아보기

profile
개발 공부 기록 🌱

0개의 댓글