전체 글

머리박기를 잘하는 나는 딱따구리
· Infra
이전엔 내가 손으로 AWS에 코드를 배포했다. 하지만, 실제로 프로젝트를 진행하면 Infra 담당자가 전부 CI/CD 파이프라인을 구축해줬다. 내가 그 일을 언젠가 할 수도 있기에 코드를 `push`하면 자동으로 AWS에 반영되도록 CI/CD 파이프라인을 구축해보려고 한다. 1. 전체 아키텍처 및 데이터 흐름 (Architecture Overview)1. git push개발자가 로컬 컴퓨터(Local)에서 코드를 작성하고 Github 원격 저장소로 `git push`를 수행한다. 이 `git push`가 Github Actions의 Webhook을 통해 배포 파이프라인의 트리거 역할을 한다. 2. build docker imageGithub Actions가 임시 가상 머신(Runner)을 할당받아 작업을..
· Java
프로그래머스에서 진행하는 PCCP 정기 시험을 친구들과 같이 봤다. 싸피 과정이 끝나고 우리의 실력이 객관적으로 어느 정도인지 궁금했기 때문이다. 최근엔 기업 코테도 뜸했던 차에 PCCP 정기 시험으로 우리 수준을 점검해보기로 했다. PCCP(Programmers Certified Coding Professional)란?그렙에서 만든 코딩전문역량인증 자격증이다. 그렙은 프로그래머스, 모니토를 운영중인 회사이다. 과거엔 채용사항에 우대가 좀 있던 것 같지만 최근엔 많이 사라졌다고 알고 있다. 시험 안내시험시간: 120분문항수: 4문항시험과목: Python, JavaScript, Java, C, C++, C# (나는 Java를 선택했다.)방식: 비대면 (모니토 앱 사용)기존 기업 코테에서 익숙하게 쓰던 모니..
· Network
HTTP 메서드 스펙상 `POST`는 멱등성을 보장하지 않는다. 하지만 결제나 포인트 충전 같은 민감한 로직에선 네트워크 지연이나 사용자의 실수로 인한 중복 처리를 반드시 막아야 한다. 이를 멱등키를 적용해 구현할 수 있다는 사실을 알게 되었다. 그래서 한번 실험해보려고 한다. 사용자의 포인트를 충전하기 위한 API를 만들어야 하고, 멱등키를 지원해야 한다는 상황이다.요구사항URL: `POST /api/v1/points/charge`Header: ` Idempotency-Key`: `String`Request Body: { "userId": 1, "amount": 1000}Response Body (성공 시):{ "status": "SUCCESS", "currentBalance": 1000, "..
· Infra
이전 글에서 만든 `docker-compose.yml`을 AWS 클라우드 환경에서 배포를 진행해보려 한다. 1. EC2 인스턴스 생성EC2를 검색해서 인스턴스 시작 버튼을 눌러보자.이름은 원하는 걸 적고, OS 이미지는 우분투를 선택했다. 💡우분투를 선택한 이유우분투는 리눅스 커널(엔진) + APT(앱스토어)가 추가된 OS이다. 서버 개발자들이 가장 많이 사용하기 때문에 구글링 했을 때 자료가 압도적으로 많고, 초심자가 문제 해결을 하기 쉬워서 선택했다. 키 페어도 생성하자.💡키 페어란?서버의 보안을 위한 '디지털 자물쇠와 열쇠'이다. 공개 키(자물쇠): AWS 서버에 저장된다.개인 키(열쇠): 내 컴퓨터에 .pem 파일로 저장된다.비밀번호 입력 방식보다 훨씬 안전하며, 이 `.pem`파일을 잃어버리..
· Infra
시작하기 전에그동안 프로젝트를 진행하며 docker-compose.yml은 AI를 사용해서 작성하거나 인프라 팀에게 받아쓰기만 했다. 인프라쪽을 잘 몰랐기 때문에, 팀을 만들 때도 이런 부분을 채워줄 수 있는 팀원을 구했는데 다시 생각해보면 인프라를 하기가 무서웠다. 멋진 비즈니스 로직을 작성하는게 아닌 데이터베이스 백업, 스키마 변경, 서버 세팅 등은 잘하면 안정적으로 서비스가 돌아가지만 실수하면 서비스 장애로 이어지는 부담스러운 작업이기 때문이다. (다시 생각해보면 그만큼 중요한 작업이다.)하지만 개인이 하고 싶은 일 보다 팀에 도움이 되는 개발을 해야 한다고 생각한다. 따라서, SSAFY의 공식 일정이 끝난 지금부터 DevOps에 대한 공부와 팀을 위한 플랫폼 엔지니어링을 하기 위한 공부를 시작하려..
· Network
백엔드 개발자로서 HTTPS가 안전하다는 것은 누구나 안다. 하지만 "HTTPS 통신 중 서버의 개인키(Private Key)가 탈취되면 과거의 데이터는 안전한가?"라는 질문을 받는다면 자신 있게 대답할 수 있을까? 오늘은 단순히 HTTPS의 흐름을 넘어, RSA와 Diffie-Hellman(ECDHE)의 결정적 차이, 완전 순방향 비밀성(PFS)의 원리에 대해 정리해 본다. 1. 키 교환의 두 가지 경우: RSA vs Diffie-HellmanHTTPS 핸드쉐이크의 핵심은 "데이터를 암호화할 대칭키를 어떻게 안전하게 나눠가질 것인가?"이다. 여기엔 크게 두 가지 방식이 있다. RSARSA는 클라이언트가 직접 키를 만들어 교환한다. 클라이언트가 PMS(Pre-Master Secret)를 생성한 뒤, 서버..
· Spring
평소에 DTO에서 `from(Entity entity)`메서드를 만들어 사용하고 있었다.코드 리뷰를 하며, '이 코드에서 DTO와 Entity의 변환에 대한 책임은 누구에게 있나요?'라는 질문에 답을 하지 못했다. 다시 생각해보니 DTO가 두 가지 책임을 동시에 가지고 있었다:Presentation 계층의 데이터 구조 역할Entity 변환 로직 처리단일 책임 원칙(SRP)을 위반하고 있었다. 더 큰 문제는 Presentation 계층(DTO)이 Domain 계층(Entity)을 직접 의존한다는 점이었다. 간단한 매핑이기 때문에 Mapper는 오버엔지니어링이라고 생각했지만, 계층 간 경계를 무너뜨리는 기본을 안 지킨 설계였다. 구체적으로 왜 DTO에서의 변환은 잘못된 것인지 알아보고, 앞으론 어떻게 작성..
· Java
프로젝트를 진행하며, Redis Stream에 객체를 넣을 때 직렬화를 해서 넣지 않아 에러가 발생했다. 평소에도 직렬화, 역직렬화를 듣긴 했지만 마주할 일이 없었기 때문에, 이번 기회에 정리해보고자 한다. 직렬화란?자바 직렬화는 JVM 힙 메모리에 있는 객체 상태(인스턴스 필드 값)를 바이트 시퀀스로 변환하는 과정이다. 메모리의 객체는 객체 그래프 구조인데, 이를 네트워크로 전송하거나 파일로 저장하려면 연속된 바이트 시퀀스로 변환해야 한다. 바이트 스트림은 뭘까?바이트 스트림은 데이터를 연속된 바이트로 전송 방식이다. 자바는 모든 입출력을 '스트림'이라는 추상화로 다루는데, 이는 데이터가 흐르는 단방향 통로와 같다. 스트림을 통해 바이트 시퀀스가 소스에서 목적지로 순차적으로 전달된다.모든 컴퓨터 ..
Ukjong
나는 딱따구리 개발자