본문 바로가기

Spring + Kotlin API Server 만들기 (3) : Entity , Repository

Entity 설계

Entity란?

간단히 말해선 DB에 저장될 객체라고 생각하면 될거 같다. 각각이 별도로 구분이 가능 해야 하고, 안에 들어가 있을 data들을 기술해 놓은 것이다.

이번 프로젝트 & 포스팅은 전체적인 흐름을 소개하는 포스팅이니 Table mapping같은 건 하지 않고 목표로 했던 Device Entity를 설계하는 걸로 한다.

Device 분석

Entity를 설계하기 위해 Device를 살펴보면 다음과 같다.

  • 각각의 Device는 구분 가능해야 한다.
  • Device는 Sensor에서 나온 데이터인 value를 가지고 있다.
  • Device는 command를 가지고 있다.

이를 토대로 Entity를 만들어 보자.

Device Entity 작성

Spring에서는 @Entity를 통해 해당 class가 entity임을 명시해 준다.

또한 @Table 과 @Column 을 통해 해당 entity가 DB에 mapping될 때 Table name, Clomn name을 설정 할 수있다. 여기서 OneToMany, OneToOne, ManyToOn 등 다양한 관계 매핑도 들어가지만 이 프로젝트에선 필요가 없다...

  • 설계된 Device Entity
package com.studuy.study.device

import javax.persistence.*

@Entity
//entity table 이름 명시
@Table(name = "devices")
class Device{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    // column 이름 명시
    @Column(name = "device_id", nullable = false)
    var id: Long? = null

    @Column
    var value: String? = null

    @Column
    var command: String? = null
}

여기서 @GeneratedValue라는게 나오는데 이는 각 Entity를 식별하기 위한 id를 Spring의 hibernate가 알아서 넣어 준다.

또한 @Id는 해당 필드가 DB에서 primary key값인 것을 알려주는 역할이다.

Repository 설계

Repository란?

DB에 접근하기 위한 class라고 생각하면 될거 같다. 기본적으로 Entity로 설계된 DB에 접근하는 인터페이스를 제공한다. 기본적으로 CRUD를 모두 제공하며, Spring에서는 이름규칙만 맞춰서 인터페이스를 정의하면 알아서 생성해주기 때문에 매우 편리하다.

CRUD란?

DB에서 일어나는 기본적인 작업이라 생각하면 될거 같다.

Create , Read , Update , Delete의 약자로 간단히 생각해보면 DB query와 상당히 바로 매칭된다.(INSERT , SELECT...)

Repository 작성

package com.studuy.study.device

import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface DeviceRepository : CrudRepository<Device, Long> {
}
  • 설명
    • Spring에서는 @Repository 어노테이션으로 해당 class가 Respository를 명시해주고 CrudRepository를 상속받는 interface를 정의해주면 기본적으로 CRUD에 대한 함수들을 생성해 준다.
    • 현재 예시에선 기본적인 CRUD를 제외하고 필요가 없기 때문에 추가적인 인터페이스를 만들지 않았지만 추가하고 싶다면 다음과 같이 인터페이스를 적어 놓으면 Spring이 알아서 함수 정의를 해준다.
package com.studuy.study.device

import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface DeviceRepository : CrudRepository<Device, Long> {
    fun findByCommand(command: String): List<Device>
    fun findByValue(value: String): List<Device>
}

이제 Entity와 Repository가 끝났다. 다음에는 Service를 만들고 TDD를 위해 Test code를 작성하는 포스팅을 할 예정이다.