분류 전체보기
[코루틴] 병렬성(Parallelism)과 연속성(Concurrency) 예제
[코루틴] 병렬성(Parallelism)과 연속성(Concurrency) 예제
2023.08.28팀 내에서 코루틴 병렬처리와 관련하여 코드리뷰 중 팀원간 싱크가 맞지 않는 것 같아 정리한 글입니다. 연속성(Concurrency) 1번 suspend fun main() = coroutineScope { async { someService.callAPI1() }.await() async { someService.callAPI2() }.await() } 위 코드는 두 API 호출이 순차적으로 이루어집니다. 첫 번째 async 블록은 callAPI1()를 호출하고, 그 결과를 기다린 후, 두 번째 async 블록이 시작됩니다. 이 방식은 두 번째 API 호출이 첫 번째 API 호출의 결과에 의존적인 경우 또는 순차적 실행이 필요한 경우에 사용하기 적합합니다. 2번 suspend fun main() = co..
SpringBoot 모니터링 하기 (feat. Grafana, Prometheus)
SpringBoot 모니터링 하기 (feat. Grafana, Prometheus)
2023.03.06애플리케이션의 메트릭과 상태를 모니터링하는 것은 성능을 개선하고, 앱을 더 나은 방식으로 관리하고, 최적화되지 않은 동작을 발견하는 데 도움이 됩니다. 많은 마이크로서비스로 구성된 시스템을 유지 관리하려면 각 서비스를 모니터링하는 것이 중요합니다. 애플리케이션의 메트릭을 노출하는 Micrometer, 메트릭 데이터를 저장하는 Prometheus, 데이터를 그래프로 시각화하는 Grafana를 사용하여 Spring Boot 웹 애플리케이션을 로컬에서 모니터링하고자 합니다. Grafana를 사용하려면 먼저 Spring Actuator를 이용해 현재 애플리케이션의 상태를 HTTP API로 응답할 수 있게 설정합니다. Prometheus를 이용하여 Spring Actuator에서 제공하는 메트릭 데이터를 수집합니..
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
Kotest를 활용해 Spring Boot에서 테스트코드 작성하기
2023.01.29Kotlin + Spring Boot 프로젝트에서 테스트코드를 Junit으로 작성하기는 쉽지 않습니다. Kotlin 컨벤션을 무시하고 Annotation 떡칠한 채 테스트코드를 작성한다면 분노의 찬 Jetbrains IntelliJ가 갑자기 컴파일을 하지 않을 수도 있습니다. 그래서 태생부터 Kotlin을 위해 개발된 테스트 프레임워크로 Kotlin 최신 문법을 발 빠르게 지원하고 있는 Kotest와 함께 테스트코드를 작성한다면 유지보수측면에서도 훨씬 더 효과적일 것입니다. 테스트 준비 Kotest와 Spring Boot Test를 사용하기 위해 의존성을 아래와 같이 추가합니다. (아래에 H2 DB를 이용해 테스트를 수행할 예정으로 h2 의존성도 추가합니다.) testImplementation("com...
Kotlin 'by' 키워드의 역할 (feat. Composition)
Kotlin 'by' 키워드의 역할 (feat. Composition)
2023.01.21코틀린의 by 키워드는 Delegate Pattern을 쉽게 구현할 수 있도록 도와주는 키워드입니다. Delegate Pattern Delegate Pattern이란 객체의 메소드를 다른 객체(Helper Object)에 위임하여 처리하는 패턴입니다. 즉 어떤 기능을 자신이 수행하지 않고 다른 객체가 수행하도록 하는 패턴입니다. 특히 이 Delegate Pattern과 항상 붙어다니는 "상속 vs 조합" 이라는 단어입니다. 자식클래스에서 부모클래스의 요소를 사용할 때 상속(Ingeritance) 또는 조합(Composition)을 이용할 수 있습니다. 상속은 모든 요소를 물려받기 때문에 변수나 메소드 등을 다시 구현할 필요가 없어 편리하지만, 객체의 유연성이 떨어진다는 치명적인 단점이 있습니다. 만약 부..
SSH no matching host key type found. Their offer: ssh-rsa,ssh-dss 에러 해결 방법
SSH no matching host key type found. Their offer: ssh-rsa,ssh-dss 에러 해결 방법
2023.01.04ssh 접속 시도시 아래와 같은 에러를 발생시키면서 접근이 불가능합니다. $ ssh -i ./something.pem user@server.com Unable to negotiate with server.com port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss 원인은 MacOS를 Ventua 13.0로 업데이트하면서 발생되었습니다. 하지만 근본적인 원인은 ssh 접속에 cbc 알고리즘을 사용하였기 때문입니다. 아래 링크를 통해 cbc 알고리즘은 2008년 공격에 취약한 것으로 판명되었음을 확인할 수 있습니다. CERT Coordination Center The Vulnerability Notes Database provides ..
Hikari Connection Pool 확인
Hikari Connection Pool 확인
2022.12.09SpringBoot는 사용이 보편화됨에 따라 Embedded Tomcat을 사용하고 있습니다. 따라서 Application 레벨에서 Datasource 관련 설정을 모두 할 수 있습니다. Hikari CP는 SpringBoot 2.0부터 기본 JDBC connection pool 의존성으로 도입되었습니다. 또한 HikariCP는 다른 DBCP보다 성능이 높다고 알려져있습니다. HikariCP 설정 application.yml spring: datasource: hikari: connectionTimeout : 30000 maximumPoolSize : 10 maxLifetime : 1800000 poolName : HikariCP readOnly : false connectionTestQuery : SE..
[Spring] 프레임워크 개념 - 1편
[Spring] 프레임워크 개념 - 1편
2022.11.20Spring 엔터프라이즈 Java 어플리케이션을 위한 가장 많이 사용되는 프레임워크입니다. 사실 스프링은 J2EE 개발을 더 쉽게 할 수 있는 단순하고 가벼운 대안으로 시작되었습니다. 그렇다면 스프링을 사용하면 어떤 이점이 있는지 알아보겠습니다. Java POJO(Plain Old Java Object)를 사용하므로 J2EE 이전 버전의 헤비급 EJB에 비해 엔터프라이즈급 어플리케이션을 훨씬 간단하게 구출할 수 있습니다. POJO는 Java 언어 사양에 의해 강제된 것 이외의 제한 사항에 구속되지 않는 Java 개체입니다. 따라서 POJO는 프레임워크에서 미리 지정된 클래스를 확장하거나 미리 지정된 인터페이스를 구현할 필요가 없습니다. DI(Dependency Injection)을 이용하여 느슨한 결합을..
Spring Boot + Kotlin 깔끔한 validation 처리 (feat. Jackson)
Spring Boot + Kotlin 깔끔한 validation 처리 (feat. Jackson)
2022.10.18스프링 부트 의존성 라이브러리를 확인했을 때 별도의 라이브러리를 추가하지 않더라도 기본 starter 킷에 Jackson 라이브러리가 포함되어 있는 것을 확인할 수 있습니다. Spring Boot를 이용한 HTTP API 서버 구현시 요청의 body 값을 대부분 JSON으로 받게됩니다. 또한 응답을 Class Instance로 반환하면 JSON으로 변환하여 응답하게 됩니다. 때문에 직렬화와 역직렬화가 수행되는데, 스프링부트에서는 @RestController 어노테이션이 달린경우 Jackson 라이브러리가 직렬화와 역직렬화를 담당하게 됩니다. 대부분의 변환 과정에서 큰 문제는 없지만 스프링부트와 Kotlin을 함께 사용하게 된다면 이야기가 조금 달라집니다. @RestController class Examp..
Javascript Promise로 배우는 Kotlin Coroutine
Javascript Promise로 배우는 Kotlin Coroutine
2022.10.09Coroutine 이란? 처음 코루틴을 접했을 때 코틀린의 '코'를 따서 'Ko'routine 인줄 알았지만, 사실 코루틴의 Co는 Concurrency라는 의미를 가지고있습니다. 즉, 동시성 프로그래밍 개념을 코틀린에 도입한 것이 코루틴 이라고 합니다. 코루틴은 javascript Promise와 조금 다른 성질을 가지고 있습니다. 코루틴은 스레드 위에서 실행되는데 여러가지 코루틴 1,2,3이 존재한다고 할 때 코루틴1을 실행하던 중 코루틴2가 실행되어도 실행중인 스레드를 정지하면서 컨텍스트 스위칭 개념으로 다른 스레드로 전환하는 것이 아니라 기존 스레드를 유지하며 기존 스레드에서 코루틴2를 실행하게 됩니다. 이후 코루틴1을 다시 실행할 때 저장해둔 코루틴1 상태를 불러와 다시 스레드에서 코루틴1을 실..
SpringBoot ResponseBodyAdvice 특정 응답 값 암호화하기
SpringBoot ResponseBodyAdvice 특정 응답 값 암호화하기
2022.09.25본 포스팅은 ResponseBodyAdvice를 이용하여 암호화된 응답값을 생성하는 예제입니다. 사실 HandlerInterceptor의 postHandler 같은 곳에서 응답값을 가공할 수 있을 듯하지만, 사실 인터셉터 단에서 응답 가공은 불가능합니다. 하지만 특정 API만 암호화된 값으로 응답을 가공하고 싶을 때가 있는데, 그럴때 사용하는 것이 ResponseBodyAdvice입니다. ResponseBodyAdvice @RestControllerAdvice class EncryptedResponseWrapper : ResponseBodyAdvice { override fun supports(returnType: MethodParameter, converterType: Class): Boolean { ..
Kotlin 리플렉션(Reflection)
Kotlin 리플렉션(Reflection)
2022.09.06리플렉션(Reflection)이란? 리플렉션은 말 그대로 '반사', '반영'의 의미를 가지고있습니다. 구체적인 클래스 타입을 알지 못하더라도 바이트코드를 이용해 해당 클래스의 메소드, 타입, 변수들을 참조하여 값을 찾을 수 있는 JAVA API입니다. 즉 컴파일 시점이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있고 변수를 변경하거나 메소드를 호출할 수 있는 프로그래밍 기법입니다. 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용됩니다. intelliJ의 자동완성 기능, Lombok, Spring Container, Spring annotation 등에서 사용됩니다. 리플렉션은 아래와 같은 정보들을 가..
jdkman으로 java 버전 관리하기
jdkman으로 java 버전 관리하기
2022.08.16SDKMAN sdkman은 SDK를 버전을 병렬로 관리하기 위한 도구입니다. 대부분의 유닉스 기반 시스템에서 사용할 수 있습니다. sdkman을 이용하여 여러 Java 버전을 관리할 수 있는 방법에 대해 알아보겠습니다. Install $ curl -s "https://get.sdkman.io" | bash 설치가 완료되면 터미널에 아래 명령을 실행합니다. $ source "$HOME/.sdkman/bin/sdkman-init.sh" 마지막으로, 설치된 SDKMAN!의 버전을 확인하여 성공적으로 설치가 완료됐는지 확인합니다. $ sdk version SDKMAN 5.16.0 Uninstall sdkman이 설치된 경로는 ~/.sdkman 입니다. 간단하게 rm 명령으로 삭제가 가능합니다. $ rm -rf ..