Symfony - "Hello Dolgo!!" 출력
조회수 2.2k 등록일 2016.05.30 21:44:47

저번 강좌에서는 Symfony의 디렉토리 구조에 대해서 배웠습니다.

이번 강좌는 프로젝트를 준비하는 단계로 DB 설정, PHP 엔진 활성화, Route 구성 등등 설정을 변경하여 "Hello Dolgo!!"를 출력하는  첫번째 페이지를 생성해 보겠습니다.


DB 설정

DB 설정은 기본적으로 app/config/parameters.yml 에서 관리합니다.

  1. #app/config/parameters
  2. # This file is auto-generated during the composer install
  3. parameters:
  4.     database_host: 127.0.0.1
  5.     database_port: 3306
  6.     database_name: my_database
  7.     database_user: ~~~~
  8.     database_password: ~~~~
  9.     ~~

app/config 파일을 보면 parameters.yml 파일을 import하여 아래 doctrine ORM에서 연동하고 있는걸 볼 수 있습니다.

  1. #app/config/config.yml
  2. imports:
  3.     - { resource: parameters.yml }
  4.     - { resource: security.yml }
  5.     - { resource: services.yml }
  6. ~~~~
  7. # Doctrine Configuration
  8. doctrine:
  9.     dbal:
  10.         driver:   pdo_mysql
  11.         host:     "%database_host%"
  12.         port:     "%database_port%"
  13.         dbname:   "%database_name%"
  14.         user:     "%database_user%"
  15.         password: "%database_password%"
  16.         charset:  UTF8
  17. ~~~~

다른  파일에서 관리하고 싶다면 해당 파일을 import 해주면 다른 디렉토리, 파일에서도 유연하게 관리 할 수  있습니다. 


PHP 템플릿 엔진 활성화

