본문 바로가기

All

(8)
[아이디어] 복잡한 로직은 GraalVM JavaScript엔진을.. 전기요금을 계산하는 프로그램을 개발해야 했다. 전기요금 계산이 이거 이래도 되나 할정도로 복잡하고, 지역, 계절, 년도등의 변수가 많고, 계산 또한 변수가 너무 많았다.이런경우 이런 계산 로직을 코드로 작성을 하는것보다, 변수에 빠르게 적응을 하기 위해서,다이나믹한 기법을 사용하는게 더 좋을것 같다는 생각을 했다.rule엔진을 사용하는게 좋아보이지만 (drools등), 단순 계산을 위해 rule엔진을 사용하는건 오버엔지니어링이라고 판단을 했다.그리고, rule엔진이 사실, 사용하는게 상당히 번잡하고 복잡하다...먼가 간단하면서, 다이나믹하게 계산식을 적용하고, 반영되게 하는 방법을 원했다. 고민중에 예전에 mocksal이라고 개인 mocking 서비스를 만들때 (https://tech.super100.a..
[아이디어] Switch문 최대한 안쓰기 스프링에서 타입에 따라 다른 행위나 결과값을 리턴해야할 경우, Switch (코틀린은 When)를 사용하여 코딩을 한다... 아래와 같은 코드가 있다고 해볼까?@Serviceclass TestService {fun printCardType(cardType:CardType) { when (cardType) { CardType.A -> println("A") CardType.B -> println("B") else -> println("UNKNOWN") } }}타입이 추가되면, 해당 TestService의 printCardType함수안에 when에 케이스 조건을 지속적으로 추가를 해줘야한다.잊어버리고 추가를 하지않는 경..
[아이디어] 스크래핑으로 플로우 간단히 만들기 외부 페이지 연동이 많은 서비스들은 상당 플로우가 복잡하기에, 사용자 이탈이 심하다. 가입 한번해서 앱한번 사용하려면, 어디 페이지 로그인해서 동의하고, 어디 사이트 웹페이지 열어서 선택해야하고 등등... 외부 연동 페이지에 종속적인 서비스들은 사용자의 이탈이 상당히 심하다. 그렇다고, 서비스를 접을수도 없으니 고민이 많을것이다. 이런 경우, 쉽게 풀수있는 방법은 해당 외부 연동 서비스에서 oauth등을 지원하여, server to server로 연동을 하는 방법이다.하지만, 쉽게 oauth기능을 제공하지 못하는 곳도 많이 있기때문에, 다른 방법이 대안이 될수도 있을것같다. 그 대안중에 하나가 '스크래핑' 기술을 이용하는 방법이다.사실 단점이 명확하고 심지어 위험하기까지도 하지만, 그 사용함에 있어서의 ..
[아이디어] 대기열 기능 만들기에 대해서 사용자가 갑자기 몰리는 기능, 특히 해당 기능이 무거운 경우 (외부 API연결, 스크래핑, 무거운 쿼리) 사용자의 기능 접근을 의도적으로 일정수준으로 제한을 해야하는 경우가 발생한다. 이런경우, 대기열 기능으로 해당 문제는 해결할수있다. 대기열이란, RateLimiter를 구현하는것이라고 보면 될듯하다.세마포어를 이용해서, 내가 기능에 접근할 최대 횟수를 정하고, 항상 그 횟수안에서 기능의 접근을 허용하고 거부하도록 만드는 구현이다.(가게에 화장실이 x개있고, 사람들이 줄을 서서 화장실에 접근하는 개념 ㅋ) 가장 일반적인 방법은 Redis의 Zset을 활용하는 방법이 있다.이 부분은 AI에이전트들에 물어보면 상세하게 알려줄것이라, 구현의 어려움은 없겠지만, 우리는 어떻게 운용을 해야하는가를 고민해야한다...
[아이디어] 대용량 앱푸시 예약발송 기능 어떻게 만들까? 앱 푸시 메세지 발송 기능을 만들어야 한다면, 그리고 예약시간에 정확히 발송해야 한다면? 어떻게 설계를 해야할까? 물론 내가 말하는 모든 가설은 대용량/대량 트래픽을 기본으로 하고있다. 따라서 좀더 고민을 해야하는 포인트들이 많다.우선은, 기본적인 것은 카프카 큐를 이용해, 발송대상 이벤트를 받고 해당 이벤트를 컨슘하며, 푸시를 보내는 설계는 기본일듯하다. 여기서 가장 큰 문제는 바로 예약 발송을 어떻게 구현을 할까이다..이 부분이 상당히 어렵기도하고 까다롭기도 하다. 예약 발송 구현을 위한 방법은 다양하다. 가장 합리적이고, 괜찮은 방법을 몇개 생각해 봤다. 1) 레디스의 ZSET을 이용하는 방법이다.레디스의 ZSET는 SORTED SET으로 키값을 정렬하여 리스트로 가지고있다. 이 키값을 범위조회로 ..
[아이디어] AI끼리 싸움을 붙이면.. 가끔씩 생각한적이 있다, AI끼리 썰전을 펼치고, 그걸 지켜보면 얼마나 잼있을까??내말이 맞네, 네말이 맞네 하며 인간처럼 치고박고 하는 것을 지켜보는 관음증 환자가 되면 얼마나 짜릿한 느낌일까!!! AI모델은 각각 특색이 있다. 어떤분야에 더 집중하여 학습을 시켰는지에 따라서, 모델별로 더 답변을 잘 주는 부분이 미세하게 존재한다.그렇기 때문에, AI모델 하나만 선택해서 사용하는것보다는 여러 AI모델들을 늘어놓고, 질문을 모든 AI모델에게 하는 방법이 더 좋은 정보를 얻을수있지 않을까? 생각한적이 있다. 이런 방식에 가장 적합하다고 생각한 아이디어가, AI들끼리 구성된 개발팀을 만들면 어떨까? 라는 생각이다. 그래서 바로 만들어 봤다.서비스 이름은 'My Dev Team' !!! AI모델별로 '친절하고..
[아이디어] 코틀린의 Delegate를 이용한 ReadableMap 구현에 대해서 가끔 Api의 RequestBody로 Map객체를 받아야할 필요가 있다. Api의 RequestBody의 필드값들이 가변적이거나, 요청에 따라 바뀌는경우등의 케이스에 유연하게 대응하기위해서,Map객체를 받게 구현을 할때가 있다. 이경우는 사실 코드상에서의 유려한 흐름으로 읽히는 코드는 포기해야한다.Map req 이런 객체에서 req.get("name"), req.get("age")등으로 꺼내써야 하고,값이 Any 타입으로 선언되어있기 때문에, 캐스팅도 해야하는 코드가 덕지덕지 붙게 됨에 따라,깔끔하지 못하고,개발자가 class로 구성된 DTO와 달리 필드를 바로 확인할수가 없고,문서나 주석등에 의존하거나 코드 전체를 훝어야 한다.... 이런 문제를 문득,코틀린의 Delegate를 사용하여, Map을 개발..
[아이디어] Actuator와 RateLimiter의 능동적 동작에 대해서 우리는 요청수를 제한하기위해 RateLimiter을 사용한다. 주로 많이 사용하는 라이브러리로는 Resilience4j인데, 사용법은 결국 초당 몇건(TPS)가 넘으면 요청을 막을래!로 설정을 셋팅하여 사용 한다.해당 max tps를 설정하기위해서는 성능테스트를 거쳐, 값을 측정하고, 예측에 의한 정적인 max tps를 설정하게 된다. 물론 이 정도의 기능도 상당히 프로덕션 서비스에서는 많이 유용하지만, 그 측정값이라는것이 정확하지 못하고, 여러 노드로 이뤄지거나, 환경이 다르거나에 따라 갭이 상당할수도있다. 이런 경우,프로덕션 환경에서는 시스템에 부하를 줄정도로 더 요청을 받거나,또는 시스템을 100% 사용하지 못하는 선에서 요청을 거부하게 RateLimiter가 동작하기도 한다. 이런 부분을 어떻게 ..