분류 전체보기
[mysql] 미사용 인덱스 확인하기
[mysql] 미사용 인덱스 확인하기
2024.10.13performance_schema 설정MySQL에서는 performance_schema의 table_io_waits_summary_by_index_usage 테이블을 통해 인덱스의 사용 빈도를 모니터링할 수 있습니다. 이 테이블은 각 테이블의 각 인덱스에 대한 I/O 활동을 수집하며, 이를 통해 사용되지 않는 인덱스를 파악할 수 있습니다. 인덱스 I/O 활동을 확인하려면 먼저 performance_schema 기능이 활성화되어 있어야 합니다. MySQL 8.0에서는 기본적으로 활성화되어 있지만, 비활성화되어 있다면 MySQL 설정 파일에서 다음 설정을 추가해야 합니다.[mysqld]performance_schema=ONperformance_schema 옵션이 활성화된 이후부터 인덱스 사용량이 카운팅되기 ..
Apache Kafka 기본 개념
Apache Kafka 기본 개념
2024.07.22Apache Kafka란 현재 카프카는 Apache Software Foundation에서 오픈 소스로 관리하는 분산 이벤트 스트리밍 플랫폼입니다. 2011년 링크드인에서는 수많은 사용자 활동 로그와 시스템 이벤트를 실시간으로 처리하는 과정에서 많은 어려움을 겪었습니다. 당시 링크드인 개발자(Jay Kreps, Neha Narkhede, Jun Rao)는 카프카를 개발하게 되었습니다. 참고로 'Kafka'라는 이름은 프란츠 카프카의 소설에서 영감을 받아 붙여진 이름입니다.당시 링크드인은 이벤트를 보내는 쪽(프로듀서)과 받는 쪽(컨슈머)이 각각 여러 개 존재했습니다. 각 프로듀서와 컨슈머가 서로 직접 연결되어야 했고 따라서 새로운 생산자나 소비자가 추가될 때마다 모든 기존 시스템과 새로 연결해야 해서 연결..
[kotlin] withTimeout 사용시 suspend/non-suspend 함수 동작 차이
[kotlin] withTimeout 사용시 suspend/non-suspend 함수 동작 차이
2024.07.14delay()코틀린의 delay 함수는 코루틴을 지연시키는 함수입니다. 이는 스레드를 차단하지 않고 코루틴이 일정 시간 동안 대기하도록 합니다.fun main() = runBlocking { println("Start") delay(1000L) println("End")}위 코드에서 delay(1000L)은 1초 동안 코루틴을 지연시키고, 그 이후에 "End"를 출력합니다.delay() 함수는 suspend 함수로, 내부적으로 코루틴을 일시 중단(pause)시키고, 지정된 시간이 경과한 후에 코루틴을 재개합니다. withTimeoutwithTimeout 함수는 주어진 시간 내에 완료되지 않는 작업을 취소하는 함수입니다. withTimeout 블록 내에서 작업이 지정된 시간 내에 완료되지 ..
[코루틴] 병렬성(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을 실..