이렇게 하면 aaa는 app.go 에 app.GET("/aaa/list", AppList) 가 추가되고 aaa.go 파일, aaa_test.go 가 생성된다. templates에 aaa 폴더 아래에 list.plush.html 이 추가된다.
buffalo g a bbb/bcd list 이렇게 하면 bcd 는 app.go 에 app.Get("bbb_bcd/list", BbbBcdList) 가 추가되고 actions/bbb 폴더 아래에 bcd.go, bcd_test.go 가 생성된다 templates/bbb/bcd 아래에 list.plush.html 가 추가된다.
삭제는 buffalo destroy action aaa 를 하면 생성됐던 파일 및 app.go의 설정이 지워진다. 그러나, 계층구조로 만든 경우에는 bbb/bcd 를 bbb_bcd 로 변환하기 때문에 파일을 찾지 못해 삭제가 되지 않는다.
삭제는 수동으로
ps : action 생성시 기본은 GET 인데 Post 로 만들 때에는 --method POST 를 추가하면 된다 ex) buffalo g a aaa list create --method POST 를 하면 app.go에 list는 get으로 create는 post로 설정된다.
2. resource
action은 만들고 싶은것들을 하나하나 설정할 때 사용하고 resource는 list,show,create,update,destroy를 한번에 생성하여 관리할 때 사용한다. app.go 에서는 app.Resource("이름", xxxResource{}) 로 설정된다. 장점은 구조만 맞으면 작업량이 줄수 있지만 추가 설정을 하려면 조금 복잡하다.
추가는 buffalo generate resource "리소스이름" "생성할 컬럼명" ex) buffalo generate resource efg title desc 를 하면 efg 그룹에 crud가 생성되고 efg table에 column으로 id, title, desc 가 정의된다.
리소스는 그룹으로 만들 수 없다. eee/efg 로 만들려고 해도 eee_efg로 변경하여 생성된다. table의 경우 마지막 언더바(_) 이후에 s를 붙여서 생성한다. eee/efg -> eee_efg -> efg -> efgs 로 table명이 정해진다. create table efgs
삭제는 애초에 변환해여 생성하므로 삭제도 가능하다 buffalo destroy resource efg buffalo destroy resource eee/efg -> 생성할 때 eee/efg로 생성해도 eee_efg로 생성
리소스는 이름에 주의를 하면 된다. 언더바 사용하지 않는것이 좋고 즉 버팔로 가 정의한 구조에 딱맞으면 resource를 쓰고 안맞으면 actions로 일일이 설정
bufallo 에서 action 생성명령은 g(generate) a(action) 이다. buffalo g a 액션명 buffalo g action 액션명 buffalo g actions 액션명
하지만 그냥 액션명을 하면 actions 아래에 바로 생긴다. 로직이 많아지면 복잡해지므로 package를 추가하는 것이 좋다 buffalo g a te/tt show index create 를 하면 actions/te/ttt.go actions/te/ttt_test.go 파일이 생성된다.
뒤에 show, index, create는 routing 과 template 파일을 생성하기 위한 것임.
추가한 action을 삭제하려면 d(destroy) 를 사용한다 buffalo d action 액션명
방금 추가한 te/ttt를 삭제 buffalo d action te/ttt Want to remove actions? (y/N)y INFO[0003] - Deleted actions/te_ttt.go INFO[0003] - Deleted actions/te_ttt_test.go INFO[0003] - Deleted References for te_ttt in actions/app.go
actions/app.go 에 가보면 route에 추가되어있던 te/ttt 관련사항이 삭제된 것을 확인할 수 있다.
Goorm 에서 이미지 팩으로 샘플프로젝트를 제공한다. react랑 spring 환경구성이 되어있어 바로 시작하기 좋은데
해당 컨테이너를 생성해서 start.sh 를 실행시켜봤는데 spring 프로젝트는 run이 되는데 react는 안된다.
생성된 spring 프로젝트라도 접속해보려고 하면 접속이 되지 않는다
왜냐? 설정이 쪼~~금 더 필요하다.
프로젝트에 보면 readme.md 파일이 있는데 여기에 몇가지 추가설정이 필요하다고 설명이 친절하게 되어있다 그러나 우리는 읽어보지 않고 안될 때 검색을 통해 해결하지 ㅋㅋㅋ
우선 react project로 가서 추가모듈이 있는지 설정확인을 해야한다. cd front npm install
그 다음 주요한 거!!! port forwarding 작업이다. 이거 안하면 외부에서 접속 안됨 ㅎㅎ 상단메뉴의 [프로젝트] - [실행url 과 포트] 를 클릭 현재 80만 잡혀있으면 스프링(8080), 리액트(3000) 포트를 추가해야한다. 추가할 때 도메인 이름을 입력하면 됨. 예) front-react , 3000 을 주면 : https://front-react.run.goorm.io 과 같이 접속할 수 있게 된다.
마지막으로 이 세팅을 빠뜨리면 제대로 동작하지 않을 수 있다. cd front 에 가면 .env.developement 파일이 있다. 여기에 위에서 접속할 주소로 변경 해야 한다. REACT_APP_SERVER_URI=
다 끝났으면 접속해 보자
우선 리액트는 3000번이므로 portforwarding에 설정한 도메인으로 입력하면 "currentTime= 어쩌구"하는 결과가 나온다.
그 다음 스프링 8080번이므로 마찬가지로 입력하보면 조금 당황스럽다.
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sun Jul 31 01:45:28 UTC 2022
There was an unexpected error (type=Not Found, status=404).
포트를 입력해야하나? 했는데 필요없다. 사실 스프링 예제는 /hello 만 설정되어있기 때문이다.
init에 의해 Create Table users, user_roles 및 select 쿼리가 로그로 찍힘. user table 생성, role table 생성, role_user table 생성 role.id, user.id 를 참조하는 fk가 role_user table에 추가
ps : backend 를 spring으로 추가로 테스트하면 nodejs실행시키면서 자동으로 table 생성이 되었기 때문에 run하면 제약조건 생성 등 오류가 나지만 서버는 정상 가동 됨. (table 모두 drop하고 가동 시키면 정상으로 될 것임)
node로 생성했을 때 table 설정에서 몇가지 빠지는게 있다. encoding이 latin으로 되고 id 가 int 형인데 auto inc 가 꺼진채로 생성된다. 그리고 날짜도 default=now()로 넣어줘야한다. user_role table에 제약조건이 걸려서 role table의 id를 auto inc 하려고 했더니 안되네... user_role table 삭제 -> role table에 auto inc 추가 -> user_role table 추가로 재설정 함.
docker ps 를 했더니 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?" 라고 나옴.
sudo systemctl status docker 를 했더니 System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
sudo systemctl enable docker 를 했더니 Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable docker
Step1 : Container . Existing container image를 선택 하면 Image path* 로 배포할 이미지를 선택(SELECT) 하라고 함. SELECT를 누르면 우측에 Container Registry Tab과 Artifact Registry Tab 에서 기존에 push한 이미지를 선택
(참고) Artifact Registry가 비활성 되어 있으면 다음과 같이 나온다
. 하단에 continue 버튼을 눌러 다음단계를 진행한다.
Step2 : Configuration - Application name : hellobro - Namespace : default . Labels Key: app, value: hellobro . Configuration YAML 에 VIEW YAML 버튼을 누르면 정의된 내용의 yaml 파일을 볼 수 있다.
. Cluster Zone : aisia-south1-a (싱가폴), asia-northeast-2-a( 서울) (Zone의 끝자리는 a,b,c 무엇이듯 상관없음. 해당 region에 여러개의 zone이 있는것임)
. Deploy 버튼을 누르면 K8S Cluster에 배포 시작 K8s cluster생성, 배포 생성, Pod에 배포
Step3 : 외부에 공개. 포트를 매핑하는 서비스를 추가해야한다. . 배포가 정상적으로 되면 Kubernetes Engine > Clusters 에서도 확인가능하다. . Kubernetes Engine > Workloads에 배포한 app을 클릭하여 상세화면으로 이동한다. . 상단메뉴의 Actions > Expose를 클릭 한다( 해당메뉴는 화면이 좁을 때 세로로 점3개에 숨어있을 수 있음) = To let othere access your deployment, expose it to create service 라고 표시된 곳이 "EXPOSE" 버튼을 눌러도 됨.
. Port mapping . port1 : from port는 80으로 설정되어 있다. sample application에서는 8080 포트를 쓰므로 Target port를 8080 으로 설정 . Service type : Load balancer . Service name : hellobro-service . EXPOSE 버튼 클릭
. 생성이 완료되면 좌측메뉴에 Services * Ingress로 이동하고 External endpoints에 링크가 있다. 클릭해보면 hello화면이 나온다. (Expose 이전에는 브라우저에서 접속이 안됐음)
Step4: 삭제 . 서비스 삭제 : Services & Ingress 에서 해당 서비스 선택 후 "DELETE"버튼 클릭 . 클러스터 삭제 : Clusters 에서 해당 클러스터 삭제 . 컨테이너 이미지 삭제 :