appkr / l5code

라라벨로 배우는 실전 PHP 웹 프로그래밍 (출판용 소스코드)
MIT License
63 stars 38 forks source link

2022년에 빨간책을 보시는 분들을 위한 실습 시작 가이드 #20

Open appkr opened 3 years ago

appkr commented 3 years ago

2015년에서 2016년으로 넘어갈 즈음에 라라벨 5.2/PHP7.0으로 온라인에 글을 쓰기 시작했고, 2016년 말 종이 책을 출간할 때는 라라벨 5.3/PHP7.0 기준으로 썼습니다. 6년이 지났습니다. 그간에 저의 빨간책을 사랑해 주신 독자 여러분께 진심을 담아 감사 인사 드립니다.

오늘 어느 독자의 질문을 받고, 오랫만에 PHP와 라라벨 생태계를 살펴보니, PHP는 8.0이고 라라벨은 9.x이군요 !!

현재의 런타임 환경으로 제 책을 보고 따라하신다면 정상 작동하는 코드가 아마도 거의 없을 겁니다. 그럼에도 불구하고, PHP와 라라벨 기초 문법이 바뀐것은 아니므로, 라라벨5.3/PHP7.1 런타임 환경만 갖춘다면 책을 보시는데 지장이 없다고 확신합니다.

2022년에 PHP7.1을 직접 설치할 수 있는 방법은 찾기 힘들겁니다. 책의 예제 코드 중 일부가 PHP7.2 버전부터는 호환되지 않습니다.

아래에서 Docker를 이용해서 PHP7.1 개발 환경을 구성하는 방법을 설명합니다.

요약 버전

이하 명령어는 모두 Mac 기준입니다. 윈도 환경에서의 작동은 어느 독자님의 환경에서 검증했습니다.

~ $ wget https://github.com/appkr/l5code/files/8481555/myapp.zip
~ $ unzip myapp.zip
~ $ cd myapp
~/myapp $ docker-compose  up -d
~/myapp $ docker exec -it laravel cp /app/.env.example /app/.env
~/myapp $ docker exec -it laravel php /app/artisan key:generate
~/myapp $ open http://localhost:8000

애플리케이션 설치

책에서 언급한 laravel new ... 또는 composer create-project ... 명령을 이용하지 않고, 이미 만든 프로젝트의 압축파일을 다운로드 받아 압축을 풉니다. 혹시 모를 의존 충돌을 피하기 위해 vendor 폴더까지 압축에 포함했습니다

myapp.zip

Docker 설치

Docker를 설치하고 실행해주세요

docker-compose

Docker가 설치되고 구동되면, docker-compose 명령을 이용할 수 있습니다. docker-compose 명령으로 MySQL, 웹서버/PHP 런타임등을 한번에 구동합니다.

최초 실행이라면, MySQL에 myapp이란 데이터베이스 스키마와 homestead 사용자를 자동으로 만들어줍니다

이 명령을 실행하기 전에 3306, 6379, 8000 번 포트를 사용하는 프로세스를 중단해야 합니다

~/myapp $ docker-compose  up -d
# up: 시작하겠다는 의미
# -d: detach(백그라운드) 모드로 실행
# 최초 한 번은 시간이 걸립니다

클러스터에 실행중인 컨테이너를 확인합니다. 총 세 개가 나와야 합니다

~/myapp $ docker-compose ps
#  Name                Command                  State                     Ports
# -------------------------------------------------------------------------------------------
# laravel   docker-php-entrypoint apac ...   Up (healthy)   0.0.0.0:8000->80/tcp
# mysql     docker-entrypoint.sh mysql ...   Up (healthy)   0.0.0.0:3306->3306/tcp, 33060/tcp
# redis     docker-entrypoint.sh redis ...   Up (healthy)   0.0.0.0:6379->6379/tcp

실행중인 컨테이너를 전부 중단하고 재시작하는 방법은

~/myapp $ docker-compose stop
~/myapp $ docker-compose start
~/myapp $ docker-compose restart

문제가 발생해서 컨테이너를 완전히 버리고, 새 컨테이너를 띄우고 싶다면

~/myapp $ docker-compose down
~/myapp $ docker-compose up -d

다만, 컨테이너를 전부 재시작하면 기존에 MySQL에 저장했던 내용은 날아갑니다. 재시작해도 기존 상태를 계속 유지하고 싶다면, docker-compose.yml 파일의 volumes 선언문의 주석을 제거한 후, 클러스터를 재시작해주세요.

커맨드 실행

로컬 개발 서버로 로컬 컴퓨터에서 개발할 때 이렇게 명령하던 것을

