https://spring.io/guides/gs/accessing-data-jpa/
JPA를 이용해 Entity와 Repository를 구현하고, entity 생성과 repository의 find 등 기본이 되는 조작을 해본다.
initializer를 이용하고 Dependencies로 "Spring Data JPA"와 "H2 Database"를 넣어준다.
## Customer.kt
@Entity
data class Customer(
val firstName: String,
val lastName: String,
@Id @GeneratedValue(strategy = GenerationType.AUTO)
val id: Long? = null
)
## CustomerRepository.kt
interface CustomerRepository : CrudRepository<Customer, Long> {
fun findByLastName(lastName: String): List<Customer>
}
Customer Entity의 경우 id를 GeneratedValue로 해서 자연스럽게 생성되게 합니다.
Repository의 경우 CrudRepository로 만들어 findBy[field]를 통해 LastName으로 find 할 수 있게 function을 추가합니다.
## Application.kt
@SpringBootApplication
class AccesingDataWithJpaApplication {
val log: Logger = LoggerFactory.getLogger(AccesingDataWithJpaApplication::class.java)
@Bean
fun demo(repository: CustomerRepository) = CommandLineRunner {
// save a few customers
repository.save(Customer("Jack", "Bauer"))
repository.save(Customer("Chloe", "O'Brian"))
repository.save(Customer("Kim", "Bauer"))
repository.save(Customer("David", "Palmer"))
repository.save(Customer("Michelle", "Dessler"))
// fetch all customers
// fetch all customers
log.info("Customers found with findAll():")
log.info("-------------------------------")
for (customer in repository.findAll()) {
log.info(customer.toString())
}
log.info("")
// fetch an individual customer by ID
// fetch an individual customer by ID
val customer: Customer? = repository.findByIdOrNull(1L)
log.info("Customer found with findById(1L):")
log.info("--------------------------------")
log.info(customer.toString())
log.info("")
// fetch customers by last name
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):")
log.info("--------------------------------------------")
repository.findByLastName("Bauer").forEach { bauer -> log.info(bauer.toString()) }
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("")
}
}
main을 두고 Application class의 해당 코드를 추가해준다. 코드를 쭉 따라가며 읽으면 이해가 쉬울 것이다. 여러 Entity들을 생성하고, find가 잘 동작하는지 확인해보면 된다.
그 이후 이 코드를 돌려보면 실제적으로 의도한대로 object들이 잘 불러와지는 것을 확인할 수 있다.
지금까지 한 두번 해봤던 작업이라서 이해가 쉬웠다. 이 guide에서 얻어가야 할 것은 Entity key의 경우 GeneratedValue를 쓰는 방법과, CrudRepository가 얼마나 유용한가~ 정도 인 것 같다. 아주 기초가 되는 수준을 훑어봤다~ 라고 생각하고, Mysql을 활용하는 guide가 좀 더 중요할 거 같아 이어서 진행한다.
코드는 여기서 확인할 수 있다.