[Maplendar] WebSocket을 기반으로 한 보스 파티 채팅 구현하기
·
개발/Spring Boot
개요우리가 보스 파티의 시간을 정하기 위해서는 각자 언제 되는지에 대해서 일정을 공유하고 논의를 해야 하는데, 그러기 위해서는 채팅 기능이 있어야 한다.Maplendar에서는 웹소켓을 도입하여 보스 파티 채팅 기능을 구현하였다.채팅 기능은 웹소켓이나 폴링(Polling) 방식으로 구현할 수 있는데, 웹소켓을 선택한 이유는 폴링 방식의 한계 때문에 그렇다. 폴링 방식을 사용하게 되면 1초마다 새로운 메시지가 있는지를 확인하기 위해 DB를 조회해야 한다. 근데 이러한 방식은 Spring Batch와 유사하게 서버 부하가 크고, 결정적으로 실시간성이 떨어진다.또한, Full-Duplex(전이중 통신)의 특성을 갖고 있는 웹소켓을 활용하게 되면, 채팅방에 한 번 연결되면 클라이언트와 서버가 언제든 데이터를 주고..
[BOJ/Gold 4] 백준 35154 ProblemSolving이 아니에요(C++)
·
BOJ/Gold
문제 링크https://www.acmicpc.net/problem/35154 문제지훈이는 PS라는 자료구조를 만들었다. 하지만 PS라는 이름의 특성상 ProblemSolving으로 오해받고는 한다.PS 자료구조는 문자 P를 저장하는 스택(Stack)으로, 다음 두 명령어를 사용한다.PP: 문자 P 하나를 PS 스택 맨 위에 push한다.P: PS 스택 맨 위의 문자 P 하나를 pop한다. 단, PS 스택이 비어 있을 때는 수행할 수 없다.지훈이는 명령어들을 공백 없이 이어 붙이면 P의 나열이 된다는 사실을 알았다. 문득, P가 N개 나열된 문자열이 주어졌을 때 이를 유효한 명령어로 해석하는 방법이 총 몇 가지나 될지 궁금해졌다.처음에 PS 스택이 비어 있을 때, N개의 P로 이루어진 문자열을 유효하게 해..
[Maplendar] Jetpack Compose에서 캐릭터의 얼굴만 보이는 UI를 구현해보기
·
개발/안드로이드
개요보통 메이플스토리의 홈페이지나, 유저분들이 개발하신 사이트 등에서는 캐릭터의 모습을 전신으로 보여주는 경우가 많지만, 일부 경우에는 얼굴만 보여줘야 한다.다행히 메이플스토리에서는 캐릭터의 머리크기가 나처럼 커서 얼굴 부분만 잘라도 내 캐릭터인지 아닌지 확실하게 구분할 수 있다.메XX라는 어떤 커스텀 사이트에서도 캐릭터를 검색할 때 얼굴 부분을 보여줌으로써 UI의 가시성을 확 높일 수 있었다.우리 6반남이 개발하고 있는 Maplendar에서도, 보스 파티를 생성하면서 참여할 캐릭터를 선택할 때 얼굴 부분만 동그랗게 잘라서 보여주는 UI를 구상하였다. Maplendar는 KMP 기반의 애플리케이션이고, 안드로이드 애플리케이션의 UI를 구현하기 위해 Jetpack Compose를 사용한다. 그렇다면 Co..
[BOJ/Gold 4] 백준 35328 Photoshoot(C++)
·
BOJ/Gold
문제 링크https://www.acmicpc.net/problem/35328 문제Farmer John is looking at his cows in a magical field and wants to take pictures of subsets of his cows.The field can be seen as a N × N grid (1 ≤ N ≤ 500), with a single stationary cow at each location. Farmer John's camera is capable of taking a picture of any K × K square that is part of the field (1 ≤ K ≤ min(N, 25)).At all times, each cow has a b..
[Maplendar] 메시지 큐를 활용하여 이벤트 종료 알림을 확실하게 보장하기
·
개발/Spring Boot
개요Maplendar의 핵심 기능 중 하나는 국민게임 메이플스토리에서 진행하는 이벤트나, 용사들이 모여 진행하는 보스 레이드에서의 일정을 관리하기 위해 푸시 알림을 보내주는 것이다.이는 애플리케이션만의 장점을 활용했다고 할 수 있다. 우리는 푸시 알림을 보내기 위해, Spring Batch 방식으로 1분마다 DB에 저장되어 있는, 사용자가 예약한 알람 데이터를 조회하고, 이를 Firebase Cloud Messaging을 통해서 FCM 토큰을 보유한 기기에 푸시 알림을 전송하는 방식으로 구현했었다.다만, 이러한 방식이라면 현재 시점에서의 알람 데이터가 DB에 많이 적재된다면 1분 안에 알람 데이터를 전부 처리할 수 없어 누락되어버리는 문제가 발생할 것이며, 이를 개선해야 한다는 동료의 피드백이 있었다.이..
[BOJ/Gold 3] 백준 35293 멘헤라(C++)
·
BOJ/Gold
문제 링크https://www.acmicpc.net/problem/35293 문제 멘헤라가 된 wlgh7407은 마음의 안정을 찾기 위해 알코올을 섭취하여 목표 단위 취기에 도달하고자 한다. wlgh7407의 앞에는 용량이 동일한 네 가지 선택지가 놓여 있다. 선택지취기 변화량순하리 레몬진 9도+9 단위순하리 레몬진 7도+7 단위순하리 레몬진 4.5도+4.5 단위생수-2 단위 wlgh7407은 목표 취기 N에 도달하기 위해 마셔야 하는 전체 액체의 양을 최소화하고 싶어 한다. wlgh7407이 정확히 N 단위 취기에 도달할 수 있는 선택의 최소 횟수를 알아내는 프로그램을 작성하시오.초기 취기는 0이고, 취기는 음수가 될 수 없다. 입력첫 번째 줄에 목표 취기 N이 주어진다. N은 음이 아닌 실수이다. (..
[Maplendar] Firebase Cloud Messaging의 sendEach()로 보스 파티의 파티원 관리에서의 성능을 개선해보자
·
개발/Spring Boot
개요보스 파티 기능 중, 파티원 초대, 초대 수락 및 거절, 파티 탈퇴, 파티원 추방, 파티장 양도 총 6가지의 파티원 관리 기능이 존재한다.파티원 관리 기능을 이용할 때마다 모든 파티원에게 FCM의 Silent Push가 전송된다. 이는 보스 파티를 보고 있는 파티원들이 있다면 실시간으로 파티원 정보를 갱신해주기 위해서 설계한 구조이다.그런데 파티원 관리 기능을 이용할 때마다 5초가 넘는 시간이 걸리는 것이 확인이 되었다. 일퀘도 귀찮아서 레드 찍고 딸깍 한 번으로 밀어버리는 메붕이들에게 5초 이상은 너무나도 긴 시간이다. 파티원 관리 기능에서의 성능 개선을 하고자 하였다. 원인 분석 및 해결1. SQL에서의 N+1 문제가 원인이다?이러한 성능 문제가 발생했을 때, 가장 먼저 의심해야 할 것은 DB ..
[Google PlayStore] 구글 플레이스토어 프로덕션 권한 승인받기
·
개발/안드로이드
개요드디어 3개월간에 걸친 Maplendar의 MVP 개발 및 테스트, 출시까지의 과정이 종료되었다. 2023년 11월 13일 이후 생성된 개발자 계정으로 출시를 하기 위해서 거쳐야 하는 과정이 이전보다도 상당히 까다로워졌다.특히나 2025년 들어서 더욱 까다로워졌는데, 그 이유는 다음과 같다.기존의 정책 : 최소 20명의 비공개 테스터 모집, 앱 설치 후 유지2025년 이후 : 최소 12명의 비공개 테스터 모집, 앱 설치, 유지 및 매일 실행하기최소 12명 이상의 테스터가 매일 실행까지 해야하는 번거로운 과정을 거쳐야 하기 때문에 이전보다도 까다로워졌다고 할 수 있다. 그리고 이 12명의 테스터들이 앱을 매일 실행할 수 있을 것이라는 보장도 없다.제목을 보시면 아시겠지만 우리 6반남 팀은 프로덕션 권한..
[자격증] 제48회 ADsP 합격 후기
·
자격증, 어학/IT 자격증
[Kotlin MultiPlatform] KMP가 대세인 이유
·
개발/안드로이드
배경 Kotlin 멀티플랫폼, 즉 KMP는 안드로이드와 iOS 간 비즈니스 로직을 공유하기 위해 구글에서 지원하는 플랫폼이다. 어그로 끌려고 대세라고는 해놨지만 사실 KMP가 대세인지는 잘 모르겠다. 다만 KMP는 애플리케이션 개발을 하면서 많은 강점을 가지고 있다. 먼저 요약을 하자면 비즈니스 로직 중복을 삭제하고, 각 네이티브별 성능을 제공 및 보장할 수 있다는 점이 KMP가 가진 강점이라고 할 수 있다. KMP vs Flutter, React Native 구글에서 제공하는 안드로이드와 애플에서 제공하는 iOS가 오늘날 모바일 운영체제 시장을 양분하고 있는 만큼, 많은 앱 개발자들은 왜 안드로이드/iOS에서 개발하는지, 어떤 플랫폼을 고를 것인지, 아니면 둘 다 개발할 것인지에 대해 고민을 할 것이다..
[BOJ/Silver 5] 백준 35143  2026(C++)
·
BOJ/Silver
문제 링크https://www.acmicpc.net/problem/35143 문제 2026. 누군가에게는 아무 의미가 없을 수 있지만, 고려대학교에게는 매우 특별한 수이다.고려대학교의 프로그래밍 경시대회 KCPC 2025의 개최일은 2026년 1월 17일이다. 준서는 대회가 개최된다는 사실이 기뻐 날짜를 뚫어져라 보다가 고려대학교의 2026년이 무언가 특별하다는 사실을 깨달았다.그렇다. 2026년은 고려대학교 개교 121주년인데, 121은 팰린드롬이고 sqrt(121) =11, 121^2=14641도 팰린드롬이다. 다음에 이런년도가 오려면 무려 10080년 뒤인 12106년이 되어야 한다. 여기서 팰린드롬이란 앞과 뒤 어느 방향으로 읽어도 똑같은 수를 의미한다. 준서는 이처럼 어떤 양의 정수가 팰린드롬이..
[BOJ/Silver 5] 백준 34995 쿠폰 잘 사용하기?(C++)
·
BOJ/Silver
문제 링크https://www.acmicpc.net/problem/34995 문제토카는 일정 금액까지 현금 대신 사용할 수 있는 쿠폰을 사용하여 음식을 주문하려 한다.쿠폰에는 N자리 정수로 쿠폰의 금액이 적혀 있다. 하지만 쿠폰 금액의 일부 숫자는 가끔 얼룩이 묻어 얼마인지 알아볼 수 없어 토카는 얼룩이 묻은 부분의 숫자를 적당히 지어내기로 한다. 쿠폰의 각 금액은 1 이상 9 이하의 숫자로 이루어져 있으며, 토카가 지어낼 숫자도 1 이상 9 이하의 숫자여야 한다.토카가 지어낸 쿠폰의 금액이 음식의 가격보다 작으면 주문할 수 없다. 토카가 음식을 주문할 수 있도록 쿠폰을 어떻게 지어내야 할지 알아보자. 입력첫 번째 줄에 쿠폰에 적힌 금액의 자릿수 N (1 ≤ N ≤ 10^5)과 쿠폰에 적힌 금액을 나타내..
[SolveSQL/난이도 3] Advent of SQL 2025(MySQL)
·
SolveSQL/난이도 3
크리스마스를 기념할 완벽한 와인 찾기SELECT * FROM winesWHERE color = 'white'AND quality >= 7AND density > ( SELECT AVG(density) FROM wines)AND residual_sugar > ( SELECT AVG(residual_sugar) FROM wines)AND pH ( SELECT AVG(citric_acid) FROM wines WHERE color = 'white');WHERE절에서 평균은 서브쿼리로 구하자. 두 대회 연속으로 출전한 기록이 있는 배구 선수WITH successive_record AS ( SELECT A.id AS `id`, A.name AS `name`, G.year AS `year`, LAG..
[SolveSQL/난이도 3] 멘토링 짝 리스트(MySQL)
·
SolveSQL/난이도 3
멘토링 짝꿍 리스트WITH mentee AS ( SELECT employee_id AS `mentee_id`, name AS `mentee_name`, department FROM employees WHERE join_date >= DATE_SUB('2021-12-31', INTERVAL 3 MONTH) AND join_date ~개월, ~년 이내 데이터를 구하려면 DATE_SUB(날짜, INTERVAL N MONTH/YEAR) 함수를 사용하면 된다.가능한 모든 멘티-멘토 짝꿍을 매칭해주기 위해 CROSS JOIN을 활용한다.
[BOJ/Gold 5] 백준 32945 극한직업 - 영양사 선생님(C++)
·
BOJ/Gold
문제 링크https://www.acmicpc.net/problem/32945 문제급식 시간이 시작되었다!학생 N명이 한 줄로 서서 배식을 받고 급식실에 앉는다. 배식은 1분 만에 완료되고, 모든 학생은 배식이 완료되자마자 급식실 자리에 앉는다. 즉, 줄의 맨 앞에서 i (1 ≤ i ≤ N)번째에 위치한 학생은 급식 시간이 시작된 지 i분 만에 자리에 앉는다.또한 학생마다 밥을 먹는 데에 걸리는 시간이 정해져 있다. 어떤 학생이 A분에 자리에 앉았고, B분 동안 밥을 먹는다면, 그 학생은 급식 시간이 시작된 지 A분, A+1분, ..., A+B-1분이 지난 시점에는 앉아 있고, A+B분이 지난 시점에 자리에서 일어나 급식실을 떠난다.대곽이는 모든 학생과 친하기 때문에 자신이 원하는 순서대로 줄을 세울 수 ..