SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Open API 와
Ruby on Rails
에 대한 이야기
푸딩 Lab | 조범석




                1
부탁의 말씀




이번 세션은 간접 광고와 개드
립,
무리수를 포함하고 있습니다

재미 없으시더라도 많은 호응 부
탁
드립니다


                   2
오늘의 주제




  +         =
실화를 바탕으로 재구성 하였습니다


                          3
오늘의 주제




  +         =
실화를 바탕으로 재구성 하였습니다


                          3
Pudding.to 소개


푸딩 시리즈의 막내



사진 기반 사회 관계망 서비스




                               4
Pudding.to 소개


푸딩 시리즈의 막내



사진 기반 사회 관계망 서비스




                               4
서비스는 계속 변합니다




사회 관계망 서비스만의 얘기는 아니지요




                           5
서비스는 계속 변합니다




               5
서비스는 계속 변합니다




               5
Pudding Lab


Server API 개발이
주 업무


Open API의 필요성




                   6
Pudding.to 구조
                                 Database (RDS)




                            Replication                    Data Read


              Cache
                                                    Data Write



CDN (Cloudfront)      Storage (S3)                               API (EC2)
                                     Image Upload


        Image Download                              API Call




                                Client (iOS/Android)

                                                                             7
Pudding.to 구조
                                 Database (RDS)




                            Replication                    Data Read


              Cache
                                                    Data Write



CDN (Cloudfront)      Storage (S3)                                 API (EC2)
                                     Image Upload


        Image Download
                                                                       ?
                                                    API Call
                                                                 OpenAPI (EC2)


                                Client (iOS/Android)

                                                                                 7
왜 따로 개발 했나?



코드가 복잡 해 져요!




                       8
왜 따로 개발 했나?



서비스API vs. OpenAPI




                           8
왜 따로 개발 했나?




서비스 정책
 및 인증



                       8
별도의 Framework가 필요해?


기존 Application 재활용 불가


부족한 개발 일정


장기적인 서비스 구조 개선을 위한 준비




                                9
Framework 선택




Pros
  개인적인 선호
  고성능, 빠른 발전

Cons
  개발자들의 Javascript에 대한 불안감




                                    10
Framework 선택




Pros
  JVM 상에서 동작
  고성능

Cons
  새로운 언어 학습에 대한 부담감




                                     10
Framework 선택




Pros
  웹 프레임워크의 유행 선도자
  높은 생산성, 개발 경험이 있음

Cons
  낮은 VM 성능




                                     10
11
?
    11
좋은 API의 특징


쉽게 배울 수 있어야 한다




                              12
좋은 API의 특징


문서 없이도 사용이 가능해야 한다




                            12
좋은 API의 특징


실수의 여지가 적어야 한다




                              12
좋은 API의 특징


확장 하기 쉬워야 한다




                            12
좋은 API의 특징


사용자가 필요로 하는 것을 제공 해야 한다




                            12
좋은 API의 특징


요구사항에 맞게 동작해야 한다




                            12
MVC - Controller




URL 설계
Versioning
CORS




                                13
Controller #1 - URL 설계 및 RESTful


URL 설계는 Open API의 기초 공사
  제공 하는 Resource 를 정의
  Meaningful URL 혹은 Pretty URL




                                          14
Controller #1 - URL 설계 및 RESTful


    RESTful 한 API
         가장 일반적인 URL 설계 규칙

HTTP Method             URL                Function
   GET            http://pud.to/photos       list
   GET          http://pud.to/photos/123    show
   POST           http://pud.to/photos      create
 POST, PUT      http://pud.to/photos/123   update
  DELETE        http://pud.to/photos/123    delete



                                                      14
Controller #1 - URL 설계 및 RESTful


진정한 REST 구조?
  단일 Resource 만 제공 할 것인가, 여러 Resource
  를 동시에 제공 할 것인가
  우선 엄격한 REST API 개발 하고 성능이 필요한 부분
  에 대해서 타협




                                         14
Controller #2 - Versioning


  OpenAPI 변경 주기에 대한 확장성 확보
          Deprecated


V1
V2
                       Obsolete
Time




                                          15
Controller #2 - Versioning


어느 수준에서 분리 하느냐의 문제
 Application 내의 Routing 처리
 Domain 분리 및 Application 분리




                                          15
Controller #3 - CORS


