SlideShare a Scribd company logo
1 of 34
Download to read offline
12 Books
조원 소개
서청원 민경수 김대용
https://github.com/coneseo https://github.com/irerin07 https://github.com/kim-daeyong
프로젝트의 목적
단순 책을 읽는 것이
아닌 동기부여를 하고
기록을 남길 수 있는
서비스를 만들자
원하는 책을 선택해서
기간을 설정하고
매일 읽은 분량
만큼의 일지를
남긴다.
설정한 기간이
지나면
도전 완료가 되고
간단한 리뷰 혹은
도전 후기 등을
작성할 수 있다.
사용 기술
DB 구조
프로젝트 아키텍처
Package 구조
twelvebooks .idea
.mvn
src main
test
com.twelvebooks.twelvebook
aop
config
controller
domain
dto
repository
scheduler
security
service
util
프로젝트 흐름
로그인
책 검색
도전 등록
Bookmark
등록
일지 작성
일지
상세보기
도전
상세보기
관리페이지
일지
수정/삭제
● Kakao REST API를 활용한 책 검색
● 검색 결과로 나온 책들 중 원하는 책을 선택하여 Challenge로 등록
● 검색 결과로 나온 책들 중 나중에 읽을 책을 선택하여 Bookmark
● 매일 간단한 일지를 작성하고 일지를 수정/ 삭제
● API 요청이 들어오거나 Exception이 발생한 경우 Log남기기
● 매일 24시에 조건에 맞는 Challenge 데이터를 업데이트
주요 구현 기능
책 검색(Kakao REST API를 활용한 이유)
1. 책 데이터를 따로 확보하기에는 무리가 있다.(매우 방대한 양의 책 데이터 -> 크롤링을 통한 데이터
베이스 확보는 무리)
2. 책 정보를 검색할 수 있는 API 조사(네이버 API, 알라딘 API, 구글 API , 카카오 API)
3. 사용이 무료이며, 책 데이터 베이스를 따로 저장해도 상업적인 용도가 아니라면 법적인 문제가
없고, 제공해주는 정보도 가장 많은 카카오 API를 사용하기로 결정
책 데이터 확보
(크롤링)
Too Much Data
책 정보 검색
API
(naver, google,
알라딘,kakao)
Kakao 책 검색
API 선택!
책 검색(Kakao REST API를 이용하는 방법)
1. 카카오 개발자 사이트에 들어가서 회원가입 및 로그인을 한다.(카카오 톡은 대부분 이용하기 때문에
사용하고 있는 카카오톡 아이디로 로그인하면 된다.)
2. 앱 만들기
책 검색(Kakao REST API를 이용하는 방법)
3. 앱 이름과 회사명을 입력한다. 공부 목적으로 하는 프로젝트이기 때문에 프로젝트 명을 입력했다.
4. 앱 만들기가 완료되면 고유의 api 키가 발급된다.
책 검색(Restlet을 사용한 API 테스트 - 요청)
Kakao API가 잘 발급 되었는지 확인하기 위해 Restlet으로 테스트를 진행했다. Kakao API는 header에
Authorization : KakaoAK + “발급받은 rest API key” 를 추가해서 요청을 보내야한다. 그렇지 않으면
응답이 오류가 발생한다. 또 Accept에 응답받을 데이터의 형식를 적어주면 그대로 데이터가
반환되서 온다.
책 검색(Restlet을 사용한 API 테스트 - 응답)
응답을 받은 JSON데이터가 BODY에 담겨서 들어왔다. Kakao 책 검색 API는 크게 document, meta
데이터를 전달해준다. document에는 책의 상세 정보들(제목, 작가, isbn, 썸네일 이미지 등)을 최소
1건에서 최대 10건씩(한 페이지씩)전달해준다. meta에는 현재 document에서 전달한 정보들이
마지막 페이지인지를 알려주는 is_end 와 몇 개의 페이지를 보여줄 수있는지를 알려주는
pagable_count, 그리고 총 검색된 책의 개수를 알려주는 total_count를 제공해준다.
책 검색(서버에서 REST API 호출하기) 수정 전
@RestController
(api/searchBooks
?searchWord=”
자바”)
@Service
KakaoBookApiSe
rvice()
Utils
getHttpPOST2Str
ing()
HttpClient를
통해서 호출
책 검색(서버에서 REST API 호출하기) 수정 전
문제점
Spring 이 아니라 Apache에서 제공해주는 HttpClient 사용
-> 굉장히 긴 코드, 떨어지는 가독성!
해결
Spring에서 제공해주는 WebClient를 사용
-> 기존 50줄 정도의 REST API 호출 코드를 10줄로 줄였다.
책 검색(서버에서 REST API 호출하기) 수정 후
@RestController
(api/searchBooks
?searchWord=”
자바”)
@Service
KakaoBookApiSe
rvice()
WebClient를
통해서 호출
책 검색(서버에서 REST API 호출하기) 수정 전 코드
책 검색(서버에서 REST API 호출하기) 수정 후 코드
RestProperties 변경
RestProperties 변경
● 변경 이유 - AWS ec2 환경에서 프로젝트를 실행을 하면
Kakao REST API를 사용하기 위한 Key값이 들어있는 rest.properties를
읽어오지 못하는 문제 발생.
○ FileInputStream을 사용하여 파일을 읽어 오는 경우 파일을 읽지 못하고 null을 반환
○ FileNotFoundException 리턴
● 구글링을 통해 AWS ec2 환경에서 resource 폴더에 있는 파일을 읽어오기
위해서는 Class.getResourceAsStream(String) 를 사용하여 읽어와야 한다는 것을
알게되어 적용
○ FileInputSystem은 실제 파일 시스템 상에 있는 파일을 읽어오지만 jar 에서는 그렇지 않다.
@Scheduled 어노테이션을 활용한 Update
@Scheduled 어노테이션을 활용한 Update
● @Scheduled를 사용한 계기
○ 사용자가 생성한 도전의 일차 수(current_day)를 자동으로 Update 해줘야 하는 상황
○ 추가적으로 설정한 기간이 지나면 상태(book_status)도 바꿔줘야 한다.
● 생각해 본 해결법 1
○ 사용자가 일지를 작성할때마다 Update를 해주자.
○ 일지는 중복되게 작성 할 수 없으니 하루 한 번 Update가 가능하지 않을까?
● 생각해 본 해결법 2
○ 사용자가 로그인을 할 때마다 Update를 해주자.
@Scheduled 어노테이션을 활용한 Update
● 1번 해결법의 문제점
○ 유저가 매일매일 일지를 작성한다는 가정하에는 가능하지만
○ 만약 일지 작성을 하루 빼먹는다면? 이틀은?
○ 적절하지 못하다.
● 2번 해결법의 문제점
○ 1번과 마찬가지로 유저가 매일 로그인을 한다면 가능하다
○ 하지만 역시 로그인을 하루 빼먹는다면?
○ 매번 로그인시에 Update를 한다 -> 하루에 몇 번씩 로그인을 하면 Update 쿼리가 여러번 호출
○ 역시 적절하지 못하다.
@Scheduled 어노테이션을 활용한 Update
● @Scheduled의 활용
○ 매일 24시 정각을 기준으로 조건에 맞는 데이터들을 Update해주는
updateChallengeDays()
○ challengeService.updateAllCurrentDays(date1, "읽는중");
○ challengeService.updateBookStatus();
@Scheduled 어노테이션을 활용한 Update
@Scheduled 어노테이션을 활용한 Update
@Scheduled를 적용 할 Class에 @Componenet 적용
@Scheduled가 적용 된 메서드는 fixedRate, fixedDelay
혹은 cron 표현식으로 설정 된 정해진 시간마다 실행이 된다.
@Scheduled 어노테이션을 활용한 Update
● fixedRate, fixedDelay 그리고 cron 표현식
● fixedRate는 메소드가 실행 된 순간을 기준으로 잡는다.
● fixedDelay는 메소드가 완료 된 순간을 기준으로 잡는다.
● cron표현식 @Scheduled(cron = “0 0 0 * * *”)
○ 초 분 시 일 월 년의 순으로 작성한다.
○ 본 예제의 경우 매년 매월 매일 24시 정각에 실행 되도록 설정 해 두었다.
○ 처음에는 “0 0 24 * * *” 으로 설정 했지만 out of range에서가 나서 수정
Spring boot Actuator 적용(모니터링)
● 모니터링을 하기 위해 Spring boot에서 제공해주는 Actuator를 사용했다.
● 컨텍스트 빈, 환경 설정, 자동 설정, JVM상태 등을 모니터링 할 수 있다. 굉장히
간단하다. pom.xml, application.properties 파일에 아래와 같이 추가만 하면
사용할 수 있다.
Spring boot Actuator 적용(모니터링)
● 기본 경로 뒤에 /actuator라고 치면 노출하고 있는 정보들의 ID가 나온다. 해당 ID에 있는 정보를 알고
싶으면 기본 경로 뒤에 /actuator/beans라고 치면 나온다.
● 제공되는 데이터는 역시 JSON 이다. 우리는 JSONView를 크롬 익스텐션에 추가해서 아래와 같이 보기
좋게 나온다. (자세한 정보들이 많이 나오지만, 현재 우리 프로젝트에 등록되어 있는 bean을 확인해 볼
수 있었다.
간단 시연
http://localhost:8080/
추가 할 기능
● 마이페이지 도전 진행 그래프 (GitHub의 Calender Graph 비슷하게)
● 책과 유저의 검색
● Jenkins를 활용한 자동 배포 구축
● REST Docs혹은 Swagger2를 사용한 API 문서화
● Alert대신 다른 형식의 알림창 구현
● Library 읽고있는 책의 진행상황 그래프 구현
● 모바일 페이지 작성
● 다른 유저 Follow 구현
● ExceptionHandler 구현
● 같이 읽기 기능 구현
Q n A
질의 응답
12 Books
감사합니다

More Related Content

What's hot

ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기Taegon Kim
 
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)Brian Hong
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaHyeonSeok Choi
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용흥배 최
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)Hyojun Jeon
 
