튜닝 시 유의사항

개발 가이드를 준수하지 않아 발생하는 모든 문제는 전적으로 이용자에게 책임이 있습니다!

📌 튜닝 위치

  • 스킨을 제외한 소스 코드 튜닝은 module 하위에서 이루어져야 합니다.

  • 지정된 구간 이외에서의 개발 작업은 운영 정책상 삭제될 수 있습니다.

📌 기능 확장 시

  • 고도몰 원본 소스를 기반으로 기능을 확장할 때, 반드시 원본 소스의 Class와 Method를 상속받아야 합니다.

  • 고도몰 Classloader의 영향으로 module 폴더 내의 Class 가 원본소스보다 우선적으로 인식되므로, 자동 패치 소스도 적용되려면 꼭 상속을 받도록 개발되어야합니다.

  • 원본 소스 Method를 오버라이드할 때는 원본 소스의 Method에 명시된 파라미터 타입 및 값을 참고하여, 적절한 파라미터 타입을 지정해주어야 합니다.

  • 원본 소스의 Method를 상속할 때 이중 상속으로 인해 Method들이 중복 호출될 수 있습니다.

    이는 쇼핑몰의 성능 저하 및 기능 오동작으로 이어질 수 있으므로 상속을 할 때에는 꼼꼼하게 검토해주시길 바랍니다.

  • 가능하다면 원본 소스의 컴포넌트 함수를 그대로 사용하는 것보다는 필요한 기능에 맞게 새로운 함수를 생성하는 것을 권장합니다. 원본 소스의 함수를 확장해야 하는 경우에는 부모 Method를 상속받아 필요한 로직만 추가하여 확장하는 방식으로 개발해야 합니다.

📌 설계

  • 튜닝 시에는 컨트롤러(Controller)컴포넌트(Component)의 역할을 분리하여 유지보수가 용이한 구조를 만들어주시길 바랍니다.

  • 컨트롤러(Controller)는 클라이언트로부터 요청을 받아 필요한 작업을 컴포넌트(Component)로 요청하고, 그 결과를 바탕으로 뷰(View)를 호출하는 역할을 담당합니다.

  • 컴포넌트(Component)는 비즈니스 로직을 수행하며, 컨트롤러(Controller)로부터 받은 요청을 기반으로 데이터를 조회/수정한 다음 처리된 데이터를 컨트롤러(Controller)로 반환하는 역할을 담당합니다.

📌 Prefix

새로운 Class를 생성하거나 View 페이지로 데이터를 전달하는 경우 고유의 Prefix 를 붙이는 것을 권장합니다. Class 의 경우에는 고유의 namespace 를 사용하는 것도 방법입니다.

📌 Namespace

사용자가 정의하는 namespace 의 시작은 Framework, Bundle, Core 를 사용할 수 없습니다.

📌 ClassPath

솔루션에서 Class 를 로드하는 경로는 module 폴더 아래 입니다. Class 의 이름은 파일명과 동일해야하고, namespace는 폴더 경로와 동일해야 합니다.

namespace Component/Cart; class Cart{} 의 경우 파일의 경로는 module/Component/Cart/Cart.php 입니다.

📌 ClassLoader

솔루션에서 정의한 ClassLoader는 솔루션과 사용자가 동일한 namespace 와 Class 를 생성 할 경우 사용자가 정의한 Class 를 로드합니다. 사용자가 새로운 Class 를 생성할 경우 고유의 namespace 또는 Prefix 를 붙이는 것이 좋습니다.

아래와 같이 클래스가 정의된 경우 Call to undefined method Component\Print\Print::printGodomall() 오류가 발생합니다.

// 솔루션에서 정의한 MsgPrintController
namespace Controller\MsgPrint;
class MsgPrintController {
    public function index() {
    	$msgPrint = new \Component\MsgPrint\MsgPrint();
        $msgPrint->printGodomall();
    };
}

// 솔루션에서 정의한 MsgPrint 클래스와 printGodomall 함수
namespace Component\MsgPrint;
class MsgPrint {
    public function printGodomall() {
    	echo '고도몰 솔루션';
    }
}

// 사용자가 정의한 Print 클래스와 printUser 함수
namespace Component\MsgPrint;
class MsgPrint {
    public function printUser() {
    	echo '고도몰 사용자';
    }
}

📌 Superglobals

PHP 에서 제공되는 Superglobals 변수는 모두 unset 됩니다. 각 변수의 역할을 대체하는 클래스 및 함수는 아래와 같습니다.

$GLOBALS = Framework\Registry\Globals;
$_SERVER = \Request::server();
$_GET = \Request::get();
$_POST = \Request::post();
$_FILES = \Request::files();
$_REQUEST = \Request::request();
$_SESSION = \Session;
$_COOKIE = \Cookie;

📌 Controller 의 setData() 함수

Controller 에서 $this->setData(key, value)를 이용하여 View 데이터를 넘길 때에는 key 가 중복이 될 경우 이전에 담긴 데이터를 덮어쓰게 되므로 prefix 를 붙여서 사용하는 것이 안전합니다.

📌 URI 와 Controller

솔루션에서는 URI를 이용하여 요청을 처리할 Controller 를 찾습니다. URI 와 Controller 간의 규칙은 아래와 같습니다.

URI : SnakeCase

ex) gdadmin.domain.com/order/order_list.php

Controller : CamelCase

ex) namespace Controller\Admin\Order\OrderListController;

📌 Controller 와 ViewPage

솔루션에서는 사용자의 요청을 Controller 가 실행한 뒤 ViewPage 를 찾습니다. Controller 와 Skinfile 간의 규칙은 아래와 같습니다.

Controller : CamelCase

ex) namespace Controller\Admin\Order; OrderListController; ex) namespace Controller\Front\Order; OrderListController;

Skinfile : SnakeCase

ex) /admin/order/order_list.php ex) /data/skin/front/[skin_name]/order/order_list.html

📌 URI_HOME, URI_SHARE

URI_HOME, URI_SHARE 는 View 페이지에서 링크를 지정할 시에 사용되는 상수입니다.

링크의 용도 외에는 사용을 하지 않는 것이 좋습니다.

📌 Request::getDomainUrl()

View 페이지 외에서 도메인을 알고 싶을 때에는 Request::getDomainUrl() 을 이용합니다.

📌 App::load()

싱글톤을 이용하여 최초 생성된 객체를 저장한 뒤 요청이 올때마다 저장된 객체를 반환하는 함수입니다.

📌 PHP Function

  • PHP 내장 함수 사용 시, 올바른 파라미터 타입을 사용해야 합니다. 부적절한 파라미터 타입을 전달하면 타입 에러가 발생할 수 있습니다.

  • 자주 사용되는 PHP 내장 함수 목록과 연결된 공식 문서를 통해 파라미터 타입을 확인하고 개발해 주시길 바랍니다.

자주 사용되는 PHP 함수 목록

Last updated