출처 : https://www.cikorea.net/bbs/view/tip?idx=21004&lists_style=

 

준비물 :

컴포저

컴포저로 설치 된 코드이그나이터 (본인은 3.1.10 에서 진행했습니다.)

MariaDB

(추가) PHP 7.1 버전 이상 .. (본인은 7.3에서 진행했습니다.)

 

그럼 시작하도록 하겠습니다.

packgist 에서 검색하면 제일 많이 사용한 ORM 이라면서 Doctrine 이 최상단에 나옵니다. 이걸 설치할 겁니다.

 

우선 vendor 디렉토리에서 composer.json 을 설정해줍니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

{

    "require": {

        "codeigniter/framework": "^3.1",

        "doctrine/orm": "*"

    },

    "autoload": {

        "psr-4": {

            "": "vendor/codeigniter/framework/application/models/Entities"

        }

    }

 

}

 

autoload  에서 저 경로는 수정해주셔도 됩니다.

키에 해당하는 저 "" 는 네임스페이스가 되는 것 같은데, 저기에 값을 넣어주게되면 오토로딩이 제대로 안되는 것 같아요.

다른 분들은 어떠실지 모르겠네요.

(컴포저 업데이트하게되면 vendor/composer/autoload_psr4.php 여기에 해당 오토로딩 위치가 나오게 되니 참고하시면 됩니다.)

 

아무튼 저렇게 수정해주고

컴포저에 composer update 혹은 심볼릭 링크 안 거신 저 같은 분들은

php composer.phar update

이런식으로 설치하면 의존성 패키지랑 같이 설치가 됩니다.

 

이후 

vendor/codeigniter/framework/application/libraries

이쪽으로 가셔서 Doctrine.php 를 생성해 주고 아래와 같이 코드를 넣습니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

<?php

use Doctrine\Common\ClassLoader,

    Doctrine\ORM\Configuration,

    Doctrine\ORM\EntityManager,

    Doctrine\Common\Cache\ArrayCache,

    Doctrine\DBAL\Logging\EchoSQLLogger;

 

class Doctrine {

 

    public $em = null;

 

    public function __construct()

    {

        // load database configuration from CodeIgniter

        require_once APPPATH.'config/database.php';

 

        // Set up class loading. You could use different autoloaders, provided by your favorite framework,

        // if you want to.

        require_once APPPATH.'../../../doctrine/common/lib/Doctrine/Common/ClassLoader.php';

 

        $doctrineClassLoader = new ClassLoader('Doctrine',  APPPATH.'libraries');

        $doctrineClassLoader->register();

        $entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" ));

        $entitiesClassLoader->register();

        $proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies');

        $proxiesClassLoader->register();

 

        // Set up caches

        $config = new Configuration;

        $cache = new ArrayCache;

        $config->setMetadataCacheImpl($cache);

        // composer 의 경로를 확인하면서 수정해주세요.

        $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models/Entities'));

        $config->setMetadataDriverImpl($driverImpl);

        $config->setQueryCacheImpl($cache);

 

        // Proxy configuration

        $config->setProxyDir(APPPATH.'/models/proxies');

        $config->setProxyNamespace('Proxies');

 

        // Set up logger

        // 이 부분의 주석을 해제하면 쿼리가 나옵니다.

        //$logger = new EchoSQLLogger;

        //$config->setSQLLogger($logger);

 

        $config->setAutoGenerateProxyClasses( TRUE );

 

        // Load the database configuration from CodeIgniter

        require APPPATH . 'config/database.php';

 

        // Database connection information

        $connectionOptions = array(

            'driver' => 'pdo_mysql',

            'user' =>     $db['default']['username'],

            'password' => $db['default']['password'],

            'host' =>     $db['default']['hostname'],

            'dbname' =>   $db['default']['database']

        );

 

        // Create EntityManager

        $this->em = EntityManager::create($connectionOptions, $config);

    }

}

 

주석 잘 유의 하시고 해당 코드를 넣어주세요.

그 다음 해당 위치에서 ../../../../bin/doctrine 를 실행 한번 해줍니다. 이건 사실 정상적으로 동작하는 건지는 잘 모르겠는데

