| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- FROM DUAL
- 초보용 무한스크롤
- 코딩테스트
- 다항식 더하기
- 프로그래머스스쿨코테
- 공원 산택
- 코딩
- 동적인음악플레이어
- SQL DB 연동
- 프로그래머스 스쿨
- SQL기본구문
- oracledb
- replace 메서드
- 오라클코테
- 프로그래머스 스쿨 코딩테스트
- 풀이정리
- DB다루는법
- DB연동 연습
- string으로 적힌 숫자끼리의 뺄셈
- SQL WHERE조건문
- 코테 레벨1
- 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분
- Spring에러처리
- 구슬을 나누는 경우의수
- JOIN 사용법
- 프로그래머스스쿨 코테
- 프로그래머스스쿨 코딩테스트
- 사운드플레이어
- #BigInteger
- 이상한문자열만들기
- Today
- Total
목록전체 글 (196)
log my life
캠핑장 예약 사이트를 하나 열었다. 이름은 캠핑하자, 주소는 www.example.com 이라고 하자.배포하고 한 달이 지났는데 네이버에 이름을 쳐도 안 나왔다.처음엔 기다리면 알아서 잡히는 줄 알았다.결론부터 말하면 검색엔진 등록은 신청서 한 장이 아니라, 서버에 파일 몇 개를 두고 콘솔에 알려주는 일이다.그리고 그 파일들이 서로 말이 안 맞으면 등록을 해도 안 잡힌다.이 글은 사이트를 구글·네이버에 올리기 위해 서버에서 할 일과 콘솔에서 할 일을 정리한 기록이다.1. 검색엔진은 사이트를 어떻게 찾는가그림 1. 수집 → 색인 → 노출검색엔진이 하는 일은 세 단계다.단계하는 일내가 줄 수 있는 것① 수집 (crawl)크롤러가 페이지를 읽는다robots.txt, sitemap.xml② 색인 (index)읽..
로그인 기능 MR 을 올리려다 커밋 목록을 봤다.오타 수정, wip, 오타 수정2.작업할 땐 몰랐는데 남이 볼 기록으로 보니 좀 부끄러웠다.처음엔 "커밋을 합친다" 는 게 코드를 건드리는 일인 줄 알았다.결론부터 말하면 squash 는 코드는 그대로 두고 기록만 다시 묶는 일이다.진짜 조심할 건 squash 자체가 아니라 이미 push 한 브랜치를 다시 쓰는 것이다.이 글은 squash 를 그림으로 먼저 보고, 터미널에서 한 단계씩 따라간 다음, GitLab 에서 체크박스 하나로 끝내는 방법까지 정리한 기록이다.1. 무엇이 바뀌는가 — 그림부터정의보다 그림을 먼저 본다. 수업할 때도 공식보다 그래프를 먼저 그렸다.그림 1. squash 전후의 커밋 그래프그림 1 의 왼쪽이 지금 상태다. 주황 점 6개가 ..
dev 서버를 하나 더 띄워야 했다. 기존 인스턴스는 pm2 로 돌고 있었는데, 이번 건은 Docker 로 감싸고 nginx 앞단에 블루그린 전환까지 붙이기로 했다. 운영에 적용하기 전 리허설이 목적이었다.처음엔 반나절이면 될 줄 알았다. Dockerfile 쓰고, 컨테이너 띄우고, nginx 설정 하나 추가하면 끝 아닌가.결론부터 말하면, 블루그린 전환 로직 자체는 셸 스크립트 30줄이었다. 시간을 다 먹은 건 두 가지였다. 앞단 구조가 어떻게 생겼는지 알아내는 일, 그리고 package.json 이 거짓말을 하고 있던 것.이 글은 그 과정의 기록이다. 특히 기존 환경 위에 새 인스턴스를 얹을 때 뭘 먼저 확인해야 하는지에 대한 지도다.1. 앞단이 어떻게 생겼는지부터 몰랐다서버 상태는 이랬다.Mem: ..
DB 안에서 돌던 암복호화를 Node 앱으로 올렸다. 그랬더니 목록 화면이 느려졌다.범인은 암복호화 연산이 아니라, 값 하나마다 계층 경계를 네 번씩 건너던 것이었다.이 글은 두 가지를 같이 담는다. 하나는 JNI 가 뭐고 왜 비싼가 를 처음부터 푸는 것, 다른 하나는 그걸 알고 나서 71배를 줄인 과정이다.JNI 라는 단어를 이번에 처음 제대로 들여다봤다. 그동안은 "자바가 C 코드 부르는 거" 정도로만 알고 넘어갔는데, 이번 최적화는 그 한 줄짜리 이해로는 절대 못 했을 것이다. 그래서 2장에 개념을 길게 풀었다. 아는 내용이면 건너뛰어도 된다.※ 벤더명은 가렸다. 이하 상용 암호화 솔루션을 XCrypt 라고 부른다.1. 배경 — 왜 앱으로 올려야 했나기존 시스템은 MySQL 에 UDF(User De..
VM 위에서 직접 돌리던 MySQL 을 네이버 클라우드 Cloud DB for MySQL(이하 CDB)로 옮기게 됐다. 처음엔 단순하게 생각했다. 덤프 뜨고, 옮기고, 붓는다. 데이터도 12GB 밖에 안 된다.결론부터 말하면 데이터 크기는 아무 문제가 아니었다. 시간을 잡아먹은 건 전부 다른 데 있었다. 관리형 DB 라서 못 하는 것들, 콘솔에서만 되는 것들, 그리고 덤프 파일 안에 박혀 있던 계정 이름 하나.이 글은 그 과정을 순서대로 정리한 기록이다. 같은 걸 하려는 사람이 나처럼 중간에 멈추지 않도록.1. 시작 전 상황원본: VM 위의 MySQL 8.0.41 (마스터 1대 + 슬레이브 1대)타겟: Cloud DB for MySQL 8.0.42 (고가용성 구성, 2vCPU / 4GB)데이터: data..
AWS 없이, 집에 있는 PC 한 대로 테스트 서버와 라이브 서버를 따로 굴려보는 기록입니다. 총 3편으로 나눠서 씁니다.1편 — 왜 로컬이고, 어떤 사양으로 시작했나 (이 글)2편 — 라이브 DB를 매주 테스트 DB로 복사하기3편 — 내 PC에서 내 PC를 때려서 성능 측정하기1. 이 글을 쓰게 된 이유실무를 하다 보면 이런 순간이 옵니다. 기능 하나 만들고 나서 팀원한테 확인을 받아야 하는데, 확인시킬 데가 내 로컬밖에 없는 상황이요. 로컬에서 서버를 띄우고, 사설 IP를 알려주고, "지금 켜뒀으니까 봐주세요" 하고 부탁합니다. 그 사이에 브랜치를 바꾸면 상대방 화면이 깨지고요.테스트 서버가 따로 있으면 안 겪을 일입니다. 그런데 테스트 서버를 "만들어 본" 경험과 "쓰기만 한" 경험은 완전히 다르더..
※ 무엇이 문제였는가?캘린더나 스케줄 관련 기능을 만들다 보면 "이 날이 공휴일인가?"를 판단해야 할 일이 생긴다.양력 고정 공휴일(신정, 삼일절, 어린이날 …)은 그냥 상수로 박으면 끝이지만 문제는 두 가지다.음력 공휴일 — 설날, 부처님오신날, 추석은 매년 양력 날짜가 바뀐다.대체공휴일 — 공휴일이 주말이나 다른 공휴일과 겹치면 뒤로 밀린다. 이게 규칙이 은근히 까다롭다.공공데이터포털의 특일 정보 API를 쓰면 되긴 하는데, 외부 API 의존이 생기고 키 관리에 장애 대응까지 딸려온다.사내망처럼 외부로 못 나가는 환경이면 아예 쓸 수도 없다.그래서 의존성 0, 파일 하나로 연도만 넣으면 그 해의 대체공휴일 배열을 뱉는 모듈을 만들었다.1. 대체공휴일 규칙 정리근거는 관공서의 공휴일에 관한 규정 제3조..
PM2 를 다루면서 Node 프로젝트를 운영하다 보니,정작 Node.js 자체를 제대로 정리한 적이 없다는 걸 깨달았다.평소엔 Spring 을 쓰는 입장이라, 이번 글은 Spring 개발자의 눈으로 본 Node.js 정리다.Java 와 JavaScript 는 뭐가 다른가Node 는 코드부터 네트워크 레벨까지 어떻게 도는가 (Spring 과 비교)package.json 과 ecosystem.config.js 는 각각 왜 있는가Express 는 뭐고 왜 쓰는가이렇게 만든 프로젝트를 서버에 어떻게 배포하는가1. Java 와 JavaScript - 이름만 닮은 남남결론부터: 둘은 기술적으로 아무 관계가 없다.1995년 넷스케이프가 새 스크립트 언어를 내놓으면서, 당시 최고 인기였던 Java 의 이름을마케팅 목적..
PM2 로그를 정리하다가 문득 이런 의문이 들었다.Java 에서는 System.out.println 이 락을 걸어서 운영 코드에 안 쓰는데,Node 의 console.log 도 똑같은 문제가 있는 거 아닌가?결론부터 말하면 아니다. 두 언어는 애초에 구현 방식이 다르다.이번 글은 "어떤 식으로 구현되어 있길래 다른가" 를 소스 레벨까지 내려가서 정리한 기록이다.1. 먼저 그림으로 비교위 (Java) : 스레드 여러 개가 락 하나를 두고 줄을 서고, 락을 잡은 스레드는 블로킹 I/O 가 끝날 때까지 락을 못 놓는다. I/O 가 느려지는 순간 뒤에 선 스레드 전부가 멈춘다.아래 (Node) : 스레드가 하나뿐이라 줄 설 상대가 없다. 락이라는 개념 자체가 등장하지 않는다.대신 직렬화(객체 → 문자열)만 동기..
지난 글에서 PM2 가 무엇이고 어디까지 관리해주는지 정리했다.그런데 실제로 써보니 또 새로운 질문들이 생겼다.pm2 라는 명령어는 대체 뭘로 만들어진 건가?이거 오픈소스 라이브러리인가, 패키지인가?console.log 랑 logger 로 찍은 로그는 각각 어디서 보는 건가?실서버 반영은 매번 서버 들어가서 해야 하나?이번 글은 이 궁금증들을 하나씩 해소한 기록이다.1. pm2 는 어떤 CLI 인가?pm2 명령어 자체가 Node.js 로 만들어진 CLI 프로그램이고,명령어 파싱에는 commander.js 를 사용한다.npm 에서 pm2 패키지의 의존성 목록을 열어보면 commander 가 들어있다.pm2 start app.js --name my-api 처럼 옵션을 해석하는 부분이 전부 commander...
