Kotlin
spring boot jib 를 사용 하여 배포 자동화 하기 (w. github action)
spring boot jib 를 사용 하여 배포 자동화 하기 (w. github action)
2023.03.23jib 란? Jib는 Dockerfile을 사용하지 않거나 Docker를 설치할 필요 없이 컨테이너를 빌드할 수 있도록 도와주는 도구이다. 특히 자바 컨테이너를 빌드하는 데 사용하는 도구이며, Maven과 Gradle 용 플러그인을 이용해 사용할 수도 있고 Jib 자바 라이브러리를 통해 사용할 수도 있다. 적용해보기 build.gradle.kts plugin { ... id("com.google.cloud.tools.jib") version "3.1.2" apply false ... } 버전은 해당 spring boot, kotlin, java 버전에 맞게 설정 이 필요하다. val stage: String? by project // github action 에서 -Pstage=alpha 옵션으로 주입 ..
Kotlin 으로 Spring batch 시작하기 Part.1
Kotlin 으로 Spring batch 시작하기 Part.1
2022.10.29Java 로 된 Spring Batch 는 예제는 많지만 Kotlin 으로 된 예제는 부족한 것 같아 실전 프로젝트 처럼 예제를 작성 하기로 했습니다. 모든 code 는 아래 github 에서 확인해주세요 https://github.com/nothingprogram/spring-batch-practice GitHub - nothingprogram/spring-batch-practice Contribute to nothingprogram/spring-batch-practice development by creating an account on GitHub. github.com Project setup 하기 build.gradle.kts import org.jetbrains.kotlin.gradle.task..
Async, CompleteableFuture 에서 RequestContextHolder 에 접근하기
Async, CompleteableFuture 에서 RequestContextHolder 에 접근하기
2022.10.20RequestContextHolder 는 ThreadLocal 을 사용하여 attributes 들을 저장하고 있다. MVC spring 에서 비동기적으로 작업을 처리해야 할때가 있는데 이때 RequestContextHolder 에 접근하게 되면 Thread 가 달라 attributes 가 원하는 값이 나오지 않게 된다. 문제해결 @Configuration class WebConfig : ServletContextInitializer { override fun onStartup(servletContext: ServletContext) { val applicationContext = AnnotationConfigWebApplicationContext() val dispatcherServlet = Dispat..
How to use Redisson with kotlin
How to use Redisson with kotlin
2022.10.02Redisson은 Jedis, Lettuce 와 같은 자바진영의 레디스 클라이언트입니다. Lettuce와 비슷하게 Netty 를 사용하며 non-blocking I/O 를 사용합니다. Redisson 의 특이한 점은 직접 레디스의 명령어를 제공하지 않고 , Bucket 이나 Map 과 같은 자료구조나 Lock 같은 특정한 구현체의 형태로 제공한다는 점입니다. https://github.com/redisson/redisson GitHub - redisson/redisson: Redisson - Redis Java client with features of In-Memory Data Grid. Over 50 Redis based Java objects Redisson - Redis Java client wi..
WebFlux spring graphql 에서 Header Handling 하기
WebFlux spring graphql 에서 Header Handling 하기
2022.10.01WebFlux 에서는 WebMvc 와는 다른 방법으로 header 를 handling 해야합니다. login 을 했을때 cookie 를 set 하는 예시로 시작해보겠습니다. @MutationMapping fun login( @Argument input: LoginInput, context: GraphQLContext ): Mono { return memberService.login(input) .flatMap { context.put("token", it.token) Mono.just(AuthToken(it.tokenType, it.token)) } } GraphqlContext 에 key value 형태로 token 을 저장합니다. 그리고 headerInterceptor 를 만들어 context 의 값..
How to set up Security in WebFlux
How to set up Security in WebFlux
2022.10.01WebFlux 에서 Spring Security 를 구성하려면 WebMvc 에서의 Security Configuration 과 조금 다른부분이 있어 정리 해두려고 합니다. WebFlux 란? [Spring] WebFlux란? WebFlux? Spring Framwork5에서 새롭게 추가된 모듈이다. web-flux는 client, server에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이라고 한다. 스프링 공식문서에… heeyeah.github.io build.gradle.kts 구성 implementation("org.springframework.boot:spring-boot-starter-graphql") implementation("org.springframework.boot:sp..
spring 에서 비동기 처리를 위한 TreadPoolTaskExecutor 알아보기
spring 에서 비동기 처리를 위한 TreadPoolTaskExecutor 알아보기
2022.08.24Spring ThreadPoolTaskExcutor 는 java.util.concurrent.ThreadPoolExecutor 의 추상화 한것을 Spring 에서 제공하는 JavaBean 입니다. corePoolSize maxPoolSize queueCapacity allowCoreThreadTimeOut keepAliveSeconds 와 같은 속성을 통해 커스텀하게 사용 할 수 있습니다. corePoolSize vs maxPoolSize corePoolSize corePoolSize 는 timeout 없이 active status 를 유지하기 위한 최소한의 worker 수입니다. ThreadPoolTaskExecutor 는 구성된 설정을 java.util.concurrent.ThreadPoolExecu..
kotlin coroutine - Mutex 와 Actor (공유자원)
kotlin coroutine - Mutex 와 Actor (공유자원)
2022.08.05kotlin 에서 멀티쓰레드 및 코루틴 환경에서 자원을 공유 하기위해서는 보통 잘알려진 방법으로 는 Mutex 로 context 의 Lock 을 걸어 자원을 읽고 쓰는 동안 그 자원에 대해서 접근하지 못하도록 하는 방법이 있다. Mutex private suspend fun massiveRun(action: suspend () -> Unit) { val n = 100 // 시작할 코루틴의 갯수 val k = 1000 // 코루틴 내에서 반복할 횟수 val elapsed = measureTimeMillis { coroutineScope { // scope for coroutines repeat(n) { launch { repeat(k) { action() } } } } } println("$elapsed ..
GraphQL 에서 N + 1 을 해결 하기 위해 Dataloader 사용하기
GraphQL 에서 N + 1 을 해결 하기 위해 Dataloader 사용하기
2022.08.02# 들어가기전 Kotlin + Dgs framework 를 사용하고 있습니다. https://netflix.github.io/dgs/ Home - DGS Framework How did this project begin? The DGS framework project started at Netflix in 2019 as internal teams began developing multiple GraphQL services. As 2020 wrapped up, Netflix decided to open source the framework and build a community around it. Is it productio netflix.github.io Graphql 에서는 왜 N + 1 문제가 발생하..
GraphQL 에서 Resolver 의 역활
GraphQL 에서 Resolver 의 역활
2022.07.28GraphQL이란 GraphQL은 2012년 페이스북 개발자들이 모바일 어플리케이션을 제작하면서 만든 쿼리 언어이다. SQL과 마찬가지로 데이터베이스의 정보를 질의하는데 사용되지만 그 구조는 매우 다르다. 페이스북 개발자들은 왜 굳이 새로운 쿼리 언어를 만들면서까지 프론트엔드로 데이터를 보내는 방식을 개선하려고 했을까? 전통적인 REST API는 오버페칭이나 언더페칭 같은, 데이터를 너무 많이 전달하거나 너무 적게 전달하여 불필요한 데이터 전송을 일으키는 문제를 발생시켰다. 또 REST API의 경우 개발이 계속될수록 점점 더 많은 엔드포인트를 필요로 하게 되어 프로젝트 관리를 어렵게 한다. 반면 GraphQL은 프론트엔드에서 필요로 하는 데이터를 있는 그대로 JSON 형태로 표현하여 되돌려받는다는 장점..
Kotlin - with 과 apply
Kotlin - with 과 apply
2022.07.24java 를 주 언어로 사용하시다가 kotlin 으로 넘어오는 경우가 많은데 kotlin 을 처음 접하게 되면 드는 생각이 OOP를 지원하지만 생각보다 많은것들이 함수형으로 코드를 작성하는것이 더 편하다는 생각이 든다. 오늘은 그중에서도 With 과 Apply function 에 대해서 알아보자. With 어떤 객체의 이름을 반복하지 않고도 그 객체에 대해 다양한 연산을 수행할 수 있다면 좋을 것이다. 다양한 언어가 그런 기능을 제공한다. 코틀린도 마찬가지 기능을 제공하지 만 언어 구성 요소로 제공하지 않고 With라는 라이브러리 함수를 통해 제공한다. fun main() { println(alphabet()) } fun alphabet() = with(StringBuilder()) { for (lett..