kotlin
[Kotlin] 함수에 인자로 함수를 사용할 수 있다?(feat. 고차함수, 함수형 인터페이스)
고차 함수 fun m1(action: () -> Unit) { action() }고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수 입니다. Kotlin 에서는 함수 매개변수를 사용할 수 있습니다. 람다 표현식val sum: (Int, Int) -> Int = { a, b -> a + b }println(sum(3, 4)) // 출력: 7람다는 익명 함수로, 코드 블럭을 변수처럼 사용하거나 함수의 인자로 전달할 수 있게 해줍니다. 람다 표현식은 `{..}` 로 정의됩니다. `고차 함수`와 `람다 표현식`// 고차 함수fun m1(action: (Int) -> String) { println(action(1))}// 람다 표현식 호출m1 { "it is $it"}위와..
[Spring] Spring Security + MockMvc 로 테스트시 주의할 점(feat. kotlin)
발단Spring Security 와 MockMvc 를 Kotlin 환경에서 검증을 하던 도중 설정(config)이 옳음에도 테스트의 결과가 일관된 반응을 하는 현상을 발견하여 그 이유를 알아보고 왜 그러하였는지 과정을 작성합니다. Kotlin 고차함수 & 함수형 인터페이스 Unit) { action() }고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수 입니다. Kotlin 에서는 함수 매개변수를 사용할 수 있습니다. 람다 표현식val sum: (Int, Int) -> Int " data-og-host="atsky.tistory.com" data-og-source-url="https://atsky.tistory.com/77" data-og-url="https://atsky.tistory.com..
[JPA] hibernate bytecode enhancement 적용시 발생하는 오류 해결 (Failed to apply plugin 'org.hibernate.orm', gradle, kotlin)
발단OneToOne 관계를 맺은 테이블에서 Lazy Initialization 을 의도하였으나 의도한 바대로 동작하지 않고 FetchType.Eager 처럼 동작하여 이를 해결하기 위해 적용한 bytecode enhancement plugin 이 찾을 수 없다는 이유로 적용되지 않는 이슈를 해결하는 과정입니다. 환경Spring Boot 3.2.5data-jpa-starterhibernate-core 6.4.4.Final OneToOne 사용시 FetchType.Lazy 가 의도대로 동작하지 않는 이유 [JPA] bytecode instrumentation 을 이용한 lazy loading 활성화-10. @OneToOne 의 양방향 연관 관계 다대일, 일대다, 다대다 와는 다르게 @OneToOne 매핑은 ..
[JPA] 연관관계를 맺은 객체에 대해 지연 로딩이 동작하지 않는다면(feat. kotlin, hibernate, lazy-loading)
발단 스케줄러 작업을 통해 주기적으로 DB 요청을 하는 상황에서 로그를 살펴보니 원하지 않았던 정보까지 요청하고 있어 어떻게 해결하게 되었는지 공유하고자 합니다. 환경 Spring Boot > 3.0 Kotlin Kotlin 의 final 정책 이해를 돕기 위해 간단히 Kotlin 의 정책에 대해 얘기해보고자 합니다. Effective Java, "Item 17: Design and document for inheritance or else prohibit it" `Effective Java` 2001 연도에 출판한 책으로 Java 의 효율적인 사용과 좋지만 흔히 사용되지 않은 개발패턴에 대해 언급한 저명한 서적입니다. 해당 책에서 `상속을 위해 디자인과 문서화 하지 않을거면 지양해라` 라는 챕터를 다룬..
[Gradle] Spring Boot + Gradle 환경에서 bootBuildImage 의 createdDate(생성 일자)의 표기가 1980년도로 되어있다면?(feat. kotlin, intellij)
발단 intellij 환경에서 gradle 플러그인을 통해 bootBuildImage 로 docker 의 image 를 관리할 때 생성일자가 과거로 설정되어있는 것을 확인하였다. 환경 Spring Boot 3.1.3(kotlin) build.gradle.kts 해결 tasks.withType{ ... createdDate = "now" // 또는 ISO 8601 규격에 맞는 값을 입력 } 참고 stack overflow 를 통한 원인 Spring Boot 2.3.0 buildpack builds image with creation date 40 years ago I've tried to use buildpack in a maven project with Spring Boot 2.3.0 running: m..
[Spring Boot] @ModelAttribute 로 맵핑하려는 대상의 depth 가 2 이상일 때 요청하였는데 오류가 난다면?(feat. kotlin)
발단EndPoint 에서 RequestBody 가 아닌 ModelAttribute 를 통해 핸들링할 때 DTO 가 2-depth 가 되며 생긴 문제를 공유하고자 합니다. 예시 코드@RestController@RequestMapping("")class TestController { @PostMapping("") fun hiPost( @ModelAttribute body: TestDto, ){ ... }}data class TestDto( var name: String = "", var testInnerDto: TestInnerDto)data class TestInnerDto( var age: Int) 오류 발생 1차 시도java.lang.NullPointer..
[Spring Boot] Spring Boot(Kotlin) Gradle 환경에서 docker 이미지를 추출하는 방법(feat. bootBuildImage)
설명 환경 윈도우즈 docker desktop 설치됨 Spring Boot 프로젝트 kotlin Gradle 로 빌드툴을 설정했을 경우 다음과 같은 탭을 찾아볼 수 있다. Gradle 빌드 툴이 제공해주는 docker image 빌드 명령어이다. Image 저장되는 장소 아무런 설정을 하지 않았을 경우 docker 로컬에 저장된다. 이는 docker desktop 과 docker CLI 를 통해 확인 가능하다. docker command : docker images docker 이미지 변경 build.gradle.kts 파일에서 다음과 같이 작성할 경우 이미지명이 변경된다. tasks.getByName("bootBuildImage"){ imageName.set(".../request-test:latest..
프로그래머스 :: 연습문제 :: 숫자 카드 나누기
풀이 package programmers.test import kotlin.math.sqrt class 숫자카드나누기 { fun solution(arrayA: IntArray, arrayB: IntArray): Int { val answerList = mutableListOf() /** * 설명 * - 철수와 영희가 가진 숫자카드의 최대공약수를 구한다. * - 각자의 공약수로 상대방의 숫자카드가 안나뉘어지는지 확인한다. * - 안나뉘어진다면 `answerList`의 원소로 추가한다. * * - 만약 `answerList`의 크기가 0 이라면 조건에 해당하는 경우가 없음으로 `0`을 return 한다. * - 그게 아니라면 `answerList`의 수중 가장 큰 수를 return 한다. * */ val g..
Programmers :: 연습문제 :: 롤케이크 자르기
풀이 class 롤케이크자르기 { fun solution(topping: IntArray): Int { var result = 0 /** * 설명 * - 만약 topping 의 크기가 `1` 이라면 공평하게 나눠 먹을 수 없다. * */ if(topping.size == 1){ return 0 } /** * 설명 * - `철수`와 `철수 동생`이 slicingPoint 를 기준으로 몇가지 종류의 topping 을 가지고 있는지 표현한다. * * @Variable * - 철수 : cs * - 철수 동생 : csBrother * - slicingPoint : `철수`와 `철수 동생`이 공평하게 나눠먹을 수 있는 시점 * */ val csGroup = topping.slice(IntRange(0,0)).toT..