[Spring] Spring Data JPA

HOJUN·2024년 6월 11일

Backend - Spring

목록 보기
18/34

JDBC

JDBC(Java DataBase Connectivity)는 Java기반 어플이케이션 데이터베이스 관리를 Java에서 사용할 수 있도록 하는 API이다.
JDBC는 많은 DBMS에 사용 가능하도록 Low Level의 인터페이스로 사용할 DBMS의 드라이버와 DB의 URL, id, passwd가 필요한 매우 날것의 정보가 필요한 API이다.
코드가 길어지면 길어질 수록 쿼리를 작성하거나 코드를 작성할 때 예외가 발생할 수 있는 범위가 늘어나고 매우 Raw한 정보가 코드 내에 등장하는 말그대로 날것의 API이다.

JPA

그래서 등장한 것이 JPA(Java Persistence API)이다.
자바클래스에서 객체를 데이터베이스와의 관계를 맵핑하는 방법을 담은 인터페이스를 지원한다.
이를 자바의 ORM을 지원하는 API라고 할 수 있겠다.

ORM(Object-Relational Mapping)은 호환되지 않는 유형의 시스템 간 데이터를 변환하는 프로그래밍 기술로 JPA의 핵심적인 개념이다.
JDBC의 문제점을 기반으로 코드 가독성 증가와 유지보수성, 결합도를 낮추는 역할을 한다.

Spring Data JPA

JPA의 구현체로 Hibernate, DataNucleus 등의 API를 이용하면 되지만, 여전히 반복적인 문제와 예외처리 간 복잡성이 높다.
이 구현체를 더욱 간단하게 이용하려고 만든 추상 클래스이 Spring Data JPA로 다룰 수 있다.

따라서 JDBC, Hibernate 등을 사용하지 않고 Spring Data JPA를 사용하면 Java 객체로 더욱 쉽게 데이터베이스를 다룰 수 있다.

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity(name="user")
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Integer age;

    private String email;
}

DTO를 생성하고 @Entity를 통해서 테이블과 연결한다.
@Id는 변수가 Primary Key라는 뜻이며, @GeneratedValue는 데이터가 생성될 때 IDENTITY 방식으로 생성되는 키라는 뜻이다.

@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserApiController {

    private final UserRepository userRepository;
    
    @GetMapping("/find-all")
    public List<UserEntity> findAll(){
        return userRepository.findAll();
    }

간단하게 테이블을 불러올 수 있는 요청을 구현해보면
UserRepository를 통해서 함수를 호출하는 것을 볼 수 있다.

public interface UserRepository extends JpaRepository<UserEntity, Long> {}

UserRepository는 JpaRepository를 상속받고 있으므로, JpaRepository의 함수를 사용하는데, 내부를 살펴보면

여러가지 기능을 하는 함수를 선언한 것을 볼 수 있다.
우리는 이것들을 불러와서 사용하면 된다.

@GetMapping("/name")
    public void autoSave(
            @RequestParam String name
    ){
        var user = UserEntity.builder()
                .name(name)
                .build();
        userRepository.save(user);
    }

save하는 함수를 작성해보면 아직 name만 구현했기에 builder에 들어갈 필드가 name뿐이므로 이름만 가진 user를 요청하게 된다.

RequestParameter로 요청해보면

user 데이터베이스에 잘 적용이 된 것을 확인할 수 있다.
이제 우리는 코드를 작성한 후 서버를 재실행해도 초기화되지 않고 데이터가 남아있는 데이터베이스를 가지게 된 것이다 !

0개의 댓글