728x90
반응형
Spring Data JPA 를 사용하여 관계형 데이터베이스에 데이터를 저장하고 검색하는 애플리케이션을 구축해보자
종속성
Spring Data JPA
H2 Database
Entity 생성
package com.example.accessingdatajpa;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
// @Table 주석이 없으므로 이 Entity 는 Customer 이라는 테이블에 매핑된다고 가정
@Entity
@Data
public class Customer {
// 객체의 아이디로 인식할 수 있도록 @Id 어노테이션
// ID 가 자동으로 생성되어야함을 나타내는 @GeneratedValue
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// 아래의 두 객체의 어노테이션이 없는 이유
// 객체 자체와 동일한 이름을 고유하는 열에 매핑된다고 가정
private String firstName;
private String lastName;
// default 생성자, 직접 사용하지 않으므로 protected 로 지정
protected Customer() {}
// 실제 사용하는 생성자
// Customer db에 저장할 인스턴스를 만드는데 사용
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
);
}
}
간단한 쿼리 생성
package com.example.accessingdatajpa;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
// CustomerRepository 확장
// Customer 과 함께 작동하는 엔티티 유형 및 ID 는 Long 매개변수에 저장
// CrudRepository 에 엔티티를 저장, 삭제, 찾는 방법을 포함하여 상속
public interface CustomerRepository extends CrudRepository<Customer, Long> {
// 메서드를 선언하여 다른 쿼리 메서드를 정의
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
ㅣ이렇게 있으면 저장소 인터페이스의 구현을 따로 작성할 필요가 없다
Spring Data JPA 가 알아서 해주기때문
Application Class
실제 테이블을 생성하지 않아서 log 로 출력을 얻어보자
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, args);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// CustomerEntity 의 Customer() 생성자를 필요로 하며 해당 생성자를 사용
// 데이터 저장
repository.save(new Customer("Jack", "Sparrow"));
repository.save(new Customer("Hector", "Barbossa"));
repository.save(new Customer("Black", "Pearl"));
repository.save(new Customer("Flying", "Dutchman"));
// 모든 데이터 출력
log.info("Customers found with findAll():");
log.info("--------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// 해당 ID 와 일치하는 데이터 출력
Customer customer = repository.findById(2L);
log.info("Customer found with findById(2L):");
log.info("----------------------------------");
log.info(customer.toString());
log.info("");
// lastName 이 일치하는 데이터 출력
log.info("Customer found with findByLastName('Sparrow'):");
log.info("-----------------------------------------------");
repository.findByLastName("Sparrow").forEach(sparrow -> {
log.info(sparrow.toString());
});
// for (Customer sparrow : repository.findByLastName("Sparrow")) {
// log.info(sparrow.toString());
// }
log.info("");
};
}
}
결과
: Customers found with findAll():
: --------------------------------
: Customer[id=1, firstName='Jack', lastName='Sparrow']
: Customer[id=2, firstName='Hector', lastName='Barbossa']
: Customer[id=3, firstName='Black', lastName='Pearl']
: Customer[id=4, firstName='Flying', lastName='Dutchman']
:
: Customer found with findById(2L):
: ----------------------------------
: Customer[id=2, firstName='Hector', lastName='Barbossa']
:
: Customer found with findByLastName('Sparrow'):
: -----------------------------------------------
: Customer[id=1, firstName='Jack', lastName='Sparrow']
:
728x90
반응형
'Spring > Spring boot' 카테고리의 다른 글
| 시간 측정하는 간단한 aop (0) | 2022.12.22 |
|---|---|
| mariadb로 데이터 액세스 (0) | 2022.08.16 |
| Restful 웹 서비스 구축 (0) | 2022.08.16 |
| 스프링부트 개념정리 2 (0) | 2022.07.27 |
| 스프링부트 개념정리 (0) | 2022.07.26 |