API 응답 속도를 빠르게 만드는 방법
·
Backend
서비스를 운영하다 보면 가장 자주 듣는 말 중 하나가 바로 “API 속도 좀 개선해 주세요.” 다. 사용자가 느린 응답을 경험하면 서비스 만족도는 즉시 떨어지고, 심하면 이탈까지 이어진다. 그렇다면 서버 개발자는 API 응답 속도를 어떻게 개선할 수 있을까?방법은 다양하지만 많은 프로젝트에서 가장 효과가 높고 적용 난도가 적당한 것이 바로 캐싱(Caching) 과 페이징(Pagination) 처리다.이 글에서는 실제로 제가 여러 프로젝트를 진행하면서 경험한 내용을 중심으로 왜 이 두 가지가 중요한지, 어떻게 적용하는지, 각각의 장단점은 무엇인지 정리해본다.API 성능은 왜 느려질까?API가 느려지는 원인은 크게 세 가지다.1) DB 조회 부하복잡한 조인대량 데이터 Full Scan인덱스 미사용명령어 자체..
TCP vs UDP
·
Network
개발을 하다 보면 "TCP가 더 안정적인 프로토콜", "UDP는 속도가 빠르다" 같은 문장을 자주 보게 된다. 하지만 막상 언제 TCP를 써야 하고, 언제 UDP를 써야 하는지 또는 왜 성능 차이가 발생하는지, 네트워크 수준에서 무엇이 다른지를 정확하게 설명하기 어려운 경우가 많다. 이번 글에서는 TCP와 UDP의 구조적 차이, 동작 방식, 장단점, 실제 서비스에서의 선택 기준을 정리해봤다.TCP와 UDP는 ‘전송 계층’ 프로토콜OSI 7계층에서 TCP와 UDP는 Layer 4(전송 계층)에 있다.IP는 목적지까지 데이터 패킷을 전달하는 역할(L3)TCP/UDP는 “그 데이터를 어떻게 전달할까?”를 결정하는 역할(L4)즉, TCP/UDP는 데이터를 어떤 방식으로 보내고 받을지를 규정하는 규칙이다.핵심 비..
@Transactional 동작 원리
·
Backend
“Spring의 트랜잭션은 어떻게 DB 트랜잭션과 연결될까?”Spring을 사용하다 보면 거의 반사적으로 @Transactional을 붙인다.서비스 코드 상단에 조용히 선언해두면 여러 SQL 실행이 하나의 묶음처럼 처리(commit)되고 오류가 나면 자동으로 되돌아간다.(rollback)하지만 막상 “Spring이 이걸 어떻게 수행하지? 진짜 DB의 트랜잭션과는 어떻게 연결되는 걸까?” 라고 물으면 설명이 흐려지는 경우가 많다.이번 글에서는@Transactional이 실제로 무엇을 하고 어떤 흐름으로 DB 트랜잭션과 묶이는지 그리고 프로젝트를 하면서 고민해봤던 부분과 문제 해결 경험을 가볍게 곁들여 정리해본다.Spring의 @Transactional은 “프록시 기반 AOP”로 시작된다핵심은 이거다.@Tr..
폐쇄망 환경에서 서로 다른 두 DB를 다뤄야 할 때
·
Backend
현재 진행 중인 프로젝트는 공공기관 시스템으로, 온프레미스 환경에서 전자정부프레임워크(eGovFrame) 기반으로 개발 중이다.그런데 예상치 못한 구조적 문제가 하나 있었다.서비스 로직상 서로 다른 두 개의 데이터베이스(DB A, DB B) 를 동시에 조회하고, 심지어 일부 기능에서는 두 DB의 테이블을 조인해야 하는 상황이 발생했다. 예를 들어보면 아래와 같은 케이스다.DB_A.user 와 DB_B.approval 테이블을 조인해야 하는 업무 로직이 있음두 DB 모두 user 테이블을 가지고 있어, 데이터 싱크를 맞춰야 하는 이슈도 존재함처음에는 단순히 DataSource를 두 개 선언해서 해결될 줄 알았지만 막상 실제 조인이 필요한 부분에서 iBatis나 MyBatis 수준에서는 처리 불가한 제약이 ..
온프레미스 환경에서 무중단 배포(Zero Downtime Deployment) 구축 방안 탐구기
·
Backend
최근 회사에서 진행 중인 공공기관 시스템 구축 프로젝트를 맡게 되었다.공공기관 특성상 보안 정책이 매우 엄격해서, 클라우드 인프라를 활용할 수 없고 완전한 온프레미스(On-Premise) 환경 위에서 서비스를 운영해야 했다.그런데 배포 절차를 살펴보다가 이런 부분이 눈에 띄었다.“배포 중에는 서비스가 중단될 수 있습니다.공지 후 재배포를 진행하세요.”즉, 배포 과정에서 서비스 중단이 전제된 구조였다.하지만 요즘 사용자는 1~2분의 중단에도 민감하게 반응한다.그래서 “이 온프레미스 환경에서도 무중단 배포가 가능할까?”라는 궁금증이 생겼고,그걸 직접 조사하고 정리해본 내용을 기술 블로그 형태로 남겨보려 한다.무중단 배포란 무엇인가?무중단 배포(Zero Downtime Deployment)는 말 그대로 서비스..
SPA vs MPA, SSR vs CSR 무엇이 다르고, 어떻게 선택해야 할까?
·
Frontend
웹 개발을 하다 보면 반드시 마주치는 개념이 있습니다. 바로 SPA(Single Page Application)와 MPA(Multi Page Application), 그리고 SSR(Server Side Rendering)과 CSR(Client Side Rendering) 입니다.처음엔 이름만 들어도 머리가 아프지만, 실제로는 서로 다른 특징과 장단점이 있어서 상황에 따라 적절히 선택하면 됩니다.이번 글에서는 제가 프로젝트를 하면서 직접 느낀 점들을 곁들여 정리해보겠습니다.1. SPA vs MPA1-1. SPA (Single Page Application)정의: 이름 그대로 "하나의 페이지"에서 동작하는 애플리케이션.페이지 이동 시 전체 페이지를 새로 불러오는 게 아니라, 필요한 데이터만 가져와 화면 일부..
DB 테이블 설계 시 자주 부딪히는 두 가지 고민: 매핑 테이블 vs 별도 엔티티, 공통 코드 vs 개별 코드
·
Database
테이블 설계에서 자주 고민하는 두 가지 포인트매핑 테이블을 얼마나 써야 하는가?코드 관리를 공통 코드로 묶을 것인가, 개별 테이블로 나눌 것인가?실제 프로젝트를 하다 보면 거의 빠짐없이 부딪히는 주제입니다. 저도 여러 차례 설계하면서 이 문제로 고민했고, 각 방식마다 장단점이 분명히 있음을 깨달았습니다. 이번 글에서는 그 고민을 정리해보려 합니다.1. 매핑 테이블 남발의 문제점매핑 테이블은 보통 N:M 관계를 풀어내기 위해 사용합니다. 예를 들어:사용자(User) ↔ 역할(Role)게시글(Post) ↔ 태그(Tag)이런 경우에는 매핑 테이블이 적합합니다. 하지만 모든 관계를 무조건 매핑 테이블로 풀어내다 보면 문제가 발생합니다.(1) 장점유연성 확보: 새로운 관계가 생겨도 테이블 추가 없이 매핑 테이블에..
REST API
·
Backend
REST API란 무엇이고, 좋은 API 디자인 규칙은?서버 개발을 하다 보면 가장 자주 듣는 단어 중 하나가 바로 API입니다.그중에서도 특히 REST API는 거의 모든 웹 서비스에서 기본처럼 사용되고 있죠.이번 글에서는 REST API란 무엇인지, 그리고 좋은 API 디자인 규칙은 무엇인지 정리해보겠습니다.1. API란 무엇인가?API (Application Programming Interface)뜻: "어플리케이션끼리 데이터를 주고받을 수 있는 인터페이스"👉 쉽게 말해, 서버와 클라이언트가 대화하는 창구입니다.예를 들어:클라이언트: “아이디 1번 유저 정보 좀 줘!”서버: “여기 있어요. 이름은 홍길동이고, 나이는 25살입니다.”이때 요청과 응답의 규칙을 정해놓은 것이 바로 API입니다.2. R..
[프로그래머스 / Java] 두 큐 합 같게 만들기
·
Data Structure & Algorithm
https://school.programmers.co.kr/learn/courses/30/lessons/118667 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr◎ 문제◎ 코드 및 풀이import java.util.*;class Solution { public int solution(int[] queue1, int[] queue2) { Queue q1 = new LinkedList(); Queue q2 = new LinkedList(); long q1Sum = 0; long q2Sum = 0; for(int i=0; i q2Sum..
JPA(Java Persistence API)
·
Backend
JPAJPA를 쓰다 보면 이론만 알았을 때는 상상하지 못한 문제들이 터집니다.저도 개인 프로젝트에서 여러 번 부딪혔고, 그때마다 구글링 + 디버깅으로 해결책을 찾아야 했습니다.이번 글에서는 제가 실제로 겪었던 문제들을 정리하면서, 여러 해결 방법과 각각의 장단점까지 비교해보겠습니다.1. N+1 문제문제 상황게시판 프로젝트에서 Post와 Comment를 1:N 관계로 매핑했습니다.게시글 목록을 조회하면서 댓글 수도 함께 보여주고 싶었는데, 단순히 postRepository.findAll()을 호출하니 쿼리가 엄청나게 많이 나가더군요.@Entitypublic class Post { @Id @GeneratedValue private Long id; private String title; ..
[프로그래머스 / Java] 미로 탈출
·
Data Structure & Algorithm
https://school.programmers.co.kr/learn/courses/30/lessons/159993 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr◎ 문제◎ 코드 및 풀이 import java.util.*;public class Solution { static int X, Y; static int[] dx = {1, 0, -1, 0}; static int[] dy = {0, 1, 0, -1}; public static void main(String[] args) { Solution sol = new Solution(); int result1 = sol..
[프로그래머스 / Java] 무인도 여행
·
Data Structure & Algorithm
https://school.programmers.co.kr/learn/courses/30/lessons/154540?language=java 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr◎ 문제◎ 코드 및 풀이import java.util.*;public class Solution { static int X,Y,day; static int[] dx,dy; public static void main(String[] args) { Solution sol = new Solution(); int[] result1 = sol.solution(new String[]{"X591X",..