Cross-Origin Resource Sharing
 Ajax 를 통한 JS 코드 실행은 같은 도메인에서만 가능
 웹 브라우저 기반의 Mesh-up App 에서는 문제 발생




                                         16
Controller #3 - CORS

 api_controller.rb

module Api
  class ApiController < ApplicationController
    before_filter :cors_preflight_check
    after_filter :cors_set_access_control_header

    def cors_preflight_check
      if request.method == :options
        headers[‘Access-Control-Allow-Origin’] = “*”
        headers[‘Access-Control-Allow-Methods’] = “POST, GET, OPTIONS”
        headers[‘Access-Control-Allow-Headers’] = “X-Requested-With, X-Prototype-
Version”
        headers[‘Access-Control-Max-Ages’] = “1728000”
        render :text => “”, :content_type => “text/plain”
      end
    end

    def cors_set_access_control_header
      headers[‘Access-Control-Allow-Origin’] = “*”
      headers[‘Access-Control-Allow-Methods’] = “POST, GET, OPTIONS”
      headers[‘Access-Control-Max-Ages’] = “1728000”
    end
  end
end



                                                                                    16
Controller #3 - CORS

/openapi.pudding.to
    /app/controllers
        /api
             /api_controller.rb
             /v1
                 /photos_controller.rb



 photos_controller.rb

module Api
  module V1
    class Api::V1::PhotosController < ApiController

    end
  end
end




                                                                        16
MVC -Model



ActiveRecord 소개
ActiveSupport::Concern 을 통한 확장
Composite Keys
DB Replication




                                   17
Model #1 - ActiveRecord


ORM (Object Relation Mapper)
  DB 의 각 Table 이 Model Class에 매핑
  Foreign Key 로 모델 객체들간의 관계를 정의




                                         18
Model #1 - ActiveRecord
      Table : PHOTO
                 id                   integer         PK, Auto inc.

             message                    text                -

              user_id                 integer               -


 photo.rb
class Photo < ActiveRecord::Base
end

 photo_controller.rb

module Api
  module V1
    class Api::V1::PhotosController < ApiController
      def message_and_user_login
        “#{self.message} - #{self.user.loginname} “
      end
    end
  end
end



                                                                      18
Model #2 - ActiveRecord Association




User                   Photo
       1           n




                                        19
Model #2 - ActiveRecord Association


 photo.rb

class Photo < ActiveRecord::Base
  belongs_to :user

  def link_to_user_email
    “<a href=‘mailto:#{self.user.email}’>#{self.user.loginname}</a>”
  end
end

 user.rb

class User < ActiveRecord::Base
  has_many :photos

  def get_all_photos
    self.photos
  end
end




                                                                       19
Model #3 - 문제의 원인




이게 다 노무ㅎ...아니 전임자 탓이다!




                                20
Model #4 - Legacy Problem


DB 설계 시 컬럼명이 대문자로 구성
   Ruby 코딩 관례와 충돌
   컬럼명이 다른 용도로 사용 되거나 혼동의 여지가 있
   다면 변경이 필요
“#{photo.MESSAGE}”
...
photo.user.USER_NAME




                                                   21
Model #5 - ActiveSupport::Concern


 /extra/active_model/column_naming.rb
module ActiveModel
  module ColumnNaming
    extend ActiveSupport::Concern

    def serializable_hash(options = nil)
      hash = super(options)
      self.class.columns_map.each do |legacy, renamed|
        hash[renamed] = hash.delete(legacy)
      end
      hash
    end

    module ClassMethods
      def columns_map
        @columns_map
      end

      def rename_columns(map)
        @columns_map = map.invert
        columns_map.each { |key, value| alias_attribute value.to_sym, key.to_sym }
      end
    end
  end
end




                                                                                     22
Model #5 - ActiveSupport::Concern


 photo.rb

class Photo < ActiveRecord::Base
  include ActiveModel::ColumnNaming
  
  rename_columns({
    id: "PHOTOID",
    user_id: "UID",
    contents: "CONTENTS",
     ...
    created_time: "REG_DATE",
    status: "STATUS"
  })

  def some_method
    “#{self.content} - #{self.user.name}”
  end
end




                                                             22
Model #6 - Composite Key


ActiveRecord 는 합성키를 지원하지 않음
  CompositePrimaryKeys Gem
  기본적인 RoR 개발 방식을 따르면 벌어지지 않을 일




                                          23
Model #7 - DB Replication

                                 Database (RDS)




                            Replication                     Data Read


              Cache
                                                     Data Write



