Study 27

Terraform을 사용하는 이유

어제는 Terraform이 인프라를 코드로 관리하는 도구라는 것을 정리했다.오늘은 Terraform을 왜 사용하는지에 대해 정리해보려고 한다. 인프라를 직접 만들 때의 문제AWS에서 EC2를 만든다고 하면 콘솔에 들어가서 직접 설정을 선택해야 한다.인스턴스 타입을 고르고, VPC와 서브넷을 선택하고, 보안 그룹을 만들고, 필요한 포트를 열어야 한다.처음에는 크게 어렵지 않지만, 서버가 여러 개가 되면 문제가 생긴다.어떤 설정으로 만들었는지 기억하기 어렵고, 사람이 직접 클릭해서 만들다 보면 설정이 조금씩 달라질 수 있다.예를 들어 A 서버는 8080 포트가 열려 있는데, B 서버는 빠져 있을 수도 있다.이런 차이는 나중에 배포나 운영 과정에서 예상하지 못한 오류로 이어질 수 있다. Terraform을 사..

Study 2026.05.13

Terraform 개념 정리

Terraform이란Terraform은 인프라를 코드로 관리할 수 있게 해주는 도구이다.서버, 네트워크, 데이터베이스, 보안 그룹 같은 인프라 자원을 직접 콘솔에서 클릭해서 만드는 것이 아니라, 코드로 작성해서 생성하고 관리할 수 있다.이런 방식을 IAC라고 한다.IaC는 Infrastructure as Code의 약자이고 한국어로는 코드형 인프라라고 볼 수 있다.기존 방식의 문제점예를 들어 AWS EC2 서버를 만든다고 하면 보통은 AWS 콘솔에 들어가서 직접 설정을 선택한다.인스턴스 타입을 고르고, 키 페어를 선택하고, 보안 그룹을 만들고, 포트를 열고, VPC나 서브넷을 설정한다.처음 한 번은 괜찮지만 서버가 여러 개가 되거나, 같은 환경을 다시 만들어야 할 때 문제가 생긴다.어떤 설정으로 만들었는..

Study 2026.05.12

Jenkins 개념 정리

Jenkins란?Jenkins는 CI/CD를 자동화해주는 도구이다.개발자가 코드를 GitHub에 push하면, Jenkins가 그 변경사항을 감지해서 자동으로 빌드, 테스트, 배포 같은 작업을 실행할 수 있다.예를 들면 원래는 개발자가 직접 해야 하는 작업이 있다.코드 pull 받기프로젝트 빌드하기테스트 실행하기서버에 배포하기Jenkins를 사용하면 이 과정을 자동화할 수 있다.Github Push → Jenkins 실행 → Build → Test → Deploy왜 사용할까?프로젝트가 커질수록 매번 직접 빌드하고 배포하는 것은 번거롭고 실수도 생기기 쉽다.예를 들어 배포할 때 테스트를 깜빡하거나, 잘못된 파일을 서버에 올릴 수 있다.Jenkins는 정해진 절차대로 자동 실행되기 때문에 이런 실수를 줄일 ..

Study 2026.05.11

로그 레벨

로그 레벨이란?로그 레벨은 로그의 중요도나 목적에 따라로그를 구분해서 남기는 기준이다.모든 로그가 같은 의미를 가지는 것은 아니다.단순히 흐름을 확인하기 위한 로그도 있고,문제가 발생했을 때 반드시 확인해야 하는 로그도 있다.그래서 로그를 남길 때는 상황에 맞게info, warn, error 같은 레벨을 구분해서 사용한다. 로그 레벨을 나누는 이유로그 레벨을 나누지 않고 모든 내용을 똑같이 남기면중요한 로그와 덜 중요한 로그를 구분하기 어렵다.예를 들어 정상적인 요청 처리 로그와실제 장애가 발생한 로그가 같은 수준으로 남는다면,문제가 생겼을 때 원인을 찾기 힘들어진다.로그 레벨을 나누면 다음과 같은 장점이 있다.정상 흐름과 오류 상황을 구분할 수 있다운영 환경에서 필요한 로그만 확인할 수 있다문제가 발생..

Study 2026.05.10

로그 찍기의 중요성

로그란?로그는 애플리케이션이 실행되는 동안어떤 일이 발생했는지 기록해두는 정보이다.예를 들면 다음과 같은 내용을 남길 수 있다.log.info("계좌 생성 요청 userId={}", userId);log.error("계좌 생성 실패 userId={}", userId, e);단순히 코드가 실행됐는지 확인하는 용도뿐만 아니라,나중에 문제가 발생했을 때 원인을 찾기 위한 기록으로 사용된다. 왜 로그가 중요할까?개발 중에는 디버거를 사용해서 코드를 한 줄씩 확인할 수 있다.하지만 실제 서버에서는 사용자의 요청이 계속 들어오고,문제가 언제 어디서 발생했는지 바로 알기 어렵다.이때 로그가 없으면 다음과 같은 문제가 생긴다.요청이 들어왔는지 모름어디서 실패했는지 모름어떤 데이터로 실패했는지 모름예외가 왜 발생했는지 ..

