전체 글
[Kotlin] Kotlin Coroutines (with Spring WebFlux)
[Kotlin] Kotlin Coroutines (with Spring WebFlux)
2021.08.29Kotlin Coroutines 기본적인 개념과 docs kotlinlang.org/docs/coroutines-guide.html#table-of-contents 참고 ) Kotlin Coroutine은 어떻게 동작하는가 - CPS 관련 설명, 자주 하는 질문까지 포함한 좋은 발표 자료 참고 ) 어떠한 코루틴이 발동될 때 마다 해당 코루틴은 이전에 자신의 실행이 마지막으로 중단되었던 지점 다음의 장소에서 실행을 재개한다. Kotlin의 Coroutine은 suspend 키워드로 마킹된 함수를 CPS(Continuation Passing Style)로 변환하고, 이를 Coroutine Builder를 통해 적절한 스레드 상에서 시나리오에 따라 동작하도록 구성됩니다. 주의해야 할 점은 suspend fun..
[Java] Jackson 프로퍼티명 snake_case <-> camelCase 변환
[Java] Jackson 프로퍼티명 snake_case <-> camelCase 변환
2021.08.01Jackson ObjectMapper 변환 https://stackoverflow.com/questions/10519265/jackson-overcoming-underscores-in-favor-of-camel-case A. @JsonProperty 애너테이션으로 각 필드에 명시해주는 방법 [Java] Jackson ObjectMapper Serialization 좀 귀찮지만, 줄임말 등을 내부 컨벤션에 맞는 이름으로 바꿔줄 수 있어서 오히려 유용할 수 있음. B. 각각의 data class에서 @JsonNaming 애너테이션으로 어떤 이름 변환 사용할지 명시해 주는 방법 ```java @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) ``` C...
카프카 컨슈머
카프카 컨슈머
2021.07.23컨슈머? 파티션 리더에게 메시지 가져오기 (Consume) 다른 메시지큐 처럼 소비하면 없어지나? ⇒ X 기본값 7일 동안 저장했다가 삭제 ⇒ 필요하다면 이미 가져온 데이터도 다시 가져올 수 있음 ⇒ 여러 컨슈머 그룹에서 메시지 수신 가능 컨슈머 중요 옵션 group.id 컨슈머 그룹 식별자 fetch 관련 fetch.min.bytes 한 번에 가져오는 데이터의 최소 사이즈. 지정한 사이즈 보다 작은 경우 요청에 응답하지 않고 데이터가 누적될 때 까지 기다림. (default 1byte) fetch.max.wait.ms 사이즈가 작아서 기다린다면 최대 몇 초 동안 기다릴건지? (default 500ms) max-wait 시간 지나면 쌓인 데이터가 min-bytes 보다 작아도 그냥 컨슈머로 보내기 때문에..
docker 안의 DB를 사용할 때 timezone 문제
docker 안의 DB를 사용할 때 timezone 문제
2021.05.19Oracle로 설명했지만 대부분의 DB in docker image에서 통하는 내용이다. 문제 상황 Oracle docker image를 사용해서 DB 올리고 작업하고 있는데, insert된 row들 날짜 필드 시간이 안맞는다. (UTC -> Asia/Seoul)로 timezone 설정이 필요한 상황이다. ```sql SELECT SYSDATE, CURRENT_DATE, DBTIMEZONE, SESSIONTIMEZONE FROM DUAL; -- 현재 시각은 한국 기준 05-19 00:38:51 +-------------------+--------------------------+----------+---------------+ |SYSDATE |CURRENT_DATE |DBTIMEZONE|SESSIONT..
[Oracle] Pagination
[Oracle] Pagination
2021.05.17Pagination https://en.wikipedia.org/wiki/Select_(SQL)#Result_limits Offset 기반 rownum ROW_NUMBER() Cursor 기반 Cursor-based pagination을 Seek method라고도 부르고 No offset이라고도 부른다. 12c 버전 이후라면? : Row Limiting Clause https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1 myjamong.tistory.com/170 12c 이전에는? https://stackoverflow.com/questions/241622/paging-with-oracle https://blogs...
Flyway
Flyway
2021.05.13flyway는 DB에 schema_version 테이블을 유지하면서, DB 상태를 버전으로 관리할 수 있게끔 도와준다. (나중에 DB를 실행해도 버전에 맞게 데이터를 밀어넣어준다.) DB에 데이터가 존재하는 상태에서 flyway를 적용할 때 발생하는 문제 ``` Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema "SYSTEM" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table. ``` DB가 비어있지 않아(상태를 가지고 있어) flyway를 적용할 수 없다는 것. flyway를 사용하려면 ..
[Test] 통합 Test에 in-memory DB 를 쓰는게 더 좋을까?
[Test] 통합 Test에 in-memory DB 를 쓰는게 더 좋을까?
2021.05.03블로그 포스팅은 업데이트 X. 상세 내용은 위 pdf 참조. Spring Batch는 통합TC 수행하고 나서 자동 rollback이 불가하다. -> 직접 rollback 코드를 작성해주어야 하는데 잡이 복잡한 경우 까다롭다. 매번 롤백 코드 신경써서 작성하는 것도 리소스 낭비다. -> 그러면 TC 수행 후 삭제되는 H2를 쓰면 어떨까? 생각하게 되는데, 이는 아래와 같은 문제점이 있다. 운영에서는 다른 DB 쓰고, TC는 다른 DB(In-Memory) 사용할 때의 문제점 유닛테스트에서는 DB를 안쓰거나, 간단한 쿼리 정도 사용하게 되므로 In-Memory 사용해도 무방하지만 복잡한 쿼리를 포함하여 실행하는 통합테스트는 In-Memory DB를 사용하면 아래와 같은 문제를 마주할 수 있다. 운영 DB는 O..
프로그래밍 언어는 그냥 도구인가? 에 대한 견해
프로그래밍 언어는 그냥 도구인가? 에 대한 견해
2021.05.01이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
CQRS : Command and Query Responsibility Segregation
CQRS : Command and Query Responsibility Segregation
2021.04.21martinfowler.com/bliki/CQRS.html (번역) https://martinfowler.com/bliki/CommandQuerySeparation.html CRUD를 모두 하나의 도메인 모델을 사용해 처리했었다면, CQRS는 CUD를 Command용 모델로, R을 Query용 모델로 분리하여 설계하는 방법 하지만 문서 전체에서 CQRS는 잘 들어맞는 부분에만 일부 사용할 것을 권장하고 있다. 문서에서 발췌 CQRS는 시스템의 특정한 부분(DDD 표현으로는 Bounded Context)에서만 사용돼야 하고, 시스템 전체에서 사용해서는 안 된다. 이러한 사고방식은 각 Bounded Context는 개별적으로 모델링을 해야 한다는 의미다. (Bounded Context: https://www..
[Spring] DB 관련 : Mybatis CustomTypeHandler
[Spring] DB 관련 : Mybatis CustomTypeHandler
2021.03.31jdbcType : nullable column에 null이 들어갈 때? MyBatis는 nullable 컬럼의 parameter로 null이 넘어왔을 때, jdbcType이 명시되어 있지 않으면 TypeException을 던진다. setNull로 해당 타입에 맞는 null값(VARCHAR인 경우 "")을 넣어줘야 하는데, 뭘 넣어줄지 모르니까 예외가 발생하는 것 The JDBC Type is required by JDBC for all nullable columns, if null is passed as a value. You can investigate this yourself by reading the JavaDocs for the PreparedStatement.setNull() method. [..
[Java] HmacUtils, Mac이 thread-safe하지 않다?
[Java] HmacUtils, Mac이 thread-safe하지 않다?
2021.03.17일반적으로 Hash, HMAC 만들 때는 아래 Util 클래스 사용한다. org.apache.commons.codec.digest.DigestUtils org.apache.commons.codec.digest.HmacUtils 그러나 HmacUtils은 thread-safe 하지 않다. 정확히는, HmacUtils는 thread-safe 하지만 그 안에서 사용되는 Mac이 thread-safe 하지 않다. https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/HmacUtils.html https://stackoverflow.com/questions/31898802/is-macdofinal-thread-..
Shell Script
Shell Script
2021.03.15linuxsig.org/files/bash_scripting.html Table 1: Built-in shell variables. Variable Use $# Stores the number of command-line arguments that were passed to the shell program. $? Stores the exit value of the last command that was executed. $0 Stores the first word of the entered command (the name of the shell program). $* Stores all the arguments that were entered on the command line ($1 $2 ...). "..