Symfony에선 템플릿 엔진으로 twig 을 기본적으로 지원해주고 있습니다. twig은 Symfony와 마찬가지로 SensioLabs에서 지원 및 개발하고 있는 템플릿 엔진으로 빠르고, 유연하고, 보안이 뛰어나고, 간결하다고 하나 아직 사용하기엔 정보가 많이 부족한게 사실이기에 우리는 PHP으로 템플릿 엔진을 사용합니다. Twig에 대해 궁금하신 분들은 공식 사이트(http://twig.sensiolabs.org )을 참고해 주세요.


config.yml파일에 PHP 엔진을 활성화 해줍니다. 간단합니다. app/config.yml 에 templateing 엔진으로 php를 작성하기만 하면 됩니다.

  1. #app/config.yml
  2. framework:
  3.    ~~~
  4.     templating:
  5.         engines: ['twig','php']
  6.     default_locale:  "%locale%"
  7.    ~~~

자, 이제 PHP 템플릿 엔진, DB연동이 완료 되었습니다. 전에도 말씀드렸듯이, 수정한 config 정보를 prod 환경에 적용하기 위해선 cache 를 clear 해야 합니다. cache를 clear 합니다.

  1. $php app/console cache:clear --env=prod

불필요한  파일 정리

불필요한 파일 정리는 깨끗한 상태에서 프로젝트를 시작함을 위한거니 굳이 하지 않으셔도 됩니다.

Symfony를 설치하면 기본적으로 설치되는 src/AppBundle, app/Resource/views/* 를 삭제합니다. 삭제를 하고 cache를 clear하면 PHP 에러가 출력됩니다. AppKernel에서 방금 삭제한 AppBundle을 찾을 수 없다는 거니 AppKernel을 열어 AppBundle을 주석 또는 삭제합니다. 그리고 routing.yml에서도  AppBundle 삭제합니다.

  1. #app/AppKernel.php
  2. $bundles = array(
  3.     new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
  4.     new Symfony\Bundle\SecurityBundle\SecurityBundle(),
  5.     new Symfony\Bundle\TwigBundle\TwigBundle(),
  6.     new Symfony\Bundle\MonologBundle\MonologBundle(),
  7.     new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
  8.     new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
  9.     new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
  10.     #new AppBundle\AppBundle(),
  11. );
  1. #app/routing.yml
  2. #app:
  3.    #resource: "@AppBundle/Controller/"
  4.    #type:     annotation

자, 다시 cache clear를 다시 진행합니다. 아무 문제 없이 clear되는걸 볼 수 있습니다.

이제 Bundle과 Controller을 생성하여 해당 Controller에  http://localhost/dolgo URL을 매칭하여 "Hello Dolgo!!"를 출력하도록 하겠습니다.


그  전에, route에 대해 간단히 설명드리자면, route는 URL과 Controller를 매칭시켜 주는 것으로 route로  URL을 구성하면 다양하고 유연하게 URL을 구성 할 수 있다는 장점이 있습니다. route 포맷으로는 Annotations, YAML, XML, PHP 를 지원하고 있으며 자세한 사항은 여기 를 참고하세요.


Bundle 생성

이제 우리가 테스트로 사용할 Bundle을 생성하도록 합니다. Symfony에서 제공하는 Console 명령을 이용하여 번들을 생성합니다.

  1. $php app/console generate:bundle

위의 명령어를 실행하면 몇가지 질문을 합니다.


1. Are you planning on sharing this bundle across multiple applications?[no] : enter

    - 2.8버전부터 추가된  것으로 생성할 번들이 다른곳에 배포 될 예정인지 질의하는 것입니다. no를 입력하면 src/밑에 Bundle이 바로 생성되고 yes로 하        게되면 src/과 Bundle 사이에 배포하는 업체? 디렉토리로 관리 할 수 있습니다. 기본인 no로 합니다.


2. Bundle Name: DolgoBundle 

    - 번들의  이름을 입력합니다.


3. Target Directory[src/]: enter

    - 번들이 생성될 디렉토리를 정의합니다. 


4 .Configuration format (annotation, yml, xml, php) [annotation]: php

    - 번들 내 config 파일의 포맷을 정의합니다. 강좌에서는 config 포맷은 모두 php이기에 php로 정의해 줍니다.


Bundle 생성이 완료되었습니다. Symfony2.8 이전 버전에서는 생성될 Bundle에 대해서 Kernel과 Routing에 자동으로 추가 할것인지에 대해서도 질의하니 yes를 입력해 주시면 됩니다. 자, src/ 하위 디렉토리를 봅시다. 우리가 테스트로 가지고 놀 DolgoBundle이 생성되어 있는걸 알 수 있습니다. Symfony에서 Bundle을 생성하면 기본적으로 Default Controller, Default Template가 설치돕니다. 하지만 우리는 하나하나 다시 재작성할 것이기에 과감히 삭제합시다.


Controller 생성

Index라는 Controller를 DolgoBundle에 생성해 보겠습니다. Bundle과 마찬가지로 Console을 이용하여 생성합니다.

  1. $php app/console generate:controller

1. Controller name: DolgoBundle:Index

    - Controller 이름을 정의합니다. Controller가 종속될 Bundle도 잊지 말고 입력해 주세요.


2. Routing format (php, xml, yml, annotation) [annotation]: php

    - route 포맷을 정의합니다. 


3. Template format (twig, php) [twig]: php

    - 템플릿 엔진을 정의합니다.


Controller 생성이 완료되었습니다. 

이제 Index Controller에  /dolgo URL을 매칭시켜줘야 합니다. 

  1. #DolgoBundle/Resources/config/routing.php
  2.  
  3. use Symfony\Component\Routing\RouteCollection;
  4. use Symfony\Component\Routing\Route;
  5.  
  6. $collection = new RouteCollection();
  7.  
  8. $collection->add('dolgo_homepage', new Route('/dolgo', array(
  9.     '_controller' => 'DolgoBundle:Index:index',
  10. )));
  11.  
  12. return $collection;

다음으로 Index Controller에 IndexAction 코드를 작성해 봅시다.

  1. #DolgoBundle/Controller/IndexController.php
  2. php
  3.  
  4. namespace DolgoBundle\Controller;
  5.  
  6. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  7. use Symfony\Component\HttpFoundation\Response;
  8.  
  9. class IndexController extends Controller
  10. {
  11.     public function indexAction()
  12.     {
  13.         echo 'Hello Dolgo!!';
  14.         return new response();
  15.     }
  16. } 

위 코드 작성 후 cache를 clear하고 http://localhost/dolgo URL로 액세스하면 "Hello Dolgo!!"가 출력되는 걸 볼 수 있습니다.

하지만, 우리가 원하는 건 Template에 렌더링 된 "Hello Dolgo!!" 를 출력시키려는 것입니다. Controller에서 정의하는 코드들은 서버단 코드인 PHP만 작성하고 html은 Template에서 정의해 봅시다.


다시, IndexAction을 재정의 합니다.

  1. #DolgoBundle/Controller/IndexController.php
  2. php
  3.  
  4. namespace DolgoBundle\Controller;
  5.  
  6. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  7. use Symfony\Component\HttpFoundation\Response;
  8.  
  9. class IndexController extends Controller
  10. {
  11.     public function indexAction()
  12.     {
  13.         return $this->render('DolgoBundle:Index:index.html.php', array());
  14.     }
  15. }

크게 달라진 건 없습니다. echo 문이 삭제되고 DolgoBundle:Index:index.html.php  파일로 렌더링한다는 게 전부입니다. Controller명 뒤의 Action은 웹에서 액세스 하는 함수라는 것으로 내부적으로 쓰신다면 굳이 Action을 쓰지 않으셔도 됩니다. 또한, Template의 파일 형식은 마지막에 꼭 엔진을 적어 주셔야 합니다. 그래야지만 Symfony에서 인식하여 에러를 토해내지 않습니다.


Template .. Template은 Resource/views/ 에 위치해야 합니다. 

Resource/views/Index/index.html.php 로 파일을 생성 후 아래 "Hello Dolgo ~ Template!!" 을 작성해 줍니다.

  1. #Resource/views/Index/index.html.php
  2. "Hello Dolgo ~ Template!!"

다시 http://localhost/dolgo에  엑세스 해봅시다

이제 템플릿 까지 렌더링 된 Hello Dolgo가 출력되어 졌습니다.!


후.. 수고 많으셨습니다.. 작성하다 보니 조금 길어졌네요.. 


감사합니다.