Study 2026.05.09

Redis로 분산락 거는 방법

어제는 분산락이 왜 필요한지 정리했다.오늘은 Redis를 사용해서 분산락을 어떻게 거는지 간단히 정리해보려고 한다.락의 기준 정하기 분산락을 걸 때는 먼저 무엇을 기준으로 잠글지 정해야 한다.주식 매수 기능에서는 같은 계좌의 잔액이 동시에 변경되면 문제가 생길 수 있다.그래서 계좌 ID 기준으로 락을 걸 수 있다.lock:account:{accountId} 예를 들어 계좌 ID가 1이면 다음 key를 사용한다.lock:account:1Redis로 락 걸기Redis에서는 보통 SET NX EX 방식을 사용한다.SET lock:account:1 random-value NX EX 3 NX는 key가 없을 때만 저장한다는 의미이다.이미 같은 key가 있으면 락 획득에 실패한다.EX 3은 3초 뒤에 락이 자동으로..

Study 2026.05.07

분산락

분산락이란?분산락은 여러 서버나 여러 프로세스가 동시에 같은 자원에 접근하지 못하도록 막는 잠금 방식이다.일반적인 synchronized나 Java Lock은 하나의 애플리케이션 안에서는 동작하지만, 서버가 여러 대로 늘어나면 한계가 있다.예를 들어 서버가 1대라면 아래처럼 처리할 수 있다.synchronized void buyStock() { // 매수 처리}하지만 서버가 2대 이상이면 문제가 생긴다.사용자 요청 1 → asset-service 서버 A사용자 요청 2 → asset-service 서버 B이 경우 서버 A와 서버 B는 서로의 메모리를 공유하지 않는다.그래서 서버 A에서 락을 걸어도 서버 B는 그 사실을 모른다.이럴 때 Redis같은 외부 저장소를 이용해서 여러 서버가 공통으로 확인..

Study 2026.05.06

N+1문제

오늘은 개발에서 자주 언급되는 N+1 문제에 대해 정리했다.N+1 문제는 어떤 데이터를 한 번 조회한 뒤,그 데이터와 관련된 정보를 가져오기 위해 추가 요청이 여러 번 반복되는 문제를 말한다.여기서 N은 처음 조회한 데이터의 개수이고,+1은 처음 데이터를 조회한 요청 1번을 의미한다.즉, 처음 목록을 가져오기 위한 요청 1번과목록에 포함된 각 데이터의 추가 정보를 가져오기 위한 요청 N번이 더해져총 N+1번의 요청이 발생하는 상황이다.예시로 이해하기예를 들어 게시글 목록과 작성자 정보를 화면에 보여줘야 한다고 해보자.먼저 게시글 목록을 가져온다.게시글 목록 조회 1번 조회 결과가 5개라면 다음과 같은 게시글이 있다고 볼 수 있다.게시글 1게시글 2게시글 3게시글 4게시글 5 그런데 각 게시글의 작성자 이..

Study 2026.05.05

Redis Sorted Set

Redis Sorted Set이란?Redis의 Sorted Set은 데이터를 저장할 때 각 값마다 score를 함께 저장하는 자료구조이다.일반 Set처럼 중복된 값은 허용하지 않지만, 각 값에 숫자 점수를 붙여서 score 기준으로 정렬할 수 있다.member + score 예를 들면 다음과 같다.apple 10banana 20orange 15 이 데이터는 score를 기준으로 정렬된다.apple → 10orange → 15banana → 20 Set과 Sorted Set의 차이중복 허용XX정렬 기준없음score저장 형태membermember + scoreSet은 단순히 중복 없는 값을 저장한다.Sorted Set은 중복 없는 값을 저장하면서, score를 기준으로 정렬까지 할 수 있다. 핵심 개념m..

Study 2026.05.02

WebSocket & 실시간 통신

WebSocket & 실시간 통신이란?실시간 통신은 사용자가 새로고침하지 않아도 서버의 변경 사항을 바로 클라이언트에 전달하는 방식이다.일반적인 HTTP 통신은 클라이언트가 서버에 요청을 보내고, 서버가 그 요청에 응답하는 구조이다.하지만 알림, 채팅, 주식 가격 변경, 주문 상태 변경 같은 기능은 서버에서 변경이 발생했을 떄 클라이언트가 바로 알아야 한다.이런 기능을 구현하기 위해 Polling, SSE, Websocket 같은 방식이 사용된다. 왜 사용하는가?일반 HTTP 방식만 사용하면 서버에 새로운 데이터가 생겨도 클라이언트가 다시 요청하기 전까지는 알 수 없다.예를 들어 새 알림이 생겼더라도 사용자가 새로고침하지 않으면 화면에 바로 표시되지 않는다.이 문제를 해결하기 위해 실시간 통신 방식을 사..

Study 2026.05.01