본문 바로가기

kotlin20

[Spring] kotlin spring lazy loading 삽질기 Kotlin spring lazy loading 삽질기 kotlin+spring 시작하기에 이어 기존에 만들었던 crud 위중의 프로젝트를 kotlin+spring 프로젝트로 변경하던 중 JPA와 Jackson 그리고 Jpa의 LazyLoading으로 인해 몇 시간 동안 붙잡게 되었습니다. 이를 해결하기 위해 진행했던 방법, 결과적으로 잘못되었던 점에 대해 짚어보려 합니다. allOpen 옵션 열어두기 먼저 kotlin의 open에 대해 알아보면, java와 다르게 kotlin의 클래스는 기본적으로 final으로 설정되어 있습니다. hibernate에서 사용하는 CGLIB는 상속을 기반으로 프록시 기술을 사용하기 떄문에 코틀린 클래스에 대해 상속을 열어두어야 프록시 기술을 사용할 수 있습니다. 기존의 b.. 2022. 8. 13.
[Spring] kotlin + Spring 시작하기 Kotlin + Spring 시작하기 최근 취업 준비를 하며 코틀린에 대한 필요성을 느꼇고, 코틀린을 공부해 보았습니다. 뒤이어 Spring에 Kotlin을 적용해 일명 코프링프로젝트를 시작하기로 했습니다. 버전의 경우 제 현재 프로젝트의 버전이 입력되어 있습니다. 때에 따라 다르게 적용하시면 됩니다. build.gradle - 코틀린 적용 plugins { ... id 'org.jetbrains.kotlin.jvm' version '1.6.21' id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21' ... } dependencies { ... implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' implem.. 2022. 8. 10.
[Kotlin] 여러가지 기능 여러가지 기능 Type Alias Kotlin typealias FruitFilter = (Fruit) -> Boolean fun filterFruits(fruits: List, filter: FruitFilter) { } typealias USGTMap = Map data class UltraSuperGuardianTribe( val name: String ) typealias: 긴 이름의 클래스 혹은 타입이 있을 때 축약하거나 더 좋은 이름을 쓰고싶을 때 사용할 수 있다. as import Kotlin import com.heekng.kotlinStudy.kotlin.lec12.Person as PersonA import com.heekng.kotlinStudy.kotlin.lec16.Person a.. 2022. 7. 7.
[Kotlin] 컬렉션을 함수형으로 사용하기 컬렉션을 함수형으로 사용하기 필터와 맵 filter filterIndexed: filter에 index를 포함하여 사용 map mapIndexed: map에 index를 포함하여 사용 mapNotNull: mapping의 결과가 null이 아닌 것만 가져와 map 다양한 컬렉션 처리 기능 all: 조건을 모두 만족하면 true 그렇지 않으면 false none: 조건을 모두 불만족하면 true 그렇지 않으면 false any: 조건을 하나라도 만족하면 true 그렇지 않으면 false count(): 개수를 센다. sortedBy: 오름차순 정렬 sortedByDescending: 내림차순 정렬 distinctBy: 변형된 값을 기준으로 중복을 제거한다. first(): 첫번째 값을 가져온다 (무조건 n.. 2022. 7. 7.
[Kotlin] 람다 람다 Java에서의 람다 자바에서는 메서드 자체를 직접 넘겨주는 것처럼 사용할 수 있다.(Predicate 사용) 즉, 2급 시민. Java에서는 함수는 변수에 할당되거나 파라미터로 전달할 수 없다. Kotlin에서의 람다 Kotlin fun main() { val fruits = listOf( Fruit("사과", 1_000), Fruit("사과", 2_000), Fruit("사과", 1_200), Fruit("사과", 1_500), Fruit("바나나", 3_000), Fruit("바나나", 3_200), Fruit("바나나", 2_500), Fruit("사과", 10_000) ) // 람다를 만드는 방법 1 /* val isApple = fun(fruit: Fruit): Boolean { retur.. 2022. 7. 7.
[Kotlin] 함수 함수 확장함수 Kotlin fun main() { val str = "ABC" println(str.lastChar()) println(str.lastChar) } fun String.lastChar(): Char { return this[this.length - 1] } val String.lastChar: Char get() = this[this.length - 1] 코틀린은 자바와 100% 호환되기를 목표로 했다. 기존 Java 코드 위에 자연스럽게 코틀린 코드를 추가하려 했다. -> 어떤 클래스 안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 만들 수 있게 하자! fun 확장하려는클래스.함수명을 이용해 함수를 확장한다. 함수 안에서는 this를 통해 인스턴스에 접근 가능하다. this: 수신.. 2022. 7. 7.
[Kotlin] 배열과 컬렉션 배열과 컬렉션 배열 Kotlin // 배열 만들기 val array = arrayOf(100, 200) // 값 넣기 array.plus(300) // 인덱스로 반복 for (i in array.indices) { println("${i} ${array[i]}") } // 인덱스와 값 모두 가져오기 for ((idx, value) in array.withIndex()) { println("$idx, $value") } 배열은 잘 사용하지 않는다. 배열보다는 리스트를 사용하자. array.indices는 0부터 마지막 index까지의 Range이다. array.withIndex()를 사용하면, 인덱스와 값을 한번에 가져올 수 있다. array.plus()를 사용하면 값을 추가할 수 있다. Collectio.. 2022. 7. 7.
[Kotlin] Data, Enum, Sealed 클래스 Data, Enum, Sealed 클래스 Data Class Java public class JavaPersonDto { private final String name; private final int age; public JavaPersonDto(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) retur.. 2022. 7. 6.
[Kotlin] 중첩 클래스를 다루는 방법 중첩 클래스를 다루는 방법 중첩 클래스의 종류 Java 기준 static을 사용하는 중첩 클래스: 클래스 안에 static을 붙인 클래스, 밖의 클래스를 직접 참조하지 못한다. Java 기준 static을 사용하지 않는 중첩 클래스 내부 클래스(Inner Class): 클래스 안의 클래스, 밖의 클래스를 직접 참조할 수 있다. 지역 클래스(Local Class): 메서드 내부에 클래스를 정의 익명 클래스(Anonymous Class): 일회성 클래스 코틀린의 중첩 클래스와 내부 클래스 Java public class JavaHouse { private String address; private LivingRoom livingRoom; public JavaHouse(String address, Living.. 2022. 7. 6.