Java 프로그래머가 PHP를 시작하는 방법

320x100

들어가며

안녕하세요, Java 백엔드 프로그래머.. 였습니다.

최근 이직을 통해 PHP를 사용하는 스타트업으로 들어가게 되었는데, 지금까지 학생 때 C, C++을 배우고 실무에서 Java를 사용하며, 혹시 몰라 python, kotlin 언어들의 기본적인 문법이나 특징 들을 배웠었고, Node.js를 통해 토이 프로젝트도 하나 만들어봤어서 나름 넓은 선택지라고 생각했었는데 어쩌다보니 아예 써보지 않았던 PHP 개발자가 되려고 하네요..

 

솔직히 이야기하자면, PHP에 대해 아예 모르던 입장에서 듣고 본 얘기들로만 생각했을 땐 거부감이 좀 있었습니다. 편협한 제 생각으로 PHP는 구식 언어이자 현재는 비인기 언어라고 생각했기 때문이죠.

그러나, PHP 언어로 코드 한 줄 작성해보지도 않고 판단하는건 너무 건방진 생각이고, 이러나 저러나 PHP 프로그래머가 되어야 하기 때문에 이 언어에 대해 부정적으로 생각하는 것 자체가 생산성 없는 일이라고 생각합니다. 프로그래머가 본인이 사용하는 기술을 안좋게 생각하다니요. 그럴거면 하질 말든가 해야지.

 

그래서 우리 PHP의 단점을 이해하되 장점들을 더 강하게 보도록 노력했고, 기본적인 문법의 차이를 비롯해 라라벨 프레임워크의 기본 형태 및 동작 등을 이해하기 위해서 공부했습니다.

참고로, 이 글은 타 프로그래머가 PHP와 라라벨 프레임워크가 무엇인지 궁금할 때, 기본적으로 이렇게 돌아가는 언어구나~를 이해하신다면 좋겠다는 생각으로 추린 내용입니다. 다른 프로그래밍 언어를 이미 잘 다루고 있었고, Spring 등의 프레임워크 등을 통해 서버를 구축해보신 적 있는 분이 저와 비슷하게 PHP 프로그래머로 넘어가려는 사람에게 해당되는 글이며, 첫 프로그래밍 언어로 PHP를 시작하고자 하시는 분들은 생활코딩 E-going 프로그래머님 등의 강의를 참조하시고, 이 글은 라라벨 프레임워크 A를 익히는 것이지, A부터 Z까지 알고 싶다는 분들에게 해당하는 포스팅은 아닙니다.

 

학습의 목표

학습의 목표는 뚜렷합니다.

1. 다른 프로그래밍 언어를 하나 이상 알고 있는 상태에서의 PHP의 기본 문법

2. PHP 대표 프레임워크인 Laravel Framework의 가장 기본적인 구조와 라우팅 형태 설명

 

참고로, 기본적인 PHP 환경 셋팅, Laravel Framework의 초기 셋팅은 제가 별도로 제작하지 않았고, 각 항목에서 설치 링크를 전달드립니다.

PHP 설치

https://www.inflearn.com/course/lecture?courseSlug=php7-reboot&unitId=84448

 

