코틀린 언어

[Kotlin] Property 토막글 (Spring boot Setter에 관한 고찰)

딸기토끼0623 2024. 5. 17. 20:12

1. Kotlin 만의 특이한 생성자 선언

Kotlin 에서는 아래와 같이 소괄호 안에, 즉 하나의 생성자 패턴으로써 프로퍼티를 파라미터로 받음과 동시에, 선언할 수 있다. 문제는!! 이렇게 선언된 프로퍼티들이 그냥 선언만 되고 끝나는 것이 아니라, 자동으로 GetterSetter 를 할당 받는다는 데에 있다. (물론 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 과 같은 다른 방법을 찾아봐야한다.