kotlin + jpa (entity)

배현서·2024년 9월 5일

kotlin

목록 보기
1/2

kotlin을 공부하고 이를 프로젝트에 적용시키면서 공부한 내용들을 정리하려고 한다.

그 중 첫번째는 kotlin과 jpa 이다.

jpa는 무엇인가

jpa는 자바의 orm 기술을 쉽게 구현해주는 api 이다.
java와 같은 객체 지향 프로그래밍 언어는 class를 사용하기에, 관계형 데이터베이스라는 테이블 과 모델 간 불일치가 존재한다.

ORM(Object Relational Mapping, 객체-관계 매핑)은 이런 문제를 해결해준다.

객체 간의 관계를 sql을 자동을 생성해줘 불일치를 해결한다!
->하지만 이렇게 비즈니스 로직에 집중하는 만큼 설계를 신중하게 해야한다.

JpaReposiroty를 상속하는 인터페이스에 메서드 이름만 적어놓음 다 처리해주어 편하다. (ex. findby, deleteby)

jpa가 뭔지는 간단하게 하고 Kotlin에 jpa를 사용할때 주의할 부분, 문제인 부분들에 대해 공부를 했다.

java에서 JPA를 사용하는 부분과 Kotlin에서 JPA 사용하는 부분의 차이를 알고자 한다.

우선 JPA를 사용하려면 Entity를 정의해야한다.

data class의 사용

kotlin을 공부하다보니 data class를 많이 사용한다.

data class는 copy, equals, hashCode, toString을 기본으로 제공해주기에 간편하기도 하고 데이터를 전달하는 의미에서 사용한다고 생각한다.

그래서 data class를 엔티티 정의하는데에 사용하면 될까라는 생각을 했지만, 다들 지양하기에 그 이유를 찾아보았다.

1. 연관관계 문제

두개의 A, B class가 N:1 쌍방향 관계를 가지고 있다고 하자.

A 엔티티에서 toString을 호출했을때 B객체가 List로 정의되어있다면
B attribute를 만들기 위해 B의 toString을 호출할 것 이고, 또 B를 구성하기위해 A의 toString이 호출됨이 반복되어 스택오버플로가 터지게 된다.

2. data class의 특징(constructor)

아래는 data class의 구조이다.

data class 클래스명(매개변수1: 타입1, 매개변수2: 타입2, ...) {
    // 추가적인 프로퍼티나 메서드 (선택사항)
}

이 때 괄호 안에 정의된 주 생성자는 class의 property가 된다.
추가적인 프로퍼티를 {}안에 작성한다면 이 변수들은 data class에서 제공하는 함수들에 활용되지 않는다. 그렇기에 이런 경우 override 하여 재정의 해야 하는데 기본 함수를 제공해준다는 이점에 쓰는 것과 반대되어 쓸 이유가 없어진다.

다음 내용에 더 세부적인 내용을 정리하려고 한다.

이와 같은 이유로 엔티티를 class로 정의하고 영속화된 데이터를 메모리로 불러온 경우 같이 엔티티를 비교하려고 한다면 {}안에 equals 와같은 함수를

override fun equals(other: Any?): Boolean {
      if (other == null) {
          return false
      }

      if (this::class != other::class) {
          return false
      }

      return id == (other as Person).id
  }

이런식으로 구현하면 좋을 것 같다.

참고블로그

0개의 댓글