목록전체 글 (109)
백고등어 개발 블로그
2025년 초, 지인들과 함께 소개팅 애플리케이션을 만들었다. 팀은 총 3명이었다. 기획을 담당하는 팀원 1명과 개발자 2명(본인 포함)이었고, 개발자 모두 회사에 다니고 있었다. 퇴근 후와 주말을 이용해 앱을 만들어야 했기 때문에 시간도 인력도 넉넉하지 않았다. 그래도 단순히 토이 프로젝트로 끝내고 싶지는 않았다. 실제로 사용할 수 있는 서비스를 만들고, 앱 스토어에 출시해서 사용자 반응까지 확인하는 것을 목표로 잡았다. 그렇게 만든 서비스가 비몬트였다. 매칭 이후의 어색함을 줄여보자기존 소개팅 앱의 핵심은 대부분 비슷했다. 프로필을 보고 상대방을 선택하고, 서로 연결되면 채팅을 시작한다. 문제는 매칭된 다음이었다. 상대방의 프로필을 봤어도 막상 채팅창에 들어가면 어떤 이야기를 해야 할지 막막할 ..
이전 회사에서 예약 푸시 알림 기능을 개선한 적이 있다. 관리자가 백오피스에서 알림 제목, 내용, 발송 시간과 대상을 등록하면 Quartz가 예약된 시간에 FCM 푸시를 보내는 기능이었다. 기능 자체는 정상적으로 동작했다. 문제는 발송 대상이 많아질수록 처리 시간이 계속 늘어난다는 점이었다. 대량 발송을 한 번 처리하는 데 20~30분 정도가 걸리는 경우도 있었다. 대상자 이력을 만드는 단계부터 토큰을 검증하고 발송 결과를 저장하는 단계까지, 사용자 수만큼 반복되는 작업이 너무 많았다. 처음에는 FCM이나 외부 네트워크가 느린 것으로 생각했다. 그런데 알림 등록 API부터 Quartz 발송 코드까지 흐름을 따라가 보니, 실제 문제는 한 군데가 아니었다. 회사에서 사용한 실제 클래스명과 테이블명은 글에 ..
10강: 실전 프로젝트와 모범 사례코틀린 코딩 규칙명명 규칙// 클래스와 인터페이스: PascalCaseclass UserRepositoryinterface DataSource// 함수와 변수: camelCasefun calculateTotal()val userName = "김코틀린"// 상수: UPPER_SNAKE_CASEconst val MAX_COUNT = 100const val API_KEY = "your-api-key"// 패키지: 소문자, 점으로 구분package com.example.myapp.domain코드 구조// 1. 패키지 선언package com.example.myapp// 2. Import 문import kotlinx.coroutines.*import java.time.LocalD..
9강: 코루틴 기초코루틴이란?코루틴(Coroutine)은 비동기 프로그래밍을 쉽게 작성할 수 있게 해주는 코틀린의 핵심 기능입니다. 경량 스레드라고 불리며, 수천 개의 코루틴을 동시에 실행해도 성능 저하가 거의 없습니다.코루틴 시작하기의존성 추가코루틴을 사용하려면 먼저 의존성을 추가해야 합니다. Gradle의 경우:dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")}첫 번째 코루틴import kotlinx.coroutines.*fun main() = runBlocking { // 메인 스레드를 차단하는 코루틴 빌더 launch { // 새로운 코루틴 시작 delay(1000L) ..
8강: 제네릭제네릭이란?제네릭(Generics)은 타입을 파라미터화하여 코드의 재사용성을 높이고 타입 안정성을 보장하는 기능입니다. 컬렉션에서 이미 제네릭을 사용해왔습니다: List, Map 등.제네릭 클래스기본 제네릭 클래스class Box(val value: T) { fun get(): T = value}fun main() { val intBox = Box(10) val stringBox = Box("Kotlin") println(intBox.get()) // 10 println(stringBox.get()) // Kotlin // 타입 추론 val doubleBox = Box(3.14) // Box로 추론 println(double..