PHP 기본 문법

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>PHP 기본 동작</title>
    </head>
    <body>
        <?php
        /* 1. PHP 기본 동작
         * PHP는 .php 파일에 작성을 한다.
         * .php이나, 기본적으로는 html 언어로 작성하며, <?php ?> 내부에서만 php 코드를 작성한다.
        */

        // 2. 주석은 일반 프로그래밍 언어들과 같다.

        // 3. 출력
        echo '<h1>출력 테스트</h1>';
        print('print로 출력해볼까</br>');
        echo 'echo로 출력해볼까</br>'; // 출력문은 echo를 주로 사용함
        echo "따옴표와 쌍따옴표는 같은 의미입니다<br/>";
        echo '문자를 합치는것은 +가 아니라 .입니다'.'<br/><br/>'; // +는 덧셈 연산자로만 사용하기 위해 . 기호로 문자열 합침

        /* 4. 변수
         * 기본 선언 : $변수명 = 값;
         * Javascript처럼 자동으로 자료형을 결정함.
        */
        echo '<h1>변수 테스트</h1>';
        $a = 1;
        echo $a.'<br/>'; // 변수를 사용할땐 언제나 앞에 $기호를 붙여야 함.
        $b = 2;
        echo $a . $b . '<br/><br/>'; // 변수끼리도 . 기호로 이어 출력 가능

        // 5. 배열
        $arr = array(1, 2, 3, 4); // 기본 선언
        $arr2 = [1, 2, 3, 4]; // PHP5.4 버전 이후부터는 이렇게도 선언 가능
        $strArr = array('a' => 10); // key를 숫자가 아닌 문자로도 지정하여 Map 비슷하게 사용 가능

        array_push($arr, 5); // 새로운 값 추가(array_로 시작하는 배열 관련 함수들이 존재)
        unset($arr[0]); // 0번째 인덱스 제거(제거 후 0번째 인덱스에 값은 비어있으나, 공간은 차지하고 있음=>당겨지지 않음)

        // 6. type과 값 출력
        echo '<h1>타입 테스트</h1>';
        var_dump($arr); echo '<br/>'; // 출력 결과 : array(4) { [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }
        var_dump($a); echo '<br/>'; // 출력 결과 : int(1)

        // 7. 비교 연산자
        echo '<h1>비교 연산자 테스트</h1>';
        $num = 5;
        $strNum = "5";

        var_dump($num == $strNum); echo "</br>"; // 값 비교
        var_dump($num === $strNum); echo "</br>"; // 값, type 비교
        var_dump($num != $strNum); echo "</br>"; // 값이 동일하지 않은지
        var_dump($num <> $strNum); echo "</br>"; // !=와 동일
        var_dump($num !== $strNum); echo "</br>"; // 값, type이 동일하지 않은지 비교
        var_dump($num > $strNum); echo "</br>"; // 큰지
        var_dump($num >= $strNum); echo "</br>"; // 크거나 같은지
        /* 출력 결과
         * bool(true)
         * bool(false)
         * bool(false)
         * bool(false)
         * bool(true)
         * bool(false)
         * bool(true)
        */

        // 8. 조건문
        echo '<h1>조건문 테스트</h1>';
        $ifNum = 0;
        if ($ifNum == 0) {
            echo "ifNum 변수는 0이다";
        } elseif ($ifNum == 1) {
            echo "ifNum 변수는 1이다";
        } else {
            echo 'ifNum 변수는 0도 1도 아니다';
        }

        // 9. 반복문
        echo '<h1>반복문 테스트</h1>';
        $repeatArr1 = array(1, 2, 3, 4, 5);
        foreach($repeatArr1 as $i) {
            echo $i." ";
        }
        echo "<br/>";

        $repeatArr2 = array('a'=>"hi, ", 'b'=>"I'm ", 'c'=>"so ", 'd'=>"happy.");
        foreach($repeatArr2 as $key=>$value) {
            echo "$value";
        }
        echo "<br/>";

        // 10. 함수
        echo '<h1>함수 테스트</h1>';
        function hello() {
            echo "Hello PHP!<br/>";
        }
        hello();

        function add($num1, $num2) {
            return $num1 + $num2;
        }
        echo add(1, 2).'<br/>';

        function defaultValueFunction($song="Say yes") {
            echo "제가 가장 좋아하는 노래는 $song 입니다<br/>";
        }
        defaultValueFunction(); // 출력 : 제가 가장 좋아하는 노래는 Say yes 입니다
        defaultValueFunction("Swing baby"); // 출력 : 제가 가장 좋아하는 노래는 Swing baby 입니다
        ?>
    </body>
</html>

 

 

Laravel Framework

자바에서 Spring Framework가 있다면, PHP에서는 Laravel Framework가 있습니다.

제가 학습했을 때 느낀 점을 기준으로, 둘 다 프레임워크이기 때문에 기본적인 프레임워크의 특징은 비슷하겠으나, PHP 자체가 서버 사이드 스크립트 언어이기도 하고, maven으로 라이브러리들을 다운받았던 Spring에서와 달리, 명령어들로 라이브러리들을 다운받고, 컨트롤러 등을 생성하는 환경 등을 보고 "좀...많이 다르네?" 생각을 했고, Spring보다는 Node.js와 가까운 것 같네요. Node.js를 사용해보신 경험이 있다면, 많이 비슷하다 느끼실 것 같습니다.

 

