라라벨 시작하기 9 – 마이그레이션 관리

날짜, 시간별로 파일명이 생성된다는건 그렇게 관리 할 수 있다는 말과도 같다. 그러니 이를 어떻게 관리하는지 찾아보자. 내가 이상하게 생각하는건 django에서는 모델의 설정이 따로 있고 마이그레이션 파일이 있어서 모델의 컬럼설정을 자동으로 마이그레이션 파일로 생성해주었다. 그런데 라라벨에서는 모델과 마이그레이션 파일이 별도로 움직이는듯한 느낌을 받았다.

데이터베이스 스키마를 모두 마이그레이션에서 한다. 모델은 fillable이라 해서 사용자의 입력을 받는 곳을 지정한다. artisan으로 모델을 생성할 때 마이그레이션 파일도 같이 생성되고 이때 id, created_at, updated_at, user_id 같이 데이터의 관리를 위한 칼럼이 자동으로 추가된다.

그렇다면 마이그레이션을 이렇게 밖에 할 수 없을까? 뭔가 다른 방법이 있을거 같은데?

마이그레이션 방법

php artisan make:migration create_flights_table

실행하면 현재일시로 기본상태(id, timestamp)만 가진체 마이그레이션 파일이 생성된다. 그런데 내가 원한건 현재상태(기존 칼럼을 그대로 가진)의 마이그레이션 파일이다. 좀더 알아보니 같은 테이블을 마이그레이션 하는데에는 좀더 신경써야할 부분들이 있었다.

