스프링 부트와 JPA를 활용한 데이터베이스 연동 방법

스프링 부트와 JPA를 활용한 데이터베이스 연동 개요

스프링 부트와 JPA를 이용해 데이터베이스를 연동하는 방법은 많은 웹 애플리케이션 개발자들이 흔히 사용하는 방법입니다. JPA는 Java Persistence API의 약어로 Java 객체와 관계형 데이터베이스를 매핑하는 자바 ORM(Object-Relational Mapping) 프레임워크입니다. 스프링 부트는 스프링 프레임워크의 일종으로, 스프링에서 제공하는 여러 기능을 미리 설정해놓은 것으로서, 간편하게 웹 애플리케이션을 개발할 수 있도록 도와줍니다.

스프링 부트와 JPA를 이용해 데이터베이스를 연동하는 방법은 매우 간단하고, 빠르게 개발할 수 있게 해줍니다. 이러한 방법을 사용하면, 개발자는 데이터베이스를 직접 다루는 SQL 쿼리문 작성에 대한 부담과 복잡성을 줄일 수 있습니다. 이 글에서는 스프링 부트와 JPA를 이용해 데이터베이스를 연동하는 방법과 성능 향상 방법을 알아보겠습니다.

Database

스프링 부트와 JPA를 이용한 데이터베이스 설정 방법

스프링 부트와 JPA를 이용해 데이터베이스를 연동하는 방법은 크게 두 가지로 나눌 수 있습니다. 하나는 스프링 부트에서 제공하는 스타터(starter)를 이용하는 것이고, 다른 하나는 스프링 부트에서 제공하는 설정 어노테이션(annotation)을 이용하는 것입니다.

스프링 부트에서 제공하는 스타터 사용하기

스프링 부트에서 제공하는 스타터를 사용하면, 간단하게 설정 파일을 작성하여 데이터베이스를 연동할 수 있습니다. 스프링 부트에서는 데이터베이스별로 스타터를 제공합니다. 예를 들어, MySQL을 사용한다면, spring-boot-starter-data-jpamysql-connector-java를 의존성으로 추가해주면 됩니다.


  org.springframework.boot
  spring-boot-starter-data-jpa

  mysql
  mysql-connector-java

이렇게 의존성을 추가하면, 스프링 부트가 알아서 데이터베이스 설정을 해주며, JPA를 사용할 수 있게 됩니다.

스프링 부트에서 제공하는 설정 어노테이션 사용하기

스프링 부트에서 제공하는 어노테이션을 사용하면, 더욱 간단하게 데이터베이스를 연동할 수 있습니다. 예를 들어, MySQL을 사용한다면, @EnableJpaRepositories@EntityScan 어노테이션을 사용하면 됩니다.

@EnableJpaRepositories(basePackages = "com.example.repository")
@EntityScan(basePackages = {"com.example.entity"})

위와 같이 어노테이션을 설정하면, 스프링 부트에서 JPA를 사용할 수 있게 됩니다.

스프링 부트와 JPA를 활용한 데이터베이스 연동 예제

스프링 부트와 JPA를 이용해 데이터베이스를 연동하는 예제를 살펴보겠습니다. 예제에서는 MySQL 데이터베이스를 사용합니다.

의존성 설정

MySQL을 사용하기 위해, spring-boot-starter-data-jpamysql-connector-java를 의존성으로 추가해야 합니다.


  org.springframework.boot
  spring-boot-starter-data-jpa

  mysql
  mysql-connector-java

설정 파일 작성

MySQL 데이터베이스에 접속하기 위해, application.properties 파일에 아래와 같이 설정합니다.

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=

위 설정에서 spring.jpa.hibernate.ddl-auto는 JPA에서 엔티티 클래스를 기반으로 데이터베이스 테이블을 생성할 때 사용하는 옵션입니다. create-drop 옵션을 사용하면, 애플리케이션을 실행할 때마다 테이블을 생성하고, 애플리케이션을 종료할 때 테이블을 삭제합니다. spring.datasource.url은 MySQL 데이터베이스의 접속 정보입니다.

엔티티 클래스 작성

데이터베이스에 저장될 데이터를 담을 엔티티 클래스를 작성합니다.

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getter, Setter
}

위 클래스에서는 @Entity 어노테이션으로 엔티티 클래스임을 표시하고, @Table 어노테이션으로 데이터베이스에서 사용될 테이블 이름을 지정합니다. @Id@GeneratedValue 어노테이션으로 엔티티 클래스의 식별자를 지정합니다.

Repository 인터페이스 작성