Laravel Framework는 실습 위주가 아닌, "전체적으로 이렇게 동작하는구나~"를 알게 하기 위한 방법 위주로 작성하겠습니다. 실무에서 코드를 보았을 때, 흐름을 이해하기 위함이죠.

설치

아무래도 프레임워크는 초기 설정이 제일 힘들겠죠.. 전 능력이 부족해서 해당 설명은 제가 도움받았던 다른 분에게 맡기겠습니다..

https://www.inflearn.com/course/lecture?courseSlug=php-개발자-라라벨&unitId=134749

프로젝트 구조 설명

힘들게 설치를 다 마치셨을까요? 하하..

모쪼록 환경셋팅을 하다가 GG 치시는 경우는 없으셨길 바랍니다..

 

그럼 구조를 설명드려볼게요.

라라벨 프로젝트를 열어보시면 다양한 폴더들과 파일들이 존재할겁니다.

 

저같은 경우에는 뭔가를 배울 때 아직 잘 몰라서 관심도 없는데 하나하나 디테일하게 설명하면 귀에 잘 안 들어오더라고요. 따라서, 먼저 얇고 넓게 익히고, 관심이 가는것들 순서로 하나하나 파고드는 학습 방식을 선호해요. 현재 설명하려는 방식도 이와 같고요.

폴더에 대한 설명은 굉장히 가볍게 하겠습니다. 그냥 "이거 뭐하는 폴더구나~"하고 느껴질 정도로만요.

 

- 폴더 설명

폴더/파일명 설명 폴더/파일명 설명
app 작동 관련 폴더 tests 테스트용 폴더
bootstrap 라라벨 앱에서 기본으로 설정된 기능(일반적으로 알려진 프론트엔드 구성하는 bootstrap 그거 아님) vendor 외부 라이브러리 존재하는 폴더
config 설정 및 헬퍼 함수(*하단 별도 설명) 관련 내용 선언 .env DB 등의 환경 셋팅
database DB 관련 설정 artisan php 몇몇 기능들을 콘솔로 실행 가능하게 해줌(대표적으로, 컨트롤러 생성도 artisan 명령어로 실행)
public css, js파일 등이 있는 곳 composer.json 외부 라이브러리 관리 파일
resources build 전 css, js와 블레이드 html이 있는곳(*하단 별도 설명) docker-compose 프로젝트를 이미지로 만들 일이 있는 경우 사용
route 라우팅 역할하는 파일들 존재 vite.config.js 프론트엔드 관련 설정 파일
storage 파일 업로드/다운로드시 사용하는 폴더    

 

* 헬퍼 함수 : 일종의 라이브러리와 비슷하다고 보면 됨(참고로, 라이브러리 개념도 별도로 존재하며, 헬퍼는 함수, 라이브러리는 클래스 정도로 구분지으면 될듯함)

* css, js 파일 적용 : 프로그래머가 resources 폴더 내부에서 css, js 파일들을 수정하나, 곧바로 프로젝트에 적용되지 않으며, 별도 빌드를 통해 public 내부에 변경된 css, js 파일들을 적용시켜야 함.

* 블레이드 html : php 기준 jsp라고 보면 쉬움.

파일 실행 순서

처음부터 다 외울 필요는 없으나, 언젠가 프레임워크가 어떤 순서로 파일들이 시작되는지는 알 필요가 있을 듯하며, 다음 실행 순서를 가져 동작한다.

public/index.php -> vendor/autoload.php -> bootstrap/app.php -> app/Http/Kernel.php -> config/app.php -> routes/web.php -> resources/views/welcome.blade.php -> app/Providers/RouteServiceProvider.php

Docker와 sail

Docker란

자체 호스팅이 아닌, 컨테이너라고 하는 가상의 컴퓨터를 만들어 이 가상 컴퓨터들이 통신하며 필요한 데이터를 관리(Linux 환경)