CDN (Cloudfront)      Storage (S3)                                API (EC2)
                                      Image Upload


        Image Download                               API Call




                                Client (iOS/Android)
Model #7 - DB Replication

                                 Database (RDS)




                            Replication                     Data Read


              Cache
                                                     Data Write



CDN (Cloudfront)      Storage (S3)                                API (EC2)
                                      Image Upload


        Image Download                               API Call




                                Client (iOS/Android)
Model #7 - DB Replication


Gems
 Seamless Database Pool
    설정이 용이
 Octopus
    가장 제공 기능이 많음
    테스트 당시 Rails 3.2.x 호환성에 문제
 Multi Db
    설정방식이 복잡
Model #7 - DB Replication


 config/database.yml

pudding_db:
  adapter: seamless_database_pool
  pool_adapter: mysql2
  encoding: utf8
  master:
    host: master_db.pudding.to
    pool_weight: 0
  read_pool:
    - host: slave01_db.pudding.to
      pool_weight: 2
    - host: slave02_db.pudding.to
      pool_weight: 1
MVC - View




RABL
대안 JSON
Library Gems




                            25
View #1 - RABL


RABL : API view 를 위한 템플릿 엔진
  다양한 포맷(JSON, XML, Message
  Pack, BSON, Plist) 지원
  템플릿 내에서 Ruby 코드를 사용 가능




                                     26
View #1 - RABL


 photos_controller.rb

module Api
  module V1
    class Api::V1::PhotosController < ApiController
      def by_user
        @count = params[:count].nil? ? 10 : params[:count]
        @offset = params[:offset].nil? ? 0 : params[:offset]
        @total_count = Photo.count_by_user params[:user_id]
        @photos = Photo.by_user params[:user_id], @count, @offset
      end
    end
  end
end




                                                                          26
View #1 - RABL

 by_user.rabl

object false
node :result do
  true
end
node :data do
  attributes :total_count => @total_count.to_i, :count => @count.to_i, :offset =>
@offset.to_i, :photos => partial("api/v1/photos/photo_simple", :object => @photos)
end



 photo_simple.rabl

object @photo
attributes :id, :contents, :photo_url, :medium_photo_url, :small_photo_url,
:likes_count, :comments_count, :created_time
node :user do |p|
  partial("api/v1/users/user_simple", :object => p.user)
end
node :music do |p|
  attributes :artist => p.music_artist.nil? ? "" : p.music_artist, :title =>
p.music_title.nil? ? "" : p.music_title
end



                                                                                     26
View #1 - RABL

    /v1/users/12345/photos.json

{
    result: true,
    data: {
      total_count: 9,
      count: 10,
      offset: 0,
      photos: [
        {
           id: 3996200,
           contents: "#api 로고",
           photo_url: "http://img.pudding.to/....781191558632.jpg",
           ....
           likes_count: 3,
           comments_count: 2,
           created_time: 1343266129,
           user: {
             id: 12345,
             nickname: "api_puddingto",
             ...
           }
        },
        ...
      ]
    }
}
                                                                             26
View #2 - JSON


RoR 기본 JSON 라이브러리
JSON Library Gems
 Yaji (https://github.com/brianmario/yajl-
 ruby)
 Oj (https://github.com/ohler55/oj)




                                              27
정리하며


관심의 분리
  스파게티 코드는 이제 그만

좋은 기술, 신기술도 꿸 줄 알아야 보배
  독고다이는 패가망신의 지름길
  팀의 절반 이상이 해당 기술에 익숙한가

고난의 길을 먼저 걸은 선구자를 찾아라
  오픈소스의 가장 큰 장점

영어 실력만이 살 길이다
                                 28
참고 자료


1. How to design a good API and why it matters.
    http://lcsd05.cs.tamu.edu/slides/keynote.pdf

2. Cross-Origin Resource Sharing for JSON and
   Rails
    http://www.tsheffler.com/blog/?p=428

3. Concerning yourself with
   ActiveSupport::Concern
    http://www.fakingfantastic.com/2010/09/20/concerning-yourself-
    with-active-support-concern/

4. Lightning JSON in Rails
    http://brainspec.com/blog/2012/09/28/lightning-json-in-rails/



                                                                     29
감사합니다.
 개발실 / 푸딩 Lab PD / 조범석
leopard2a6@kthcorp.com
     @ACodeFarmer



                         30

Weitere ähnliche Inhalte

Ähnlich wie [H3 2012] Open API 와 Ruby on Rails 에 대한 이야기

Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)
Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)
Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)Channy Yun
 
