1. Kotlin 만의 특이한 생성자 선언
Kotlin 에서는 아래와 같이 소괄호 안에, 즉 하나의 생성자 패턴으로써 프로퍼티를 파라미터로 받음과 동시에, 선언할 수 있다. 문제는!! 이렇게 선언된 프로퍼티들이 그냥 선언만 되고 끝나는 것이 아니라, 자동으로 Getter 와 Setter 를 할당 받는다는 데에 있다. (물론 val 로 선언된다면, Setter는 할당받지 않는다.)
@Entity
class Reply (
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
var member: Member? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "todo_id")
var todo: Todo? = null
@Column(nullable = false)
var content: String? = null
){
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
}
2. 왜 문제냐고?
당연히 문제다!! 이제 Reply 클래스로 선언된 인스턴스들은 누구나, 어디에서나 속성값들을 바꿔버릴 수 있다!! Kotlin Spring boot 라고 해서, Java Spring Boot 와 다르게, Setter를 남발해도 된다는 얘기는 아니다!!
3. 내가 찾은 해결책
해결책은 Java 와 크게 다르지 않다. 싱글톤을 활용하는 것인데, Java의 static 과 Kotlin의 companion은 거의 비슷하지만 그 용번과 내부 동작이 조금씩 다르니, 자세히 알아보길 바란다.
@Entity
class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
var member: Member? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "todo_id")
var todo: Todo? = null
@Column(nullable = false)
var content: String? = null
companion object {
fun createReply(member: Member, todo: Todo, content: String): Reply {
val reply: Reply = Reply()
reply.member = member
reply.todo = todo
reply.content = content
return reply
}
}
fun updateReply(content: String?): Reply{
if(content != null){
this.content = content
}
return this
}
}
위와 같이 생성 패턴과 수정 패턴을 정의한 다음, Reply 객체를 만들거나 값을 수정할때는 정해진 함수를 이용하도록 한다!! 사용할때는 아래와 같이 사용하면 된다.
// Reply 생성할때
val member: Member = Member.createMember(값1, 값2, 값3 ...)
val todo: Todo = Todo.createTodo(값1, 값2, 값3 ...)
val reply: Reply = Reply.createReply(member, todo, "First Content")
// Reply의 값을 수정할때
reply.updateReply("new content")
4. 긴급 수정 (2024.06.12)
3번 처럼 한다고 해서 Setter가 막하지 않는다!!
private set 과 같은 다른 방법을 찾아봐야한다.
'코틀린 언어' 카테고리의 다른 글
[Kotlin] Singleton 디자인 패턴 토막글 (왜 static 이 아닌 object 인가?) (2) | 2024.05.21 |
---|---|
[Kotlin] Any 타입과 MutableList (0) | 2024.04.24 |
[Kotlin] 각종 배열 및 리스트 Collection, List, Set, Map, Deque 개념정리 (0) | 2024.04.24 |