티스토리 이웃서비스 티네스(Tines) 개발 돌아보기
포트폴리오

티스토리 이웃서비스 티네스(Tines) 개발 돌아보기

티스토리 이웃 서비스, 티네스(Tines)

티스토리에는 지난 수년 간 구독서비스가 존재하지 않았다. 지금은 구독서비스가 추가된지 몇 년이 지났고, 티스토리가 고수하던 티스토리 초대장이 있어야만 블로그를 만들 수 있었던 때도 이미 지나가고 없다. 내가 개발자로 성장하는 동안에도 이러한 구독서비스는 없었는데, 어느 정도 실력이 쌓이고서는 한 번 만들어보자는 생각이 들었다.

 

티네스 서비스는 2018년에 운영, 개발되었고, 현재 운영 중단 상태. 1년도 운영되지 못했다. 내가 티네스를 만들고 1년 내에 티스토리가 구독 서비스를 런칭했기 때문이다. 따라서 나는 눈물을 머금고 서비스를 중단할 수 밖에 없었다. 내 소중한 포트폴리오가 될 수 있었던 것이었는데! 참으로 아쉽기만 하다.

어떤 기능을 제공했나?

웹 서비스

티네스는 기본적으로 티스토리 API 를 통한 로그인과 로그아웃, 어플리케이션 내부에서의 블로그를 구독하고 구독자 및 이웃을 확인할 수 있으며 내가 구독한 블로그의 3일 이내의 포스트를 확인할 수 있다. 또한 관리기능을 제공하여 티네스에 노출할 블로그를 설정하고 삭제할 수 있다. 티스토리는 기본적으로 다중 블로그 운영을 허용하고 있기 때문에 이는 필수적인 기능이었다.

위젯

그 외에 위젯이라는 기능도 제공했는데, 이것은 네이버 이웃커넥터처럼 사용자의 블로그에 내 구독자와 이웃을 표시할 수 있는, 말그대로 작은 위젯이다.

라이브러리와 프레임워크

티네스는 PHP 어플리케이션이다. 따라서 PHP 가 메인으로 쓰였으며, 그 외에 프론트엔드는 VueJS 를 사용했다. 사용한 프레임워크는 라라벨이다. 라라벨은 현재 PHP 생태계를 이끌고 있는 주요 프레임워크 중 하나다. 따라서 나는 라라벨을 사용하여 개발해보기도 했다. 버전은 5.6이다. 현재 포스트를 쓰고 있는 시점에서 라라벨은 8.x 가 나왔는데, 버전 관리 정책을 바꾼 것인지 요즘에는 메이저 버전 위주로만 업데이트 하는 듯 보인다.

 

톺아보기

이제 내가 만들 티네스 어플리케이션을 하나하나씩 뜯어보기로 하자. 라라벨은 MVC 패턴을 따르고 있기 때문에 Model, View, Controller 가 기본적으로 나뉘어 있으나 이 포스트에서 MVC 에 대한 설명을 자세하게 하는 것은 주제를 벗어나기 때문에 궁금하다면 아래의 포스트를 살펴보자.

 

https://pronist.tistory.com/43

 

PHP: MVC(Model, View, Controller)

MVC(Model, View, Controller) 모델, 뷰, 컨트롤러로 분리하는 이 아키텍쳐는 많은 프레임워크에서 사용되는 개념이다. 모델은 코드상 어플리케이션에서 사용되는 데이터인 데이터베이스를 클래스화

pronist.tistory.com

URL 인터페이스

라라벨은 또한 URL 포맷을 RESTful API 형태를 따르는 것을 좋아하기 때문에 아래와 같이 구성되었다.

Method URL Description
GET / 메인
GET /login 로그인
GET /logout 로그아웃
GET /users/{id}/followings 이웃
POST /users/{id}/followings 내 이웃 추가
DELETE /users/{id}/followings/{id} 내 이웃 삭제
GET /users/{id}/blogs 블로그
POST /users/{id}/blogs 내 블로그 등록
DELETE /users/{id}/blogs/{id} 내 블로그 삭제
GET /users/{id}/blogs/{id}/followers 구독자
GET /feed 내 이웃의 3일 이내의 새 글보기
GET /widget/{component} 위젯

모든 경로를 다 알아볼 수는 없는 노릇이기 때문에 중요한 것들만 알아본다. 지금 포스트를 적는 시점에서는 이 프로젝트가 몇 년 전이기 때문에 기억이 제대로 안 날지도 모르겠지만 그냥 적어보기로 한다.

ERD

티네스의 데이터베이스 구성은 아주 간단하다. 단순 유저간의 관계를 맺어주는 그 이상의 역할은 거의 하지 않았기 때문이다. 서비스가 조금 더 발전할 여지가 있었다면 테이블을 확장했을텐데 조기 종료되는 바람에 초기 상태에서 그대로 유지될 수 밖에 없었다.

