기타 7

Sealed Interface로 깔끔하고 안전한 API 응답 구조 만들기

백엔드 개발을 하다 보면 서비스 레이어의 처리 결과를 컨트롤러에 어떻게 전달할지 고민하게 됩니다. 데이터가 없으면 null을 보낼지, 아니면 Exception을 던져야 할지 모호한 경우가 많죠. 이럴 때 Sealed Interface를 활용하면 응답의 상태를 명확하게 강제할 수 있고, 코드의 안정성도 획기적으로 높아집니다.1. Sealed Interface 응답 구조 설계성공, 데이터 없음, 에러 상황을 하나의 인터페이스로 묶어 관리하는 방식입니다. 여기서 핵심은 상황에 따라 class와 object를 적절히 섞어 쓰는 것입니다.sealed interface AnalyticsResult { // 성공: 결과 데이터라는 '본문'이 있으므로 data class data class Success(v..

기타 15:10:06

포스트 하나에 10초? 코루틴으로 AI 요약 파이프라인 병렬화하기

최근 기술 블로그 RSS를 스크래핑하고 AI로 내용을 요약하는 'Morning Commit' 프로젝트의 파이프라인을 개선했습니다. 구현 과정에서 마주친 성능 병목 지점과 이를 Kotlin Coroutines로 해결한 과정을 정리했습니다.1. 문제 상황: 순차 처리의 한계기존 방식은 RSS 피드에서 추출한 포스트들을 하나씩 순서대로 처리했습니다.프로세스: HTML 스크래핑 → AI 요약(LLM API 호출) → 데이터 가공 및 저장소요 시간: 포스트 당 평균 약 10초포스트 하나당 10초는 짧아 보일 수 있지만, 배치 작업의 특성상 누적 시간은 무시할 수 없습니다. 한 번에 처리해야 할 포스트가 30개만 되어도 5분이 소요되며, 연동하는 블로그 소스가 늘어날수록 전체 작업 완료 시간은 선형적으로 증가하는 ..

기타 2026.02.24

예약 게시글 업로드

이번 포스트에는 예약 게시글 업로드를 구현하면서 새로 배웠던 내용을 다시 한번 정리해보겠습니다. 예약 게시글 업로드를 구현하기 위해 ThreadPoolTaskScheduler, RabbitMQ를 사용하였고, 각 기술의 특징에 대해서 설명해보겠습니다. ThreadPoolTaskScheduler먼저 ThreadPoolTaskScheduler입니다. ThreadPoolTaskScheduler는 Spring Framework에서 제공하는 스케줄링용 스레드 풀 기반의 TaskScheduler 구현체입니다. ThreadPoolTaskScheduler를 사용하기 위해 Bean으로 등록을 해주었습니다.@Configurationpublic class SchedulerConfig { @Bean public Th..

기타 2025.05.30

만들면서 배우는 클린 아키텍처

계층형 아키텍처의 문제는 무엇일까?그림 1. 전통적인 웹 애플리케이션 구조 웹 계층 : 요청을 받아 도메인 혹은 비즈니스 계층에 있는 서비스로 요청을 보낸다.도메인 계층 : 필요한 비즈니스 로직을 수행하고, 도메인 엔티티의 현재 상태를 조회하거나 변경하기 위해 영속성 계층의 컴포넌트를 호출한다.영속성 계층 : 엔티티를 조회 또는 변경한다.계층형 아키텍처는 견고한 아키텍처 패턴이다. 계층을 잘 이해하고 구성한다면 웹 계층이나 영속성 계층에 독립적으로 도메인 로직을 작성할 수 있다. 원한다면 도메인 로직에 영향을 주지 않고 웹 계층과 영속성 계층에 사용된 기술을 변경할 수 있다. 기존 기능에 영향을 주지 않고 새로운 기능을 추가할 수도 있다. 잘 만들어진 계층형 아키텍처는 선택의 폭을 넓히고, 변화하는 요구..

기타 2025.04.22

맞춤 추천 게시글 시스템 구축 - 구현 2편

이 전에 작성했던 맞춤 추천 게시글 시스템 구축 - 구현 1편에 이어서 구현 2편을 진행해보겠습니다. 해당 시스템에는 레디스를 적용할 계획입니다. 레디스의 목적은 추천 게시글 목록이 이미 존재한다면 해당 데이터를 리턴하고, 추천 게시글 목록이 존재하지 않으면 레디스에 저장해서 관리하기 위함입니다. 레디스 설정파일은 다음과 같습니다. 유저 ID를 Key로 게시글 ID 리스트를 Value로 가진 자료구조로 저장해보겠습니다.@Configuration@EnableCachingclass RedisConfig( @Value("\${redis.host}") private val host: String, @Value("\${redis.port}") private val port: Int) { ..

기타 2025.04.19

맞춤 추천 게시글 시스템 구축 - 구현 1편

이 전에 작성했던 맞춤 추천 게시글 구축 - 이론편을 기반으로 구현편을 이어서 진행하도록 해보겠습니다.기술 스택 버전Spring Boot : 3.4.4Kotlin : 1.9JDK : 21MySQL : 9.2.0Spring Data JPA : 3.4.4Kotlin JDSL : 3.5.5Coroutine : 1.8.1테이블 설계가장 먼저 테이블이 필요하므로 최대한 간단하게 설계를 진행해보겠습니다. 필요한 테이블로는 '사용자', '게시글', '사용자 게시글 활동 이력' 테이블이 있습니다.User(사용자) 테이블@Entityclass User( @Id @GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY) var id: L..

기타 2025.04.17

맞춤 추천 게시글 시스템 구축 - 이론편

요즘 많은 서비스가 사용자 맞춤 추천을 통해 관심 있는 콘텐츠를 효과적으로 제공하고 있습니다. 이번 글에서는 간단한 방법으로 맞춤 추천 게시글 시스템을 구축하는 기본 개념과 구현 방법에 대해 살펴보겠습니다. 이번 포스팅에서는 이론적인 부분에 대해서 집중적으로 정리해보겠습니다. 대표적인 추천 방식추천 방식의 대표적인 방식으로는 컨텐츠 기반 추천 시스템과 협업 필터링 추천 시스템이 있습니다. 해당 방식의 장점과 단점을 테이블로 정리를 해보겠습니다. 구분 장점 단점컨텐츠 기반 추천 시스템• 신규 사용자·아이템에도 강함(콜드 스타트 완화)• 외부 사용자 데이터 필요 없음 → 프라이버시 이슈 적음• 추천 근거(아이템 특징) 설명이 쉬움• 아이템 특징 추출·정규화가 필요(텍스트 전처리, 태그 관리 등)• 사용..

기타 2025.04.17