728x90

Backend/Kotlin 22

[Kotlin] 코틀린에서 @QueryProjection 사용하기

Querydsl를 이용하는 경우 엔티티와 다른 반환 타입인 경우 Projections를 사용한다. Projections 를 적용하는 방법은 여러가지가 있는데 권장되는 방법은 @QueryProjection 어노테이션을 활용하는 것이다. 우선 https://findmypiece.tistory.com/287 와 같이 코틀린에서 JPA Entity 를 정의할 경우 일반 class 사용이 권장되지만 Projections 은 영속상태가 아니라 dirty checking 도 동작하지 않고 lazy loading도 어차피 지원하지 않기 때문에 data class 를 사용해도 무관하다. @QueryProjection 는 생성자에 지정할 수 있는데 코틀린에서는 이걸 사용하기가 좀 애매하다. 기본생성자를 별도 클래스로 만드..

Backend/Kotlin 2022.02.03

[Kotlin] JPA Entity. data class? class?

Spring 가이드에도 나와있듯이 JPA Entity 는 data class가 아닌 일반 class 를 사용하는 것이 권장된다. 사실 data class 를 Entity로 사용하더라도 몇가지만 주의하면 문제될 것은 없지만 일반 class 사용이 권장되는 이유는 data class 를 Entity 로 사용할 경우 data class 답게 사용하지 못하게 된다는 것에 있다. 코틀린이 data class 의 특징은 아래와 같다. equals(), hashCode(), toString(), copy() 메소드를 자동으로 만들어준다. copy() 메소드는 얕은복사만 지원하기 때문에 data class 는 불변 클래스로 사용하는 것이 권장된다. 순수하게 데이터만 관리하는 클래스인 만큼 open 키워드를 통한 상속을..

Backend/Kotlin 2022.02.03

[Kotlin] 함수형 인터페이스

