전체 글
[Oracle] Pagination
[Oracle] Pagination
2021.05.17Pagination https://en.wikipedia.org/wiki/Select_(SQL)#Result_limits 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.oracle.com/oraclemagazine/on-top-n-and-pagination-queries https://use-the-index-luke.com/sql/partial-re..
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-..
[Spring] WebClient
[Spring] WebClient
2021.03.14왜 WebClient ?: RestTemplate은 deprecated 예정. docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html NOTE: As of 5.0 this class is in maintenance mode, with only minor requests for changes and bugs to be accepted going forward. Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API and supports syn..
[Oracle] longest match
[Oracle] longest match
2021.02.16https://dba.stackexchange.com/questions/42997/longest-prefix-search-in-oracle https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4246230700346756268 일단... 쿼리 하나로 해결하자면 이렇게도 가능은 한데, 성능 관점에서는? ```sql SELECT MIN(t.BIN_NO) KEEP (DENSE_RANK FIRST ORDER BY LENGTH(t.BIN_NO) DESC) FROM CARD_BIN t WHERE '654103' LIKE t.BIN_NO || '%'; ``` DBA 문의 결과... 다음과 같이 인덱스 걸고 ```sql create index CARD..
[Kotlin] java의 static final 변수에 대응되는 것은?
[Kotlin] java의 static final 변수에 대응되는 것은?
2021.02.11```kt class KakaoAuthHelper { companion object { const val REDIRECT_URI = "http://webpage-observer" val AUTHZ_CODE_URL = "https://kauth.kakao.com/oauth/authorize?client_id=${KakaoConfig.app_rest_api_key}&redirect_uri=${REDIRECT_URI}&response_type=code" } } ``` AUTHZ_CODE_URL은 변수가 들어가야 해서 const를 안붙였지만... Byte Code -> Java Decompile 해보면 ```java public static final String REDIRECT_URI = "http://web..
SonarQube
SonarQube
2020.12.08Pull Request decoration 기능? PR 시 changes만 가져와서 sonarqube 돌리고 이를 PR 댓글로 리포팅해주는 기능. SonarQube v7.2부터는 유료(Developer Edition)로 바뀜. 7.1 까진 무료 버전에서도 플러그인 형태로 제공. https://docs.sonarqube.org/display/PLUG/GitHub+Plugin https://github.com/SonarSource/sonar-github 7.1 무료버전에서 플러그인으로 설정하는 경우, PR에 대한 리포트는 SonarQube 서버에 저장되지 않는다. SonarQube 서버 report 저장 기능? 유료(Developer Edition)이 아니면, 어떤 브랜치에 대고 돌린 분석이든 모두 mast..
NGINX
NGINX
2020.12.04Reverse Proxy 실 운영 환경에서는 80, 443 빼고는 inbound를 막아두는 경우가 많아서 iptables 써서 80 -> xxxx로 포워딩하거나, nginx써서 80 -> xxxx로 포워딩한다. 후자를 더 많이 사용하는데 그 이유는 nginx를 쓰면 설정이 좀 귀찮기는 하지만, 한 장비에 여러 인스턴스를 띄우고 이들을 domain(혹은 location)으로 구분하므로 모두 80으로 받을 수 있다. jenkins나 sonarqube 등 설정 파일에서 home location (e.g., /jenkins)을 설정할 수 있도록 지원하는 것이 이 것 때문. 어차피 server IP가 변경될 상황을 대비해서 도메인을 쓰긴 써야하니 그럴 바에 nginx로 리버스 프록시하는게 낫다. IP로 hook ..