전체 글 163

[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..

개인 서버 구축(9) - nginx 설정하고 SSL 인증서로 HTTPS 받기 [마지막]

1. Nginx 설치sudo apt updatesudo apt install -y nginxsudo systemctl status nginx- sudo apt update로 패키지 목록을 업데이트해준다.- sudo apt install -y nginx로 Nginx를 설치해 준다.- sudo systemctl status nginx로 서비스 상태를 조회한다. 초록색으로 활성화가 떴다고 조회되면 올바르게 설치된 것이다. sudo rm /etc/nginx/sites-enabled/default기본으로 들어있는 /etc/nginx/sites-enabled/default 파일을 지워준다.default 설정을 지우는 이유는 어차피 사용하지 않을 것이고, 기본값이 내가 따로 설정할 값과 충돌할 수 있기 때문에 지워줬..

프로필사진

남건욱's 공부기록

반응형