전체 글

Studio
· Backend
API를 만들고 PR을 올리는 동안 GitHub Actions가 검사와 배포를 이어서 처리해 주었다. 성공 표시를 확인하고 다음 작업으로 넘어가던 어느 날, Actions 실행을 잠시 로컬로 옮겨야 했다. 그때부터 내가 쓰고 있던 CI/CD가 정확히 무엇인지 궁금해졌다.PR을 올리기 전에 검사를 한다면 그 명령은 어디서 실행될까? YAML의 첫 줄부터 GitHub 컴퓨터가 실행할까? 머지와 배포는 어떻게 이어질까? 내 맥북에서도 같은 일을 할 수 있다면 GitHub는 그동안 어떤 부분을 맡고 있었을까?설정 파일과 실행 기록을 따라가며 이해한 내용을 정리했다. 예제는 Java·Gradle 백엔드와 Docker 배포를 기준으로 단순화했다. 실제 서비스의 계정, 저장소, 서버 주소, 비밀값과 내부 운영 코드는..
· Backend
기존에 Google 로그인을 구현한 상태에서 Apple 로그인을 붙이기 시작했다. Apple Developer 설정을 마치고 .p8 키 파일도 전달받았다. 이제 기존 로그인 흐름에 연결할 차례라고 생각했는데, 파일 하나를 앞에 두고 질문이 연달아 생겼다.이 키는 누구를 증명할까? 로컬에 받은 파일을 서버 프로그램은 어떻게 읽을까? Apple이 돌려준 토큰과 내가 발급하는 토큰은 각각 어디에 쓸까? 코드를 교환하다가 응답이 유실되면 어떤 순서로 다시 시작해야 할까?구현한 코드를 천천히 읽고 질문을 따라가며 정리해 보았다. 이 글은 백엔드 개발자의 관점에서 남기는 구현과 리뷰 기록이다. 코드와 경로는 설명에 필요한 부분만 일반화했다. 현재는 코드 구현, 합성 키를 사용한 테스트, 빌드와 코드 리뷰까지 진행했..
· Backend
DB 구조와 설계 문서를 대조하다가, 최종 수강신청 외에 신청을 처리하는 중간 기록도 필요하다는 이야기를 만났다. 처음에는 잘 이해되지 않았다. 신청 테이블이 있는데 왜 비슷한 테이블이 또 필요한 걸까?실패하면 다시 시도하면 되지 않을까? 트랜잭션으로 묶으면 끝 아닌가? 사용자가 그냥 나가면 누가 정리하지? 질문 하나에 답을 얻으면 다음 질문이 생겼다. 나중에는 어디서 시작한 고민인지 놓칠 정도여서, 그 흐름 자체를 남겨보려고 한다.이 글은 구현을 완료한 뒤 작성한 성능·장애 대응 후기가 아니다. 수강신청 설계를 이해하며 던진 질문과 현재의 이해를 정리한 기록이다. 예시는 일반화했으며, 실제 카드 결제·환불이 아닌 신청 당시 금액 보존을 다룬다.1. 신청 테이블이 있는데 처리 기록은 왜 또 필요할까?예시..
· CS/Algorithm
1. 개념 소개KMP 알고리즘은 본문(Text) S 안에서 패턴(P) 을 찾는 문자열 검색 알고리즘이다.틀렸을 때 무식하게 처음부터 다시 비교하지 않고, 이미 비교해서 얻은 정보(LPS) 로 패턴을 점프한다.그래서 최악의 경우에도 O(N + M) (N=본문 길이, M=패턴 길이)필자는 이해하는데 무려 3일이라는 시간이 걸렸다......비교 요약완전탐색(브루트포스)은 “한 칸 밀고 처음부터 다시”KMP는 “겹친 만큼은 건너뛰고 다음 비교로”2. 주요 용어용어의미LPS, 실패함수, 실패 배열KMP 알고리즘에서 매칭 실패 시, 패턴을 얼마나 건너뛸 수 있는지를 알려주는 역할접두사문자열의 시작에서부터 연속된 부분 문자열. 예: "ABC"의 접두사는 "", "A", "AB", "ABC"접미사문자열의 끝에서부터 연..
0. 주의사항사실 이 문제는 나머지 연산을 사용하면 쉽게 풀 수 있습니다.이 글은 큰 수의 나누기 연산에서 소수점을 정밀하게 구할 수 있는 방법을 소개합니다.이 문제를 풀 때, 논리가 너무 인상적이었어서 기록하고 싶어서 작성합니다.1. 문제소개1-1. 요구사항세 정수 a, b, c가 주어짐 (1 => 두 수를 곱할 경우 int로는 터짐오차가 10^(-6) 이하가 되도록 a * b / c를 계산해야 함1-2. 입력값과 출력값123456789 987654321 7유일한 줄에 세 정수 a, b, c가 하나의 공백을 두고 주어짐하나의 소수를 출력함 (오차가 10^(-6) 이하가 되도록)1-3. 문제조건단순 double 형으로 문제를 풀 수 없음소수점이 전부 .000000 으로 나오는 정밀도 문제가 발생함..
📦 JavaScript에서 상속(Inheritance) 구조1. 개요JavaScript는 클래스 기반 상속이 아닌 프로토타입 기반 상속을 사용한다.객체는 자신의 프로퍼티에 없으면 proto 를 따라 부모의 프로퍼티를 탐색한다.함수의 prototype과 인스턴스의 __proto__를 연결함으로써 상속 구조가 형성된다.2. 상속의 목적과 개념공통된 속성 및 메서드를 재사용하여 객체 간 중복 제거하위 객체가 상위 객체의 메서드 및 속성에 접근할 수 있도록 상속 체계를 만든다JavaScript에서는 __proto__ 체인을 통해 메서드를 찾아간다3. 프로토타입 기반 상속의 원리function Person(name) { this.name = name;}Person.prototype.introduce = fun..
새벽녹차
DAWNTEA_STUDIO