| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- JOIN 사용법
- 동적인음악플레이어
- 프로그래머스스쿨 코테
- 코딩테스트
- 풀이정리
- SQL DB 연동
- 공원 산택
- DB연동 연습
- 프로그래머스스쿨 코딩테스트
- #BigInteger
- 프로그래머스 스쿨 코딩테스트
- oracledb
- 사운드플레이어
- 프로그래머스스쿨코테
- 이상한문자열만들기
- string으로 적힌 숫자끼리의 뺄셈
- 코딩
- 초보용 무한스크롤
- 프로그래머스 스쿨
- SQL기본구문
- 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분
- 다항식 더하기
- 구슬을 나누는 경우의수
- replace 메서드
- 오라클코테
- 코테 레벨1
- Spring에러처리
- SQL WHERE조건문
- DB다루는법
- FROM DUAL
- Today
- Total
목록전체 글 (193)
log my life
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...
PM2 는 무엇이고 어디까지 관리해주는가서버에서 node 프로젝트를 돌리다 보면 한 번쯤 겪는 상황이 있다.터미널에서 node app.js 로 서버를 띄웠는데터미널을 닫으니 서버도 같이 죽어버린다.또는 새벽에 에러 하나로 프로세스가 죽어서 아침까지 서비스가 내려가 있던 경우.이걸 해결해주는 게 PM2 다.1. PM2 란?Node.js 애플리케이션을 백그라운드에서 계속 살아있게 관리해주는 프로세스 매니저(Process Manager)한 줄로 정리하면 "앱을 대신 돌봐주는 관리자" 다.터미널을 닫아도 프로세스가 계속 돌아감 (데몬화)앱이 죽으면 자동으로 재시작서버가 재부팅되어도 등록해둔 앱을 자동으로 다시 띄움즉 node app.js 는 "실행" 만 해주지만PM2 는 실행 + 감시 + 복구까지 해준다.설치는..
※무엇이 문제였는가? 다운로드를 구현할때 직접 NAS를 통해 다운로드하거나niginx의 서버가 설정되어 실시간으로 streaming을 통해 다운로드를 할 경우 에는다운로드의 진행상황이 바로 브라우저에 보이게된다. 그러나 그렇지않은 경우, 예를들어 nginx에서 streaming을 위한 chunk설정이 막혀있거나, header의 전달이 제한되는 환경 등.. 다운로드진행이 서버, 또는 백엔드에서 바이트를 모두 모은 후 브라우저로 전달하기에 다운로드에 대한 UX가 좋지않아파일 용량이 클 경우 아무 반응이 없다가 다운로드가 완료되었다 뜨게되어 사용자입장에선 다운로드가 진행중인지 알 수가 없다. 이를 위해 UI에 로딩을 주어 현재 다운로드가 진행중임을 보이며, 다운로드가 완료될 경우 로딩을 화면에서 제거하여다운로..
MyBatis를 사용하다 보면 아래와 같은 상황을 자주 겪는다. try { mapper.selectUser(id);} catch (SQLException e) { ...} 그런데 컴파일 시 다음 에러가 발생한다.unreachable catch block for SQLException실제로 DB를 타고 쿼리를 날리는데 왜 SQLException 이 unreachable 인지 헷갈릴 수 있다.결론부터 말하면 컴파일러 기준과 MyBatis 예외 구조 때문이다.1. unreachable catch block 이란?자바 컴파일러는 catch 블록에 대해 다음 기준으로 판단한다.try 블록 안에서 해당 예외 타입이“컴파일 타임 기준으로” 발생할 가능성이 전혀 없을 때중요한 포인트는 다음과 같다.런타임에서..