본문 바로가기
코딩과 알고리즘

php, 네임스페이스 [ namespace ] ?!

1. 오토셋 APM 인스톨러 ( apache + php7.2 + mariadb ) 설치 | https://itadventure.tistory.com/93

2. 코드이그나이터 4 ( codeigniter 4 ) 설치 | https://itadventure.tistory.com/95

3. 비주얼 스튜디오 코드 에디터 설치 & 한글 설정 | https://itadventure.tistory.com/96

4. 폴더열기 / 웹페이지 편집(1) | https://itadventure.tistory.com/97

5. 웹페이지 편집(2) | https://itadventure.tistory.com/101

6. 코드이그나이터4의 URL 규칙 | https://itadventure.tistory.com/105

♣ 7. php, 네임스페이스 [ namespace ] ?! ♣


코드이그나이터에서는 컨트롤러 또는 컨트롤러의 메소드 1개가
웹페이지 URL에 1:1로 대응한다고 지난 시간에 다뤄본 바가 있습니다.

사실 컨트롤러 소스의 글자 하나하나에는 나름대로의 의미가 있는데요.
오늘은 코드이그나이터 대부분의 첫번째 줄에 표시되는 네임스페이스의 의미에 대해 알아보도록 하겠습니다.


네임스페이스!
자바나 c#에서나 들어보았던 네임스페이스를 이제 PHP에서도 만나보게 되었는데요.
네임스페이스란 간단히 말하면 '나는 ㅇㅇㅇ 소속이다'라고 정의하는 겁니다.
그리고 사용하는 측에서도 ㅇㅇㅇ 소속의 아무개를 불러다 쓰는 것이지요.

네임스페이스를 사용할때는 엄청난 장점이 있는데요.
동일한 함수명, 다른 기능을 하는 함수 또는 동일한 클래스, 다른 기능을 하는 클래스를 무한대로 만들수 있습니다. 과거 php 코딩 방식으로는 상상도 할 수 없었지요.
동일한 함수명을 정의하면 원래 무조건 에러가 나게 되어 있었습니다.

코드이그나이터의 규칙의 틀 안에서는 제약조건이 있긴 하지만,
이번 시간에는 잠시 코드이그나이터4의 기본규칙을 벗어나
원래 php7 기능을 100% 활용하는 방식으로 네임스페이스를 이해해보도록 하겠습니다 :)

지난 시간에 비주얼 스튜디오 코드 편집기에서 폴더와 파일을 만드는 방법을 다루어 보았었지요?
특히 Sample2 폴더를 만들었는데 그 폴더 아래에 다음 2개의 파일을 추가해 주시기 바랍니다.

Americano.php

<?php namespace Americano;

function Drink()
{
    echo "구수하다<br/>";
}

Cafelatte.php

<?php namespace Cafelatte;

function Drink()
{
    echo "달다<br/>";
}

추가한 2개의 파일이 탐색기 창에 이렇게 표시되면 됩니다.

혹시라도 왼편의 탐색기 창을 닫았거나 다른 창을 열어서 보이지 않거든
화면 상단 메뉴의 보기 - 탐색기 메뉴를 선택하시면 되구요.

2개의 소스에서 첫번째 줄에 네임스페이스 문을 선언했는데요.
과연 이 코드는 무슨 의미일까요?

우선 Americano.php 에서 namespace Americano; 라고 기술한 부분은
이 파일은 Americano 소속이다~ 라고 밝힌 부분입니다.

<?php namespace Americano;

그리고 나서 Drink() 라는 함수를 선언했지요.

       :
function Drink()
{
    echo "구수하다<br/>";
}

namespace 는 소스의 앞 부분에 기술해주어야 합니다.
그래야 이 후로 나오는 모든 함수나 클래스는 해당 네임스페이스의 소속이 됩니다.
Drink() 라는 함수를 정의했지만 이 함수를 사용할 때는 Drink(); 라고 사용하시면 안되고 아래와 같이 사용하셔야 합니다.

Americano\Drink();

상식적으로 네임스페이스는 한번만 기술하는 것이 일반적이지만,
php 에서는 그 마저도 자유롭습니다.

만일 소스를 아래와 같이 작성하면,
Americano 소속의 Drink() 함수와 Capuchino 소속의 Drink() 함수 2개가 모두 생겨납니다.

<?php namespace Americano;

function Drink()
{
    echo "구수하다<br/>";
}

namespace Capuchino;

function Drink()
{
    echo "버블버블<br/>";
}

각각의 함수를 사용하는 방법은 아래와 같지요.

Americano\Drink();
Capuchino\Drink():