환경 설정은 아까 Laravel Framework 설치 시 하셨을거라 생각합니다.

sail

도커에서는 일반적으로 docker-compose를 사용하나, 라라벨에서는 sail 명령어로 대체함

  • 자주 사용되는 명령어 종류(sail up -d로 가동된 상태에서만 사용 가능)
    • composer : 외부 라이브러리 설치
    • artisan : 프로젝트 파일 생성 및 수정
    • node : 프론트엔드 node.js 관련 실행
    • npm : 라라벨에 node.js 패키지 설치
    • mysql : mysql 컨테이너 명령창 불러오기
  • artisan
    • sail artisan list를 통해 명령어 확인 가능
      make, storage, db쪽 명령어들 자주 사용
    • sail artisan storage:link
      업로드/다운로드 폴더 생성
    • sail artisan make:controller [컨트롤러명]
      컨트롤러 생성
    • sail artisan make:migration [테이블명]
      테이블과 마이그레이션

라우팅, 컨트롤러

폴더 설명에서 라우팅 폴더는 route폴더로 말씀드렸었습니다.

그중에서도 route/web.php 파일에서 기본적으로 url을 통해 홈페이지에 접속했을 때, 컨트롤러를 연결시켜 화면을 보여주는 형태를 갖고 있습니다.

 

-기본적인 라우팅 지정 방법

1. 블레이드 파일 생성 또는 수정
앞서 말씀드렸듯, 블레이드 파일은 Spring의 jsp와 비슷하다고 보시면 됩니다.

<!-- resources\views\welcome.blade.php 파일 내부 -->
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>라라벨 실습</title>
    </head>
    <body>
        <h1>안녕하세요</h1>
    </body>
</html>

 

2. 컨트롤러 생성
터미널에 'sail artisan make:controller NewController' 명령어를 통해 컨트롤러 생성

 

3. 컨트롤러 내부에 라우팅 함수 생성

<?php
// app\Http\Controllers\NewController.php 파일
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class NewController extends Controller
{
    public function index() {
        return view("welcome"); // resources/views안에 존재하는 welcome.blade.php로 라우팅(파일명으로 지정하면됨)
    }
}

 

4. 라우팅 지정

<?php
// route\web.php 파일
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\View;
use Illuminate\Http\Request;
use App\Http\Controllers\NewController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', [NewController::class, 'index']); // 주소에 접속시 NewController의 index함수를 실행

참고로, 이 파일에서 라우팅을 지정하는 형식은 다음 4개입니다.

1. Route::get(’/주소’, [컨트롤러클래스:’함수이름’];

2. Route::get(’/주소’, function(){});

3. Route::post(’/연결주소’, function(request, $request) {});

4. Route::post(’/연결주소’, [컨트롤러클래스:’함수이름’]);

 

이렇게 하면, sail up -d를 통해 라라벨 프로젝트를 실행시키고, localhost로 접속시 블레이드 파일로 작성된 홈페이지가 나타납니다.

 

마무리

솔직히, 설치도 다른 링크를 드리고, 라라벨 프레임워크에서 너무나 중요하나 담지 않은 내용도 굉장히 많습니다. 이 글은 정말 타 언어 프로그래머가 "PHP가 뭔지 대충이라도 궁금한데.."라는 생각이 들 때에 대한 궁금증을 해결 해주셨으면 하여 작성한 글이며, 디테일이 많이 부족합니다.

 

이후 학습 및 활용은 다른 분들의 강의나 포스팅을 참고해주시길 바라며, 공식 문서 또한 설명이 잘 되어있어 링크를 남깁니다.

- PHP 공식 문서 : http://docs.php.net/manual/kr/

- Laravel 공식 문서 : https://laravel.kr/docs/8.x/README

320x100

'PHP' 카테고리의 다른 글

PHP 표준 권고(PSR)  (0) 2023.07.04
PHP 기본 문법 요약  (0) 2023.06.30
[PHP & Laravel] JWT Token 방식 구현  (0) 2023.06.23
PHP 전체 개발 환경 정리  (0) 2023.03.28