남들이 쓴다고 하면 뜯어 말리는 기술 RoR

생태계가 맛이 갔다

개발자가 다 떠나고 있는건지 Archive된 리포지터리가 상당히 많이 보인다.

Rails운영동력 꺼짐

RoR의 장점을 흡수해서 다른 기술들은 계속 발전하고 있는데
RoR는 10년째 제자리다.

디렉토리 구조도 새로운 기능 추가도…

최신버전인 7.0에서 어떤 기술을 표준으로 사용할지도 조금 애매한 모양이다. js관리 라이브러리도 서너개가 동시에 따로 개발되고 있는 것 같다. 안그래도 버전업이느린데…. 세개로 화력을 분산까지?

인터페이스가 없다보니 하위 라이브러리들 구현이 지좆대로임

Devise의 Omniauth를 보면

google, facebook, github, gitlab, keycloak 죄다 생긴게 다름
openid와 oauth2차이때문에 다른게 아니라 그냥 구조 자체가 다름

자바계열 주로 하다가 와보니 이런 문제가 있네
언어 자체의 문제이기도 하지만…
커뮤니티 리더가 표준을 제시 해 주면 따를텐데 그렇게 하지 못하고 있음

프로젝트 구조가 망가지고 있다.

js 폴더는 어디일까?

  • /app/javascripts
  • /app/assets/javscripts

왜 두개가 같이 돌아가고 있는걸까
sprocket와 importmap, jsbundling, cssbundling …

루비는 애초에 자유로운 프레임워크가 아니다.
구동 속도도 빠르지 않고…

쉽고 빠르게 개발하기 위해 사용하는 기술인데 … 이렇게 복잡해진다???

내 라이브러리는 어디다가 넣어야하나

커뮤니티에 봐도 명확한 답을 가진 사람은 없음

/app/lib? /lib? /app/libs

새로 추가한 라이브러리는 include 해서 써야되는데 불편…
include ‘../.././libs/ ~~

Active Record migration

active record의 migration이 예전에는 루비만의 장점이었지만 이젠 아니다.
spring도 flyway가 있고 다른언어도 비슷한게 다 나왔다.


솔루션의 시대에서 서비스의 시대로 넘어오면서 마이그레이션의 역할이 축소됐다. 서비스 시작부터 모든 히스토리를 가지고 있을 필요가 없어졌다.
오히려 배포 후 롤백의 필요가 없어진 시점에서 코드베이스에서 사라지는게 좋다.

gitlab처럼 고객마다 다른 버전(6.0, 7.5 9.3, 11.5, 13.3, 15.1 …)이 있는 경우 히스토리가 모두 필요하긴 하다. 대부분의 서비스 회사에서는 1가지 버전만 운영된다.

마이그레이션 코드가 설계될 때 up-down 양방향으로 사용되도록 설계되어 있는데 이것도 문제다. 사실 데이터가 들어간 시점부터 서버 버전이 양방향으로 자유롭게 왔다갔다 할 수가 없다.

1.0 -> 2.0 -> 1.0은 가능
1.0 -> 데이터입력 -> 마이그레이션 -> 2.0 -> 1.0은 가능
1.0 -> 데이터입력 -> 마이그레이션 -> 2.0 -> 데이터입력 -> 1.0은 불가능..가끔 가능

그리고 단방향의 업데이트도 변경이 큰 경우에 가끔 오류가 난다.
gitlab도 12 to 15 업그레이드시에 문제가 발생한 사례가 많다.

이제 다른데서도 다 되는 레일즈의 장점

  • active record 마이그레이션
  • active record orm
  • 관용적 설정
  • active admin

이런데도 바득바득 쓴다고?

예전부터 RoR을 써온 사람들에게는 생산성 높은 기술일 것 같다.
하지만 그 사람들이 node로 전향하면 더 생산성이 높아지겠지…

RoR로 만든 서비스들 (초기서비스만 한 경우도 많음)
-> 대부분 전환 완료 또는 전환

글로벌

twitter, github, gitlab 등등 많은 회사가 사용중?? 사용했었나?
gitlab은 아직 쓰는데

국내

  • 잡플래닛
  • 마이리얼트립
  • 당근마켓
  • 왓챠
  • 업비트
  • 리멤버

대체재

react-next, nest, svelte 등등

Admin Visualization Tool