엔티티 클래스와 데이터베이스를 연동하기 위한 Repository 인터페이스를 작성합니다.

@Repository
public interface UserRepository extends JpaRepository {
}

위 인터페이스에서는 @Repository 어노테이션으로 Repository 클래스임을 표시하고, JpaRepository 인터페이스를 상속받습니다. JpaRepository 인터페이스에서 제공하는 여러 메소드를 이용해, 데이터베이스와 연동할 수 있습니다.

서비스 클래스 작성

비즈니스 로직을 담당하는 서비스 클래스를 작성합니다.

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List getUsers() {
        return userRepository.findAll();
    }

    public User getUser(Long id) {
        return userRepository.findById(id).orElseThrow(() -> new NoSuchElementException());
    }

    public User createUser(User user) {
        return userRepository.save(user);
    }
}

위 서비스 클래스에서는 @Service 어노테이션으로 서비스 클래스임을 표시하고, @Autowired 어노테이션으로 Repository 인터페이스를 주입받습니다. findAll() 메소드를 이용해 모든 사용자 정보를 가져오고, findById() 메소드를 이용해 특정 사용자 정보를 가져올 수 있습니다. save() 메소드를 이용해 사용자 정보를 저장할 수 있습니다.

컨트롤러 클래스 작성

웹 요청을 처리하는 컨트롤러 클래스를 작성합니다.

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public List getUsers() {
        return userService.getUsers();
    }

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
}

위 컨트롤러에서는 @RestController 어노테이션으로 컨트롤러 클래스임을 표시하고, @Autowired 어노테이션으로 서비스 클래스를 주입받습니다. @GetMapping 어노테이션으로 GET 요청을 처리하고, @PostMapping 어노테이션으로 POST 요청을 처리합니다.

스프링 부트와 JPA를 이용한 데이터베이스 연동 성능 향상 방법

스프링 부트와 JPA를 이용한 데이터베이스 연동에서 성능 향상을 위해 고려해야 할 몇 가지 방법이 있습니다.

캐시 사용하기

데이터베이스에서 데이터를 가져오는 작업은 비용이 많이 드는 작업 중 하나입니다. 이러한 작업을 최소화하기 위해, 캐시를 사용하는 것이 좋습니다. 스프링 부트와 JPA에서는 캐시를 적극적으로 사용할 수 있는 다양한 방법을 제공합니다. 예를 들어, @Cacheable 어노테이션을 이용해 메소드의 결과를 캐시할 수 있습니다.

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Cacheable(value = "users")
    public List getUsers() {
        return userRepository.findAll();
    }

    // ...
}

위 코드에서는 @Cacheable 어노테이션으로 getUsers() 메소드의 결과를 캐시하고 있습니다.

페이징 처리하기

데이터베이스에서 대량의 데이터를 한 번에 가져오는 것은 비용이 많이 드는 작업 중 하나입니다. 이러한 작업을 최소화하기 위해, 페이징 처리를 사용하는 것이 좋습니다. 스프링 부트와 JPA에서는 Pageable 인터페이스를 이용해 페이징 처리를 할 수 있습니다.

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public Page getUsers(int page, int size) {
        Pageable pageable = PageRequest.of(page, size);
        return userRepository.findAll(pageable);
    }

    // ...
}

위 코드에서는 Pageable 인터페이스로 페이징 처리를 하고 있습니다.

SQL 튜닝하기

SQL 튜닝은 데이터베이스 성능 향상을 위해 가장 중요한 작업 중 하나입니다. 스프링 부트와 JPA에서도 SQL 튜닝을 할 수 있습니다. 예를 들어, @Query 어노테이션을 이용해 직접 SQL 쿼리를 작성할 수 있습니다.

@Repository
public interface UserRepository extends JpaRepository {
    @Query("SELECT u FROM User u WHERE u.name LIKE %:name%")
    List findByNameLike(@Param("name") String name);
}

위 코드에서는 @Query 어노테이션으로 직접 SQL 쿼리를 작성하고 있습니다.

결론

이 글에서는 스프링 부트와 JPA를 이용해 데이터베이스를 연동하는 방법과 성능 향상 방법을 알아보았습니다. 스프링 부트와 JPA를 이용하면, 간단하고 빠르게 데이터베이스를 연동할 수 있습니다. 또한, 캐시를 사용하거나 페이징 처리를 하거나 SQL 튜닝을 함으로써 데이터베이스 성능을 더욱 향상시킬 수 있습니다. 이러한 방법들을 잘 활용하면, 더욱 빠르고 안정적인 웹 애플리케이션을 개발할 수 있을 것입니다.