전체 글 106

[JavaScript] 자바스크립트 기본 문법

0. 개요입사 후 프론트 역량이 필요하다는 것을 깨달았고, 이를 보완하기 위해 직접 자바스크립트를 공부하며 정리한 내용이다. 이 글은 이미 한 가지 이상의 프로그래밍 언어를 경험해본 사람에게 도움이 될 것 같다.1. 기본 문법자바스크립트는 1) 변수자바스크립트에서 변수를 선언하는 키워드는 3가지가 있다.var: 사용 지양 (함수 단위 스코프 문제)let: 재할당 가능const: 재할당 불가 / 할당한 객체의 내부 값은 변경 가능// varvar x = 10;x = 20; // 재할당 가능console.log(x); // 20// letlet count = 1;count = 2; // 재할당 가능console.log(count); // 2// constconst a = 10;a = 20; // error..

[도커] Docker 기초 개념 정리

1. 도커 구조도커 클라이언트: 도커에 명령을 내릴 수 있는 CLI 도구.도커 호스트: 도커를 설치한 서버.도커 레지스트리: 도커 이미지를 저장하거나 배포하는 시스템. ex) Docker Hub도커 이미지: 컨테이너 형태로 SW를 배포하기 위해 필요한 모든 요소(코드, 라이브러리, 설정 등)를 실행할 수 있는 포멧으로 컴파일 및 빌드한 패키지.도커 컨테이너: 도커 이미지를 실행할 수 있는 인스턴스. * 도커 컨테이너 실행클라이언트가 run 명령어를 입력하면, 도커 호스트의 데몬이 실행 명령을 요청받고 도커 호스트에 있는 이미지를 컨테이너 형태로 실행한다. 2. docker run hello-world 실행 과정docker run hello-world에서 docker: hello-world 컨테이너를 실..

[개발환경 설정] AWS EC2 서버 구축

1. EC2 인스턴스 생성AWS Region 설정우측 상단의 Region을 현재 지역으로 바꿔준다.EC2 서비스 접속EC2 인스턴스 생성AMI 설정원하는 OS를 선택한다.인스턴스 설정프리 티어를 위한 t2.micro를 사용했다.키 페어 설정키 페어는 EC2 인스턴스에 접속하기 위해 사용되는 암호화 된 파일이다.RSA 방식으로 .pem 파일로 생성하는 걸 추천한다.네트워크 설정SSH 트래픽 허용란에 "위치 무관" 이라고 설정되어 있는데, 이게 "내 IP" 라고 되어 있으면 키 페어를 이용한 SSH 접속이 동일 IP 에서만 접속 가능하니 주의해야 한다. 스토리지 구성AWS 프리 티어에서는 월별 30GB의 스토리지 양을 제공한다.용량이 부족하면 나중에 확장할 수 있다.인스턴스 생성 완료보안 그룹 설정보안 그룹..

개발환경 설정 2025.09.21

[개발환경 설정] 우분투(리눅스) 환경에서 Docker와 Kubernetes 설치

1. Docker 설치* 도커 기초 개념2025.09.28 - [도커] - [도커] 도커(Docker) 기초 개념 정리 [도커] 도커(Docker) 기초 개념 정리1. 도커 구조도커 클라이언트: 도커에 명령을 내릴 수 있는 CLI 도구.도커 호스트: 도커를 설치한 서버.도커 레지스트리: 도커 이미지를 저장하거나 배포하는 시스템. ex) Docker Hub도커 이미지: 컨테lightningtech.tistory.com (1) 도커 설치를 위한 환경 설정ca-certificates: 인증서 관련 패키지curl: 파일을 다운로드하기 위한 패키지gnupg: 디지털 서명을 사용하기 위한 패키지lsb-release: 리눅스 배포판 식별을 위해 필요한 패키지# 도커를 설치하기 위해 필요한 환경 설정sudo apt-g..

개발환경 설정 2025.09.21

[쇼핑몰 프로젝트 - 리팩토링] Spring Batch를 활용한 생일 쿠폰 발급 성능 약 94% 개선

0. 개요쇼핑몰 프로젝트 당시 구현하지 못했던 생일 쿠폰 발급 요구사항을 Spring Batch로 구현했지만,개발 후 회원 규모를 확장해 가며 테스트한 결과 처리 속도가 매우 느렸다. 요구 사항은 다음과 같다. 이 글은 Spring Batch 기반 생일 쿠폰 발급 배치의 속도 개선 과정을 정리한 글이다.1. 문제 발생(1) 문제 발견회원 더미 데이터를 점차 늘려가며 배치 테스트를 하던 중, 처리 시간이 급격히 늘고 SQL 쿼리문이 굉장히 많이 발생하는 문제가 발생했다. 테스트 조건은 아래와 같다.전체 회원: 120만 명이번 달 생일자: 10만 명Chunk Size: 1000 * 더미 데이터 생성더보기(1) 프로시저DELIMITER $$DROP PROCEDURE IF EXISTS seed_members_b..

