분류 전체보기 164

[트러블슈팅] 유튜브 영상 삭제 감지는 API 없이 불가능할까?

https://devnote.kr DevNote개발 관련 YouTube/News Aggregator - 최신 개발 트렌드와 뉴스를 한 곳에서devnote.kr나는 내가 만든 서비스인 DevNote를 습관처럼 접속해 상태를 확인한다.수만 개의 유튜브 영상을 수집하고 분류하는 서비스인 만큼, 데이터가 최신 상태로 유지되고 있는지가 가장 중요하기 때문이다. 어느 날 평소처럼 사이트를 확인하던 중, 목록 일부의 썸네일이 회색 아이콘으로 표시된 것을 발견했다 해당 항목을 클릭해 보니 “동영상을 재생할 수 없습니다”라는 메시지가 노출되고 있었고, 해당 유튜버가 채널을 닫아 삭제처리된 영상이었다 수집 당시에는 정상적이던 영상들이 시간이 지나며 유튜버의 채널 삭제나 영상 비공개/삭제로 접근이 불가능해진 것이다.이 상태..

[JPA] DTO 없이 엔티티로 응답하면 안될까?

JPA로 개발을 하다 보면 repository.findById()로 엔티티를 조회하고 서비스 계층에서 DTO로 변환하는 코드를 습관처럼 작성한다.@GetMapping("/users/{id}")public UserResponseDto getUserById(@PathVariable Long id) { return userService.findUser(id); // 서비스가 DTO를 반환} 그런데 예전으로 돌아가서 생각해보면 이런 생각이 들었던것 같다. "그냥 엔티티를 반환하면 편한데 굳이 DTO를 만들어야 하나?" 물론 지금은 "당연히 안 되지"라고 생각하겠지만 "내가 생각하지 못했던 다른 이유가 더 있지는 않을까" 라는 생각이 들어 찾아보게 되었다. 엔티티를 직접 반환하면 정확히 어떤 문제가 발생하는..

[JPA] N+1 문제의 원인과 3가지 해결 방안

JPA는 SQL을 직접 작성하지 않고도 데이터베이스 작업을 처리할 수 있게 해주는 기술이다. repository.findById(1L) 같은 간단한 메서드 호출만으로도 복잡한 SQL이 실행되어 객체를 가져다준다. 하지만 이 편리함 뒤에는 'N+1 문제'라는 함정이 숨겨져 있다. 당연하게 사용하던 JPA가 어떻게 데이터베이스에 과부하를 주는지, 이 문제를 어떻게 해결할 수 있는지 비유를 통해 알아보자. 1. N+1 문제란 무엇인가?N+1 문제는 JPA를 통해 연관 관계가 설정된 엔티티를 조회할 때 발생하는 대표적인 성능 문제다. 이름 그대로 처음 1번의 쿼리로 원하는 엔티티 목록을 가져왔지만, 이 엔티티들이 각자 연관된 하위 엔티티에 접근할 때마다 추가적인 쿼리가 N번 발생하는 현상을 말한다. 1.1. 예..

[Spring] 제어의 역전(Inversion of Control, IoC) 이란 무엇일까?

1. DI와 IoChttps://ngwdeveloper.tistory.com/205 [Spring] 의존성 주입(Dependency injection, DI) 이란 무엇일까?spring을 사용해 개발을 하다보면 @Autowired나 생성자로 객체를 주입받아 쓴다. 너무나 당연하게 써왔었다. 그런데 문득 궁금해졌다. "그냥 내가 만들어 쓰면 안되나?" 라는 생각이 들었다. 이 의존ngwdeveloper.tistory.com 이전 글에서 DI가 객체 간의 결합도를 낮추는 기술임을 알게됐다. 이전 글 3.3 섹션에서 "객체의 생성과 관계 설정의 제어권이 개발자로부터 프레임워크로 넘어간 것을 제어의 역전(IoC)이라 부르며, DI는 이 IoC를 구현하는 핵심 방식이다."라고 말했었다.DI에 대해서는 이해했지만,..

[Spring] 의존성 주입(Dependency injection, DI) 이란 무엇일까?

spring을 사용해 개발을 하다보면 @Autowired나 생성자로 객체를 주입받아 쓴다. 너무나 당연하게 써왔었다. 그런데 문득 궁금해졌다. "그냥 내가 만들어 쓰면 안되나?" 라는 생각이 들었다. 이 의존성 주입이 왜 스프링의 핵심 개념인지 비유를 통해 이해해보자. 1. 스프링의 핵심중 하나인 DI스프링 프레임워크를 사용한다는 것은 의존성 주입(Dependency Injection, DI)의 개념 위에서 개발한다는 것과 같다. DI는 스프링의 3대 핵심 프로그래밍 모델 중 하나이며, 현대적인 객체지향 설계를 가능하게 하는 기반 기술이다.많은 개발자가 DI를 단순히 어노테이션(@Autowired)을 통해 객체를 받아오는 기술 정도로 이해하지만, DI의 본질은 객체 간의 결합도를 낮추고 유연성을 극대화하..

ELK 스택으로 MSA 로그 한곳에 모으기

1. 왜 중앙화된 로그 시스템이 필요할까?마이크로서비스 환경에서 장애가 발생하면 곤란한 상황에 빠질 수 있다. 현재 나의 devnote를 예로 들면 요청 하나를 추적하기 위해 6개의 서비스 컨테이너에 각각 접속해 로그 파일을 뒤지는 것은 상당히 비효율적일것이다. 이 문제를 해결하기 위해 모든 서비스의 로그를 한곳으로 모아 검색하고 분석할 수 있는 중앙화된 로그 시스템으로 ELK 스택을 구축했다. 2. Devnote 프로젝트의 로그 아키텍처로그는 Filebeat → Logstash → Elasticsearch → Kibana 순서로 흐르도록 구성했다. 각 컴포넌트는 아래처럼 명확한 역할을 수행한다. MSA 서비스 → 호스트의 로그 파일 → Filebeat (수집) → Logstash (가공) → Elas..

Kafka와 AI로 콘텐츠 자동 수집 및 분류 시스템 만들기

DevNote개발 관련 YouTube/News Aggregator - 최신 개발 트렌드와 뉴스를 한 곳에서devnote.kr1. 왜 이벤트 기반 데이터 파이프라인인가?devnote 프로젝트의 핵심은 외부 콘텐츠를 가져와 가공하는 것이다. 만약 데이터 수집, AI 분류, DB 저장을 하나의 동기적 흐름으로 짰다면 AI 분류 API가 느려지거나 실패했을 때 전체 데이터 수집 프로세스가 멈춰버리는 문제가 발생했을 것이다. 이러한 문제를 해결하고 각 기능의 독립성을 보장하기 위해, Kafka를 이용한 이벤트 기반 비동기 데이터 파이프라인을 구축했다. 2. 전체 데이터 파이프라인 아키텍처데이터의 흐름은 명확한 역할 분담을 따르도록 설계했다. 1. 데이터 생산 (Produce): news-youtube-servic..

개인 프로젝트에 MSA를 도입한 이유

DevNote개발 관련 YouTube/News Aggregator - 최신 개발 트렌드와 뉴스를 한 곳에서devnote.kr 1. 개인 프로젝트에서 MSA는 오버 엔지니어링일까?포트폴리오를 위한 개인 프로젝트를 시작할 때면 늘 같은 고민에 빠진다. "어떤 아키텍처를 선택할 것인가?" 가장 익숙하고 빠른 방법은 모든 기능을 하나의 프로젝트에 담는 모놀리식 방식이다. 하지만 MSA를 경험해보고 싶은 마음을 무시할 수 없었다. 과연 학습 목적의 개인 프로젝트에 오버 엔지니어링은 아닐까?devnote 프로젝트를 시작하며 나는 이 질문에 "그럼에도 불구하고 MSA로 가자"고 답했다. 이번 글에서는 그 결정의 이유와 초기 설계 과정을 작성했다. 2. 이번 프로젝트에 MSA를 선택한 이유이번에 진행한 개인 프로젝트 ..

Devnote 프로젝트

DevNote개발 관련 YouTube/News Aggregator - 최신 개발 트렌드와 뉴스를 한 곳에서devnote.kr 1. 개발자 콘텐츠 플랫폼흩어져 있는 최신 개발 소식과 유튜브 영상을 한곳에서 모아볼 수 있는 개발자 콘텐츠 허브 플랫폼으로 Devnote 프로젝트를 기획했다. 단순히 링크를 모아두는 것을 넘어, AI를 통해 모든 콘텐츠를 알맞은 카테고리별로 자동 분류하고 검색 기능과 커뮤니티 기능을 통해 사용자가 원하는 정보를 쉽고 깊이 있게 탐색할 수 있도록 설계했다. 2. 주요 기능개발자에게 유용한 정보를 제공하기 위해 다음과 같은 핵심 기능들을 구현했다. 2-1. 콘텐츠 자동 수집 및 분류외부 뉴스 사이트의 RSS와 YouTube API를 통해 개발 관련 콘텐츠를 주기적으로 수집하고, G..

[Spring Boot] 실시간검색어 구현하기

1. 요구사항 정리- 실시간 집계사용자가 검색 즉시 “인기 검색어” 점수에 반영- 조작 방지동일 IP(또는 로그인 유저)가 같은 키워드를 반복 검색해 점수를 부당하게 올리는 행위 차단 - 시간 가중치 적용최근 검색일수록 더 큰 가중치를 부여 - 시간대 보정새벽 시간대에는 보정값을 높여 점수를 낮게, 오후 시간대엔 보정값을 낮춰 점수를 높게 - 전체 검색량 보정평소 검색량(과거 일주일 등)이 많은 키워드는 보정값으로 점수를 낮춤 - 지속성 확보Redis 인메모리 휘발성 대비 RDBMS 백업위 내용으로 요구사항을 정리한 뒤 구현에 들어갔다. 2. 구현2-1. 새로운 로직 추가 (Trending)package com.example.footprint.trending.controller;import com.exa..

프로필사진

남건욱's 공부기록

반응형