Meteor Korea DEV School 1st day
Meteor Korea DEV School 1st dayMeteor Korea DEV School 1st day
Meteor Korea DEV School 1st dayseung-hyun Park
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
구글의 분산스토리지
구글의 분산스토리지구글의 분산스토리지
구글의 분산스토리지juhyun
 
20151022 elasticsearch 적용및활용_송준이_sds발표용
20151022 elasticsearch 적용및활용_송준이_sds발표용20151022 elasticsearch 적용및활용_송준이_sds발표용
20151022 elasticsearch 적용및활용_송준이_sds발표용Junyi Song
 
what is_tabs_share
what is_tabs_sharewhat is_tabs_share
what is_tabs_shareNAVER D2
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항Minchul Jung
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개흥배 최
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우NAVER D2
 
Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Minchul Jung
 
React 튜토리얼 1차시
React 튜토리얼 1차시React 튜토리얼 1차시
React 튜토리얼 1차시태현 김
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XpressEngine
 
Android Google Cloud Message 설정
Android Google Cloud Message 설정Android Google Cloud Message 설정
Android Google Cloud Message 설정정호 이
 

What's hot (20)

Spring Boot 1
Spring Boot 1Spring Boot 1
Spring Boot 1
 
ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기
 
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
 
Meteor Korea DEV School 1st day
Meteor Korea DEV School 1st dayMeteor Korea DEV School 1st day
Meteor Korea DEV School 1st day
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
Talos
TalosTalos
Talos
 
