본문 바로가기

개발 관련됨/개발 이슈를 해결함8

Java 에 Enum Circular Dependency 이라는 말을 들어봤나요? 문제 어느 날과 다르지 않는 기능 개발 중에 이상한 상황을 마주쳤습니다. 코드부터 살펴보겠습니다. enum DisplayType { DISPLAY_1("1", ServiceType.SERVICE_A), DISPLAY_2("2", ServiceType.SERVICE_A), DISPLAY_3("3", ServiceType.SERVICE_B), DISPLAY_4("4", ServiceType.SERVICE_B); private final String name; private final ServiceType serviceType; DisplayType(String name, ServiceType serviceType) { this.name = name; this.serviceType = serviceType; .. 2023. 12. 16.
Java Regex 정규표현식 사용시 java.lang.StackOverflowError 가 발생하는걸까 자바에서 정규표현식을 활용하다보면, BuiltIn 클래스인 Pattern 과 Matcher 이 두 가지를 사용하는 경우가 많다. Pattern 과 Matcher 을 사용할 때 주의해야될 점이 있다. 바로 재귀로 인해 무한한 루프에 빠질 수 있다는 것이다. 이로인해 위에서 말하 StackOverflowError 가 발생한다. public class RegexTest { public static void main(String[] args) { // 재귀적으로 일치하는 패턴 Pattern pattern = Pattern.compile("(a|b)*c"); Matcher matcher = pattern.matcher("aaa" + "aaa"); System.out.println(matcher.matches()).. 2023. 2. 25.
비관적 잠금, 낙관적 잠금 그런 동시성 이슈 해결하기 우리가 개발하는 프로덕트에 동시성 이슈는 어떤 것이 있을까? 사실은 그다지 많지 않을 수 있을 것 같다. 특히, 트래픽은 적은 회사에서는 더욱 그러지 않을까 싶다. 그래서 언제든 맞닥뜨리더라도 당황하지 않았으면 좋겠다. 먼저 동시성 이슈가 무엇인지부터 살펴보자. 하나의 Table Row 을 Client 1과 Client 2가 서로 업데이트를 하려고 하다보니, 동시성 이슈가 발생한다. 좀 더 구체적으로 어떤 상황에서 동시성 이슈가 발생하는가? 참고 할 만한 예시 테스트 코드는 다음과 같다. https://github.com/take-small-steps/understanding-concurrency-Issue/blob/9eea5414c1a35ec09484f2281e51e1b18380dd93/src/test.. 2023. 1. 11.
ConnectionAcquireTimeoutError [SequelizeConnectionAcquireTimeoutError] 문제 해결하기 운영중에 Node.js 모듈이 간혈적으로 갑자기 기능이 동작되지 않는 이슈가 있었습니다. 가장 처음에는 트랜잭션 자체가 동작되지 않아, 로그를 살펴보니 위와같은 내용이 있었습니다. 이게 왜 발생했을까요? Node.js 에서 ConnectionAcquireTimeoutError 이 발생했는데, 이유를 알 수 없었습니다. 에러 메세지에 대한 원인을 찾아보니, Transaction 이 ConnectionPool 을 물고 있고, graphql에서 새롭게 만들 트랜잭션이 없어서 발생한 문제점이라는 사실을 알았습니다. 최근에 const transaction = await sequelize.transaction(); 관련된 작업이 있었고, 그곳에서 transaction 이 정상적으로 종료되지 않았음을 알 수 눈치챌 .. 2022. 9. 11.
Message Relay 를 PollingPublisher 방식으로 구현하기 이벤트 소싱을 하기 위해서는 트랜잭션 아웃박스 패턴을 구현해야 합니다. 당연히 트랜잭션 아웃박스 패턴에 대한 이해가 있어야 합니다. 다만, 해당 포스트에서는 자세한 트랜잭션 아웃박스 패턴을 다루지 않을 계획입니다. 다시 트랜잭션 아웃박스 패턴를 표현하는 위 그림에서 네모난 부분이 바로 메세지릴레이를 수행하는 곳입니다. 데이터베이스에 특정 데이터가 Insert 되면, 변경분에 대해서 MessageRelay 는 특정 데이터를 읽어 Message Broker 에게 전달한다. 이 때 MessageRelay 의 구현방식은 2가지가 있습니다. 1. Polling publisher 2. Transaction log tailing 1. Polling publisher 는 일정 주기마다 변경분을 조회해서 메세지를 전달하.. 2022. 6. 19.
정규표현식에서 알지 못했던 capture group 과 non- capture group val groupMD = """((?:\+|\+-)?[.\d]+)([*/])((?:\+|\+-)?[.\d]+)""".toRegex() fun foldGroup(v: String): Double = groupMD.findAll(v).fold(0.0) { acc, curr -> val (_, left, op, right) = curr.groupValues val leftValue = left.replace("+", "").toDouble() val rightValue = right.replace("+", "").toDouble() val result = when (op) { "*" -> leftValue * rightValue "/" -> leftValue / rightValue else -> throw T.. 2022. 6. 6.
Springboot 에서 react.js 연동시 모든 view 맵핑을 index.html으로 forwarding 하는 방법은? [문제] SpringBoot 에서 thymeleaf 대신, React.js 를 ViewTemplate 로 사용하려 한다. 기존의 thymeleaf 는 html 별로 View을 맵핑하고 있었기 때문에, 하나의 html 에서 URL에 따른 여러 화면으로 라우팅되는 SPA Application 에서는 ViewName 맵핑이 정상적으로 동작되지 않는다. ( 참고자료 ) 예를 들어, product/list 라는 View 이름으로 맵핑을 시도한다고 가정해본다면, 프로젝트에서는 /WEB-INF/templates/product/list.html 와 같은 형태로 ViewTemplate 을 맵핑하기 위한 html 이 존재해야 합니다.(꼭, html 일 필요는 없음) 그러므로, 하나의 html 에서 원하는 URL로 라우팅시.. 2022. 4. 26.
Postgresql 에서 epoch time 을 읽을 수 있는 timestamp 변환하는 방법은? 우리가 다루는 시간 중에는 epochtime 이라는게 존재합니다. // epochtime 1970년 1월 1일 00:00:00 UTC 부터 지금까지의 경과 시간을 초로 환산하여 정수로 나타낸 것을 말한다. DB 를 다루다보면, Application 에서 DB 에 데이터를 삽입할 때, application의 date 타입을 Timestamp 로 변환해서 넣는 것이 문제가 되는 경우가 더러 있습니다. 한번만 사용되어지는 DB 라면 더욱더 해당되는데, 종종 ViewTable을 만들기 위한 용도로 만들 경우 약간의 트릭으로 Timestamp 에 넣어야 할 값을 Bigint 타입으로 CREATE Table 한 뒤, 어플리케이션에서 epochtime 으로 값을 삽입합니다. 아래 epochtime 으로 값을 넣을 경.. 2022. 4. 26.