jvm 기반 언어를 위한 jdk, sdk 설치 및 버전관리 도와주는 툴. 다른 언어의 비슷한 것으로는... 루비 rbenv, rvm (old) 노드 nvm python venv 설치 방법 curl -s "https://get.sdkman.io" | bash .zshrc 파일에 추가 export SDKMAN_DIR="$HOME/.sdkman" [[ -s "$SDKMAN_DIR/bin/sdkman-init.sh" ]] && source "$SDKMAN_DIR/bin/sdkman-init.sh" 버전 확인 sdk version 주요 명령어 현재 설치되어 있는 현황 확인 sdk current sdk current 특정 버전 사용하기 / default로 지정하기 sdk use scala 3.3.1 sdk defa..
챗지피티한테 물어봤던 golang 모듈에 관한 내용을 정리해두기. Go 모듈 시스템 - Go 1.11 버전에서 실험적인 기능으로 도입되었고, Go 1.13 버전에서는 공식적인 기능으로 채택 (모듈 시스템 이전) - $GOPATH 환경변수로 go 패키지를 관리하던 방식. (프로젝트 마다 다른 버전을 사용하기 어렵고, 버전 관리가 어렵다) - go get 명령어로 패키지 설치하고 $GOPATH/src 에 저장됨 (go 모듈 시스템) - 프로젝트 마다 go.mod 파일로 관리하는 방식 - go mod tidy 하면 프로젝트에서 사용중인 모듈만 $GOPATH/pkg/mod 디렉토리에 저장됨 환경변수 GO111MODULE => 모듈 시스템 사용 설정 on : 모듈 시스템 강제 활성화 off : 모듈 시스템 강제 ..
표준화된 multi-provider 인증 라이브러리 (미들웨어). 인증 서비스를 제공하고 싶은 provider는 omniauth strategy 클래스를 extend한 strategy를 작성해서 제공하면 된다. (파악하고 나니까 omniauth는 oauth2 Flow에서 레일즈 app을 찌르는 케이스를 미들웨어로 처리하기 위한 gem이다. 각 provider가 이걸 상속받아서 일관된 인터페이스로 여러 provider 인증 추가 가능.) 예를 들면 페이스북으로 로그인 하기 => https://github.com/simi/omniauth-facebook 네이버로 로그인하기 => https://github.com/kimsuelim/omniauth-naver 커뮤니티에서 관리중인 Strategy 리스트 omni..
📖 Real MySQL 책 내용 발췌... 스트리밍 방식 서버 쪽에서 처리해야 할 데이터가 얼마나 될지에 관계없이 조건에 일치하는 레코드가 검색될 때마다 바로바로 클라이언트로 전송해주는 방식. 클라는 쿼리 요청 후 곧바로 첫번째 레코드를 전달 받음. 마지막 레코드를 받는 시점은 알 수 없음. 클라이언트는 바로 데이터 가공 시작할 수 있음. 레코드 수에 상관 없이 빠른 응답 시간 보장 가능. 💡 클라이언트 도구, API에 따라 스트리밍 처리 방식이 다를 수 있음 JDBC => mysql 서버는 레코드를 읽자마자 클라이언트로 그 결과를 전달할 것이지만, JDBC가 mysql 서버로부터 받는 레코드를 일단 자체적인 버퍼에 모두 담아 두고, 마지막 레코드가 전달되면 그 때서야 비로소 클라이언트 어플리케이션에 반..
회사에서 발표했던 자료 😎 시연한 예제 코드 generator // feature1 ) pause - resume function* sampleGen(){ console.log('함수를 시작합니다') x = yield 1; console.log(`여기서부터 함수를 다시 시작해요. input = ${x}`) y = yield 2; console.log(`다시 시작~ ${y}`) } const gen1 = sampleGen() gen1.next() gen1.next(5) gen1.next(6) // feature2 ) iterator function* sampleGen2(){ for (let i=1; i coroutine (지역 변수 및 pc 값을 저장할 수 있는 초경량 실행 유닛) ---> async/aw..
yield 키워드 지난 yield 와 generator에 대한 글에서 제너레이터를 2가지 관점으로 바라봤었는데 1) 반복적으로 실행 flow를 pause, resume할 수 있는 경량(유저레벨) 스레드 같은 것. => cpu 스케줄 타임을 점유하는 문제와 관련되어 있다. => 코루틴 (일반적인 언어들) / Fiber (루비) 으로 연결된다. 2) 호출할 때마다 값을 하나씩 produce 함 (next로 호출, yield문을 만나면 caller에게 값을 돌려주고 멈춘다.) => memory를 효율적으로 사용하는 문제와 관련되어 있다. => 연산전에 모든 element를 메모리에 올릴 것인가? (전통적인 배열 같이) 아님 lazy하게 필요할 때 하나씩 갈 것인가? => stream processing 개념으..
배경 연동된 외부 재고 관리 시스템에서 주문을 마감하고 쌓인 정보를 가져가는 시각을 "오후 10시로 고정" 에서 "관리자가 시간을 설정할 수 있도록" 바꿔야 하는 요구사항이 있었다. 따라서 이와 같이 관리자가 설정한 스케줄 (주문 마감) 정보를 테이블에 저장하면 매일 새벽 5시 (서버가 제일 한가한 시간) 마다 한번씩 cronjob이 돌면서 해당 날짜에 설정된 스케줄 데이터가 있는지 확인하고 있다면 해당 시각으로 주문 정보 가져가세요~ api 를 요청하는 job을 실행하도록 만들었다. 이때 이 cronjob을 어떤 툴을 이용해서 구현하면 좋을지 고민이었다. 선택 기준 (1) 중복 실행되지 않도록 job은 idempotent 하게 구현해야 하는 원칙이 있어서, 여러번 실행돼도 상관 없게 짜야하지만 많을 때..
지난 2분기에는 "물류센터 작업자의 수고로움을 덜 수 있도록 한번의 처리 요청으로 전체 대상을 처리할 수 있도록 해달라" 라는 요구사항과 관련된 태스크를 많이 처리하게 되었다. 개중에는 전체 처리 시간이 너무 오래걸려 request - response flow 안에서 동기적으로 처리하기 무리인 것들이 있었는데 이런 경우는 클라이언트에 응답은 바로 주고, 작업은 job으로 비동기 실행하도록 했다. 그런데 이때 작업자에게 노티할 수 있도록 슬랙으로 시작, 완료 알람도 보내야하고 실행하는 동안 몇건 성공했고, 몇건을 어떤 이유로 실패했는지도 전달하고 싶었다. (기획자분이 그렇게까지 요구하진 않았지만...) 어떻게 복잡하지 않게, 그렇지만 정확하게 여러 job들을 하나의 단위로 묶고, 그와 관련된 메타 데이터들..