구글의 분산스토리지
구글의 분산스토리지구글의 분산스토리지
구글의 분산스토리지
 
20151022 elasticsearch 적용및활용_송준이_sds발표용
20151022 elasticsearch 적용및활용_송준이_sds발표용20151022 elasticsearch 적용및활용_송준이_sds발표용
20151022 elasticsearch 적용및활용_송준이_sds발표용
 
what is_tabs_share
what is_tabs_sharewhat is_tabs_share
what is_tabs_share
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
 
Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작
 
React 튜토리얼 1차시
React 튜토리얼 1차시React 튜토리얼 1차시
React 튜토리얼 1차시
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
Android Google Cloud Message 설정
Android Google Cloud Message 설정Android Google Cloud Message 설정
Android Google Cloud Message 설정
 

Similar to 12books

Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Gruter
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Inho Kwon
 
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220Seomgi Han
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with SpringKeesun Baik
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃Kwangyoun Jung
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Kyoung Up Jung
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJSEunYoung Kim
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장Seongchan Kang
 
Data-Oriented Design과 유니티 DOTS
Data-Oriented Design과 유니티 DOTSData-Oriented Design과 유니티 DOTS
Data-Oriented Design과 유니티 DOTSSukwoo Lee
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축Youngil Cho
 
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁창규 김
 