어드민 도구 종류

  • 챠트, 테이블 라이브러리 처럼 API를 사용하거나
  • 엘라스틱서치처럼 로그를 전달받아서 처리
  • 디비 접근권한을 열어주고 쿼리까지 날려서 볼 수 있게 해 주는 도구

생각해보면… 금융권에서 쓰는 마이플랫폼같은것도 비슷한 도구이긴 한데
뭐 깔아서 써야되는데 좆같다고 욕하는거였나
화면 뽑아내는데는 효율적이다

링크

  • http://retool.com
  • https://www.stackerhq.com
  • https://www.jetadmin.io
  • https://www.appgyver.com
  • https://uibakery.io
  • https://www.appsmith.com
  • https://budibase.com
  • https://tooljet.com

오픈소스도 몇 개 있고
완전 유료도 있고

Ktor web framework – kotlin

kotlin web framework인데…
간단하게 rest api 만들기 좋다.
간단한 rest api가 필요한가??
프로토타이핑 정도 하는거라면 모를까
그냥 스프링 쓰는게 나을 것 같다

뭔가 많이 부족하다

추가기능 – 만들거. 있음좋을거

  1. API route에서
    route 이름, 주소URI 가져오기
  2. 공통파라미터 상위에서 선언한거 하위에서 같이 쓰기
    route (/game)
      val user_id = Header
      get {
      user_id
    }
    post {
    user_id
    }

언어 구조 때문에 만들기 힘들 것 같다

CAS – 로컬실행/개발환경 만들기

뭔가 괜찮은 것 같으면서도 애매한 오픈소스 프로젝트…
복잡함 때문에 몇 번 사용하려다가 포기 했는데 이번에 인증서비스를 만들면서 다시 사용하려고 한다.

jasig CAS일 때 보고 apereo로 바뀐거 보고… 세번째 정도인 것 같다.
이전에는 기능을 축소해서 직접 개발했었는데

복합인증을 구현하려면 쓰는게 나을 것 같다

경쟁제품

유료 무료 다 포함해서 대강

무료

  • Keycloak
  • CAS
  • JOSSO
  • LemonLDAP
  • Shibbolet ldP
  • OpenAM
  • Gluu
  • https://freeradius.org/

유료

  • Auth0
  • AWS Cognito

기타

  • https://gist.github.com/bmaupin/6878fae9abcb63ef43f8ac9b9de8fafd
  • https://www.gluu.org/blog/gluu-versus-keycloak/

조금씩 특성이 다르긴 하다.

CAS 특징

  • 프로젝트가 굉장히 잘게 나눠져 있다.
    모듈형으로 가져다가 사용하라는 것 같은데…
    의존성이 복잡해서 그렇게 쓸 수가 없다
    도큐먼트는 사용법에 관한 것만 있고
  • 설치형으로 사용하려고 보면…
    cas-overlay-template 라는게 있기는 한데
    기본으로 지원되는 부분을 제외하면 설치형으로 쓸 수 있는건 아니고 거의 소스레벨에서 수정해서 써야만 한다.
  • 스프링을 매우 잘 쓴다. 나도 스프링 꽤 써봤다고 생각했는데 처음보는게 조금씩 보인다
  • Springboot autoconfigure 사이의 엄청난 충돌이 발생
    실행형으로 만들게 아니라면 그냥 없애야 하지 않을까

어쨌든 소스레벨에서 분석해서 사용해야 하고
필요한 부분만 뽑아쓰긴 힘들어 보인다

설치방법

소스

docker 컨테이너를 제공 해 주면 좋겠는데…. 커스텀을 해서 쓰라는 철학을 가지고 있는 애들이라 그런지 통짜로 제공 해 주지는 않는다.
그래도 쓰기 편하게 템플릿이 제공된다.

https://github.com/apereo/cas-overlay-template

이런것도 제공 해 주고 많이 발전했다.

아래 순서대로 치다보면 뭐가 뭔지 알 수 있을거다. README.md와 비슷하지만 약간 다르다.

git clone https://github.com/apereo/cas-overlay-template cas-server
cd cas-server
./gradlew clean build
./gradlew downloadShell runShell
./gradlew allDependencies

설정파일 수정

docker-compose 실행테스트를 해야되서 설정파일을 수정 해 준다

# /etc/cas/config/cas.properties

logging.config=file:/etc/cas/config/log4j2.xml

