NOTODO 코틀린 전환기

Hyuk·2023년 10월 15일
0

NOTODO 리팩토링

목록 보기
5/5
post-thumbnail

기존의 코드를 코틀린으로 전환하고자 한다.
코틀린에 익숙한 상태가 아니라서 학습을 거치며 점진적으로 고쳐나가고자 한다.

인텔리제이의 Convert Java to Kotlin File 기능을 사용했다.

변환을 거치고 나면 위그림과 같이 오류가 나는 부분도 있다.

1. autowired와 lateinit

자바 코드

@Service
public class FriendService {
    @Autowired
    private FriendRepository friendRepository;

    @Autowired
    private MemberService memberService;

    @Autowired
    private NotodoService notodoService;
    
    ...생략
}

코틀린 코드

@Service
class FriendService {
    @Autowired
    lateinit var friendRepository: FriendRepository

    @Autowired
    lateinit var memberService: MemberService

    @Autowired
    lateinit var notodoService: NotodoService
    
    ...생략
}

코틀린에서 @Autowired 어노테이션으로 의존관계를 주입해주려면 lateinit을 이용해야 한다.

스프링에서 @Autowired를 사용하여 의존성 주입을 받는 경우, 실제로 변수의 초기화는 스프링 컨테이너가 해당 빈을 생성하고 의존성을 주입하는 시점에 발생하기 때문이다.

그런데 코틀린에서 non-nullable 타입의 변수는 선언될 때 초기화되어야 하기 때문에 lateinit을 붙여줘야 오류가 나지 않는다.

2. Kotlin nullable

자바 코드

@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Friend {

    @Id 
    @GeneratedValue
    @Column(name = "friend_id") // 컬럼 이름 지정
    private Long friendId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="member_id")
    private Member member;

    private String email;


}

코틀린 코드

@Entity
class Friend(
    @Id
    @GeneratedValue
    @Column(name = "friend_id")
     var friendId: Long? = null,

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
     var member: Member,
     var email: String

)

코틀린에서는 변수 선언시 Not nullable, Nullable을 강제로 선택해서 선언하게 된다. 이러한 강제로 인해 Nullable에 대해 신경을 쓸 수 밖에 없다는 장점이 있다.

3. 롬복

자바 코드

@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Friend {

    @Id 
    @GeneratedValue
    @Column(name = "friend_id") // 컬럼 이름 지정
    private Long friendId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="member_id")
    private Member member;

    private String email;


}

코틀린 코드

@Entity
class Friend(
    @Id
    @GeneratedValue
    @Column(name = "friend_id")
     var friendId: Long? = null,

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
     var member: Member,
     var email: String

)

2번과 같은 코드이다. 자바에서는 5개의 어노테이션을 사용했는데, 코틀린 코드에서는 한 개의 어노테이션만 사용했다.

먼저 JPA의 사용을 위해서는 no-arg 생성자가 필요하다. 코틀린에서 모든 프로퍼티에 기본값을 설정하면 no-arg 생성자를 자동으로 생성하지만, JPA 엔티티의 각각의 필드에 기본값을 제공하는 방법은 적절하지 않을 수 있다.
따라서 다음과 같은 no-arg 플러그인을 이용히는것이 방법중 하나이다.

자바 코드에서 Data 어노테이션은 게터와 세터의 보일러플레이트 코드를 줄이기 위해 사용했다.
코틀린에서는 var로 선언된 프로퍼티에 대해 자동으로 getter와 setter를 생성해준다. 또한 val로 선언된 프로퍼티에 대해서 getter를 자동으로 생성해준다. 따라서 @Getter @Setter 어노테이션은 쓰지 않아도 된다.

AllArgsConstructor 어노테이션의 경우 클래스 선언과 동시에 주 생성자가 선언되므로 필요가 없어진다.

@Builder의 경우

Freind fr=Freind.builder()
	.member(member)
    .email(email)
    .build()

자바에서는 다음과 같이 빌더를 사용했다. 특히 생성자에 매개변수가 많으면 더욱 권장되는게 빌더인데, 코틀린에서는 사실 필요가 없었다.

val fr=Friend(member=member, email = email)

기본 생성자만으로도 빌더의 역할을 대체할 수 있었고, 해당 컬럼에 기본값을 주게 되면 그 인자는 값을 할당해주지 않더라도 기본값이 들어가므로 생성 할 수 있게 되기 때문이었다.

3. data class

자바 코드

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class FindFriendDTO {
    private String email;
    private String nickname;

    private String thumbnail;

    private boolean isFriend;

    private boolean isMe;
}

코틀린 코드

data class FindFriendDTO(
        val email: String? = null,
        val nickname: String? = null,
       val thumbnail: String? = null,
        val isFriend : Boolean,
        val isMe : Boolean
)

공부해나가면서 추가 할 예정입니다.

profile
🙂 🙃 🙂 🙃

0개의 댓글