[[TableOfContents]] 누구나 쉽게 배포하고 자신의 그룹에 맞춰서 쓸 수 있는 오픈소스 웹 앱을 만들자. [조영준]이 추진 중. == 이전 프로젝트 == [열파참/프로젝트]에서 이미 한 번 시도를 했으나, 다음과 같은 이유로 갈아엎기로 결정. === 날뛰는 구조 === 딱 프레임 워크의 사용법만 익힌 후 설계나 추가적인 공부 없이 바로 코드를 작성 해서 구조가 괴랄해짐. === 잘못된 프레임웍 선정 === Django와 함께 AngularJS를 이용했으나, 서버에서 도느냐 클라에서 도느냐 차이만 있을 뿐 둘 다 동일하게 웹에서의 MVC패턴을 지원하는 프레임웍. 역할이 겹치다 보니 둘 다 입지가 애매해졌다. 그리고 결정적으로, GAE(Google App Engine)은 일반적인 SQL을 사용할 수 없기 때문에 Django의 매우 큰 장점인 Model 부분을 써먹을 수가 없다! == 설계 == === 프레임 워크 및 API === * [https://cloud.google.com/appengine/ Google App Engine] - 줄여서 GAE. PaaS. 무료 제공 양이 상당한 편이라 사용. * [https://cloud.google.com/datastore/ Google Datastore] - NoSQL DB. 무료도 무료지만 GAE와 궁합이 좋음. * [https://cloud.google.com/endpoints/ Google Endpoints] - RESTful 백엔드 서비스. GAE위에서 돈다면 '''완전무료'''. * [https://angularjs.org/ AngularJS] - 프론트엔드 웹 앱 프레임워크. Single Page Website를 만드는 것을 목적. Polymer로 대체할 수도 있음. AngularJS 자체가 좀 장황하다는 느낌이 있어서 Polymer 쪽으로 기우는 중. * [http://flask.pocoo.org/ Flask] - 작업의 대부분이 AngularJS로 넘어갈 수 있기 때문에 훨신 가볍고 단순한 webapp2로 대체할 수도 있음. * [https://developers.google.com/books/docs/v1/reference/volumes?hl=ko Google Book API]. 도서 정보 추출. 영어. * [https://developers.daum.net/services/apis/search/book Daum Book API]. 도서 정보 추출. 한글. 뭔가 구글판인 것 같지만 넘어가자. === DB === ==== 책 ==== * '''ISBN13''' * ISBN10은 13으로 쉽게 변환 가능. https://en.wikipedia.org/wiki/International_Standard_Book_Number * 제목 * 저자 * 역자 * 출판사 * 출판일 * 설명 * 언어 * 섬네일 주소 (작음/보통): 따로 이미지 스토리지를 쓰지 않고 외부 이미지 링크를 사용. * 페이지 수 * 권 수 * 등록 일자 * 메모 ZP에서는 기증자 정보가 필요하나, 이는 범용적이지 않음. 따라서 memo라는 항목을 통해서 기타 사항들을 관리자가 추가할 수 있도록 할 예정. ==== 태그 ==== * '''태그''' * ISBN13 ==== 사용자 ==== * '''Email''' * User ID Number * 이름 * 등급 (최고관리자 / 관리자 / 사용자 / 미승인) ==== 대여 ==== * ISBN13 * User ID Number * 대여일 / 반납일 반납일이 null일 경우 반납을 하지 않은 것. === 필요한 기능 === ==== 로케일 ==== '''누구나 쉽게''' 쓸 수 있다는 것은 국경을 가리지 않고를 의미...하지만 일단 국경은 둘째 치고 String 값들을 따로 빼는 것만으로도 관리가 용이해 지기 때문에 충분히 필요한 작업. json 형식의 locale 파일들을 ajax로 불러와서 사용자가 선택한 언어를 화면에 뿌려주자. * http://stackoverflow.com/questions/30053947/how-to-build-a-multilingual-website-with-polymer ==== 환경 변수 ==== 단순히 서비스의 이름부터 시작해서 도서 검색에 필요한 API Key 등 일부 값들은 서비스 제공자가 입력하여야 한다. 이에 따라 생각되는 방법은 다음과 같음: 1. environment variable: 말 그대로 시스템 환경 변수를 이용. 근데 GAE에서 제공 안 하는 것 같음. 더 찾아봐야 함. 1. datastore를 통한 값 관리: 환경 변수를 이용할 때 마다 db에 쿼리를 날리기 때문에 성능과 할당량에 문제가 생김. 하지만 이는 [https://cloud.google.com/appengine/docs/python/memcache/ memcache]로 최소화 시킬 수 있을 것. 1. json을 이용한 관리. 문제는 gae에서는 파일 읽기는 되나 쓰기가 되지 않기 때문에 웹 페이지상에서 수정을 하는 것은 불가능하고 사용자가 직접 json 파일을 수정해야 함. ==== 검색 ==== 제목 / 저자 / 출판사 / 전체 (앞의 3개 + 키워드)를 통한 검색을 할 수 있어야 함. 키워드의 경우 책 설명에서 추출하는 방법과, 사용자로부터 키워드를 추가하는 방법을 생각할 수 있음. Datastore는 full text matching이 되지 않기 때문에 [https://cloud.google.com/appengine/docs/python/search/ Search API]를 사용해야 하나, Tag를 Key로 가지고, 해당되는 ISBN들을 Value로 갖는 DataStore를 만든다면 Search API를 쓰지 않아도 될 듯. ==== 실시간 검색 ==== {{{Data Structure}}}라는 책을 검색한다고 할 때, {{{d}}}만 입력 하더라도 해당 알파벳으로 시작하는 책 이름의 목록이 출력되는 기능. 위에서 언급했듯이 Full Text Matching이 되지 않기 때문에 첫 1~2글자를 기준으로 해싱을 한 다음, 사용자가 1~2글자를 입력 했을 때 JSON으로 해당 글자로 시작하는 책 제목의 목록을 보내준 다음 client에서 처리를 하는 방법을 예상 중. ==== 회원 ==== 비밀번호를 잘 저장할 자신이 없기 때문에 'Sign Up with~' 기능을 이용해서만 계정을 관리할 예정. GAE에서 google 계정을 통한 인증을 지원 하나, 이전 프로젝트에서 google 계정을 사용하지 않는 사용자에 대한 이슈가 있었기 때문에 twiiter, facebook, github를 OAuth를 이용해 인증하는 방법을 추가 하는 것이 좋을 것. 가입을 한 후 인증의 방법은 다음을 지원할 예정: * 누구나 사용 가능 * 지정된 도메인의 이메일로 가입할 경우 자동 인증 * 관리자가 지정된 코드를 입력할 경우 자등으로 인증 * 수동으로 인증