만약 병렬처리를 위해 매번 새로운 인스턴스를 생성해야 하고 생성해야 할 인스턴스에 메소드가 하나라면 함수형 인터페이스를 고려해볼 수 있다. 코틀린에서는 이를 SAM 인터페이스 라고도 부른다. 물론 고전적인 방식으로 함수 하나만 가지고 있는 클래스를 선언해서 인스턴스를 생성해서 사용해도 되지만 함수형 인터페이스를 사용할 경우 익명클래스를 정의할 필요없이 람다식으로 대체할 수 있어서 좀 더 깔끔하고 직관적으로 코드를 완성할 수 있다. 코틀린에서 함수형 인터페이스는 아래와 같이 사용한다. 만든다. interface 지시어 앞에 fun 만 붙여주면 된다. 함수형 인터페이스 선언 interface 지시어 앞에 fun 만 붙여주면 된다. fun interface TestFunc { fun test(param1: S..

Backend/Kotlin 2021.12.31

[Kotlin] 확장함수 언제 어떻게 사용해야 할까?

코틀린에는 확장함수 라는 기능이 있다. 자바에서는 메소드를 사용할 때 파라미터는 반드시 메소드의 인자로 포함되어야 한다. 즉, 호출 단계에서 메소드가 우선 작성되고 재료가 되는 파라미터가 그곳에 포함되는 방식이다. 예를 들면 아래와 같다. public String format(LocalDate localDate, String pattern){ return localDate.format(DateTimeFormatter.ofPattern(format)); } String dateStr = format(LocalDate.now(), "yyyy-MM-dd") 코틀린에서도 위와 같은 방식으로 구현해도 되지만 아래와 같이 확장함수 방식으로 구현할 수도 있다. fun LocalDate.format(pattern: S..

Backend/Kotlin 2021.12.24

코틀린 with, apply, also, let, run

일단 모두 지정된 객체의 유효범위를 람다식 내부로 제한하는 기능을 한다. 즉 어떠한 객체를 특정 변수에 할당해서 활용한다고 생각하면 되는데 그 영역을 블록으로 제한한다고 생각하면 된다. 각각의 의미만 나열하면 오히려 어떤걸 활용해야 할 지 감이 안 올 수 있기 때문에 연관지어서 정리하도록 하겠다. 제일먼저 with 는 가장 단순하다. 지정된 객체를 람다식 안에서 this 로 참조할 수 있고 객체를 수정할 수도 있으며 원하는 값을 리턴하거나 리턴하지 않을 수도 있다. var map = mutableMapOf("A" to "aaa") var map2 = with(map) { this["A"] = "bbb" this } var map3 = with(map) { this["A"] = "ccc" } println..

Backend/Kotlin 2021.12.23

[Kotlin] interface default method

코틀린에서는 interface의 default method 를 지원하지 않는다. interface 에 구현부를 포함한 메소들 포함해서 사용할 순 있지만 java의 default method 와는 다르다. 자바 코드로 변환된 내용을 보면 알겠지만 내부클래스를 정의하고 그 안에 static 메소드로 만들어진다. 이로 인해 코틀린 환경에서 JpaRepository 를 상속한 interface 에 구현부를 포함한 메소드를 포함할 경우 컴파일 단계에서 아래와 같은 에러를 마주하게 된다. No property betweenOsVer found for type ${EntityName} spring-data-jpa 에서는 "쿼리 메소드" 라는 기능이 있는데 JpaRepository 를 상속한 interface 해당하는..

Backend/Kotlin 2021.12.22

[Kotlin] 제네릭(내가 필요한 것만 정리..)

타입 파라미터와 타입 인자 제네릭 클래스나 함수를 정의할 때에는 T 같은 것들을 타입 파라미터라 하고 객체를 생성하거나 함수를 호출할 때 지정하는 실제 타입을 타입인자라고 부른다. 자바에서는 제네릭 타입을 선언할 때 타입 파라미터나 인자가 없는 raw 타입을 허용하는데 예를 들어 List를 선언할 때를 생각해볼 수 있다. List list = new ArrayList(); 하지만 코틀린에서는 이렇게 선언할 수 없으며 아래와 같이 반드시 타입 파라미터 또는 인자를 지정해야 한다. 자바는 제네릭을 1.5 버전 부터 도입했기 때문에 하위 호환성을 위해 raw 타입을 허용하지만 코틀린은 처음부터 제네릭을 지원했기 때문에 타입 인자를 반드시 정의해야 한다. //타입 파라미터 지정 var list: List = m..

Backend/Kotlin 2021.12.06

[Kotlin] inline

고차함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 그런데 내부적으로 이게 실제로 사용될 때 내부적으로 Function 이라는 인터페이스를 구현한 객체를 생성해서 사용하게 된다. 예를 들어 아래와 같은 코드가 있다면 1 2 3 4 5 6 7 8 fun testFunc(a: Int, b: Int, body: (Int, Int) -> Int): Int { return body(a, b) } @Test fun test() { println(testFunc(2, 3) { a, b -> a + b }) } Colored by Color Scripter cs 컴파일 단계에서 아래와 같이 변환된다. 1 2 3 4 5 6 7 8 9 f..

Backend/Kotlin 2021.12.06

[Kotlin] 코틀린에서 유틸함수 만들기

자바에서는 유틸성 함수를 만들 때 특정 클래스에 static 메소드를 정의해놓고 사용하곤 한다. 반복적으로 자주 사용되는 함수이기 때문에 별도의 객체 생성 단계 없이 메모리 상주시켜 사용하기 위함이다. 코틀린에서는 유틸성 함수를 만드는데 세 가지 방법을 제공하는데 object, companion object, top-level-function 를 활용한다. 우선 세 가지 방식 모두 자바로 디컴파일 해보면 static 자원이다. top-level-function 은 자바에서 흔하게 사용하던 유틸 메소드와 같이 class 에 static 메소드로 정의된다. object, companion object 는 객체 자체가 static 변수에 할당되는데 모두 어플리케이션 실행시 클래스 로더에 의해 초기화 된다. 차..

Backend/Kotlin 2021.11.24

[Kotlin] val, const val

코틀린에서 상수를 선언하는 방법은 두가지로 변수 선언 앞에 val 또는 const val 를 사용하는 것이다. val의 값은 런타임 시 할당되고 const val 은 컴파일 시 할당된다. val 은 자바의 final 이라고 생각하면 되고 const는 자바의 static final 이라고 생각하면 된다. 이에 val 와 달리 const val 은 객체 생성이 필요없는 최상위 함수나 싱글톤 형태의 object 또는 static 과 비슷한 companion object 에서만 정의할 수 있다. 또한 const val 에는 함수나 객체는 할당할 수 없고 String 같은 기본타입만 할당할 수 있다. val 로 할당한 상수는 field + getter 메소드 가 조합된 것으로 코드상에서 접근할 때 field 로 ..

Backend/Kotlin 2021.11.22
728x90