{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":754393352,"defaultBranch":"develop","name":"MoGakGo-BE","ownerLogin":"Open-Eye-Im-Developer","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2024-02-08T00:25:30.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/158427400?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1718028954.0","currentOid":""},"activityList":{"items":[{"before":"572be3ec01c13891715d5e7391afd69af61986bb","after":"42d3d5753d367a8b410ba2f1e2012a34b2b742ed","ref":"refs/heads/develop","pushedAt":"2024-07-17T11:57:12.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"Update README.md","shortMessageHtmlLink":"Update README.md"}},{"before":"2c00ba4325e3ba33285dc326121dc1ae8a8f1c3a","after":"572be3ec01c13891715d5e7391afd69af61986bb","ref":"refs/heads/develop","pushedAt":"2024-07-17T11:40:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"Feat/#378 event driven architecture (#379)\n\n* [FEAT] 재시도 메커니즘 및 재시도, DLT를 이용한 에러 핸들링 로직 설정\r\n\r\n* [FEAT] 이벤트 발행을 위한 '이력 및 달성 처리' '달성 알림' 관련 엔티티 구현\r\n\r\n* [FEAT] Transactional Outbox Pattern 적용을 위한 Outbox 엔티티 및 레포지토리 구현\r\n\r\n* [FEAT] Outbox 엔티티 관련 Enum 클래스 구현\r\n\r\n* [FEAT] Outbox 엔티티 관련 유효성 검사 및 도메인 로직 구현\r\n\r\n* [FEAT] Outbox 엔티티 관련 400 에러 코드 추가\r\n\r\n* [FEAT] Outbox 엔티티 관련 커스텀 예외 클래스 구현\r\n\r\n* [FEAT] 'Achievement' 토픽 컨슈머의 '이력 및 업적 달성 처리' 관련 로직 구현\r\n\r\n* [REFACT] 메서드명을 직관적으로 변경\r\n\r\n* [FEAT] Transactional Outbox Pattern을 적용한 '이력 및 업적 처리' 관련 이벤트 핸들러 구현, Producer를 이용한 메시지 발행, 이벤트 발행 기록 로직 구현\r\n\r\n* [FEAT] 프로젝트 생성 관련 업적 처리를 위한 이벤트 헬퍼 클래스 리팩토링, Transactional Outbox Pattern 구현을 위한 이벤트 저장 로직 구현, 이벤트 발행 로직 구현\r\n\r\n* [FEAT] 중복되는 @Transactional 제거\r\n\r\n* [FEAT] 업적 관련 헬퍼 클래스에 Transactional Outbox Pattern 적용 및 이력, 업적 처리를 위한 이벤트 발행 로직 리팩토링\r\n\r\n* [FEAT] 업적 이력 처리 리스너 대체로 인해 제거\r\n\r\n* [FEAT] 업적 달성 처리 리스너 대체로 인해 제거\r\n\r\n* [FEAT] Transactional Outbox Pattern을 적용한 '달성 알림 처리' 관련 이벤트 핸들러 구현, Producer를 이용한 메시지 발행, 이벤트 발행 정보를 기록하는 로직 구현\r\n\r\n* [FEAT] generatekey() 파라미터를 GeneralEvent 타입으로 변경\r\n\r\n* [FEAT] 달성 알림 처리 핸들러 대체로 인해 기존의 리스너 제거\r\n\r\n* [FEAT] 이벤트 발행 및 처리를 위한 새로운 이벤트 엔티티 대체로 인해 기존의 이벤트 엔티티 제거\r\n\r\n* [FEAT] 이벤트 발행 요청 정보를 찾는 메서드 로직 수정\r\n\r\n* [FEAT] 중복 로직 메서드로 분리, Event 타입을 Generic으로 변경\r\n\r\n* [FEAT] OutboxEvent 엔티티 관련 404 에러 코드 추가\r\n\r\n* [FEAT] Event 타입에 이벤트 구분을 위한 EventType 추가, Kafka의 Consumer가 메시지 소비를 위해 사용할 CustomDeserializer 구현\r\n\r\n* [FEAT] Kafka의 메시지 타입을 Generic 타입 Event로 변경, Kafka의 Consumer가 메시지 소비를 하기 위한 Event 타입 CustomDeserializer 설정 추가 및 변경\r\n\r\n* [FEAT] jackson을 이용한 역직렬화에 필요한 @NoArgsConstructor 추가\r\n\r\n* [FEAT] 발행 및 수신 실패한 이벤트에 대해 재발행을 위한 정보를 저장하기 위한 필드 추가\r\n\r\n* [FEAT] 이벤트 발행이 실패에도 이벤트 발행 기록을 남기기 위해 로직 리팩토링, 이벤트 발행 로직과 트랜잭션 분리, 이벤트 발행 기록 저장 로직 수정\r\n\r\n* [FEAT] 발행한 이벤트를 찾기 위한 키 생성 로직 수정, 트랜잭션 분리로 인해 주체가 커밋된 후 이벤트를 수신하도록 phase 변경\r\n\r\n* [FEAT] port conflict로 인한 포트 변경, REPLICATION_FACTOR 1로 수정\r\n\r\n* [FEAT] 이벤트 발행 비동기 로직 완료 후에 자동으로 호출되는 성공 콜백으로 이벤트 요청 업데이트 로직 이동, 발행한 이벤트에 대해 별도의 스레드에서 처리하도록 @Async 추가\r\n\r\n* [FEAT] ProducerConfig에 ACK 설정 추가\r\n\r\n* [FEAT] 발행한 이벤트 상태 변경 로직 이동\r\n\r\n* [FEAT] 업적 달성 및 달성 알림 토픽을 구독하고 있는 컨슈머의 메시지 소비 로직 구현, 업적 달성 처리가 끝난 후 연쇄 이벤트 발행 로직 구현\r\n\r\n* [FEAT] 불필요한 필드 제거\r\n\r\n* [FEAT] 달성 알림에 대한 이벤트를 처리하는 헬퍼 클래스 구현\r\n\r\n* [FEAT] 발행한 이벤트 수신 및 카프카로 메시지 발행 로직을 별도 스레드 처리로 변경, @Async\r\n\r\n* [FEAT] Kafka ConsumerConfig 구성, DefaultErrorHandler를 이용한 에러 핸들링 구현, 역직렬화 메커니즘 설정\r\n\r\n* [FEAT] TODO 주석 추가\r\n\r\n* [FEAT] KafkaConsumer 관련 상수 인터페이스 추가\r\n\r\n* [FEAT] 단일 Consumer 컴포넌트를 토픽별 컴포넌트로 분리\r\n\r\n* [FEAT] 메시지의 Exactly-Once 보장을 위한 속성 추가\r\n\r\n* [FEAT] 메시지 엔티티에 식별자 추가\r\n\r\n* [FEAT] 메시지 발행에 대해 @Transactional 추가\r\n\r\n* [FEAT] 메시지 중복 처리를 위한 메커니즘 구현, RDBMS를 이용한 메시지 중복 검사, Redis를 이용한 캐싱 구현\r\n\r\n* [FEAT] 메시지 중복 처리 로직 추가\r\n\r\n* [FEAT] UUID 타입 식별자를 Event 엔티티에 추가, 불필요한 id 타입 제거, 역직렬화 메서드 타입 수정, 메시지 중복 처리 검사 메커니즘 수정\r\n\r\n* [FEAT] 재시도 및 Exactly-Once-Delivery를 위한 속성 추가\r\n\r\n* [FEAT] 메시지 중복 처리 검사 메커니즘 추가, 트랜잭션 설정 변경,\r\n\r\n* [FEAT] 캐싱을 위한 식별자 수정 및 중복 검사 로직 수정\r\n\r\n* [FEAT] REPLICATION_FACTOR, MIN_ISR 속성 1로 변경 (추후 수정)\r\n\r\n* [FEAT] 트랜잭션 추가\r\n\r\n* [FEAT] Redis Config 추가\r\n\r\n* [FEAT] 메시지 발행 시에 디비 작업에 대한 병목현상을 줄이기 위해 ThreadPoolTaskExecutor 사용, RejectExecutionHandler 정책을 'callerRunPolicy'로 설정\r\n\r\n* [FEAT] Executor 타입을 ThreadPoolTaskExecutor 타입으로 변경, RejectedExecutionHandler 설정\r\n\r\n* [FEAT] 존재하지 않은 업적 타입에 대한 예외코드 추가\r\n\r\n* [FEAT] 재발행된 메시지에 대한 중복 처리를 위한 식별자 eventId 추가\r\n\r\n* [FEAT] TODO 주석 제거\r\n\r\n* [FEAT] 이벤트 발행을 완료하기 전에, 이미 처리된 적이 있는지 중복 체크를 위한 QueryDSL 로직 구현\r\n\r\n* [FEAT] 이벤트 수신 로직을 별도 트랜잭션으로 분리\r\n\r\n* [FEAT] 이벤트 발행 및 수신 실패한 작업에 대한 Message Relay 로직 구현\r\n\r\n* [FEAT] EventStatus, EventType을 이용한 이벤트 발행 기록 조회 로직 구현\r\n\r\n* [FEAT] key 생성 로직 수정\r\n\r\n* [FEAT] 이벤트 발행 기록 조회 로직 수정, 해결한 TODO 제거, 주석 추가\r\n\r\n* [FEAT] Cache Aside 전략 적용을 위한 로컬 캐시, 글로벌 캐시 구현, 로컬 캐시, 글로컬 캐시 순으로 조회하도록 로직 수정, 조회수에 기반한 TTL 증가 로직 구현, 디비에서 데이터를 미리 캐싱하는 CacheWarning 로직 구현,\r\n\r\n* [FEAT] Redis 속성 추가, 불필요한 필드 제거\r\n\r\n* [FEAT] 카프카 메시지 중복 방지를 위한 로직에서 캐싱 전략 제거\r\n\r\n* [FEAT] 메일 전송을 위한 의존성 및 Config 클래스 구현\r\n\r\n* [FIX] MailConfig properties 수정\r\n\r\n* [FIX] 컨슈머가 메시지 소비에 실패해 DLT로 Publishe되면서 관리자에게 메일을 전송하는 핸들러 구현\r\n\r\n* [FEAT] 메일 전송을 위한 의존성 수정, 트랜잭션 빈 이름 추가, DLT 이동 시, 관리자에게 메일 전송하는 로직 추가\r\n\r\n* [FEAT] JpaTxManager, KafkaTxManager @Bean으로 등록\r\n\r\n* [FEAT] 이벤트 핸들러, 발행된 이벤트 상태 업데이트 작업을 위한 ThreadPoolTaskExecutor 설정, @Async 속성 변경\r\n\r\n* [FEAT] @Transactional propagation 속성 변경, 로그 추가\r\n\r\n* [FEAT] 실패한 이벤트를 재발행하는 스케줄러 Cron식 변경, 불필요한 스케줄러 제거\r\n\r\n* [FIX] group-id명 수정\r\n\r\n* [FEAT] 불필요한 코드 주석 처리, import문 제거\r\n\r\n* [TEST] 카프카 기능 테스트 주석 처리, 새롭게 재구성할 예정\r\n\r\n* [FEAT] transactionManager 빈 충돌 해결, noti 컨슈머에서 레코드를 리스트로 처리할 수 있도록 수정\r\n\r\n* [FEAT] CI에 SSH에 접속해 카프카 서버 실행 추가\r\n\r\n* [FEAT] CI username 변경","shortMessageHtmlLink":"Feat/#378 event driven architecture (#379)"}},{"before":"89d0a41528573decbdce509dd8a8105e425f8e48","after":"d25971dcd9476ce3dd06948f698b0922bf4b3b9d","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-07-10T12:32:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] CI username 변경","shortMessageHtmlLink":"[FEAT] CI username 변경"}},{"before":"fc841a7d4fe61c3167704291bb153234b406ce41","after":"89d0a41528573decbdce509dd8a8105e425f8e48","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-07-10T12:24:02.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] CI에 SSH에 접속해 카프카 서버 실행 추가","shortMessageHtmlLink":"[FEAT] CI에 SSH에 접속해 카프카 서버 실행 추가"}},{"before":"220a186d5363d9bef135666c7af5d216e981d3bf","after":"fc841a7d4fe61c3167704291bb153234b406ce41","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-07-10T11:52:13.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] transactionManager 빈 충돌 해결, noti 컨슈머에서 레코드를 리스트로 처리할 수 있도록 수정","shortMessageHtmlLink":"[FEAT] transactionManager 빈 충돌 해결, noti 컨슈머에서 레코드를 리스트로 처리할 수 있도록 수정"}},{"before":"14e2b06b090f77c3d7f3a1bec710d331eb094be8","after":"220a186d5363d9bef135666c7af5d216e981d3bf","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-07-08T12:08:13.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[TEST] 카프카 기능 테스트 주석 처리, 새롭게 재구성할 예정","shortMessageHtmlLink":"[TEST] 카프카 기능 테스트 주석 처리, 새롭게 재구성할 예정"}},{"before":"2b933610d37fd1169b52a18e9b3a42eb30a41820","after":"14e2b06b090f77c3d7f3a1bec710d331eb094be8","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-07-08T12:04:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 불필요한 코드 주석 처리, import문 제거","shortMessageHtmlLink":"[FEAT] 불필요한 코드 주석 처리, import문 제거"}},{"before":"d1a7f3f3417ebed8870ac7ecd607964df5ebf5a1","after":"2b933610d37fd1169b52a18e9b3a42eb30a41820","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-07-08T12:00:07.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FIX] group-id명 수정","shortMessageHtmlLink":"[FIX] group-id명 수정"}},{"before":"427adff23f835cbe0bf5974a9983beb2eb7bbf8e","after":"d1a7f3f3417ebed8870ac7ecd607964df5ebf5a1","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-24T15:59:00.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 실패한 이벤트를 재발행하는 스케줄러 Cron식 변경, 불필요한 스케줄러 제거","shortMessageHtmlLink":"[FEAT] 실패한 이벤트를 재발행하는 스케줄러 Cron식 변경, 불필요한 스케줄러 제거"}},{"before":"2f10812685ede55b05f605bfbf0a0a9c9bff19bd","after":"427adff23f835cbe0bf5974a9983beb2eb7bbf8e","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-24T15:52:46.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] @Transactional propagation 속성 변경, 로그 추가","shortMessageHtmlLink":"[FEAT] @transactional propagation 속성 변경, 로그 추가"}},{"before":"4e6e70d85d3606cb02f9b2414667a015922138ed","after":"2f10812685ede55b05f605bfbf0a0a9c9bff19bd","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-24T15:28:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 이벤트 핸들러, 발행된 이벤트 상태 업데이트 작업을 위한 ThreadPoolTaskExecutor 설정, @Async 속성 변경","shortMessageHtmlLink":"[FEAT] 이벤트 핸들러, 발행된 이벤트 상태 업데이트 작업을 위한 ThreadPoolTaskExecutor 설정, @async"}},{"before":"8bea07d3ada2d85b9f4ebab5053ac914da105811","after":"2c00ba4325e3ba33285dc326121dc1ae8a8f1c3a","ref":"refs/heads/develop","pushedAt":"2024-06-24T13:05:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"Update README.md","shortMessageHtmlLink":"Update README.md"}},{"before":"53fbfa83ece06fc441c3c995622c8b448896a7ba","after":"4e6e70d85d3606cb02f9b2414667a015922138ed","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-24T11:10:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] JpaTxManager, KafkaTxManager @Bean으로 등록","shortMessageHtmlLink":"[FEAT] JpaTxManager, KafkaTxManager @bean으로 등록"}},{"before":"7532f0b4d413ac099e112e03f16e139bb183bb88","after":"53fbfa83ece06fc441c3c995622c8b448896a7ba","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-23T17:10:52.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 메일 전송을 위한 의존성 수정, 트랜잭션 빈 이름 추가, DLT 이동 시, 관리자에게 메일 전송하는 로직 추가","shortMessageHtmlLink":"[FEAT] 메일 전송을 위한 의존성 수정, 트랜잭션 빈 이름 추가, DLT 이동 시, 관리자에게 메일 전송하는 로직 추가"}},{"before":"90593d6300c72c594637bfbddf159bc4deb4a8b2","after":"7532f0b4d413ac099e112e03f16e139bb183bb88","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-23T17:07:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FIX] 컨슈머가 메시지 소비에 실패해 DLT로 Publishe되면서 관리자에게 메일을 전송하는 핸들러 구현","shortMessageHtmlLink":"[FIX] 컨슈머가 메시지 소비에 실패해 DLT로 Publishe되면서 관리자에게 메일을 전송하는 핸들러 구현"}},{"before":"8dc20b79a6bf946715448cf754071ca37059902f","after":"90593d6300c72c594637bfbddf159bc4deb4a8b2","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-23T14:29:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FIX] MailConfig properties 수정","shortMessageHtmlLink":"[FIX] MailConfig properties 수정"}},{"before":"6117bbe55a0c3155ca623355ef6ba8b4faeae1c9","after":"8dc20b79a6bf946715448cf754071ca37059902f","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-23T05:52:57.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 메일 전송을 위한 의존성 및 Config 클래스 구현","shortMessageHtmlLink":"[FEAT] 메일 전송을 위한 의존성 및 Config 클래스 구현"}},{"before":"8355339c8094dbd79649778eda761461ef6638cd","after":"6117bbe55a0c3155ca623355ef6ba8b4faeae1c9","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-22T09:43:05.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 카프카 메시지 중복 방지를 위한 로직에서 캐싱 전략 제거","shortMessageHtmlLink":"[FEAT] 카프카 메시지 중복 방지를 위한 로직에서 캐싱 전략 제거"}},{"before":"53c291db51f38596356e471a3f0afa7d9c2bfcc1","after":"8355339c8094dbd79649778eda761461ef6638cd","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-21T19:04:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] Redis 속성 추가, 불필요한 필드 제거","shortMessageHtmlLink":"[FEAT] Redis 속성 추가, 불필요한 필드 제거"}},{"before":"f834d60ef0dae308612cc5249bfe8f2de1a6f3e3","after":"53c291db51f38596356e471a3f0afa7d9c2bfcc1","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-21T19:01:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] Cache Aside 전략 적용을 위한 로컬 캐시, 글로벌 캐시 구현, 로컬 캐시, 글로컬 캐시 순으로 조회하도록 로직 수정, 조회수에 기반한 TTL 증가 로직 구현, 디비에서 데이터를 미리 캐싱하는 CacheWarning 로직 구현,","shortMessageHtmlLink":"[FEAT] Cache Aside 전략 적용을 위한 로컬 캐시, 글로벌 캐시 구현, 로컬 캐시, 글로컬 캐시 순으로 조회하도…"}},{"before":"09e7a206c3fef46ace8274c99d288b755a35cf2c","after":"f834d60ef0dae308612cc5249bfe8f2de1a6f3e3","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T18:29:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 이벤트 발행 기록 조회 로직 수정, 해결한 TODO 제거, 주석 추가","shortMessageHtmlLink":"[FEAT] 이벤트 발행 기록 조회 로직 수정, 해결한 TODO 제거, 주석 추가"}},{"before":"2bca563d7ad29a932a0df046378d75699642932f","after":"09e7a206c3fef46ace8274c99d288b755a35cf2c","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T17:58:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] key 생성 로직 수정","shortMessageHtmlLink":"[FEAT] key 생성 로직 수정"}},{"before":"cb8323e1a8465ae0815b2f3a077d11eaed7ea0ff","after":"2bca563d7ad29a932a0df046378d75699642932f","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T17:50:34.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] EventStatus, EventType을 이용한 이벤트 발행 기록 조회 로직 구현","shortMessageHtmlLink":"[FEAT] EventStatus, EventType을 이용한 이벤트 발행 기록 조회 로직 구현"}},{"before":"4536d1f4f04843badae5d3f61f046f9698c4ca50","after":"cb8323e1a8465ae0815b2f3a077d11eaed7ea0ff","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T17:48:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 이벤트 발행 및 수신 실패한 작업에 대한 Message Relay 로직 구현","shortMessageHtmlLink":"[FEAT] 이벤트 발행 및 수신 실패한 작업에 대한 Message Relay 로직 구현"}},{"before":"e35f1867fdb8c4ed656eab4be66029c16fbaac62","after":"4536d1f4f04843badae5d3f61f046f9698c4ca50","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T15:09:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 이벤트 수신 로직을 별도 트랜잭션으로 분리","shortMessageHtmlLink":"[FEAT] 이벤트 수신 로직을 별도 트랜잭션으로 분리"}},{"before":"3b892c8f4f3374a1bb70b802cc437a3569baebd7","after":"e35f1867fdb8c4ed656eab4be66029c16fbaac62","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T13:10:47.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 이벤트 발행을 완료하기 전에, 이미 처리된 적이 있는지 중복 체크를 위한 QueryDSL 로직 구현","shortMessageHtmlLink":"[FEAT] 이벤트 발행을 완료하기 전에, 이미 처리된 적이 있는지 중복 체크를 위한 QueryDSL 로직 구현"}},{"before":"1a6e906231282c71075a2fc02aa883aa4cf59619","after":"3b892c8f4f3374a1bb70b802cc437a3569baebd7","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T12:42:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] TODO 주석 제거","shortMessageHtmlLink":"[FEAT] TODO 주석 제거"}},{"before":"a7e76d64eb791468a7b7904ba1f4a2092ec5b126","after":"1a6e906231282c71075a2fc02aa883aa4cf59619","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T12:40:43.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 재발행된 메시지에 대한 중복 처리를 위한 식별자 eventId 추가","shortMessageHtmlLink":"[FEAT] 재발행된 메시지에 대한 중복 처리를 위한 식별자 eventId 추가"}},{"before":"e55e93a317fa316f705267ca88ee1deaf0953102","after":"a7e76d64eb791468a7b7904ba1f4a2092ec5b126","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T12:18:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] 존재하지 않은 업적 타입에 대한 예외코드 추가","shortMessageHtmlLink":"[FEAT] 존재하지 않은 업적 타입에 대한 예외코드 추가"}},{"before":"11ef39673ad5754faed2483488784e1db3c5545e","after":"e55e93a317fa316f705267ca88ee1deaf0953102","ref":"refs/heads/feat/#378-event_driven_architecture","pushedAt":"2024-06-20T10:54:56.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"JIN-076","name":null,"path":"/JIN-076","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/57834671?s=80&v=4"},"commit":{"message":"[FEAT] Executor 타입을 ThreadPoolTaskExecutor 타입으로 변경, RejectedExecutionHandler 설정","shortMessageHtmlLink":"[FEAT] Executor 타입을 ThreadPoolTaskExecutor 타입으로 변경, RejectedExecution…"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0xN1QxMTo1NzoxMi4wMDAwMDBazwAAAASByG0a","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0xN1QxMTo1NzoxMi4wMDAwMDBazwAAAASByG0a","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNi0yMFQxMDo1NDo1Ni4wMDAwMDBazwAAAARqczUi"}},"title":"Activity · Open-Eye-Im-Developer/MoGakGo-BE"}