실행했을 경우 별다른 메세지가 나오지 않는다면 정상적으로 경로가 맞다고 볼 수 있겠습니다.

 

이후에 아까 composer.json 에 설정해둔

 

1

2

3

4

5

"autoload": {

        "psr-4": {

            "": "vendor/codeigniter/framework/application/models/Entities"

        }

    }

 

이 위치로 가서 ORM 으로 연동할 php 파일을 만듭니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?php

 

/**

 * @Entity @Table(name="product")

 **/

 

class Product {

 

    /** @Id @Column(type="integer") @GeneratedValue **/

    protected $sn;

 

    /** @Column(type="string") **/

    protected $name;

 

    public function getName()

    {

        return $this->name;

    }

 

}

 

사용하시는 테이블 명, 클래스 명을 유의해서 넣어주세요. 주석처럼 보이는 저 곳에 값을 넣어주지않으면 에러가 납니다.

그리고 주석에 해당하는 부분에 테이블 명을 꼭 넣어주어야되고, Id 부분에는 Primary Key를 꼭 넣어달라고 하네요.

 

마지막으로 config/autoload.php 에서 library 쪽에 Doctrine 을 추가해주거나

$this->load->library('doctrine'); 이런식으로 로드를 해주면 됩니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public function doctrine()

    {

        //오토로딩 안되서 임시방편으로 했던 방법..

        //include_once APPPATH.'models/Entities/Product.php';

        $em = $this->doctrine->em;

 

        $product = $em->find('Product', 1);

 

        if ($product === null) {

            echo "No product found.\n";

            exit(1);

        }

 

        echo sprintf("%s\n", $product->getName());

 

    }

 

컨트롤러 쪽에서 이런식으로 테스트를 진행했는데 잘 나오네요.

 

doctrine 에 대한 자세한 사용방법은

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/cookbook/integrating-with-codeigniter.html

여기서 확인해주세요.



코드 이그나이터에서 웹소켓을 돌리는데 드디어 성공! 꽤나 뿌듯하다.


스택 오버플로우와 국내 블로그의 도움을 많이 받았다.







순서대로 오늘 한 일에 대해서 나열해보자면


1. 공유기 포트포워딩 전면 수정


2. etc/httpd/conf/httpd.conf 에서 프록시 설정



띄어쓰기 주의



나같은 경우는 아파치를 이미 돌리고 있어서, 빨간 칸에는 지금 사용하고 있는 웹사이트 포트번호를 적고(ex:80)


하얀 칸에는 Node.js가 사용할 포트 번호를 적으면 된다.



3. Node.js, npm, socket.io 설치


cent os 7에서 설치하였고, yum install nodejs 명령어로 설치했다. 이 명령어로 설치를 하면 lib/node_module 폴더에 설치가 된다.


이후 yum install npm 으로 패키지 매니저를 설치 한 후, /lib 폴더에서 npm install socket.io를 설치


여기서 꽤나 고생을 했는데, 다른 디렉토리에서 socket.io 설치를 진행하게되면 오류가 계속 난다. 이것 말고도 다른 오류가 계속 났는데 이것저것 수정하고 지웠다 깔고.. 시행착오를 겪다보니 설치가 되었다.



4.  Node.js 프레임 워크라고 하는 express 설치


마찬가지로 npm install express 로 설치하면 된다. /lib 폴더에서 진행.



5. app.js 작성




굳이 app.js로 이름 지을 필요는 없는것 같다. 포트는 아까 프록시 설정했던 포트로 설정.


본인은 /var/www/html 위치에다가 놓았고, 가장 중요한 것은


npm link e

npm link socket.io

npm link express


를 해주어야 모듈 오류가 나지 않는다.



6. html 페이지 작성 후 실행


주소와 포트엔 자기 자신의 도메인이나 아이피, 사용하는 포트를 넣어야함


주소:포트/socket.io/socket.io.js 를 넣으면 알아서 socket.io를 찾는다.





7.  node app.js 실행


실제로 데이터를 주고받으려면 이걸 꼭 실행시켜야 하는데.. 살짝 번거롭다.


좀 더 찾아보면 뭔가 좀 더 좋은 방법이 있을 듯 싶다.









테스트 성공