Kotlin 을 배우기만 하고 활용을 잘 못해본것 같아서 이번 기회에 코틀린 연습겸 자바 ->kotlin 변환 연습을 해봤다.
코틀린은 클래스 정의시 var,val 을 매개변수로 넣어서 선언 해주면 게터,세터, 매개변수 생성자, 맴버 변수를 만들 어줌.
하지만 JPA에서 @Entity를 사용해 DB 등록을 하기 위해서는 기본 생성자가 필요함
-> id 'org.jetbrains.kotlin.plugin.jpa'version'1.6.21'추가
멤버 변수 id 는 불변, 하지만 null 일수 있으므로 위와 같이 선언 했고 name 같은 경우에는 null불가(?불가), 불변(val)으로 선언 해줬다.
name같은 경우 초기화시 간단한 널체크가 있으며 이는 코틀린의 init()으로 객체가 생성될때 검사가 되도록 했다.
@Transactional 을 사용하기 위해서는 밑으로 override가 가능한 상태 즉 Open 상태여야함. 하지만 코틀린은 기본 final
->id 'org.jetbrains.kotlin.plugin.spring'version'1.6.21' 추가
map(람다식)
Optional을 반환타입으로 가지는 우리가 만든 메서드는 ? 로 변경가능하지만 findById 같은 경우에는 fix 된경우라 ? 로 변경 할수가 없다. 이런 경우에는 코틀린의 확장함수를 사용하자!
- 스프링 프레임워크에서는 Kotlin 과 crudRepository를 함께 사용할 경우를 대비해 crudRepostioryExtension.kt 라는 확장함수가 담긴 파일을 만들어 놨다
여기서 방법1(부생성자) 생성이유는 부생성자를 만들지 않을시에 그냥 각각 값(맴버변수)를 받아 생성되지만 부생성자에서는 User라는 클래스로 값을 받아 만들기 떄문
하지만 만들떄 companion object(정적 팩토리 메서드) 를 사용해서 만드는 방식이 더 선호됀다.
controlelr도 크게 특별한건 없지만 눈여겨 볼점은 코틀린에서는 {} 를 생략해 조금 더 간단하게 리턴 코드를 작성 할수 있다는 점
@RequestParam 은 디폴트가 true 라 필수이지만 코틀린의 ?를 사용하면 (null허용) false로 바꿔준다.
이러한 패턴을 object mother 이라 부르고 이렇게 생겨난 것을 object fixture 라고 한다.
왜 사용하냐면 코드들도 유지보수 대상이지만 테스트 코드들도 유지 보수 대상이다. 즉 메인 코드들이 변경되면 테스트 코드들도 변경이 되야하는데 예를들어 로직이 변경된게 아닌 그냥 데이터값 하나만 추가 된경우는(그렇게 중요한 데이터가 아닌경우) 테스트 코드에 굳이 반영하지 않아도 별 영향이 없다.
-> 그래서 아예 고정 데이터를 박아 놓는다고 생각하면 쉽다!