본문 바로가기

분류 전체보기154

[Redis] 많은 키를 삭제할 때는 UNLINK Redis의 key를 삭제할 때는 주로 DEL 커맨드를 사용한다. DEL key [key ...] Redis 1.0.0 부터 사용되던 커맨드이고 SET과 더불어 Redis 예제에서 자주 사용되는 예제이기 때문에 Redis를 사용한 서버 애플리케이션 개발 시 DEL 커맨드가 자주 사용된다. DEL 커맨드 외에도 Redis는 4.0.0 버전부터 UNLINK 라는 커맨드가 있는데 DEL과 동일하게 특정 key를 삭제하는 기능을 수행한다. UNLINK 커맨드의 차이점은 여러 key를 삭제할 때 DEL 커맨드의 경우 O(N) (n은 삭제할 key의 수) 의 시간 복잡도를 갖는데에 반해, UNLINK 커맨드는 삭제할 key의 수에 상관없이 O(1)의 시간 복잡도를 갖는다. UNLINK 라는 이름처럼 실제로 key를.. 2023. 2. 12.
[SQS] 메세지 지연 시키기 (+ 15분을 넘어서) SQS 같은 경우 delay queues 라고하는 Consumer에게 메세지 노출을 지연시킬 수 있는 기능을 제공한다. 지연은 최대 15분까지 가능하다. (Visibility Timeout과는 다른 개념이기 때문에 명확하게 차이를 인지해야한다) 이 기능을 사용하면 메세지에 지연을 줄 수 있기 때문에 예약 실행 기능(정해진 시간 뒤에 특정 기능이 실행되어야하는 기능)을 개발할 때 사용될 수 있다. 예를 들어 '회원 가입 후 5분 뒤에 가입 축하 메세지를 보내기' 와 같은 기능이 있을 수 있는데, 회원 가입 도메인 이벤트에 대한 SQS 메세지 or 가입 축하 메세지 전송 SQS 메세지를 5분의 지연을 설정하고 enqueue 하면 5분 뒤에 메세지 핸들러에서 해당 메세지를 consume 하여 대상 유저에게 가.. 2023. 2. 4.
[SQS] Visibility Timeout Consumer가 Queue에서 메세지를 consume 하고 처리를 한 뒤, 해당 메세지를 acknowledge(delete)를 하기 전까지는 메세지는 Queue에 계속 남아있는다. 특정 Consumer가 메세지를 consume 하고 모든 처리가 끝날 때까지 다른 Consumer에서 동일 메세지를 consume하는 것을 막기위해서 SQS에서는 Visibility Timeout을 설정한다. 메세지가 consume 된 뒤에 다른 Consumer에게 다시 보여지기 위한 시간이라고 생각하면 될 것이다. (하지만 이는 메세지가 두 번 전달되는 것을 막기 위함은 아니다) 기본값은 30초이며, 0초~12시간 까지 설정 가능하다. 관련하여 메세지 수의 제한을 확인해야하는데, 제한을 확인하기 전에 짧게 메세지의 상태에 .. 2023. 2. 4.
방법론에 중독된 사회 요즘은 방법론들이 정말 많다. OKR, 애자일, TDD, DDD 같은 프로젝트, 제품 개발 방법론 뿐만 아니라 1일 1커밋, 미라클 모닝 과 같이 생활 속의 방법론들도 말이다. 그리고 그걸 따라하는 사람들도 많다. 대부분 "누가해서" 혹은 결과만을 보고 "이렇게하니까 저렇게 성공하더라"라는 이유로 많이들 따라하였지만, "어떤 사람이나 조직이 왜 그것을 하는지", "그것에서 나는 무엇을 적용할 수 있고 어떤 것을 취해야할지"는 빠져있는 경우가 많았다. 그리고 간혹 어떤 방법론을 따르면서 마치 정해진 답이 있는 것처럼 그 방법론을 자체를 연구하는 경우도 종종 있었다. 그 방법론이 잘 동작하지 않으면 "혹시 내가 방법론을 제대로 이해한게 아닌건가?" 하는 의심도 하면서 말이다. 클린 시리즈로 잘 알려져있는 R.. 2023. 1. 28.
[Spring Data JPA] @OneToMany Entity 연관 관계에 대하여 JPA는 RDBMS의 table 연관 관계를 Java object로 표현되는 DB model로 표현하기 위해 @OneToMany, @ManyToOne, @Embedded 와 같이 entity 간의 연관 관계를 설정하는 여러 기능을 제공한다. 이는 JPA를 사용하면서 POJO로 이뤄진 Entity와 DB model인 JPA Entity를 굳이 분리하지 않아도 표현력 있는 Entity 코드를 작성할 수 있게 해준다. 이번 포스팅에서는 JPA를 사용했을 때 상위 객체가 하위 객체를 포함하고 있음을 표현하기 위해 @OneToMany로 일대다 관계를 만드는 방식에 대한 얘기를 해보겠다. 여기서는 다대일 관계(many-to-one)에 대해서는 다루지 않겠다. 다대일 관계는 query 효율을 위해 사용할 수 있지만,.. 2023. 1. 20.
reified를 통해 generic type 정보 가져오기 generic을 사용하여 코드를 작성할 때, generic type의 정보를 사용하고 싶은 경우가 있을 것이다. 아래 코드는 generic을 사용하여 파라미터의 타입을 확인하는 함수이다. fun isInstanceOf(obj: Any): Boolean { println("check object(${obj::class}) is instance of ${T::class}") return obj is T } 하지만 generic은 compile 후 제거되기 때문에 위 코드와 같이 generic type을 직접적으로 사용하는 코드는 compile error를 낸다. 그래서 주로 아래와 같이 추가로 generic type과 같은 Class 타입의 파라미터를 받는 식으로 우회한다. fun isInstanceOf(o.. 2023. 1. 16.