How to make Successful Open APIs for Startups (2012)
How to make Successful Open APIs for Startups (2012)How to make Successful Open APIs for Startups (2012)
How to make Successful Open APIs for Startups (2012)Channy Yun
 
open api seminar
open api seminaropen api seminar
open api seminarNamhoon Kim
 
Geo Service Open API 플랫폼 구축 전략
Geo Service Open API 플랫폼 구축 전략Geo Service Open API 플랫폼 구축 전략
Geo Service Open API 플랫폼 구축 전략Channy Yun
 
개발생산성
개발생산성개발생산성
개발생산성UtilLab
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oceuEngine Solutions
 
Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Junyoung Sung
 
PHP Slim Framework with Angular
PHP Slim Framework with AngularPHP Slim Framework with Angular
PHP Slim Framework with AngularJT Jintae Jung
 
애플리케이션 최적화를 위한 컨테이너 인프라 구축
애플리케이션 최적화를 위한 컨테이너 인프라 구축애플리케이션 최적화를 위한 컨테이너 인프라 구축
애플리케이션 최적화를 위한 컨테이너 인프라 구축rockplace
 
[Uws] enterprise application architecture, msa, java9, spring 소개
[Uws] enterprise application architecture, msa, java9, spring 소개[Uws] enterprise application architecture, msa, java9, spring 소개
[Uws] enterprise application architecture, msa, java9, spring 소개HYUN-JOO LEE
 
텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님NAVER D2
 
Daum APIs: A to Z - API Meetup 2014
Daum APIs: A to Z  - API Meetup 2014Daum APIs: A to Z  - API Meetup 2014
Daum APIs: A to Z - API Meetup 2014Channy Yun
 
F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업NAVER D2
 
2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCampJeikei Park
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AIJoongi Kim
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
Swc발표자료2 2(restful)
Swc발표자료2 2(restful)Swc발표자료2 2(restful)
Swc발표자료2 2(restful)마경근 마
 
올챙이로 살펴보는 개발툴과 Cloud
올챙이로 살펴보는 개발툴과 Cloud올챙이로 살펴보는 개발툴과 Cloud
올챙이로 살펴보는 개발툴과 Cloudcho hyun jong
 
파크히어 Realm 사용 사례
파크히어 Realm 사용 사례파크히어 Realm 사용 사례
파크히어 Realm 사용 사례선협 이
 

Ähnlich wie [H3 2012] Open API 와 Ruby on Rails 에 대한 이야기 (20)

Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)
Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)
Open API - 웹 플랫폼 생태계를 만드는 기술 (2011)
 
How to make Successful Open APIs for Startups (2012)
How to make Successful Open APIs for Startups (2012)How to make Successful Open APIs for Startups (2012)
How to make Successful Open APIs for Startups (2012)
 
open api seminar
open api seminaropen api seminar
open api seminar
 
Geo Service Open API 플랫폼 구축 전략
Geo Service Open API 플랫폼 구축 전략Geo Service Open API 플랫폼 구축 전략
Geo Service Open API 플랫폼 구축 전략
 
J2 Ee
J2 EeJ2 Ee
J2 Ee
 
개발생산성
개발생산성개발생산성
개발생산성
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oce
 
Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기
 
PHP Slim Framework with Angular
PHP Slim Framework with AngularPHP Slim Framework with Angular
PHP Slim Framework with Angular
 
애플리케이션 최적화를 위한 컨테이너 인프라 구축
애플리케이션 최적화를 위한 컨테이너 인프라 구축애플리케이션 최적화를 위한 컨테이너 인프라 구축
애플리케이션 최적화를 위한 컨테이너 인프라 구축
 
[Uws] enterprise application architecture, msa, java9, spring 소개
[Uws] enterprise application architecture, msa, java9, spring 소개[Uws] enterprise application architecture, msa, java9, spring 소개
[Uws] enterprise application architecture, msa, java9, spring 소개
 
텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님
 
Daum APIs: A to Z - API Meetup 2014
Daum APIs: A to Z  - API Meetup 2014Daum APIs: A to Z  - API Meetup 2014
Daum APIs: A to Z - API Meetup 2014
 
F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업F3 네이버오픈api만드는매쉬업
F3 네이버오픈api만드는매쉬업
 