Cafelatte.php 파일도 같은 맥락입니다.
소스를 아래와 같이 작성했는데요. Cafelatte 소속의 Drink() 함수가 하나 생겨나는 것이지요.

<?php namespace Cafelatte;

function Drink()
{
    echo "달다<br/>";
}

이제 이 함수를 사용하기 위해서 지난번 Sample2/Book.php 소스를 약간 가공해봅시다.
해당 파일을 열어 소스를 아래와 같이 수정해 주세요.

<?php namespace App\Controllers\Sample2;
use CodeIgniter\Controller;

require_once(APPPATH."Controllers/Sample2/Americano.php");
use Americano;

require_once(APPPATH."Controllers/Sample2/Cafelatte.php");
use Cafelatte;

class Book extends Controller
{
	public function index()
	{
		Americano\Drink();
		Cafelatte\Drink();
	}
}

주목해주실 부분은 이 2줄입니다.
네임스페이스를 사용하는 쪽에서는 이 2줄이 매우 중요하지요.

첫번째는 Americano.php 파일 경로가 app\Conrollers\Sample2\Americano.php 이므로
파일을 불러오는 require_once 문을 아래와 같이 구성합니다.

require_once(APPPATH."Controllers/Sample2/Americano.php");

두번째는 Americano 소속의 기능을 사용하겠다는 선언을 하나 해주어야 합니다.

use Americano;

이렇게 해야 Americano 네임스페이스 기능을 사용할 수 있는 것이지요.

카페라떼 소스도 마찬가지로 require_once 로 파일을 사용할 수 있도록 포함시켜 준 다음에
use 문으로 사용을 선언하도록 되어 있습니다.

require_once(APPPATH."Controllers/Sample2/Cafelatte.php");
use Cafelatte;

그리고 최종적으로 index() 메소드에서
2가지 네임 스페이스의 Drink() 함수를 사용하는 것이지요

Americano\Drink();
Cafelatte\Drink();

이 소스를 실행해보기 위해 웹브라우저를 열고 다음을 입력해보세요.

http://localhost/sample2/book

그러면 아래와 같이 실행결과가 노출될 것입니다.
각각 다른 네임스페이스의 Drink() 함수가 출력된 결과이지요.

구수하다
달다

그냥 함수를 아래와 같이 정의하면 되지 않나요? 하시는 생각도 드실텐데요.

function Americano_Drink(){ ... }
function Cafelatte_Drink(){ ... }

우선 깔끔하지가 않습니다.
"새 술은 새 부대에 담으라"는 성서 말씀이 있듯이
php7을 사용한다면 새로운 사용법을 익혀서 소스를 깔끔하게 유지하는게 좋지요.

그리고 만일 Americano 소속의 함수가 여러개 정의되었다면,
모든 함수명의 이름을 다 바꾸어 주셔야 합니다.
새로운 Buttletea_* () 함수들을 추가하려고 해도 마찬가지구요.
하지만 네임스페이스는 한 군데만 바꾸어주면 끝입니다 :)


네임스페이스에 대해 대략적인 개념이 이해되셨는지 모르겠습니다.
php7에서는 원래 네임스페이스와 파일명이 동일하지 않아도 됩니다만,
코드 이그나이터의 기본 규칙을 따를 때는 좀 다릅니다.

네임스페이스명이 폴더구조 + 파일명과 똑같이 구성이 되어야 하거든요.
그 부분은 다음 시간에 다뤄보도록 하겠습니다.

아메리카노는 맛이 쓰다는 분도 계시고 구수하다는 분도 계신데요.
아마도 인생의 맛이 쓴 분에게는 쓰게 느껴지고,
인생의 맛이 구수한 분에게는 구수하게 느껴질 수도 있을것 같습니다.

아무쪼록 힘든 일이 있으시더라도 피할수 없다면 즐기는게 어떨까요?
힘든 일도 즐기고, 어려운 일도 즐기면서 극복하고 세상을 살아가다 보면
보람도 느껴지고 세상 사는 맛이 생겨나지 않을까 합니다.

성경 말씀 하나 올려드립니다.
창조주 신 하나님의 뜻이 이러한 것은
인간이 하나님을 기억하며 행복하게 살아라~는 의미가 아닐까요? :)

항상 기뻐하라
쉬지 말고 기도하라
범사에 감사하라

이는 그리스도 예수 안에서 너희를 향하신
하나님의 뜻이니라.

- 데살로니가전서 5장 16-18절 말씀 -

추석이 막바지인데요. 푹 쉬시다가 다가오는 가을을 즐거움으로 맞이하시는 모두가 되시기를 소원합니다.
감사합니다.