최초에 테이블을 생성하면 위 그림과 같이 id와 timestamps가 생성된다. 그리고 내가 추가하고 싶은 칼럼을 추가한다. 이렇게 사용하다가 추가 칼럼이 필요하면 새로 마이그레이션을 생성한다. 그리고 나서 create가 아닌 “Schema::table(‘table_name’, function(Blueprint $table){” 형태로 해서 추가 칼럼을 등록한다.

이렇게 정확히 반대로 구성해야 마이그레이션과 롤백이 제대로 작동한다.

정리해보면

  1. command ./vendor/bin/sail php artisan make:migration new_table
  2. new_table.php의 create에 컬럼 추가
  3. 적용 command ./vendor/bin/sail php artisan migrate
  4. command ./vendor/bin/sail php artisan make:migration new_table
  5. new_table.php의 create를 table로 변경하고 변경할 컬럼을 추가
  6. 적용 command ./vendor/bin/sail php artisan migrate

./vendor/bin/sail php artisan migrate:fresh

이 코드를 실행하면 전체 테이블을 드롭하고 마이그레이션을 다시 실행한다.

./vendor/bin/sail php artisan migrate:refresh

이건 전부 롤백 했다 마이그레이션을 다시 실행한다. 이 두 개는 현실에선 사용할 일은 없을거 같은데?

실제 운영에 마이그레이션을 써야 하겠지만 철저하게 코드화 하여 적용하지 않으면 큰일을 당할거 같다. 마이그레이션이야 그래도 문제가 없겠지만 롤백이 문제다.

디비를 보니 migration테이블이 있어 여기에 마이그레이션상태를 저장한다.

batch는 마이그레이션을 실행할 때마다 하나씩 올라간다. rollback하면 하나씩 내려가고.

오늘은 여기까지.

라라벨 시작하기 8 – 화면과 저장(모델)

부트캠프의 Chirps 까지 진행을 했다. 그래서 화면에 Hello, World! 까지는 출력을 했다. View를 달아준다.

Vite Development 덕분에 (npm run dev) 리로드를 하지 않아도 코드 수정후 저장만 하면 즉각 변경을 해준다.

적당히 적용해주면 이렇게 화면이 나온다. 그러니까 index.blade.php는 본문역할인샘.

상단 네이게이션도 레이아웃에 별도로 추가할 수 있어 여기에 코드를 추가하면 서로 연동할 수 있다. 참 잘 만들어 놨다. 물론 여기에 맞춰 만들면 그런데 이 틀을 벗어나려면 고생을 좀 해야겠지?

그리고 다음에 할 건 사용자가 Chirps를 등록함에 있어 HasMany 관계를 맺는다. 스프링의 JPA는 양방향으로 관계를 맺을 수 있어 Many to One 또는 One to Many를 할 수 있다. 이 케이스에서는 User에 One to Many를 한다. 내 경우엔 Chirps에 Many to One을 하는게 데이터 모델링 측면에서 더 어울린다 생각했다. 여기선 HasMany로 이루어진다니 이부분은 좀더 알아봐야겠다.

컬럼 설정

validation은 컨트롤러에 있다. 모델에는 없고. 그런데 실제 DB의 테이블 컬럼에 적용되었다. 이렇게 추측한 이유는 validation에 ‘message’ => ‘required|string|max:255’, 때문.

그런데 저 값을 변경하고 migrate:fresh를 했는데 디비에 적용되지 않았다. 왜지? 혹시나 싶어 컬럼을 삭제후 다시 migrate를 했으나 255그대로이다. 이건 기본값이 255인가보다. 그렇다면 validation을 컨트롤러에서 하는 추측은 맞지 않는다.

컬럼 설정은 Migration에서 한다.

이렇게 length를 지정할 수 있었다.

Migration 파일의 관리

Migration 파일은 각 모델마다 database\migrations\yyyy_mm_dd_hhiiss_create_(model_name)_table.php 형태로 생성된다. 왠지 모델을 변경할 때마다.migration 형태로 생성되는거 같은데 지금은 수동으로 해당 파일을 만지고 있다. 다른 방법이 있는지 찾아보자.

오늘은 여기까지.

라라벨 시작하기 7 – sail

당연하게도 php를 설치해야 한다.

https://php.watch/articles/php-8.3-install-upgrade-on-debian-ubuntu

혹시 몰라 컴포저도 설치했다.

https://getcomposer.org/download/

그리고 라라벨 부트캠프를 계속 하자면 Bleeze를 설치 하라고 나온다. 인증에 관련된 플러그인으로 보인다. 이걸 계속 진행하려면 php의 extension를 설치 하라고 나온다.

sudo apt install php8.3-xml php8.3-dom

그럼 정상적으로 설치가 완료된다.

그리고

또다시 에러

php artisan breeze:install blade

이걸 실행하면 위 화면과 같은 에러가 난다. 에러의 연속. 모듈이 없다는데. 스택오버플로우에 현자가 해결방법을 알려줬다.

https://stackoverflow.com/a/77546437/8432566

이걸로 설치는 완료 했는데 또다시 에러등장. 아주 끝이 없다.

원인은 ./vendor/bin/sail 로 시작하는 명령을 해야 에러가 안 난다.

실행 완료. 오늘은 여기까지.

라라벨 시작하기 6 – docker

이렇게 어이없게도 /var/run/docker.sock 의 모드를 666(rw) 로 변경하는 것만드로 실행이 됐다. 잠깐. 사용자를 추가하는것은 아무 영향도 못미쳤을까?

이건 내가 잘못했다. 도커그룹에 사용자를 추가하는 것만으로도 충분했다. 그런데 왜 실패했을까? 그건 변경된 설정이 적용되기 위해선 재접속을 해야했기 때문.

나에게 답을 알려준 https://thxxyj.tistory.com/42 여기에도 재접속을 하라고 나와있다. 그런데 내가 이를 무시하고 기존 접속을 유지한체 도커를 실행시켰기 때문에 문제가 발생한 것이다.

굿!

라라벨 시작하기 5 – bootcamp

public/index.php가 시작점이다.

  1. HTTP/Console 커널
  2. 서비스
  3. 라우팅

구조 자체는 코드이그나이터랑 비슷한거 같다. 그럼에도 라라벨만의 특징이 있겠지. 설명만 봐선 잘 이해가 안간다. 한 번 사용을 해 보면서 어떤 구조인지 파악하는 과정이 필요하다. 의존성 주입도 있고 해서 마치 스프링부트 같기도 하고.

부트캠프

라라벨은 부트캠프를 제공하고 있었다. 한번 따라 해보자.

우분투의 경우 설치 과정에서 extension을 추가로 설치 해줘야 한다. php-xml, php-curl 을 설치해주자. env는 code를 실행하여 수정해주자.

막히는 중

The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied The exception occurred while attempting to log: The stream or file "/var/www/html/storage/logs/laravel.log"

권한 문제인데 storage에 있는 logs의 권한이 root 인데 php는 sail로 실행하고 있어서 로그를 저장할 수 없다. 해당 디렉토리의 권한을 변경하거나 사용자그룹을 변경하면 되긴 하는데 이게 맞는건지 모르겠다. 좀더 조사중.

라라벨 시작하기 4 – Sail

Sail

라라벨은 Framework인데 기존 내가 아는 Framework가 아니다. 내가 생각하는 Framework는 특정 언어에서 개발을 시작할 때 MVC처럼 미리 틀을 만들어 놓고 그 틀에 맞춰 개발을 하면 되는 그런걸 생각하고 있었다. 내가 접한 대부분의 Framework가 그랬다.

codeigniter도 그랬고 Django, Flask도 그랬다. Node의 Express도 그렇고. 그런데 가만 생각해보니 스프링부트는 https://start.spring.io/ 라는걸 만들어놓고 Dependency를 추가하여 확장 가능하게 했다. 그러더니 라라벨은 Sail이란 커맨드 툴을 만들어 docker-compose 에 필요한 것들만 추가할 수 있게 했다. 실제 배포과정에선 이 부분을 어떻게 풀어나갈지 궁금하다.

사용 가능한 서비스는 mysqlpgsqlmariadbredismemcachedmeilisearchminioseleniummailpit 가 있다고 한다.

이중 meilisearch, minio, mailpit은 처음 보는 서비스라 여기에 정리해보자.

meilisearch

검색엔진이다. elastic search처럼 문서들로부터 빠른 검색을 해준다. 보통 elastic stack이라 해서 elastic search, logstash, kibana를 한데묶어 msa환경에서 로그통합을 하는데 이 meilisearch도 그런 용도로 사용할 수 있는건가? 슬쩍 봐선 그런 내용은 없는데.

찾아보니 meilisearch 서비스는 실시간 검색, 타이포에 특화되어 있어 사용자 경험에 맞춰져있다. 그리고 왠만한 언어를 지원해서 기존 서비스에 통합하기도 쉽다. 만약 내 서비스가 사용자 검색을 할 일이 있고 타이핑 와중에도 검색 내용이 시시각각 변하게 하고 싶으면서 오타가 발생해도 비슷한 내용을 검색결과로 보여주고 싶다면 이 서비스를 사용하는게 직접 개발하는 것보다 나을것이다. 그렇다곤 해도 이걸 실제로 써보지않으면 어떤 느낌인지 모르겠다. 이것도 나중에 알아보는걸로.

minio

오브젝트 관리 서비스이다. AWS S3와 완벽하게 호환된다. 오브젝트는 파일이다. 이미지, 문서 모든 것들이다. 이들을 관리하는 서비스이다. 당장은 쓸일이 있을까 싶다.

mailpit

메일 테스팅 도구라는데 이것도 뭔지 모르겠다.

WSL

라라벨을 쓰기 위해 WSL이 필요하다해서 정리한다.

이건 현재 설치된 리눅스이다. 내용을 보니 docker를 설치하며 두 개가 추가 됐고 Ubuntu, Ubuntu-22.04 이렇게 두 개가 추가됐는데 나의 행적을 생각해보니 뭣모르고 스토어에서 Ubuntu-22.04를 설치했고 나중에

wsl --install

이 명령어로 Ubuntu가 설치됐나보다.

그럼 Ubuntu는 버전이 뭐지?

버전이 같네. 그냥 두 개가 설치됐다. 스토어를 통해 설치한 Ubuntu-22.04는 삭제했다.

도커데스크탑을 설치하면 리눅스 두 개가 설치된다는걸 처음 알았다.

오늘은 여기까지.

라라벨 시작하기 3 – wsl

윈도우에서 시작하기

사실 윈도우에서 시작하기를 하지 않아도 얼마든지 위 커맨드만으로도 시작할 수 있다. 그런데 왜 윈도우에서 시작하기를 따로 만들었을까?

라라벨에서는 OS별 실행 방법을 별도로 알려주고 있다. 그리고 모두 도커가 설치되었다는걸 전제로 설명한다. 프로젝트 생성은 컴포저를 통해 할 수 있지만 이를 실행하려면 상황에 따라 디비도 있어야 할 것이고 기타 부가기능들이 필요할 것이다. 이를 모두 한 번에 해주는게 도커 커맨드라고 유추해보자. redis도 본거 같은데. mac도 결국은 도커로 돌린다. 로컬에서는 도커만한게 없는거 같다. 그리고 메모리를 많이 사용한다. 32G로 가고싶다.

curl -s "https://laravel.build/example-app" | bash

도커를 설치하고 나서 위 커맨드를 실행하면 example-app이란 폴더에 샘플프로젝트가 생성된다.

wsl2를 활성화 하라는데

https://learn.microsoft.com/en-us/windows/wsl/install

라라벨 설명서에도 있지만 먼저 여기 링크에 나온데로 실행하자

wsl --install

그럼 ubuntu가 설치되었다고 나오고 재시작하라고 나온다. 글 쓰는 도중 무심결에 재시작버튼을 눌렀더니 이미지가 날라가버렸.

wsl을 사용해보니 모르는게 너무 많았다. 이 부분은 따로 다루기로 한다.

오늘은 여기까지.

라라벨 시작하기 2 – composer

php를 배포하는건 아주 쉽다. 서버에 그냥 올리면 된다. 파일을. 빌드를 하는 과정이 없다. 파일을 변경해도 서버를 재시작 하지 않아도 된다. 이점은 서버를 유지보수하는 측면에서는 굉장한 강점이 있다. 특히 소규모에서 더더욱 그렇다. 또한 개발중일때도 빌드를 하지 않는점은 빌드시간 자체가 없어 개발속도가 매우 빠르다.

물론 좋은쪽으로 보면 그렇지. 모든건 상대적이라고 했던가. 컴파일, 빌드과정을 거치지 않으니 더 신경써야 한다. 빌드가 없다는건 컴퓨터의 도움을 받지 못한다는 말도 된다. 컴퓨터가 해주는 최소한의 검토과정이 없다는 말과도 같다. 그래도 요즘은 IDE가 잘돼있어 이부분은 어느정도 상쇄가 된다.

서버에서 직접 코드수정이 가능하다. 이것도 장점이면서 단점이 될 수 있다. 아니 PHP라는 언어의 특징이다. 장단점이라기엔 너무 호불호가 갈린다.

IDE를 서버에 연결하여 언제든지 코드 수정을 할 수 있는데, 개발중이라면 이는 그렇게 나쁘지 않으나 운영중에는 아주아주 위험하다. 언제든지 바꿀 수 있다는건 언제든지 바뀔 수 있다.

라라벨 설치

나는 윈도 환경에서 라라벨을 시작한다. php와 컴포저는 윈도 버전이 있으니 그걸 설치하면 된다.

라라벨을 커멘드로 실행하자 그럼

이런 에러가 난다. extension이 없어서 그런거 같다.

extension=zip
extension=fileinfo를 주석 해제했다.

설치가 완료 됐다.

라라벨을 글로벌로 설치하고 라라벨커맨드로 프로젝트를 실행시키면 이런 화면이 나온다.

컴포저로 생성하면 이렇게 할 거 같은데 확인은 다음에.

컴포저에서 바로 설치한 것과 글로벌설치후 커맨드로 설치한 것의 결과물이 다르다. 버전도 다르고. 커맨드에서 눈치챘어야 했는데 최초 내가 실행한 커맨드에 ^9.0이라는 버전이 있어 9.대 버전이 설치되었다. 글로벌 설치후 라라벨 커맨드로 실행한 신규프로젝트 생성은 최신버전이었고. 나중에 9.대와 10.대의 차이점도 찾아봐야겠다.

오늘은 여기까지.

라라벨 시작하기 1 – install

회사에서 PHP로 된 서버로 서비스중인 프로젝트가 있다. 그런데 이 코드는 그야말로 레거시. 이제 겨우 코드가 눈에 익어 어느 정도는 만질수 있는 수준이 됐다. 그럼에도 너무 복잡하다. 예전에 코드이그나이터를 사용하여 이것 저것 만들어 봤는데 이번엔 명성이 자자한 라라벨로 마이그레이션을 했으면 하는 원대한 꿈이 있다.

그래서 라라벨을 한번 경험해보고자 마음 먹었고 이왕이면 이 내용을 기록하여 미래의 내가 위기에 처했을때 도움이 되지 않을까 막연한 기대를 하며 시작한다.

https://laravel.kr/docs/9.x/installation

라라벨은 PHP의 프레임워크의 일종이다.

PHP는 참 거시기한 언어이다. 처음 배웠을땐 이거만큼 좋은 언어가 없었다. 너무 쉬웠다. 자바를 배우고 나서 PHP를 접했는데 몇 줄 적지 않아도 탁탁 되는게 신기했다. 그러다 여기저기서 문제점이 발생하기 시작했다. 변수를 할당하지 않았는데 에러가 나지않아 한참을 디버깅 해야 했다. 필요한 곳마다 Ctrl + c Ctrl + v로 코드를 복사해서 유지보수를 할 때 중복코드를 찾아 전부 바꿔야 했다. 나중에 안 거지만 시작이 쉽다고 좋은게 아니었다. 에러가 나지 않았던 이유는 귀찮다고 에러리포트를 전부 막아서였다. php도 클래스가 가능하단걸 나중에서야 알았다. 사용방법을 모르고 그냥 사용해서 생긴 문제들이었다.

다시 PHP를 사용할 기회가 되어 느낀점은 소규모 환경에선 이거만한 언어가 없다. 회사 프로젝트를 하며 그걸 피부로 느낀다. 물론 그 편리함에 기대에 무분별하게 사용하면 대참사가 예고되어 있으니 조심해서 사용해야 한다.

쓸때없이 이야기가 샜다.

설치 방법이야 저 위 링크에 다 있으니 나는 내가 겪으며 느낀점을 정리하려고 한다. 다음에.