(6) Spring Official Guide - Accessing Data With JPA

HEYDAY7·2022년 10월 27일
0

Learn Kotlin + Spring

목록 보기
7/25
post-custom-banner

Accessing Data With JPA

https://spring.io/guides/gs/accessing-data-jpa/

한줄 요약

JPA를 이용해 Entity와 Repository를 구현하고, entity 생성과 repository의 find 등 기본이 되는 조작을 해본다.

프로젝트 구성

initializer를 이용하고 Dependencies로 "Spring Data JPA"와 "H2 Database"를 넣어준다.

Define a Simple Entity & Create Simple Queries

## 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을 추가합니다.

Create an Application Class

## 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가 좀 더 중요할 거 같아 이어서 진행한다.

코드는 여기서 확인할 수 있다.

profile
(전) Junior Android Developer (현) Backend 이직 준비생
post-custom-banner

0개의 댓글