its_jh_stroy

[Springboot] JPA를 쉽게 사용하기 위한 Spring Data JPA 본문

Java

[Springboot] JPA를 쉽게 사용하기 위한 Spring Data JPA

_J_H_ 2024. 8. 23. 21:45

Spring Data JPA

스프링에서 제공해 주는 JPA 인터페이스

JPA 인터페이스 기반으로 더욱 추상화된 메서드를 제공받을 수 있다.

 

데이터베이스 연결하고 모델 만들기

Spring Data JPA는 데이터베이스와 상호작용을 위한 것이기 때문에 데이터베이스 연결과 모델을 만들어야 한다.

여기서는 스프링부트에서 제공하는 H2 데이터베이스를 사용할 것이다.

# application.properties
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.defer-datasource-initialization=true
// Food.java
@NoArgsConstructor(access = AccessLevel.PROTECTED) 
@AllArgsConstructor
@Builder
@Getter
@Entity
@Table(name="food")
public class Food {
    @Id
    @Column(name="id")
    private Long id;

    @Column(name="name")
    private String name;

    @Column(name="price")
    private int price;
}

 

 

초기 데이터 설정하기

뒤에 저장하는 코드도 작성할 예정이므로 이 단계는 생략해도 상관없다.

생략하지 않는다면 resources 위치에 data.sql 파일을 만들어 작성하면 된다.

-- data.sql
INSERT INTO food (id, name, price)
VALUES
(1, 'rice', 1000),
(2, 'meat', 3000);

 

 

코드 작성하기

스프링부트에서는 JpaRepository 인터페이스를 상속받는 것으로 Spring Data JPA를 사용할 수 있다.

JpaRepository를 상속받으면 내부적으로 FoodRepository 객체까지 생성되어 인터페이스에 선언된 메서드를 따로 작성하지 않아도 사용할 수 있게 된다.

// FoodRepository.java
public interface FoodRepository extends JpaRepository<Food, Long>  {  }
// FoodService.java
@RequiredArgsConstructor
@Service
public class FoodService {
    private final FoodRepository foodRepository;

    public List<Food> findAll() {
        return foodRepository.findAll();
    }

    public void save(Food food) {
        foodRepository.save(food);
    }
}
// FoodController.java
@RequiredArgsConstructor
@RestController
public class FoodController {
    private final FoodService foodService;

    @ResponseBody
    @GetMapping("/list")
    public List<Food> findAll() {
        return foodService.findAll();
    }

    // {
    //     "id": 3,
    //     "name": "new food",
    //     "price": 20000
    // }
    @ResponseBody
    @PostMapping("/save")
    public void save(@RequestBody Food food) {
        foodService.save(food);
    }
}