[쇼핑몰 프로젝트 - 리팩토링] 상품 목록 조회 최적화: N+1 해결 & 인덱스로 31% 개선

0. 개요기존 쇼핑몰 프로젝트의 카테고리별 도서 조회에서 N+1 문제와 조회 속도가 느리다는 문제점이 있었다.리팩토링을 통해 N+1 문제를 해결하고, 인덱스를 통해 조회 속도를 개선했다.이 글은 그 과정을 정리한 글이다.1. 기존 구조의 문제점먼저 프론트를 보면, 해당 페이지에서 필요한 데이터는 bookId, title, price, salePrice, amount 5개다. 하지만 백엔드는 아래 메서드로 엔티티(Page) 자체를 반환했다. 이러한 문제 때문에 N+1 문제가 발생했다.한 번의 리스트 쿼리로 books_categories를 가져온 뒤, 행마다 Book을 개별 조회했다.Book.publisher가 EAGER라 출판사까지 매번 조인됐다.20개의 책을 가져오는데, 결과적으로 요청 1번에 쿼리 23..

[쇼핑몰 프로젝트 - 리팩토링] 카테고리 N+1 문제 해결과 Redis 캐싱 적용

0. 개요쇼핑몰 프로젝트의 카테고리는 재귀적 계층 구조로 설계되어 있었다. 처음에는 백엔드에서 전체 카테고리 트리를 재귀적으로 내려주는 방식이었지만, 이 방식은 N+1 문제를 유발했고, 그로 인해 쿼리 수가 과도하게 늘어나고 응답 속도도 매우 느려지는 문제가 있었다. 당시에는 시간적인 여유가 없어서, 문제를 임시로 해결하기 위해 프론트 서버에서 아래와 같이 로직을 구성한 것 같다.최상위 카테고리 목록을 먼저 /topCategories API로 조회.그 중 자식이 있는 카테고리에 대해 /subCategories/{id} API를 반복 호출.이 방식은 겉보기에 구조를 분리한 것처럼 보이지만, 결국 카테고리 개수만큼 API 요청이 발생하게 되면서 N+1 문제를 DB 쿼리에서 API 요청 수준으로 옮긴 것에 불..

[쇼핑몰 프로젝트] FeignClient 에러 처리: ErrorDecoder

0. 개요쇼핑몰 프로젝트를 혼자 다시 만들면서, FeignClient 사용 중 발생하는 예외 처리 방식에 대해 고민하게 되었다. 당시 프로젝트는 MSA 구조였고, 각 API 내부에서는 상황에 맞는 적절한 예외 처리를 하고 있었다. 문제는, 서버 간 통신을 위해 FeignClient로 요청을 보낼 때 발생했다. 요청을 받은 서버는 어떤 예외가 발생했는지 알고 있었지만, 요청을 보낸 서버에서는 모든 예외가 그냥 FeignException 하나로 퉁쳐졌다. 그 결과, 실제 어떤 오류가 발생했는지를 확인하려면 요청을 받은 서버의 로그를 직접 확인해야 했고, 이는 디버깅이나 예외 추적에 있어 꽤 큰 불편함이었다. 그때는 프로젝트 마감 기한이 촉박해서 그냥 넘겼지만, 이번에 혼자 다시 프로젝트를 진행하면서 이 문제..

[쇼핑몰 프로젝트] Spring 예외 처리: ErrorCode 기반 공통 처리로 단순화하기

0. 개요쇼핑몰 프로젝트를 혼자 새로 만들면서, 예외 처리 방식을 어떻게 설계할 것인가에 대해 많은 고민을 하게 되었다.이전 팀 프로젝트에서는 예외 클래스를 도메인별로 세분화하고 상속 구조를 활용해 관리했지만, 예외 종류가 많아질수록 클래스 수가 급격히 늘어나고, 각 예외마다 @ExceptionHandler를 추가해야 하는 번거로움이 뒤따랐다. 결국 이러한 관리 부담과 중복 처리 문제를 해결하기 위해, ErrorCode Enum과 공통 예외 클래스를 활용한 단순화된 예외 처리 방식으로 전환하게 되었다. 이 글에서는 기존 방식의 한계와 그로 인한 고민 과정을 소개하고, ErrorCode 기반 예외 처리 방식으로 어떻게 개선했는지를 정리해본다.1. 기존 방식: 예외 클래스를 세분화하여 상속 구조로 관리이전 ..