전체 글 164

[Domain Model / Persistence Model] Model 분리와 VO에 대한 간단한 깨달음

아름다운 코드 난 도메인별 책임, 레이어별 책임을 상당히 많이 고민한다.깔끔하게 책임이 분리되고, 그에 알맞는 아름다운 코드가 작성되면 희열을 느끼기 때문이다. 이런 고민이 누군가에게는 상당히 쓸데없는 고민이고, 비효율적이라 보일 수도 있지만.. 어쩌겠는가? 내 성격이 그런걸.. 그렇지만, 이런 고민은 비단 '아름다움'만을 위한 고민이 아니라는 것은 자신있게 말할 수 있다. 아름다운 코드란, 판단의 기준점을 시스템적으로 강제하여 일관성 있는 코드를 작성할 수 있게 해주고, 시간이 지나도 어디서 무엇을 고쳐야 하는지 빠르게 드러나게 해준다. 특히 도메인 정책이 커질수록 이 기준은 더 중요해진다.“이 검증은 어디서 해야 맞는가?” 같은 질문에 흔들리지 않으려면, 모델과 레이어의 책임을 먼저 분리해두는 편..

WIL(What I Learned) - Round1. 루퍼스 합류, TDD

Loopers 합류 루퍼스에 합류했다. 이전부터 고민을 쭈욱 해왔지만, 막상 합류하게 된건 충동적이었다. 당시 면접이란 면접은 다 떨어져서 실력에 대한 회의감이 들었는데, 그 와중에 스터디원중 두 분이나 루퍼스에 새로 합류하신다기에 나만 뒤떨어지는것은 아닌가 라는 불안감이 엄습했다. 거기다 멘토진중 한분은 이전부터 개발자 오픈톡방에서 많이 봐왔기에 신뢰가 가기도 했었고, 이미 1기로 수료했던 다른 스터디원분의 영업도 선택에 영향을 미쳤다. 하지만 가장 큰 영향을 미친건, '이대로 가만히 있으면 아무것도 변하지 않을 것 같다' 라는 생각이었다. 주위에 꽤 훌륭한 개발자 지인들이 있는데, 다들 사비 들여서 교육을 받지 않고도 좋은 회사를 갔고, 실력도 훌륭하신 분들이다. 그래서 나도 모르게 '그분들처럼 돈..

회고록 2026.02.08

[Test Code] '대-AI 시대'에서 안정성을 보장하는 방법에 관한 고찰(feat.TDD)

대 AI 시대 웹에서 질문하던 시절 → IDE로 들어온 순간예전에는 웹에서 AI에게 질문하고, 나온 스니펫을 복사해서 붙여넣는 방식이 거의 전부였다. 그런데 2025년 6월 4일, Cursor 1.0의 등장으로 흐름이 완전히 바뀌었다. IDE 안에서 바로 “의도 → 수정 → 적용”이 닫힌 루프로 돌아가니까, 웹 기반 질의응답이랑은 비교가 안 될 정도로 생산성이 올라갔다.이후 대부분의 AI들이 웹 형태를 벗어나 IDE에 통합된 Agent로 진화했고, Claude도 그 흐름에 올라탔다. Claude 쪽에서는 2025년 2월 24일 Claude Code가 공개되면서, “브라우저가 아니라 개발 환경 안에서 실행되는 Claude”가 현실이 됐다.즉, AI는 더 이상 ‘검색/질문 도구’가 아니라 개발 워크플로..

[Network] HTTP (CS스터디 1주차)

HTTP란? 정의웹(WWW, Wolrd Wide Web)에서 Client와 Server간에 데이터를 주고받기 위해 등장한 프로토콜로, 원활하고 일관성있는 통신을 위한 규칙이다서로 다른 시스템 간 통신에서 요청과 응답의 형식, 처리 방식에 대한 공통 규칙이 없다면, 일관성있고 원활한 통신이 어렵기 때문에 이를 표준화하기 위해 정의되었다현재는 웹을 포함한 다양한 분산환경의 API 통신에서도 사용된다특징무상태(Stateless) 프로토콜 -> 따라서 각 요청은 독립적이고, 이전 요청을 기억하지 않는다요청-응답 모델 -> 클라이언트가 API 요청을 보내면, 서버에서 응답을 해주는 방식전송 가능한 데이터에는 다양한 종류가 있다 -> html, css, java script, png, gif, mp4, ...동..

Network 2026.01.11

[Network] 쿠키/세션 (CS스터디 1주차)

