본문 바로가기

전체 글86

DBeaver 데이터 뷰어에서 시간까지 볼 수 있게 날짜 형식(Date Format) 변경하기 Pattern을 yyyy-MM-dd HH:mm:ss로 변경한다. 2020. 1. 16.
Spring Boot Request Logging - CommonsRequestLoggingFilter Spring Boot로 api를 개발할 때 쉽게 Request를 Logging 할 수 있게 Spring에서는 CommonsRequestLoggingFilter를 Servlet Filter 형태로 제공한다. 아래 bean 정의를 소스코드에 추가하고, logger 설정에서 org.springframework.web.filter의 logger level을 debug로 바꾼다. CommonsRequestLoggingFilter Bean @Configuration class FilterConfig { @Bean fun commonsRequestLoggingFilter(): CommonsRequestLoggingFilter { val filter = CommonsRequestLoggingFilter() filter.. 2020. 1. 3.
Kafka 2.1 이상에서 Kafka Offset Monitor 사용하기 - Unknown offset schema version 3 해결 2019-12-19 14:52:58 ERROR KafkaOffsetGetter$:103 - The message was malformed and does not conform to a type of (BaseKey, OffsetAndMetadata. Ignoring this message. kafka.common.KafkaException: Unknown offset schema version 3 at kafka.coordinator.GroupMetadataManager$.schemaForOffset(GroupMetadataManager.scala:739) at kafka.coordinator.GroupMetadataManager$.readOffsetMessageValue(GroupMetadataMana.. 2019. 12. 26.
Kafka Monitoring Tool - Kafka Offset Monitor Kafka Offset Monitor This is an app to monitor your kafka consumers and their position (offset) in the queue. You can see the current consumer groups, for each group the topics that they are consuming and the position of the group in each topic queue. This is useful to understand how quick you are consuming from a queue and how fast the queue is growing. It allows for debuging kafka producers an.. 2019. 12. 26.
Kafka 용어 정리 Kafka Pub-Sub 모델의 MQ(메시지 큐)이며, 분산 환경에 특화되어 있다. LinkedIn에서 개발된 분산 메시징 시스템으로 2011년에 오픈소스로 공개되었다. Pub-Sub 모델 Publish-Subscribe Message를 전송자가 바로 수신자에게 보내지 않고, 전송자(=발행자/Publish)가 어떤 형태로든 Message를 구분하여 Publish-Subscribe 시스템에 전송하면 수신자(=구독자/Subscribe)가 특정 부류의 Message를 구독할 수 있게 해 준다. 이때 발행된 Message를 저장하고 중계하는 역할을 브로커(broker)가 수행한다. Message Kafka에서는 데이터의 기본 단위를 Message라고 한다. DB에서의 row 또는 record에 비유될 수 있다... 2019. 12. 25.
Tibero6 jdbc jar 파일 다운로드 Tibero jdbc jar 파일은 tibero를 설치한 후 %TB_HOME%/client/lib/jar 경로에 있다. 2019. 12. 25.
[Gradle/Windows] Caused by: java.io.IOException: CreateProcess error=206, 파일 이름이나 확장명이 너무 깁니다. Windows 환경에서 bootRun 실행 시 아래와 같은 오류가 발생할 수 있다. Caused by: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" (in directory "D:\dev\rhea\safe\fds"): CreateProcess error=206, 파일 이름이나 확장명이 너무 깁니다 at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25) ... 8 more Caused by: java.io.IOException: CreateProcess error=20.. 2019. 11. 20.
Recursive CTE(Common Table Expression) 이해하기 요즘 기존에 MyBatis로 개발하였던 프로젝트를 JPA와 QueryDSL로 바꾸는 작업을 하고 있다. 그런데 어째 처음 배우는 QueryDSL보다 기존 쿼리 구문 문법이 더 어렵다. WITH RECURSIVE CTE as ( SELECT 1 AS LEVEL ,MENU_ID ,MENU_NM ,UPR_MENU_ID FROM TB_MENU WHERE UPR_MENU_ID IS NULL UNION ALL SELECT 1 + LEVEL AS LEVEL ,A.MENU_ID ,A.MENU_NM ,A.UPR_MENU_ID FROM TB_MENU A ,CTE B WHERE A.UPR_MENU_ID = B.MENU_ID ) SELECT LEVEL ,MENU_ID ,MENU_NM ,UPR_MENU_ID FROM CTE 그.. 2019. 11. 12.
[Kotlin] Java Scripting API (JSR-223) JSR-223 Kotlin은 Java scripting engine을 사용하기 위한 툴로 Java Scripting API를 지원한다. 원래 우리의 프로젝트에서는 Java scripting engine으로 Nashorn을 사용했었는데, 이게 jdk11부터 deprecated(관련 링크 - https://openjdk.java.net/jeps/335) 되면서 다른 대안이 필요해졌다. 그래서 서치하다 보니 Kotlin에서 제공하는 Java Scripting API(JSR-223)가 있었다. Kotlin 1.1 버전부터 지원한다. 우리는 이미 백엔드 서버 개발을 Kotlin으로 하고 있었기 때문에 큰 변경 없이 이를 사용할 수 있었다. 제공하는 기능은 Nashorn과 거의 유사하다. 사용자가 작성한 스크립트 .. 2019. 10. 19.
Error running '{ClassName}': Command line is too long. Shorten command line for {ClassName}. 해결; Shorten command line IntelliJ에서 테스트를 실행할 때 또는 개발한 애플리케이션을 실행할 때에도 이러한 에러가 발생하면서 실행되지 않는 경우가 있다. IntelliJ에서 바로 실행할 때에는 class path를 자동으로 잡게 하는데, 이 때문에 run command가 너무 길어져서 발생하는 문제이다. 정상적으로 실행되는 경우에도 알고 보면 아래처럼 어마 무시하게 run command가 길다. 이 run command에 길이가 OS limit를 넘으면 실행할 수 없게된다. 이를 해결하기 위해서는 Run/Debug Configuration에서 Shorten command line의 옵션을 수정한다. 4가지 옵션중 하나를 선택할 수 있다. None: 기본 옵션 값. IDE에서 긴 classpath를 줄여주지 않는다. comm.. 2019. 10. 16.
Docker Container Networking 간단 정리 공식문서: https://docs.docker.com/v17.09/engine/userguide/networking/ docker network ls 명령으로 구성된 network 종류 확인 가능 $ docker network ls NETWORK ID NAME DRIVER SCOPE 9802b1bb6468 bridge bridge local f78513044503 docker_dask_default bridge local 8eeeb223ac9f docker_gwbridge bridge local u6u3pgytc9qr hadoop-net overlay swarm 94e45591dbd0 host host local cuz7djbr1y1z ingress overlay swarm a214353d85c3 non.. 2019. 10. 15.
Kotlin에서 Util 함수 작성하기 - Top-Level Functions Java에서 Util 함수를 만들 때는 주로 Util class를 만들어서 사용하였다. 이런 Util 작성 패턴을 Kotlin에서 그대로 사용하면 아래와 같은 코드가 된다. // Don't object MapUtils{ fun Map2JsonString(map: mutableMap) : String{ return objectMapper.writeValueAsString(map) } } // Usage val map: MutableMap = mutableMapOf("K" to "V") MapUtils.Map2JsonString(map) // {"K":"V"} 하지만, Kotlin에서는 Top-Level Function을 대신 사용하는 것이 좋다. Java에서와 같이 추가로 Util class를 작성할 필요.. 2019. 10. 14.
Kafka 외부 접속 허용하기 $ vi conf/server.properties conf/server.properties가 Kafka의 설정을 담당하는 파일이다. # Hostname and port the broker will advertise to producers and consumers. If not set, # it uses the value for "listeners" if configured. Otherwise, it will use the value # returned from java.net.InetAddress.getCanonicalHostName(). #advertised.listeners=PLAINTEXT://your.host.name:9092 여기에서 마지막 줄의 주석을 풀고 advertised.listeners.. 2019. 10. 7.
[Kotlin] Generics - 공변성(covariant)과 반공변성(contravariant) What is generic? Generic이란 Class 또는 method에서 매개변수에 사용되는 자료형의 정의를 개체 생성시 정하게 하여 타입에 대한 안정성을 높이는 도구를 말한다. 일반적으로 로 표기된다. Generic 사용의 장점 – Type casting is evitable- typecasting을 하지 않고 객체를 사용할 수 있다. Type safety- Generic allows only single type of object at a time. Compile time safety- 런타임 에러를 방지하기 위해 Generics code는 컴파일 타임에 체크된다. 이런 Generic에서 사용할 수 있는 타입의 범위를 지정하는것이 Type Bound이다. Modern Language들은 대부분.. 2019. 10. 5.
[Gradle] Caused by: org.gradle.api.GradleException: No tests found for given includes: 에러 해결 Caused by: org.gradle.api.GradleException: No tests found for given includes: [TestClassPath.TestClassName] Gradle 프로젝트에 JUnit Test를 작성하고 실행하였을 때 위 에러와 함께 test events were not received 메시지가 나오면서 테스트가 실행되지 않는 경우가 있다. 이럴 때는 build.gradle.kts에 아래 task를 추가한다. tasks.withType { useJUnitPlatform() } 그리고 JUnit5를 사용하고자 한다면 spring-boot-starter-test에서 junit이 제외되어 있는지 확인한다. spring-boot-starter-test에 JUnit4가 .. 2019. 10. 4.
Netty Server에 SSL(https) 연결 적용하기 SSL? Netty에 SSL 인증을 적용하기 전 SSL 인증이 무엇인지, TLS Handshake는 어떤 프로세스로 동작하는지 설명한다. 대부분의 내용은 를 참고하였다. 대칭키/공개키 암호화 대칭키 공개키(비대칭키) 암호화에 사용되는 키와 복호화에 사용되는 키가 동일 암호화에 사용되는 키와 복호화에 사용되는 키가 서로 다름 빠른 암복호화 성능, 구현이 비교적 간단 대칭키 암호화에 비해 상대적으로 낮은 성능 키가 유출되면 키를 공유한 상대방의 데이터를 모두 복호화 할 수 있음 키가 유출되어도 상대방의 데이터는 안전 대표적으로 RSA가 여기에 속함 공개키 암호화에 대한 더욱 자세한 설명 공개키 암호화는 암복호화에 사용되는 키가 다르다. 즉, 한 명의 사용자가 가지는 키는 두 개가 된다. 예를들어 모모라는 사.. 2019. 10. 3.