server.port=8080
server.ssl.enabled=false

실행

docker-compose up

화면수정

수정가능 항목의 목록을 얻는 명령어

./gradlew listTemplateViews

템플릿을 소스코드로 가져오는 명령어

./gradlew getResource -PresourceName=[여기뭐가들어갈까]

기능수정

이쪽 철학이 그런가보다. 디비를 직접 관리하거나 하지 않는다.
그럴거면 jpa 연동하기 쉽게 인터페이스를 달아주던가 하면 좋을텐데 그런건 또 안해놨다.

트리거 설정

각 기능이 실행될 때 마다 앞뒤로 트리거를 달 수 있다.
인터셉터
groovy

아직 안해봐서잘 모르겠지만 할 수 있다.

배포

리버스 프록시 사용

요즘 리버스 프록시 안쓰는 경우가 더 드물지 않을까

cas.server.name=https://domain.tld
cas.server.prefix=/

server.port=8080
server.ssl.enabled=false
cas.server.http.enabled=false
cas.server.httpProxy.enabled=true
cas.server.httpProxy.secure=true
cas.server.httpProxy.scheme=https
cas.server.httpProxy.protocol=HTTP/1.1

결론

overlay template 설치하려면 keycloak, gluu 등 다른 쉬운걸 쓰는게 나을것으로 보인다
인증방식은 어차피 다 표준프로토콜이 있어서 한두개 빼고는 다 비슷하게 제공된다

소스레벨에서 사용하려면 cas를 쓰는게 나을까… 그냥 만드는게 나을까
아직 시작단계라 정확하지는 않지만
이걸 쓰기보다는 필요한 부분 소스만 참고해서 따로 만들게 될 것 같다

REF

  • https://apereo.github.io/2019/01/07/cas61-gettingstarted-overlay/
  • https://apereo.github.io/cas/6.3.x/configuration/Configuration-Server-Management.html
  • https://apereo.github.io/2018/01/05/cas-deployment-with-proxy/

State Machine libray

상태관리

프로그램을 만들다 보면 상태가 중요한 요소일 경우가 많은데
회원의 상태, 프롯스의 상태
상태를 변경하기 위한 동작들
기존 상태 메모리에 로드, 디스크 저장 등등

별도로 관리하지 않고 디비에서 가져와서 한개씩 처리하면서 트랜잭션 거는거도 가능하지만
실수가 잦다

그래서 하나 만들어볼까 하다가 찾아보니 잔뜩 나와서 일단 정리

REF

  • https://statecharts.github.io/
  • https://kentcdodds.com/blog/implementing-a-simple-state-machine-library-in-javascript
  • https://github.com/davidkpiano/xstate
  • https://github.com/Ankzz/easyfsm/
  • https://github.com/hekailiang/squirrel

Ruby On Rails App – 시작하기

철지난 루비온 레일즈

별 생각이 없다.. 그냥 해봄

어플리케이션 생성

스타터킷이 있기는 한데 다 너무 오래됐다. 마지막 업데이트가 5년~7년…
그 때 부터 안쓰기 시작했나보다
그래도 아직 현역인데… 이렇게까지 인기가 없을까

  • https://github.com/prismicio/ruby-rails-starter
  • https://github.com/mattbrictson/rails-starter
  • https://github.com/RailsApps/rails-devise-pundit
rails new app

필수 환경 설치

rbenv 2.6.5 bundle rails

필수 라이브러리

  • https://github.com/heartcombo/devise
  • https://github.com/rspec/rspec-rails
  • https://github.com/varvet/pundit
  • https://github.com/thoughtbot/factory_bot_rails

명령어 실행

bundle
rails db:create
rails g devise:install
rails g devise user
rails db:migrate
rails g pundit:install

그리고 코드생성

rails g model post
rails g controller post 
rails g service post

쉽게 프로젝트를 생성할 수 있는게 장점인데
노드가 더 쉬워서 자리를 뺏긴 느낌이다.

전문가용 터미널 셋팅

개발자는 터미널이 간진데
텍스트 편집할 때 emacs까지는아니라도 vim정도는 써 줘야된다.
근데 이게 기본형으로 쓰면 또 각이 안나와서 추가기능을 깔아주고
다른사람 자리에서 vi쓸 때 이게 왜 안돼? 같은 대사도 해 주고 해야된다

