[Spring] Spring Data JPA

yoon·2024년 1월 14일

spring-boot

목록 보기
9/41
post-thumbnail

✅ 자바에서 db 사용

✔ JDBC(Java DataBase Connectivity)

: 자바 언어로 데이터베이스 프로그래밍을 하기위한 라이브러리

  • 단점

    • 가장 날 것의 코드
    • 코드 반복이 많아서 번거로움
    • 어디에서 예외가 생길 지 모르기 때문에 많은 케이스를 고려해줘야함

✔ JPA(Java Persistence API)

: JAVA ORM 기술에 대한 인터페이스 (데이터를 객체로 관리)

  • @PersistenceContext
    entityManager, entityManagerFactory 자동으로 생성해줌

  • @Transactional
    transaction 환경을 만들어줌

  • 의존성 추가
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

  • Hibernate 등 JPA 인터페이스를 구현한 라이브러리 등장

    • 단점 : 여전히 반복되는 코드가 있음
  • ✨ SPRING DATA JPA

    • 위와 같은 라이브러리의 사용을 편리하게 해줌
    • 트랜잭션 관리도 스프링이 맡아줌
      → spring data jpa 가 만들어둔 repository를 상속받아 사용하면 됨

✅ JPA 적용하기

✔ model - entity 수정

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity(name="user") //테이블 이름과 매핑하기 위한 어노테이션 추가
public class UserEntity {

    @Id // id라는 것을 인식하게 해주는 역할
    @GeneratedValue(strategy = GenerationType.IDENTITY)//생성 방법은 데이터베이스에 위임
    private  Long id; //primary key인 id 필수

    private String name;
    private Integer score;
}

✔ db - repository 수정

memory db를 사용하기 위해서는 repository라는 인터페이스를 만들어서 사용했다.
jpa를 사용한 방법에서는 미리 만들어진 JpaRepository를 상속받아서 사용하면 된다.

1. JPA 쿼리문 사용하기

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository  extends JpaRepository<UserEntity, Long> {

    List<UserEntity> findAllByScoreGreaterThan(Integer score);
    List<UserEntity> findAllByScoreGreaterThanEqualAndScoreLessThanEqual(Integer min, Integer max);

JPA에서 제공하는 쿼리문을 사용하면 sql문을 작성하지 않아도 원하는 데이터를 필터링하여 가져올 수 있다.
예를 들어 위에서 사용했듯이 findAllByScoreGreaterThan(Integer score)는 괄호안에 있는 점수보다 높은 점수를 가진 데이터를 가져오는 쿼리문이다.

쿼리문 참고사이트

https://docs.spring.io/spring-data/jpa/docs/current-SNAPSHOT/reference/html/#jpa.query-methods.query-creation

2. @Query 사용하기

sql문을 직접 작성하여 데이터를 가져올 수 있는 방법이다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository  extends JpaRepository<UserEntity, Long> {
    @Query(
            value = "select * from user as u where u.score >= :min AND score <= :max",
            nativeQuery = true
    )
    List<UserEntity> score(
            @Param (value="min") int min,
            @Param (value="max") int max
    );
}
profile
하루하루 차근차근🌱

0개의 댓글