2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AI
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
Swc발표자료2 2(restful)
Swc발표자료2 2(restful)Swc발표자료2 2(restful)
Swc발표자료2 2(restful)
 
올챙이로 살펴보는 개발툴과 Cloud
올챙이로 살펴보는 개발툴과 Cloud올챙이로 살펴보는 개발툴과 Cloud
올챙이로 살펴보는 개발툴과 Cloud
 
파크히어 Realm 사용 사례
파크히어 Realm 사용 사례파크히어 Realm 사용 사례
파크히어 Realm 사용 사례
 

Mehr von KTH, 케이티하이텔

KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환
KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환
KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환KTH, 케이티하이텔
 
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주KTH, 케이티하이텔
 
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기KTH, 케이티하이텔
 
KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈
KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈
KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈KTH, 케이티하이텔
 
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기KTH, 케이티하이텔
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for AppspressoKTH, 케이티하이텔
 
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략KTH, 케이티하이텔
 
[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터
[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터
[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터KTH, 케이티하이텔
 
[H3 2012] Local based SNS를 이용한 타겟 마케팅
[H3 2012] Local based SNS를 이용한 타겟 마케팅[H3 2012] Local based SNS를 이용한 타겟 마케팅
[H3 2012] Local based SNS를 이용한 타겟 마케팅KTH, 케이티하이텔
 
[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기KTH, 케이티하이텔
 
[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화
[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화
[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화KTH, 케이티하이텔
 
[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0
[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0
[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0KTH, 케이티하이텔
 
[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.
[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.
[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.KTH, 케이티하이텔
 
[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'
[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'
[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'KTH, 케이티하이텔
 
[H3 2012] OAuth2 - API 인증을위한 만능 도구상자
[H3 2012] OAuth2 - API 인증을위한 만능 도구상자[H3 2012] OAuth2 - API 인증을위한 만능 도구상자
[H3 2012] OAuth2 - API 인증을위한 만능 도구상자KTH, 케이티하이텔
 
[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP
[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP
[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEPKTH, 케이티하이텔
 
[H3 2012] 로그속 사용자 발자국 들여다보기
[H3 2012] 로그속 사용자 발자국 들여다보기[H3 2012] 로그속 사용자 발자국 들여다보기
[H3 2012] 로그속 사용자 발자국 들여다보기KTH, 케이티하이텔
 
[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용
[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용
[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용KTH, 케이티하이텔
 

Mehr von KTH, 케이티하이텔 (20)

KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환
KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환
KTH_Detail day_안드로메다에서 온 디자이너이야기_3차_디자인기본요소_박지환
 
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(2)_디자인사례_정덕주
 
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기
KTH_Detail day_안드로메다에서 온 디자이너이야기_2차(1)_디자인프로세스,협업_한재기
 
KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈
KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈
KTH_Detail day_안드로메다에서 온 디자이너이야기_1차_디자인용어_지훈
 
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
 
[H3 2012] UX, 애자일하고 싶어요
[H3 2012] UX, 애자일하고 싶어요[H3 2012] UX, 애자일하고 싶어요
[H3 2012] UX, 애자일하고 싶어요
 
[H3 2012] Instant Prototyping with ROR
[H3 2012] Instant Prototyping with ROR[H3 2012] Instant Prototyping with ROR
[H3 2012] Instant Prototyping with ROR
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
 
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
[H3 2012] 스마트모바일 환경에서의 App.품질관리전략
 
[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터
[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터
[H3 2012] 스타트업 개발사의 생존필수 아이템, BaaS 모바일 고객센터
 
[H3 2012] Local based SNS를 이용한 타겟 마케팅
[H3 2012] Local based SNS를 이용한 타겟 마케팅[H3 2012] Local based SNS를 이용한 타겟 마케팅
[H3 2012] Local based SNS를 이용한 타겟 마케팅
 
[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기[H3 2012] 오픈소스로 개발 실력 쌓기
[H3 2012] 오픈소스로 개발 실력 쌓기
 
[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화
[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화
[H3 2012] 앱(APP) 중심으로 생각하기 - DevOps와 자동화
 
[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0
[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0
[H3 2012] 하이브리드앱 제작 사례 공유 - 푸딩얼굴인식 3.0
 
[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.
[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.
[H3 2012] Cloud Database Service - Hulahoop를 소개합니다.
 
[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'
[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'
[H3 2012] 기획/디자인/개발자 모두 알아야 하는 '대박앱의 비밀'
 
[H3 2012] OAuth2 - API 인증을위한 만능 도구상자
[H3 2012] OAuth2 - API 인증을위한 만능 도구상자[H3 2012] OAuth2 - API 인증을위한 만능 도구상자
[H3 2012] OAuth2 - API 인증을위한 만능 도구상자
 
[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP
[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP
[H3 2012] 오픈 소스로 구현하는 실시간 데이터 처리를 위한 CEP
 
[H3 2012] 로그속 사용자 발자국 들여다보기
[H3 2012] 로그속 사용자 발자국 들여다보기[H3 2012] 로그속 사용자 발자국 들여다보기
[H3 2012] 로그속 사용자 발자국 들여다보기
 
[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용
[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용
[H3 2012] 클라우드기반 앱 만들기 - baas.io SDK 활용
 

[H3 2012] Open API 와 Ruby on Rails 에 대한 이야기

  • 1. Open API 와 Ruby on Rails 에 대한 이야기 푸딩 Lab | 조범석 1
  • 2. 부탁의 말씀 이번 세션은 간접 광고와 개드 립, 무리수를 포함하고 있습니다 재미 없으시더라도 많은 호응 부 탁 드립니다 2
  • 3. 오늘의 주제 + = 실화를 바탕으로 재구성 하였습니다 3
  • 4. 오늘의 주제 + = 실화를 바탕으로 재구성 하였습니다 3
  • 5. Pudding.to 소개 푸딩 시리즈의 막내 사진 기반 사회 관계망 서비스 4
  • 6. Pudding.to 소개 푸딩 시리즈의 막내 사진 기반 사회 관계망 서비스 4
  • 7. 서비스는 계속 변합니다 사회 관계망 서비스만의 얘기는 아니지요 5
  • 10. Pudding Lab Server API 개발이 주 업무 Open API의 필요성 6
  • 11. Pudding.to 구조 Database (RDS) Replication Data Read Cache Data Write CDN (Cloudfront) Storage (S3) API (EC2) Image Upload Image Download API Call Client (iOS/Android) 7
  • 12. Pudding.to 구조 Database (RDS) Replication Data Read Cache Data Write CDN (Cloudfront) Storage (S3) API (EC2) Image Upload Image Download ? API Call OpenAPI (EC2) Client (iOS/Android) 7
  • 13. 왜 따로 개발 했나? 코드가 복잡 해 져요! 8
  • 14. 왜 따로 개발 했나? 서비스API vs. OpenAPI 8
  • 15. 왜 따로 개발 했나? 서비스 정책 및 인증 8
  • 16. 별도의 Framework가 필요해? 기존 Application 재활용 불가 부족한 개발 일정 장기적인 서비스 구조 개선을 위한 준비 9
  • 17. Framework 선택 Pros 개인적인 선호 고성능, 빠른 발전 Cons 개발자들의 Javascript에 대한 불안감 10
  • 18. Framework 선택 Pros JVM 상에서 동작 고성능 Cons 새로운 언어 학습에 대한 부담감 10
  • 19. Framework 선택 Pros 웹 프레임워크의 유행 선도자 높은 생산성, 개발 경험이 있음 Cons 낮은 VM 성능 10
  • 20. 11
  • 21. ? 11
  • 22. 좋은 API의 특징 쉽게 배울 수 있어야 한다 12
  • 23. 좋은 API의 특징 문서 없이도 사용이 가능해야 한다 12
  • 24. 좋은 API의 특징 실수의 여지가 적어야 한다 12
  • 25. 좋은 API의 특징 확장 하기 쉬워야 한다 12
  • 26. 좋은 API의 특징 사용자가 필요로 하는 것을 제공 해야 한다 12
  • 27. 좋은 API의 특징 요구사항에 맞게 동작해야 한다 12
  • 28. MVC - Controller URL 설계 Versioning CORS 13
  • 29. Controller #1 - URL 설계 및 RESTful URL 설계는 Open API의 기초 공사 제공 하는 Resource 를 정의 Meaningful URL 혹은 Pretty URL 14
  • 30. Controller #1 - URL 설계 및 RESTful RESTful 한 API 가장 일반적인 URL 설계 규칙 HTTP Method URL Function GET http://pud.to/photos list GET http://pud.to/photos/123 show POST http://pud.to/photos create POST, PUT http://pud.to/photos/123 update DELETE http://pud.to/photos/123 delete 14
  • 31. Controller #1 - URL 설계 및 RESTful 진정한 REST 구조? 단일 Resource 만 제공 할 것인가, 여러 Resource 를 동시에 제공 할 것인가 우선 엄격한 REST API 개발 하고 성능이 필요한 부분 에 대해서 타협 14
  • 32. Controller #2 - Versioning OpenAPI 변경 주기에 대한 확장성 확보 Deprecated V1 V2 Obsolete Time 15
  • 33. Controller #2 - Versioning 어느 수준에서 분리 하느냐의 문제 Application 내의 Routing 처리 Domain 분리 및 Application 분리 15
  • 34. Controller #3 - CORS Cross-Origin Resource Sharing Ajax 를 통한 JS 코드 실행은 같은 도메인에서만 가능 웹 브라우저 기반의 Mesh-up App 에서는 문제 발생 16
  • 35. Controller #3 - CORS api_controller.rb module Api   class ApiController < ApplicationController     before_filter :cors_preflight_check     after_filter :cors_set_access_control_header     def cors_preflight_check       if request.method == :options         headers[‘Access-Control-Allow-Origin’] = “*”         headers[‘Access-Control-Allow-Methods’] = “POST, GET, OPTIONS”         headers[‘Access-Control-Allow-Headers’] = “X-Requested-With, X-Prototype- Version”         headers[‘Access-Control-Max-Ages’] = “1728000”         render :text => “”, :content_type => “text/plain”       end     end     def cors_set_access_control_header       headers[‘Access-Control-Allow-Origin’] = “*”       headers[‘Access-Control-Allow-Methods’] = “POST, GET, OPTIONS”       headers[‘Access-Control-Max-Ages’] = “1728000”     end   end end 16
  • 36. Controller #3 - CORS /openapi.pudding.to /app/controllers /api /api_controller.rb /v1 /photos_controller.rb photos_controller.rb module Api   module V1     class Api::V1::PhotosController < ApiController end   end end 16
  • 37. MVC -Model ActiveRecord 소개 ActiveSupport::Concern 을 통한 확장 Composite Keys DB Replication 17
  • 38. Model #1 - ActiveRecord ORM (Object Relation Mapper) DB 의 각 Table 이 Model Class에 매핑 Foreign Key 로 모델 객체들간의 관계를 정의 18
  • 39. Model #1 - ActiveRecord Table : PHOTO id integer PK, Auto inc. message text - user_id integer - photo.rb class Photo < ActiveRecord::Base end photo_controller.rb module Api   module V1     class Api::V1::PhotosController < ApiController       def message_and_user_login         “#{self.message} - #{self.user.loginname} “       end end end end 18
  • 40. Model #2 - ActiveRecord Association User Photo 1 n 19
  • 41. Model #2 - ActiveRecord Association photo.rb class Photo < ActiveRecord::Base belongs_to :user def link_to_user_email     “<a href=‘mailto:#{self.user.email}’>#{self.user.loginname}</a>”   end end user.rb class User < ActiveRecord::Base has_many :photos def get_all_photos     self.photos   end end 19
  • 42. Model #3 - 문제의 원인 이게 다 노무ㅎ...아니 전임자 탓이다! 20
  • 43. Model #4 - Legacy Problem DB 설계 시 컬럼명이 대문자로 구성 Ruby 코딩 관례와 충돌 컬럼명이 다른 용도로 사용 되거나 혼동의 여지가 있 다면 변경이 필요 “#{photo.MESSAGE}” ... photo.user.USER_NAME 21
  • 44. Model #5 - ActiveSupport::Concern /extra/active_model/column_naming.rb module ActiveModel   module ColumnNaming     extend ActiveSupport::Concern     def serializable_hash(options = nil)       hash = super(options)       self.class.columns_map.each do |legacy, renamed|         hash[renamed] = hash.delete(legacy)       end       hash     end     module ClassMethods       def columns_map         @columns_map       end       def rename_columns(map)         @columns_map = map.invert         columns_map.each { |key, value| alias_attribute value.to_sym, key.to_sym }       end     end   end end 22
  • 45. Model #5 - ActiveSupport::Concern photo.rb class Photo < ActiveRecord::Base   include ActiveModel::ColumnNaming      rename_columns({     id: "PHOTOID",     user_id: "UID",     contents: "CONTENTS", ...     created_time: "REG_DATE",     status: "STATUS"   }) def some_method “#{self.content} - #{self.user.name}” end end 22
  • 46. Model #6 - Composite Key ActiveRecord 는 합성키를 지원하지 않음 CompositePrimaryKeys Gem 기본적인 RoR 개발 방식을 따르면 벌어지지 않을 일 23
  • 47. Model #7 - DB Replication Database (RDS) Replication Data Read Cache Data Write CDN (Cloudfront) Storage (S3) API (EC2) Image Upload Image Download API Call Client (iOS/Android)
  • 48. Model #7 - DB Replication Database (RDS) Replication Data Read Cache Data Write CDN (Cloudfront) Storage (S3) API (EC2) Image Upload Image Download API Call Client (iOS/Android)
  • 49. Model #7 - DB Replication Gems Seamless Database Pool 설정이 용이 Octopus 가장 제공 기능이 많음 테스트 당시 Rails 3.2.x 호환성에 문제 Multi Db 설정방식이 복잡
  • 50. Model #7 - DB Replication config/database.yml pudding_db:   adapter: seamless_database_pool   pool_adapter: mysql2   encoding: utf8   master:     host: master_db.pudding.to     pool_weight: 0   read_pool:     - host: slave01_db.pudding.to       pool_weight: 2     - host: slave02_db.pudding.to       pool_weight: 1
  • 51. MVC - View RABL 대안 JSON Library Gems 25
  • 52. View #1 - RABL RABL : API view 를 위한 템플릿 엔진 다양한 포맷(JSON, XML, Message Pack, BSON, Plist) 지원 템플릿 내에서 Ruby 코드를 사용 가능 26
  • 53. View #1 - RABL photos_controller.rb module Api   module V1     class Api::V1::PhotosController < ApiController def by_user         @count = params[:count].nil? ? 10 : params[:count]         @offset = params[:offset].nil? ? 0 : params[:offset]         @total_count = Photo.count_by_user params[:user_id]         @photos = Photo.by_user params[:user_id], @count, @offset       end   end   end end 26
  • 54. View #1 - RABL by_user.rabl object false node :result do   true end node :data do   attributes :total_count => @total_count.to_i, :count => @count.to_i, :offset => @offset.to_i, :photos => partial("api/v1/photos/photo_simple", :object => @photos) end photo_simple.rabl object @photo attributes :id, :contents, :photo_url, :medium_photo_url, :small_photo_url, :likes_count, :comments_count, :created_time node :user do |p|   partial("api/v1/users/user_simple", :object => p.user) end node :music do |p|   attributes :artist => p.music_artist.nil? ? "" : p.music_artist, :title => p.music_title.nil? ? "" : p.music_title end 26
  • 55. View #1 - RABL /v1/users/12345/photos.json { result: true, data: { total_count: 9, count: 10, offset: 0, photos: [ { id: 3996200, contents: "#api 로고", photo_url: "http://img.pudding.to/....781191558632.jpg", .... likes_count: 3, comments_count: 2, created_time: 1343266129, user: { id: 12345, nickname: "api_puddingto", ... } }, ... ] } } 26
  • 56. View #2 - JSON RoR 기본 JSON 라이브러리 JSON Library Gems Yaji (https://github.com/brianmario/yajl- ruby) Oj (https://github.com/ohler55/oj) 27
  • 57. 정리하며 관심의 분리 스파게티 코드는 이제 그만 좋은 기술, 신기술도 꿸 줄 알아야 보배 독고다이는 패가망신의 지름길 팀의 절반 이상이 해당 기술에 익숙한가 고난의 길을 먼저 걸은 선구자를 찾아라 오픈소스의 가장 큰 장점 영어 실력만이 살 길이다 28
  • 58. 참고 자료 1. How to design a good API and why it matters. http://lcsd05.cs.tamu.edu/slides/keynote.pdf 2. Cross-Origin Resource Sharing for JSON and Rails http://www.tsheffler.com/blog/?p=428 3. Concerning yourself with ActiveSupport::Concern http://www.fakingfantastic.com/2010/09/20/concerning-yourself- with-active-support-concern/ 4. Lightning JSON in Rails http://brainspec.com/blog/2012/09/28/lightning-json-in-rails/ 29
  • 59. 감사합니다. 개발실 / 푸딩 Lab PD / 조범석 leopard2a6@kthcorp.com @ACodeFarmer 30

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n