그러기 위한 몇가지 추가기능

Terminal

  • zsh
  • oh-my-zsh

리눅스나 맥이면 이정도는 이미 깔려 있어야되고
윈도우라고 빼먹으면 안된다.

  • oh-my-pysh

오히려 여기에다가 리눅스 터미널까지 설치 해 줘야된다

  • cygwin
  • ubuntu18.04 WSL

그리고 추가로 터미널 유틸

  • https://github.com/junegunn/fzf

VIM

에디터

  • nvim
  • vim

플러그인 관리

  • https://github.com/junegunn/vim-plug
  • https://github.com/VundleVim/Vundle.vim

에디트 툴

  • https://github.com/neilagabriel/vim-geeknote
  • https://github.com/jeffkowalski/geeknote

이정도 깔아두면 이제 어디가서 전문가 행세하기 충분하다.
내 노트북을 가지고 강연/강의/세미나를 할 때 부끄럽지 않을 최소한의 환경

MongoDB 4.0 to AWS DocumentDB 3.6 migration 기록

mysql, aurora정도로 호환되는 제품인 줄 알았는데

스펙을 보니 다른점이 상당히 많다.
https://docs.aws.amazon.com/ko_kr/documentdb/latest/developerguide/mongo-apis.html
아니요가 너무 많은거 아니요?

처음 접속할 때 부터 애를 먹었다. public access가 안된다고???

AWS의 불친절함이란.. .어디 잘 써 있지도 않고

루비온레일즈 개발자가 AWS를 설계했으면 이렇지 않았을텐데
(친절한 루비의 에러메시지)

공식 문서에서 시키는대로 한 것 같은데 접속이 안되서 인증서 사용을 중지시키고 접속했다
https://docs.aws.amazon.com/ko_kr/documentdb/latest/developerguide/connect-from-outside-a-vpc.html

쓰는 사람이 없는건지 검색도 잘 안되는군

AWS 직원새끼도 이거 안쓰는거 아닐까

파라미터 그룹에서 TLS를 끄고 겨우 접속은 했는데

admin으로 접속이 안되네?

test로 접속해봤더니 된다

그 다음에 test2로 접속했더니 된다

근데 test2로 접속하면 test1이 아show dbs부터 안먹힌다??

아니군 데이터가 있는 디비만 목록에 뜬다

이래저래 하다가 너무 이상한 것 같아서 포기..

결국은 몽고디비를 설치해서 사용

그래도 직접 구성은 안 하고 aws에서 지원 해 주는 cloud formation을 활용했다
https://docs.aws.amazon.com/ko_kr/quickstart/latest/mongodb/step2.html

그냥 실행했더니 실패???왜??

바로 클릭해서 접속했떠니 북부 버지니아로 접속되는군.. 어째 이상하더라고
aws 콘솔에서 안 쓰는 리전 꺼놓는 기능은 언제 나올건가

그러고보면 aws에서 대부분의 관리 기능들이 cloud formation을 확장한 정도 기능 아닐까 싶을 정도로.. 비슷한 프로세스로 돌아가는 것 같다.

ui를 따로 만들어주면 관리형 서비스가 돼 버리는거겠지

docuemntDB를 갖다버리고 mongoDB를 관리형으로 넣어주는건 어떨까

하려다가 다시 DocumentDB를 사용하기로

설치가 어려운건 아니지만 나중에 관리비용도 상당히 있으니까

그리고 기존 어플리케이션(node-mongoose)을 돌려보니까 별 문제없이 돌아간다. 4.0에 특화된 기능을 쓰는게 없어서 그런가?

백업 덤프에서 버전을 안 맞췄더니 아예 안된다. 에러메시지가 버전이 안맞다가 아니라 이상한게 안된다고 해서 한참을 검색을 했는데… 버전문제였다.
mongodump(4.x) – mongorestore(3.6)

docker 덕분에 간단히 해결됐다.
docker run –rm -it -v $(pwd):/mongobak mongo:3 mongodump –out /mongobak –host x.x.x.x -uUser -pPass –db dbname

버전이 안맞아서 인덱스나 뭐가 날라갈 수 도 있다고 하는데 나중에 생성 해 주면 되지 않을까

몽고디비 툴 사용

몽고해커 http://tylerbrock.github.io/mongo-hacker/
http://mongodb-tools.com/