쿠키 (Cookie) 정의클라이언트(브라우저)에 저장되는 작은 데이터 조각특징브라우저에 '평문(문자열)'으로 저장되기 때문에, 개발자 도구를 통해 쉽게 확인할 수 있다또한 'HttpOnly'를 적용하지 않으면 JS로도 접근 가능하고, HTTPS를 적용하지 않으면 네트워크 전송 중 탈취 위험이 존재한다브라우저별로 크기 제한이 있고(약 4KB), 도메인당 쿠키의 갯수도 제한이 있다만료 시간을 설정할 수 있고, 브라우저가 종료되어도 유지될 수 있다동작서버로 요청을 보낼때마다, 브라우저의 쿠키를 자동으로 함께 전송한다종류세션 쿠키(Session Cookie)만료 시간(Expires/Max-Age)이 설정되지 않은 쿠키브라우저 프로세스(브라우저 세션)가 끝나면 완전히 종료된다ex) JSESSIONID영구 쿠키(..

Network 2026.01.09

[Scheduler/Monitoring] 리소스 측정을 통해 알아보는 문제 인식에 대한 고찰(1/2) (feat. '퍼센트의 함정' 깨부수기)

이전 글) https://kdh0518.tistory.com/99 [Task Scheduler] 불규칙적인 task 처리 (동적 스케줄링) + 영속성 처리불규칙적 상황? 동적 스케줄링? 개발을 진행하다 보면 특정 시점에 기능이 동작해야 하는 경우가 존재한다.trigger가 존재한다면 단순하게 trigger 메서드에서 target 메서드를 실행하면 되지만,kdh0518.tistory.com 문제 인식 Task Scheduler 글을 작성할 당시만 하더라도, 2026년 기준으로 하루 최대 144번 실행되던 메서드를, 평균 5.72회에서 최대 26회 실행되도록 줄임으로써 리소스를 81.9% ~ 96.0% 감소시켰다고 생각했다. 실제로 '실행 횟수'만 본다면 해당 수치만큼 감소된게 맞고, 실제 ..

[SSL] NginxProxyManager SSL 인증서 설정 에러 (feat. the domain's nameservers may be malfunctioning, Some challenges have failed)

DuckDNS에서 ec2 컨테이너에 무료 도메인을 할당 후, NginxProxyManager를 사용해서 SSL 인증서를 설정하려했다. 그런데 Internal Error 발생 !!똑같은 방식으로 다른 컨테이너 두 개에는 멀쩡하게 HTTPS 설정도 완료하고 접속도 잘 되는데, 얘는 왜이런걸까?? 바로 portainer 켜서 로그 확인ㄱㄱ 흠.. 그렇구나.. 너는 무언가를 하려고했지만 잘 안됐구나. 그래 고생했다.. "Saving debug log to /tmp/letsencrypt-log/letsencrypt.log. Some challenges have failed." 라고 하니까, 터미널로 해당 파일에 접속해서 에러 로그를 확인해보자. 오잉? DNS 문제라고? dig trace를 사용해서 ..

[백준/Java] 2487: 섞기 수열

문제: https://www.acmicpc.net/problem/2487 조건TimeLimit = 1s섞기 수열 = 1~N까지의 숫자로 이루어진 수열 (1섞기 = 기존 카드 배열에서, '섞기 수열'의 각 원소가 나타내는 위치에 있는 카드를 순서대로 뽑아서 나열하는 것'기존 카드 배열'에서 '섞기'를 진행할 때, 제일 처음 상태로 되돌아오는 '최소' 섞기 횟수는?단, 정답은 최대 20억이다 풀이완전탐색선택지가 따로 없어서 DFS/BFS 상관없이 그냥 탐색하면 됨N이 작아서 단순 탐색이 될 것만 같지만... 탐색 한번에 '섞기 횟수'가 +1 되는 것이므로, 정답이 최대 20억이라 단순 탐색으로는 절대 불가능몇 번 직접 예시를 그려보자-> 각 자리의 숫자마다, 제일 처음 상태로 돌아오기까지 필요한 '섞기 횟..

[백준/Java] 1726: 로봇

문제: https://www.acmicpc.net/problem/1726 조건TimeLimit = 2s로봇은 상,하,좌,우로 움직인다명령어는 두 종류가 있다Go k : 현재 방향으로 k만큼 이동한다. k는 1,2,3 중 하나이다Turn dir : dir로 90도만큼 회전시킨다. dir은 left와 right가 있다지도는 0(이동가능)과 1(이동불가능)으로 이루어져있다방향은 1,2,3,4가 각각 동서남북이다 (오른, 왼, 아래, 위)현재 위치와 방향이 주어질 때, 도착 위치와 도착 방향까지 필요한 명령어의 최소 횟수를 출력한다 풀이완전탐색최소/최단이므로 bfs 사용제자리에서 방향회전이 가능하므로 visited를 3차원 배열로 만들어서 사용하자-> visited[r][c][dir]nr, nc, nd 설정을..

[백준/Java] 17240: Team Selection

문제: https://www.acmicpc.net/problem/17240 조건TimeLimit = 1s역할군 5개, 후보자 n명 (5각 후보자별로 각 역할군 실력이 주어진다 (0~1000)후보자 n명중 5명을 뽑을 때, 역할군 실력의 합 최대를 출력하라 풀이완전탐색최단/최소가 아니니까 dfs(백트래킹)으로 가보자단순 선택/비선택으로 가면 O(2^2만)이므로 다르게 접근5개의 능력치중, 어떤 능력치를 최우선으로 뽑을지 선택하는 방향으로 가보자 (그리디하게)후보자 번호와 능력치를 매핑시켜두고, 각 능력치별로 정렬시켜서 방문처리이렇게하면 O(5! * 정렬비용)이므로 가능 코드import java.io.*;import java.util.*;public class Main { static BufferedRea..