본문 바로가기
공부/Kotlin

코틀린에서 JPA를 사용할 때 고려할 점(SETTER, 생성자 안의 프로퍼티, data class)

by JERO__ 2022. 8. 28.

인프런 최태현님의 실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 보고 정리하였습니다.

 

 

 

 

코틀린에서 JPA를 사용할 때 고려할 점을 하나씩 살펴보자!

1. setter를 어떻게 처리할까?

setter를 사용하는 것보다 좋은 이름의 함수를 사용하는 것이 훨씬 clean하다.

  • 하지만 코틀린에서 생성자 필드를 생성하면 setter는 public이다.
  • 따라서 setter를 사용할 수도 있다.
  • public getter는 필요하다.

방법1. setter를 private로 닫는다.

backing property를 사용한다.

방법2. custom setter를 이용한다.

class User(
	name: String
) {

	val name = name
		private set              // set을 잠군다
}

하지만, 모두 프로퍼티가 많아지면 번거롭다.

방법3. setter를 열어두고 사용하지 않는 방법 (팀 컨밴션 선호)

  • 팀에서 setter를 사용하면 안된다는 사실을 모든 개발자가 체득
  • Trade-Off의 영역, 팀 컨밴션을 잘 맞추면 되지 않을까

2. 생성자 안의 프로퍼티 / 클래스 body 안의 프로퍼티

어떻게 넣어야 할까? 아래 코드는 잘 동작한다.

@Entity
class User(
	var name: String,
	val age: Int?,
) {
	
	@OneToMany(mappedBy = "user", cascade = [CascadeType.ALL], orphanRemoval = true)
  val userLoanHistories: MutableList<UserLoanHistory> = mutableListOf(),

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  val id: Long? = null
}
  • 모든 프로퍼티를 생성자에 넣거나
  • 프로퍼티를 생성자 혹은 클래스 body 안에 구분해서 넣을 때 명확한 기준이 있거나

3. Entity 클래스는 data class를 피하자

다음은 JPA Entity와 어울리지 않는 메소드이다.

  • equals
  • hashCode
  • toString

만약 연관관계가 있는 equals를 호출한다면, 계속 서로를 부르며 에러가 발생할 수 있다.

 

댓글