ERD 구성은 위와 같다. 먼저, 유저를 중심으로 생각해보자. 유저는 여러 개의 블로그를 등록할 수 있으며 또한 이웃을 여럿 가질 수 있다. 한편, 여러 개의 블로그는 한 명의 유저에 소속될 수 있으며 다수의 이웃, 그러니까 블로그의 입장에서보면 해당 블로그를 구독하는 다수의 구독자를 가질 수 있다. 유저는 블로그를 구독(Subscribe)한다. 구독은 티네스의 주요 핵심 기능이다.

위젯

위젯은 사용자의 블로그에 직접 iframe 형태로 얻을 수 있게 만든 네이버 이웃커넥터 같은 것이다. 실제로 저것을 만들 떄도 네이버 이웃커넥터를 참고하긴 했었다. VueJS 컴포넌트로 구성했으나 티네스 프로젝트에서 프론트엔드에 대한 것을 강조할 생각은 전혀 없으므로 생략하기로 하자.

다만 아이디어의 측면에서는 이것이 중요하다고 생각된다. 티네스 웹서비스에서 위젯을 구성해서 사용자가 포함할 수 있도록 한다는 점 말이다. 이러한 시도는 일반적인 서비스에서는 잘 하지 않지만, 티네스는 조금 특수한 케이스이기 때문에 한 번 해볼까 싶어서 해봤다.

인프라 환경

개발

개발 환경에서는 코드 편집자체는 Windows 에서 했지만, Laravel Homestead 를 사용, 자동으로 가상머신을 구성하고 환경을 만들어 주는 Vagrant Virtualbox 에 가상화 환경을 만들고 호스트 OS 에서는 가상머신을 프록시로 연결하여 프론트엔드 개발을 위해 Webpack Dev ServerHot Reload 를 사용했다. 가상머신에서 서버를 켜고 호스트 OS 에서 또 서버를 켜야하는건 상당히 번거롭다. 

프로덕션

AWS EC2, Amazon RDBMS 서비스를 사용해서 배포했던 것으로 기억한다. 이걸 만들 때는 Docker 의 존재도 모르고 있었으므로 여러모로 환경구축과 테스트 및 배포에 대해서는 공부해볼만한 것이 많다는 것을 새삼 느낀다. 관심을 가지고 공부하는 블록체인의 일종인 이더리움도 따지고 보면 어플리케이션 배포 환경 중 하나다. 이더리움 플랫폼은 스마트 컨트렉트가 동작할 수 있는 환경이니까 말이다.

테스트와 배포 자동화

.env 처럼 프로젝트 자체에서 큰 변화없이 공용으로 사용되는 파일이나 폴더에 대해서는 공유 폴더에 별도로 두었기에 릴리즈 폴더에 있는 공용 파일들은 공용 폴더에 있는 파일에 링크된다. 주 어플리케이션 폴더는 현재 버전의 릴리즈 폴더와 링크를 하는 방식으로 하여 무중단 배포가 가능하도록 하였다.

use App\Classes\Command;

/**
 * Deploy Laravel Project on Server
 */
function deploy()
{
    /** 
     * Calling configuration
     */
    $connection = config('deploy.connection');
    $remote     = config('deploy.remote');
    $root       = config('deploy.root');
    $shared     = config('deploy.shared');
    $releases   = config('deploy.releases');
    $dist       = config('deploy.dist');
    $group      = config('deploy.group');

    $requires = [ $shared, $releases ];

    $shareds = [
        "$shared/.env"    => "$releases/$dist/.env",
        "$shared/storage" => "$releases/$dist/storage",
        "$shared/cache"   => "$releases/$dist/bootstrap/cache"
    ];

    /** 
     * Execute commands over SSH
     */
    (new Command($connection))
        ->require($requires)
        ->download($releases, $remote, $dist)
        ->copy($shared, $releases, $dist)
        ->shared($shareds)
        ->composer($releases, $dist)
        ->link($releases, $dist, $root)
        ->chmod($shared)
        ->chgrp($group, $releases, $dist)
    ;
}

SSH 클라이언트 역할을 할 수 있는 스크립트를 작성하여 배포했다. 이것도 그다지 좋은 방법이라고는 볼 수 없다는 것을 잘 알고 있다. Git Action, TravisCI, JenkinsCD/CI 를 위한 도구가 있었지만 난 이걸 만들 당시에 사용하지 않았다. 테스트도 그다지 하지 않은 것 같다. 아니, 전혀하지 않았다. 요즘 들어서야 유닛 테스트를 작성하고 자동화를 하려고 시도를 해보는 것인데, 이 프로젝트를 만들때는 그렇게 할 생각을 전혀 하지 않았다. 이는 자랑이 아니긴 하지만, 이렇게 회고해야 나중에 새로운 프로젝트를 할 때라도 테스트와 배포 자동화를 그럴듯하게 하기 나름이다.

더 읽을거리

티스토리 블로그 백업 프로그램을 만들었습니다.

티스토리 스킨을 원격으로 조작할 수 있다? 티스토리 스킨 API 만들기

티스토리 스킨 프레임워크, 티도리는 어떻게 동작할까?

hELLO. 티스토리 스킨을 소개합니다.

내가 개발한 티스토리 프로젝트 정리!