[NEXT] Nextgram Refactoring
[NEXT] Nextgram Refactoring[NEXT] Nextgram Refactoring
[NEXT] Nextgram RefactoringYoungSu Son
 
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경YoungSu Son
 
Elastic Stack & Data pipeline
Elastic Stack & Data pipelineElastic Stack & Data pipeline
Elastic Stack & Data pipelineJongho Woo
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서Jeongmin Cha
 

Similar to 12books (20)

Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
 
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
 
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with Spring
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJS
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장
 
Data-Oriented Design과 유니티 DOTS
Data-Oriented Design과 유니티 DOTSData-Oriented Design과 유니티 DOTS
Data-Oriented Design과 유니티 DOTS
 
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
 
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
 
[NEXT] Nextgram Refactoring
[NEXT] Nextgram Refactoring[NEXT] Nextgram Refactoring
[NEXT] Nextgram Refactoring
 
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
 
Elastic Stack & Data pipeline
Elastic Stack & Data pipelineElastic Stack & Data pipeline
Elastic Stack & Data pipeline
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
 

12books

  • 2. 조원 소개 서청원 민경수 김대용 https://github.com/coneseo https://github.com/irerin07 https://github.com/kim-daeyong
  • 3. 프로젝트의 목적 단순 책을 읽는 것이 아닌 동기부여를 하고 기록을 남길 수 있는 서비스를 만들자 원하는 책을 선택해서 기간을 설정하고 매일 읽은 분량 만큼의 일지를 남긴다. 설정한 기간이 지나면 도전 완료가 되고 간단한 리뷰 혹은 도전 후기 등을 작성할 수 있다.
  • 7. Package 구조 twelvebooks .idea .mvn src main test com.twelvebooks.twelvebook aop config controller domain dto repository scheduler security service util
  • 8. 프로젝트 흐름 로그인 책 검색 도전 등록 Bookmark 등록 일지 작성 일지 상세보기 도전 상세보기 관리페이지 일지 수정/삭제
  • 9. ● Kakao REST API를 활용한 책 검색 ● 검색 결과로 나온 책들 중 원하는 책을 선택하여 Challenge로 등록 ● 검색 결과로 나온 책들 중 나중에 읽을 책을 선택하여 Bookmark ● 매일 간단한 일지를 작성하고 일지를 수정/ 삭제 ● API 요청이 들어오거나 Exception이 발생한 경우 Log남기기 ● 매일 24시에 조건에 맞는 Challenge 데이터를 업데이트 주요 구현 기능
  • 10. 책 검색(Kakao REST API를 활용한 이유) 1. 책 데이터를 따로 확보하기에는 무리가 있다.(매우 방대한 양의 책 데이터 -> 크롤링을 통한 데이터 베이스 확보는 무리) 2. 책 정보를 검색할 수 있는 API 조사(네이버 API, 알라딘 API, 구글 API , 카카오 API) 3. 사용이 무료이며, 책 데이터 베이스를 따로 저장해도 상업적인 용도가 아니라면 법적인 문제가 없고, 제공해주는 정보도 가장 많은 카카오 API를 사용하기로 결정 책 데이터 확보 (크롤링) Too Much Data 책 정보 검색 API (naver, google, 알라딘,kakao) Kakao 책 검색 API 선택!
  • 11. 책 검색(Kakao REST API를 이용하는 방법) 1. 카카오 개발자 사이트에 들어가서 회원가입 및 로그인을 한다.(카카오 톡은 대부분 이용하기 때문에 사용하고 있는 카카오톡 아이디로 로그인하면 된다.) 2. 앱 만들기
  • 12. 책 검색(Kakao REST API를 이용하는 방법) 3. 앱 이름과 회사명을 입력한다. 공부 목적으로 하는 프로젝트이기 때문에 프로젝트 명을 입력했다. 4. 앱 만들기가 완료되면 고유의 api 키가 발급된다.
  • 13. 책 검색(Restlet을 사용한 API 테스트 - 요청) Kakao API가 잘 발급 되었는지 확인하기 위해 Restlet으로 테스트를 진행했다. Kakao API는 header에 Authorization : KakaoAK + “발급받은 rest API key” 를 추가해서 요청을 보내야한다. 그렇지 않으면 응답이 오류가 발생한다. 또 Accept에 응답받을 데이터의 형식를 적어주면 그대로 데이터가 반환되서 온다.
  • 14. 책 검색(Restlet을 사용한 API 테스트 - 응답) 응답을 받은 JSON데이터가 BODY에 담겨서 들어왔다. Kakao 책 검색 API는 크게 document, meta 데이터를 전달해준다. document에는 책의 상세 정보들(제목, 작가, isbn, 썸네일 이미지 등)을 최소 1건에서 최대 10건씩(한 페이지씩)전달해준다. meta에는 현재 document에서 전달한 정보들이 마지막 페이지인지를 알려주는 is_end 와 몇 개의 페이지를 보여줄 수있는지를 알려주는 pagable_count, 그리고 총 검색된 책의 개수를 알려주는 total_count를 제공해준다.
  • 15. 책 검색(서버에서 REST API 호출하기) 수정 전 @RestController (api/searchBooks ?searchWord=” 자바”) @Service KakaoBookApiSe rvice() Utils getHttpPOST2Str ing() HttpClient를 통해서 호출
  • 16. 책 검색(서버에서 REST API 호출하기) 수정 전 문제점 Spring 이 아니라 Apache에서 제공해주는 HttpClient 사용 -> 굉장히 긴 코드, 떨어지는 가독성! 해결 Spring에서 제공해주는 WebClient를 사용 -> 기존 50줄 정도의 REST API 호출 코드를 10줄로 줄였다.
  • 17. 책 검색(서버에서 REST API 호출하기) 수정 후 @RestController (api/searchBooks ?searchWord=” 자바”) @Service KakaoBookApiSe rvice() WebClient를 통해서 호출
  • 18. 책 검색(서버에서 REST API 호출하기) 수정 전 코드
  • 19. 책 검색(서버에서 REST API 호출하기) 수정 후 코드
  • 21. RestProperties 변경 ● 변경 이유 - AWS ec2 환경에서 프로젝트를 실행을 하면 Kakao REST API를 사용하기 위한 Key값이 들어있는 rest.properties를 읽어오지 못하는 문제 발생. ○ FileInputStream을 사용하여 파일을 읽어 오는 경우 파일을 읽지 못하고 null을 반환 ○ FileNotFoundException 리턴 ● 구글링을 통해 AWS ec2 환경에서 resource 폴더에 있는 파일을 읽어오기 위해서는 Class.getResourceAsStream(String) 를 사용하여 읽어와야 한다는 것을 알게되어 적용 ○ FileInputSystem은 실제 파일 시스템 상에 있는 파일을 읽어오지만 jar 에서는 그렇지 않다.
  • 23. @Scheduled 어노테이션을 활용한 Update ● @Scheduled를 사용한 계기 ○ 사용자가 생성한 도전의 일차 수(current_day)를 자동으로 Update 해줘야 하는 상황 ○ 추가적으로 설정한 기간이 지나면 상태(book_status)도 바꿔줘야 한다. ● 생각해 본 해결법 1 ○ 사용자가 일지를 작성할때마다 Update를 해주자. ○ 일지는 중복되게 작성 할 수 없으니 하루 한 번 Update가 가능하지 않을까? ● 생각해 본 해결법 2 ○ 사용자가 로그인을 할 때마다 Update를 해주자.
  • 24. @Scheduled 어노테이션을 활용한 Update ● 1번 해결법의 문제점 ○ 유저가 매일매일 일지를 작성한다는 가정하에는 가능하지만 ○ 만약 일지 작성을 하루 빼먹는다면? 이틀은? ○ 적절하지 못하다. ● 2번 해결법의 문제점 ○ 1번과 마찬가지로 유저가 매일 로그인을 한다면 가능하다 ○ 하지만 역시 로그인을 하루 빼먹는다면? ○ 매번 로그인시에 Update를 한다 -> 하루에 몇 번씩 로그인을 하면 Update 쿼리가 여러번 호출 ○ 역시 적절하지 못하다.
  • 25. @Scheduled 어노테이션을 활용한 Update ● @Scheduled의 활용 ○ 매일 24시 정각을 기준으로 조건에 맞는 데이터들을 Update해주는 updateChallengeDays() ○ challengeService.updateAllCurrentDays(date1, "읽는중"); ○ challengeService.updateBookStatus();
  • 27. @Scheduled 어노테이션을 활용한 Update @Scheduled를 적용 할 Class에 @Componenet 적용 @Scheduled가 적용 된 메서드는 fixedRate, fixedDelay 혹은 cron 표현식으로 설정 된 정해진 시간마다 실행이 된다.
  • 28. @Scheduled 어노테이션을 활용한 Update ● fixedRate, fixedDelay 그리고 cron 표현식 ● fixedRate는 메소드가 실행 된 순간을 기준으로 잡는다. ● fixedDelay는 메소드가 완료 된 순간을 기준으로 잡는다. ● cron표현식 @Scheduled(cron = “0 0 0 * * *”) ○ 초 분 시 일 월 년의 순으로 작성한다. ○ 본 예제의 경우 매년 매월 매일 24시 정각에 실행 되도록 설정 해 두었다. ○ 처음에는 “0 0 24 * * *” 으로 설정 했지만 out of range에서가 나서 수정
  • 29. Spring boot Actuator 적용(모니터링) ● 모니터링을 하기 위해 Spring boot에서 제공해주는 Actuator를 사용했다. ● 컨텍스트 빈, 환경 설정, 자동 설정, JVM상태 등을 모니터링 할 수 있다. 굉장히 간단하다. pom.xml, application.properties 파일에 아래와 같이 추가만 하면 사용할 수 있다.
  • 30. Spring boot Actuator 적용(모니터링) ● 기본 경로 뒤에 /actuator라고 치면 노출하고 있는 정보들의 ID가 나온다. 해당 ID에 있는 정보를 알고 싶으면 기본 경로 뒤에 /actuator/beans라고 치면 나온다. ● 제공되는 데이터는 역시 JSON 이다. 우리는 JSONView를 크롬 익스텐션에 추가해서 아래와 같이 보기 좋게 나온다. (자세한 정보들이 많이 나오지만, 현재 우리 프로젝트에 등록되어 있는 bean을 확인해 볼 수 있었다.
  • 32. 추가 할 기능 ● 마이페이지 도전 진행 그래프 (GitHub의 Calender Graph 비슷하게) ● 책과 유저의 검색 ● Jenkins를 활용한 자동 배포 구축 ● REST Docs혹은 Swagger2를 사용한 API 문서화 ● Alert대신 다른 형식의 알림창 구현 ● Library 읽고있는 책의 진행상황 그래프 구현 ● 모바일 페이지 작성 ● 다른 유저 Follow 구현 ● ExceptionHandler 구현 ● 같이 읽기 기능 구현
  • 33. Q n A 질의 응답