https://spring.io/guides/gs/accessing-data-jpa
Getting Started | Accessing Data with JPA
You can run the application from the command line with Gradle or Maven. You can also build a single executable JAR file that contains all the necessary dependencies, classes, and resources and run that. Building an executable jar makes it easy to ship, ver
spring.io
이 가이드는 스프링 데이터 JPA를 사용하여 관계형 데이터베이스에 데이터를 저장하고 조회하는 애플리케이션을 만드는 과정을 차근차근 설명합니다
무엇을 만들까요?
메모리 기반 데이터베이스에 `Customer` POJOs (Plain Old Java Objects)를 저장하는 애플리케이션을 만들어 봅니다.
무엇이 필요한가요?
- 약 15분의 시간
- 선호하는 텍스트 에디터 또는 IDE
- Java 17 이상
- Gradle 7.5+ 또는 Maven 3.5+
- STS, IntelliJ IDEA, VSCode와 같은 IDE에서 코드를 바로 가져올 수 있습니다
가이드를 마무리하는 방법
대부분의 Spring 시작 가이드와 마찬가지로, 처음부터 시작하여 각 단계를 완료하거나 이미 익숙한 기본 설정 단계를 건너 뛸 수 있습니다. 어느 쪽이든 작업 코드는 완성됩니다.
1. 처음부터 시작한다면, Spring Initializr로 시작하기 단계로 이동하세요
2. 기본 설정 단계를 건너 뛴다면, 다음의 단계를 따르세요
- 이 가이드의 소스 저장소를 다운로드하고 압축을 해제 하거나 Git을 사용하여 복제하세요
git clone https://github.com/spring-guides/gs-accessing-data-jpa.git
- gs-accessing-data-jpa/initial로 이동하세요
- 간단한 엔티티 정의하기 단계로 넘어가세요
완료한 후에는 gs-accessing-data-jpa/complete의 코드와 비교하여 결과를 확인할 수 있습니다.
Spring Initializr로 시작하기
초기화 된 프로젝트에서 Generate를 클릭하고 압축 파일을 다운로드 받을 수 있습니다. 이 프로젝트는 이 튜토리얼의 예제에 맞게 구성되었습니다.
프로젝트를 수동으로 초기화하려면:
- https://start.spring.io로 이동하세요. 이 서비스는 애플리케이션에 필요한 모든 의존성을 가져오고 대부분의 설정을 수행합니다.
- Gradle 또는 Maven과 사용하려는 언어를 선택합니다. 이 가이드는 Java를 선택했다고 가정합니다.
- Dependencies를 클릭하고 Spring Data Jpa와 H2 Database를 선택합니다.
- Generate를 클릭합니다.
- 선택에 따라 구성된 웹 애플리케이션의 아카이브의 결과인 압축 파일을 다운로드 합니다
IDE에 Spring Initializr 통합이 있는 경우 IDE에서 이 과정을 완료할 수 있습니다.
Github에서 프로젝트를 fork하여 IDE나 다른 편집기에서 열 수도 있습니다.
간단한 엔티티 정의하기
이 예시에서, 각각 JPA 엔티티로 애너테이션이 달린 `Customer` 객체를 저장합니다. 다음 코드는 Customer 클래스(in src/main/java/com/example/accessingdatajpa/Customer.java)를 보여줍니다.
package com.example.accessingdatajpa;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
protected Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
id, firstName, lastName 세 가지 속성이 있는 Customer 클래스가 있습니다. 또한, 두 개의 생성자가 있습니다. 기본 생성자는 오직 JPA를 위해서 존재합니다. 직접 사용하지 않으므로 protected 접근 제한자를 사용합니다. 다른 생성자는 데이터베이스에 저장할 Customer 인스턴스를 생성하기 위해 사용합니다.
Customer 클래스에는 @Enitity 애너테이션을 사용해 JPA 엔티티임을 나타냅니다.(@Table 애너테이션이 없으므로, 이 엔티티는 Customer라는 테이블에 매핑된 것으로 가정합니다.)
JPA가 Customer 객체의 id 속성에 @Id 애너테이션을 사용하여 JPA가 이를 객체의 ID로 인식합니다. id 속성에는 @GenerateValue 애너테이션을 사용하여 ID가 자동으로 생성됨을 나타냅니다.
다른 두 속성인 firstName, lastName은 애너테이션이 없는 상태로 있습니다. 속성 자체와 동일한 이름을 공유하는 열에 매핑됨을 가정합니다.
편리한 toString() 메서드를 사용하여 Customer의 속성을 출력합니다.
간단한 쿼리 작성하기
Spring Data JPA는 JPA를 사용하여 관계형 데이터베이스에 데이터를 저장하는 데 중점을 둡니다. 가장 강력한 기능은 저장소 인터페이스에서 런타임 시 자동으로 저장소 구현체를 생성하는 것입니다.
작동하는 방법을 알기 위해서, 다음 코드(in src/main/java/com/example/accessingdatajpa/CustomerRepository.java) 처럼 Customer 엔티티와 작동하는 저장소 인터페이스를 만듭니다.
package com.example.accessingdatajpa;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
Customer Repsitory는 CrudRepository 인터페이스를 확장합니다. 작업하는 엔티티 유형과 ID의 타입인 Customer 및 Long은 CrudRepository의 일반 매개변수에 지정됩니다. CrudRepository를 확장하며 CustomerRepository는 Customer 엔티티를 저장, 삭제, 조회 방법을 포함하여 Customer 영속성 작업을 위한 여러 메서드를 상속받습니다.
Spring Data JPA를 사용하면 메서드 시그니처를 선언하여 다른 쿼리 메서드를 정의할 수 있습니다. 예를 들어, CustomerRepsitory에는 findByLastName() 메서드가 포함되어 있습니다.
일반적인 Java 애플리케이션에서는 CustomerRepository를 구현하는 클래스를 작성할 것으로 예상할 수 있습니다. 그러나, 이것이 Spring Data JPA를 강력하게 만드는 이유입니다. 저장소 인터페이스의 구현을 작성할 필요가 없습니다. Spring Data JPA는 애플리케이션을 실행할 때 구현을 생성합니다.
이제 이 예제를 연결하고 어떻게 작동하는지 확인할 수 있습니다.
Application 클래스 생성
Spring initializr는 애플리케이션을 위한 간단한 클래스를 생성합니다. 다음 코드는 이 예제를 위해 Initializr가 생성한 클래스(in src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java)를 보여줍니다.
package com.example.accessingdatajpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class, args);
}
}
@SpringBootApplication은 다음 애너테이션들을 모두 추가하는 편리한 애너테이션입니다.
- @Configuration: 애플리케이션 컨텍스트에 대한 Bean 정의 소스로 클래스에 태그를 지정합니다.
- @EnableAutoConfiguration: classpath 설정, 다른 bean, 속성 설정을 기반으로 bean 추가를 시작하도록 Spring Boot에 지시합니다 예를 들어, spring-webmvc가 classpath에 있는 경우 이 애너테이션은 웹 애플리케이션으로 플래그를 지정하고 DispatcherServelet 설정과 같은 핵심 동작을 활성화합니다.
- @ComponentScan: Spring에게 com/example 패키지에서 다른 구성 요소, 설정, 서비스를 찾아 컨트롤러를 찾도록 지시합니다.
main() 메서드는 Spring Boot의 SpringApplication.run() 메서드를 사용하여 애플리케이션을 시작합니다. XML이 한 줄도 없는 것을 눈치채셨나요? web.xml파일도 없습니다. 이 웹 애플리케이션은 100% 순수 Java이므로 플러밍 또는 인프라 구성을 할 필요가 없습니다.
이제 Initializr가 생성한 간단한 클래스를 수정해야 합니다. (이 예에서는 콘솔로) 출력을 얻기 위해 로거를 설정해야 합니다. 그 후 일부 데이터를 설정하고 이를 사용하여 출력을 생성해야 합니다. 다음 코드는 완성된 AccessingDataJpaApplication 클래스(in src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java)를 보여줍니다.
package com.example.accessingdatajpa;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class AccessingDataJpaApplication {
private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a few customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
repository.findAll().forEach(customer -> {
log.info(customer.toString());
});
log.info("");
// fetch an individual customer by ID
Customer customer = repository.findById(1L);
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
log.info("");
};
}
}
AccessingDataJpaApplication 클래스에는 몇 가지 테스트를 통해 CustomerRepository를 실행하는 demo() 메서드가 포함되어 있습니다. 먼저, Spring 애플리케이션 컨텍스트에서 CustomerRepository를 가져옵니다. 그 후 Customer 객체를 저장하고 save() 메서드를 실행하고 작업할 일부 데이터를 설정합니다. 다음으로, findAll()을 호출하여 데이터베이스에서 모든 Customer 객체를 가져옵니다. 그 후, findById()를 호출하여 해당 ID로 단일 Customer를 가져옵니다. 마지막으로 findByLastName()을 호출하여 lastName이 "Bauer"인 모든 고객을 찾습니다. demo() 메서드는 애플리케이션이 시작될 때 자동으로 코드를 실행하는 CommandLineRunner 빈을 반환합니다.
기본적으로 Spring Boot는 JPA 저장소를 지원하고 @SpringBootApplication이 있는 패키지(그리고 하위 패키지)를 찾습니다. configuration에 표시되지 않는 패키지에 JPA 저장소 인터페이스 저장소 인터페이스 정의가 있는 경우 @EnableJpaRepositories 및 해당 유형 타입 안전한 basePackageClasses=MyRepository.class 매개변수를 사용하여 대체 패키지를 가리킬 수 있습니다.
실행가능한 JAR 빌드
Gradle 또는 Maven을 사용하여 명령줄로부터 애플리케이션을 실행할 수 있습니다. 필요한 모든 의존성, 클래스, 리소스가 포함된 단일 실행 가능한 JAR 파일을 빌드할 수 있습니다. 실행 가능한 jar을 빌드하면 개발 수명 주기 전반에 걸쳐 다양한 환경에서 서비스를 애플리케이션으로 쉽게 전송, 버전과리, 배포할 수 있습니다.
Gradle을 사용하는 경우, ./gradlew bootRun을 사용하여 애플리케이션을 실행할 수 있습니다. 또는 다음과 같이 ./gradlew build를 사용하여 JAR 파일을 빌드 한 후 JAR 파일을 실행할 수 있습니다.
java -jar build/libs/gs-accessing-data-jpa-0.1.0.jar
Maven을 사용하는 경우, ./mvnw spring-boot:run을 사용하여 애플리케이션을 실행할 수 있습니다. 또는 다음과 같이 ./mvnw clean 패키지를 사용하여 JAR 파일을 빌드한 후 실행할 수 있습니다.
java -jar target/gs-accessing-data-jpa-0.1.0.jar
이 단계는 실행가능 JAR을 생성합니다. 클래식 WAR 파일을 빌드할 수도 있습니다.
애플리케이션을 실행하면, 다음과 유사한 결과를 확인할 수 있습니다.
== Customers found with findAll():
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=2, firstName='Chloe', lastName='O'Brian']
Customer[id=3, firstName='Kim', lastName='Bauer']
Customer[id=4, firstName='David', lastName='Palmer']
Customer[id=5, firstName='Michelle', lastName='Dessler']
== Customer found with findById(1L):
Customer[id=1, firstName='Jack', lastName='Bauer']
== Customer found with findByLastName('Bauer'):
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=3, firstName='Kim', lastName='Bauer']
요약
축하합니다! 구체적인 저장소 구현을 작성하지 않고 Spring Data JPA를 사용하여 데이터베이스에 객체를 저장하고 가져오는 간단한 애플리케이션을 작성했습니다.
약간의 노력으로 Restful 프론트엔드로 하이퍼미디어 기반 JPA 저장소를 내보내려면 REST를 사용하여 JPA 데이터 액세스를 읽어보세요
'Spring > Spring.io' 카테고리의 다른 글
Guide - 폼 입력 검증 (2) | 2025.03.22 |
---|---|
Guide - 폼 제출 처리 (1) | 2025.03.02 |
Guide - Spring MVC를 사용하여 웹 콘텐츠 제공하기 (0) | 2025.02.23 |
Guide - RESTful 웹 서비스 소비 (0) | 2025.02.11 |
Guide - RESTful 웹 서비스 구축 (1) | 2025.02.09 |