7. Package 구조
twelvebooks .idea
.mvn
src main
test
com.twelvebooks.twelvebook
aop
config
controller
domain
dto
repository
scheduler
security
service
util
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를
통해서 호출
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 구현
● 같이 읽기 기능 구현