~/myapp $ php artisan

Docker 컨테이너를 사용할 때는 이렇게 하셔야 합니다

~/myapp $ docker exec -it laravel php /app/artisan
# Laravel Framework version 5.3.31
# ...

# 또는 Docker 컨테이너에 들어가서 커맨드해도 됩니다
# ~/myapp $ docker exec -it laravel bash
# /myapp $ php artisan

애플리케이션 초기 설정

.env를 복제합니다

~/myapp $ docker exec -it laravel cp /app/.env.example /app/.env

APP_KEY를 만듭니다

~/myapp $ docker exec -it laravel php /app/artisan key:generate

DB 접속 테스트 한번 해볼까요?

~/myapp $ docker exec -it laravel php /app/artisan tinker
# Psy Shell v0.8.18 (PHP 7.1.33 — cli) by Justin Hileman
# New version is available (current: v0.8.18, latest: v0.10.5)
# >>> DB::select('SELECT 1');
# => [
#      {#710
#        +"1": 1,
#      },
#    ]

HTTP 통신 테스트 (웹 브라우저에서 http://localhost:8000 하시면 됩니다)

$ curl -s -I http://localhost:8000
# HTTP/1.1 200 OK
# Server: nginx
# ...

코드 작성 및 디버깅

Docker 컨테이너를 사용한다고 코드 작성 방법이 달라지지 않습니다. 사용하던 코드 에디터로 코드 작성하시면 됩니다.

~/myapp $ pstorm . # phpstorm
~/myapp $ subl .   # sublime 
~/myapp $ code .   # vscode

myapp 프로젝트 폴더는 laravel 컨테이너의 /app폴더로 마운트되어 컨테이너 안에서 실행됩니다. 따라서 컨테이너 안에서 PHP 런타임이 storage/logs/laravel.log에 쓴 내용도 로컬 컴퓨터에서 확인 가능합니다

~/myapp $ tail -f storage/logs/laravel.log

asciicast

kwangmson commented 3 years ago

Asset Link (css, js) 가 로드되지 않습니다.

위의 내용대로 프로젝트를 만든 후 책의 5.3 버전 프로젝트를 적용하여 도커에서 실행하였습니다.

다른것은 동작되는데, 다음 두 라인에서 404 NotFound Error 가 발생합니다. 생성된 페이지의 소스는 다음과 같습니다.

<!-- Styles -->   <link href="/build/css/app-cc019f8b59.css" rel="stylesheet"> ... <!-- Scripts -->   <script src="/build/js/app-a417f277bc.js"></script>

그 결과 css, js 의 적용이 되지 않습니다. 사용자 등록과 로그인은 문제없이 동작합니다.

아래와 같이 layout.app 에서 cdn 으로부터 직접 읽어들이면 css 는 적용이 됩니다.

<!-- Styles --><link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

appkr commented 3 years ago

@kwangmson 리포트 고맙습니다. 확인해볼게요.

kwangmson commented 3 years ago

.env 화일은 다음과 같습니다.

MySQL 이 에러가 나서 구글링하여

DB_HOST=localhost 를 DB_HOST=mysql 로 변경하였더니 MySQL은 정상 동작되었습니다.


APP_ENV=local APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxx APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost:8000

API_DOMAIN=api.myapp.dev APP_DOMAIN=myapp.dev

DB_CONNECTION=mysql DB_HOST=mysql # localhost # 127.0.0.1 DB_PORT=3306 DB_DATABASE=myapp DB_USERNAME=homestead DB_PASSWORD=secret

BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379

MAIL_DRIVER=log

...

PUSHER_KEY= PUSHER_SECRET= PUSHER_APP_ID=

appkr commented 3 years ago

@kwangmson 이렇게 변경하고 해보시겠어요? 변경된 내용은 본문의 zip 파일에도 반영해두었습니다.

--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -50,6 +50,7 @@ services:
     ports:
      - 8000:8000
     volumes:
+      - ..:/app
       - ./laravel.conf:/opt/bitnami/nginx/conf/server_blocks/laravel.conf
     depends_on:
       - laravel
kwangmson commented 3 years ago

감사합니다.

allnight123 commented 2 years ago

로컬 개발 서버로 로컬 컴퓨터에서 개발할 때 이렇게 명령하던 것을

~/myapp $ php artisan

Docker 컨테이너를 사용할 때는 이렇게 하셔야 합니다

~/myapp $ docker exec -it laravel php /app/artisan

Laravel Framework version 5.3.31

...

이렇게 하라고 하셨는데요..

컴포저 같은거는 어떻게 실행 하나요? 의존성에서 계속 에러가 나서.. 진행을 못하고 하루를 그냥 날렸네요.. 컴포저 버전이 너무 높아서 안되나 하고 다운그레이드를 시켰더니.. php버전을 맞추라고 에러가 뜨고.. ㅠㅠ

마크다운 다듬기 진행중인데.. 더이상 진행을 못하고 있습니다.

이.. 자료를 미리 봤다면 처음부터 도커로 시작했을텐데.... 몇번을 뒤엎고 하다보니 지치네요..ㅠㅠ 맥프레 2013 이라서 버전업도 못하는터라,, 도커도 cli 만 써야 합니다.

appkr commented 2 years ago

@allnight123 두 가지 방법을 안내해드릴게요.

첫째, 로컬 컴퓨터에서 도커 컨테이너에 명령을 내리는 방법

$ docker exec -it laravel composer

둘째, 도커 컨테이너로 들어가서 명령을 내리는 방법

$ docker exec -it laravel bash
root@container-hash:/# composer
allnight123 commented 2 years ago

질문에 빠른 답변 주셔서 감사합니다.

가끔 소스를 따라치다가 어딘가 오타가 났는데 찾기가 너무 힘들때는 빠른진행을 위해서,

태그로 다운받아서

전부 덥어쓰고 실행을 하는데요..

도커로 할때는 어떻게 하는지 계속 헤메고 있습니다.

이 방법도 알려주셨으면 합니다.

혹시 이부분이.. composer.lock , /vendor 이 두가지 지우고 `$ docker exec -it laravel composer update '

이렇게 실행하면 될까요?

appkr commented 2 years ago

@allnight123 예 composer.lock /vendor 폴더 지우고 composer install 하시면 됩니다 그리고, 가이드를 잘못했는데, 두 번째 방법으로 하셔야합니다. 도커 컨테이너에 들어가서 app 폴더로 이동한 후 composer install 하시면 될거에요.

allnight123 commented 2 years ago

첫번째 방법으로 했더니.. json 파일이 없다고 나오길래 잠깐 헤메다가.. alias 를 별도로 주고 실행했더니 되더라고요.. alias dcomposer='docker exec -it laravel composer ' 이렇게 별칭주고 dcomposer update 하니깐 잘 됬습니다.. 나중에 install 도 테스트 해볼께요~

답변 정말 번개 속도로 주셔서 너무 감사해요~~~

allnight123 commented 2 years ago

바로 또 질문사항이 나왔네요.. node.js , npm , gulp

책내용과 너무 버전차이가 나서.. 실행을 하면 혹시 될까 하고 해봤지만.. 역시나 안되는군요.. 이부분은 넘기는것이 낫겠죠?

책 후반부에 gulp 를 또 다룬다면 한참 헤멜꺼 같은데.. 이부분은 어떻게 해야 할까요?

좀 꼭 시도 해보지 않아도 될만한 부분을 알려주시면.. 좋을거 같아요..

appkr commented 2 years ago

건너 뛰셔도 됩니다. js, css 는 전부 넘기셔도 됩니다.

나의 iPhone에서 보냄

      1. 23:50, Bae Sung Min @.***> 작성:

 바로 또 질문사항이 나왔네요.. node.js , npm , gulp

책내용과 너무 버전차이가 나서.. 실행을 하면 혹시 될까 하고 해봤지만.. 역시나 안되는군요.. 이부분은 넘기는것이 낫겠죠?

책 후반부에 gulp 를 또 다룬다면 한참 헤멜꺼 같은데.. 이부분은 어떻게 해야 할까요?

좀 꼭 시도 해보지 않아도 될만한 부분을 알려주시면.. 좋을거 같아요..

— Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android. You are receiving this because you authored the thread.

allnight123 commented 2 years ago

tag 로 다운 받았을때 폴더를 통채로 덮어 씌울때요.. 순서가.. 1 .2021용 myapp.zip 을 먼저다운받는다.

  1. tag 파일을 다운받는다.

  2. tag 파일안에 있는내용을 myapp에 덮어쓴다.

  3. 도커를 실행한다. docker-compose -f docker/docker-compose.yml start

  4. 환경변수 복사를 한다. docker exec -it laravel cp /app/.env.example /app/.env

  5. 키를 생성한다. docker exec -it laravel php /app/artisan key:generate

  6. composer.lock /vendor 폴더 지운다

  7. 도커에 접속을 한다. docker exec -it laravel bash

  8. app 폴더로 이동한다 cd app

  9. composer install 실행한다.

이렇게 정리 되는게 맞는거죠?

아까 안되서 한참을 삽질하다가.. 머리를 좀 식히고 나니.. 잘 됬습니다..

appkr commented 2 years ago

@allnight123 그렇게 하시면 됩니다

allnight123 commented 2 years ago

사용자 인증 재구성에서 비밀번호가 바뀌지 않습니다.

책 233페이지 코드 23-27

이부분이 좀 이상한것이.. 예제 태그를 다운받아서 돌려보면 되는것같아보였는데.. 책내용과 태그소스 부분이 좀 달라서 어떤내용이 맞는건지 잘모르겠어서..

일단 태그 내용을 먼저 돌려보고, DB를 확인해봤는데, 토큰의 변화가 없고 update 가 되지 않아서,

책의 내용인

    \App\User::whereEmail($request->input('email'))->first()->update([
        'password' => bcrypt($request->input('password'))
    ]);

이 부분을 추가해주었더니.. 에러가 나네요..

이메일로 받은 링크 클릭해서 접속하면 에러가.. 나는군요..

왜 그런건지는 잘 모르겠어서.. 질문 남깁니다.

allnight123 commented 2 years ago

제가 이글을 남기고 나서.. 너무 안되서 삽질 하다가.. 그냥 놔뒀거든요.. 그리고 도커를 리스타트 시켜주고.. 서비스 다시 올려줬더니.. 다시 정상작동을 하네요..

그래서 질문이 있는데요.. 도커가 좀 이상하게 작동 한다고 생각되는 타이밍이 있을거 같아서..

"지금 이 상황은 좀 이상하다" 라고 느낄때.. 도커를 리붓 해주고 싶은데요..

이건 말로 표현 하기 힘들겠죠?

appkr commented 2 years ago

@allnight123 .env가 변경/추가 되거나, 도커 환경변수가 변경/추가되면 도커 재시작해주시면 됩니다. 호스트 머신에 있는 프로젝트 폴더를 도커에 그냥 마운트했고, opcache도 꺼져있기 때문에 코드 변경으로 인해 도커를 재시작할 필요는 없을 것 같아요. 혹시, 도커를 재시작해야 하는 다른 상황이 발생하면 다른 분들을 위해 이곳에 메시지 남겨주세요.

allnight123 commented 2 years ago

제가 표현을 잘못 말한거 같네요.. 도커를 재시작 한다는 말은.. 제 로컬에 설치된 도커앱을 껏다가 켠다는 말이었습니다..

실제로 돌고 있는 서비스를 리붓 한다는 말은 아니었습니다... 오해의 소지가 있는 말을 해서 헷갈리게 했네요..^^;;

allnight123 commented 2 years ago

소셜 로그인 하고 있는데요.. 이부분은 정말 에러 인거 같습니다. 최근에 깃헙에서 인증관련해서 공지 올라온것을 한번본거 같은데.. 기억은 잘 안나지만.. 이 에러는.. 아무래도 다이렉트로 깃헙과 연동은 기존 코드하고는 안맞는것 같아요..

스크린샷 2022-03-09 오전 2 20 08

appkr commented 2 years ago

@allnight123 깃헙 API가 바꼇고, 프로젝트에서 사용중인 Socialite가 바뀐 깃헙 API를 수용하지 못하나봅니다. 5년이 훌쩍 지났으니 그럴만 하죠. Socialite를 버전업하는 방법이 있긴한데, 상당한 삽질이 예상되니, 내용만 가볍게 읽고 다음 챕터로 넘어가시면 좋겠습니다.

appkr commented 2 years ago

laravel 컨테이너는 아래 설정으로 xdebug를 포함하고 있습니다; 설정법은 이 포스트를 참고하세요.

~/myapp $ cat docker/files/usr/local/etc/php/conf.d/xdebug.ini

# 주요하지 않은 설정은 생략
xdebug.idekey=IDEA
xdebug.remote_port=10001

책을 학습하는 동안에는 dd() 함수면 충분합니다.

책을 완독했거나, PHP 개발에 익숙하고 xdebug 설정 및 사용에 어려움이 없는 중급자 분들은, xdebug를 통해 라라벨 프레임워크의 작동 원리를 더 잘 이해할 수 있을 겁니다.

사실 xdebug 포함 사실을 알릴까 말까 많이 고민했습니다. PHP 웹 개발 및 라라벨에 익숙하지 않으신 분에게는 이 댓글은 독이 될 가능성이 큽니다. xdebug는 단지 장식입니다, 본질은 라라벨 학습이니까요. 웬만큼 익숙할 때 디버거를 사용해도 늦지 않습니다. xdebug를 사용할지 말지는 독자 여러분이 현명하게 판단하기길 바랍니다.