[Spring/Project] 네이버 핵데이 준비과정 두번째
by
5월 8일 (9일차)
먼저 해야할일을 정리하자
-
dummy api제작 및 springboot 셋업 Create, delete구현완료 Dummy data만든후에 cloud에서 데이터 가져오는걸로 조회 구현해보자.
-
api Document만들기
-
Cloud Storage 연동
-
Cloud Storage에 file형태의 이미지 저장 + db에 경로 저장
성능문제 잘 고려하기
-
이미지 태깅기능, 클러스터링 기능, 개인화기능
-
Dropbox 올려놓은 이미지 보기 구체적으로는 드랍박스에 올려놓은 이미지와 프론트 위치정보가 매칭되야한다. Naver map api중에 위치검색해서 좌표알려주는게있는데 그 검색어로 파일 검색해서 매칭된 파일리스트를 가져오고, 프론트에 검색어에 해당하는 좌표를 리턴할때, 지도도 같이 리턴하는 방법도 있다. (안 유용해보임) 아니면, 모든파일 이름 읽어서 그걸로 위치정보 하나씩 검색한다음에 파일- 위치 매핑해서 프론트로 보내는 방법도 있음.
-
이미지 데이터 수집 자동화
이미지 데이터 저장방식
Cloud Storage를 사용하는데 Image를 db에 blob으로 저장하는것과 파일로 저장해서 관리하는 것의 장단점은 무엇일까?
- 파일로 저장
단점
- 파일의 개수가 많아질경우 느려진다. 여러개의 파일을 한번에 접근해야 할 경우 IO비용이 많이듬. -> 꼭 성능비교 해보자. db에서 폴더 + 파일명을 찾아서, 다시 파일로 접근 (2번 접근)
- 권한체크를 해줘야함
- Binary 파일을 Base64 인코딩하여 db에 저장
장점
- Query Selector가 가능해짐. 파일별로 특징 부여해서 나중에 쿼리로 조회할 수 있다. 하지만 파일로 구성해도 db를 filePath와 같이 이렇게 구현하면 상관없긴 함.
-> 파일로 저장하는 방식을 택한다.
Naver Cloud의 Object Storage 사용.
사용가이드
http://docs.ncloud.com/ko/storage/storage-8-1.html
5월 9일 (10일차)
팀원들과의 첫 미팅 by 행아웃
팀원들과 첫 미팅을 했다. 프로젝트에 대한 개요와 협업방법, 이슈관리 방법등을 논의하였다. 즐거운 사람들인 것 같다.
Object Storage 연동 적용
Object Storage에 대한 연동을 완료하였다. 각 테스트를짜고, 코드를작성하는데 역시나 테스트 짜는시간이 코딩시간의 80% 정도를 차지하는것 같다. 어렵다. 테스트를 먼저짜는건 진짜 손이 많이가고 노력이 많이 드는일인것 같다.
특히 컨트롤러에 대한 단위테스트는 테스트 코드가 테스트 대상 코드의 3배정도는 된다. 어렵다
5월 10일 (11일차)
팀원들과 같이 모여서 공부
행아웃으로 모여서 각자 공부를 진행했다. 자극이 되어 좋은것 같다.
Account에 대한 CRUD 구현
Account에 대해 기본 CRUD를 모두 구현하기위해 시간을 쏟았다. ATTD는 정말.. 어렵다
컨트롤러와 서비스에 메서드 하나씩을 생성하는것에
AcceptanceTest, Controller Unit Test , Service Unit Test, Request -> Service DTO생성 및 테스트, Service -> Response DTO생성 및 테스트를 작성해야하다니 으으으으.. 좀더 익숙해 져야할것 같다. 아직은 진도가 안나가는것에 대해 처지는 느낌이 많다.
이미지 저장 방식에 대한 재논의
이미지를 api에서 클라이언트로 보내주는 방식에 대한 논의를 하였다.
처음에 file을 직접 보내주는 방식을 생각하고 구현하였지만 금새 코드를 엎어야 했다.
먼저 Storage에서 수많은 이미지를 받아서 파일 각각을 byteStream으로 변환해줘야한다. 여기서 서버 성능저하가 초래될 것이 예상되었다. 이를 클라이언트에 uri를 전송해서 클라이언트에서 이미지를 각각 가져온다면, 통신에 대한 비용과 성능을 클라이언트쪽과 분담할 수 있는 장점이있다.
그러한 이유로 DB에는 이미지가 저장된 uri를, 클라이언트에서 ajax로 이미지를 요청하는것으로 구조를 변경하였다.
기분
외롭다. 외롭다. 혼자 공부하는 것이 특히 외롭다. 혼자 코딩하는 것이 외롭다. 같이 코딩을 마음껏 해줄 수 있는 친구가 없는 것이 외롭다. 정말 외롭다.
5월 11일 (12일차)
Account에 대한 CRUD 구현완료
CRUD구현과 모든 테스팅을 완료하였다.
차후 validation과 login을 구현해야하지만 그래도 기분이 좋다.
이미지 매핑 구현 고민하기
기존 서비스
현재 네이버 지도 경우, 지도가 나타났을때부터 요소에 대해 a태그가 설정되어있다.
그리고 그 태그를 누르면 api로 데이터를 요청해서 가져온다.
여기에 포함된 정보에는 주소와, 각 주소의 코드, x,y좌표가 포함되어있다.
이미지가 포함된 경우 동시에 다른 request를 CDN에 보내는 데, 이 요청으로 이미지를 가져온다.
분석 및 고찰
현재 네이버 서비스의 이미지 request는 위치에 따른 검색이 아니라, 처음에 지도와 함께 날라왔던 a태그에 포함되는 것으로 보인다.
- 지도에 사진띄우기 현재 picture-on-map을 구현하기 위해서는 처음에 지도를 띄워줄때 이미지리스트를 가져와서 지도에 뿌려줘야한다. 이것을 현재 네이버 지도가 a태그들을 지도에 뿌려주는 방식과 비슷하게 구현할 수 있을것 같다.
초기 getList를 api요청시 -> api에서는 각 사진의 위치정보, 이름, 기타정보와 함께 CDN의 이미지 URI를 프론트에 list
형태로 보내준다.
api에서 response가 도착했을때 콜백함수를 통해서 각 CDN URI에 이미지를 요청하고, 받아온 이미지를 가지고 한 블록을 만들어서 xy좌표 기반으로 지도에 매핑한다.
이미지 CDN설정
이미지를 어떻게 띄울지에 대한 청사진은 얼추 그려진다.
이제 구현을 위한 재료인 이미지 CDN을 설정해서 구현하고. 그에 맞게 API를 수정하자.
- CDN 등록
- CDN 사용 가이드 정독
http://docs.ncloud.com/ko/networking/networking-8-1.html
- Storage에 ACL설정
공개 유저가 CDN에서 이미지를 가져가기위해선 파일 공개여부가 허용으로 되어있어야한다.
이를 위해 이미지 저장시에 ACL을 설정해서 공개로 전환해주는 코드를 구현한다
- 결과
Generic Type 에 대한 공부
https://lng1982.tistory.com/240
5월 12일 (13일차)
5월 13일 (14일차)
첫 미팅
멘토님과 팀원들을 만나 식사를 하였다. 그린팩토리 근처 식당에서 맛있는 (너무 맛있어서 놀랐다)밥을 먹으면서 멘토링 시간을 가졌다.
팀원과 나 공통적으로 제일먼저 궁금했던건 내가 왜(?)뽑혔나 하는 질문이었다. 깃허브를 많이본다. gitScore가 중요하다 등등 말들이 떠돌아다니고, 팀 바이 팀이다 라고 하는 말등 여러 말들을 그전까지 들었었다. 여쭤보니 너무 정석적인 답변에 오히려 놀란.. 풀었던 알고리즘 + 자소서에 적은 내용 + github 꾸준히 했던거, 말 그대로 “종합적으로” 보았다고 하신다.
네이버 일하는 이야기도 여쭤보고, 팀에서 하시는 일같은것도 여쭤보고 면접 볼때 중요한점, 경력직 면접에선 어떻게 보는지, 현재 내 상황에 대한 질문들.. 여러 이야기를 질문하고 답변을 들었다.
네이버 지도 하는일이 정말 멋진 것 같다. 사실 전까지 계속 큰 생각이나 욕심을 안가지려고 노력했었는데 가서 하는일이랑 일하시는 이야기 들으니까 막 격양되가지고 머리에서 김이 났던 것 같다. 지도-웹쪽 직무는 조금 많이 재미있어보였다. 약간 욕심이 생긴 것도 사실인 것 같다.
프로젝트에 대한이야기로 성능과 세부사항에 대한 고민을 나누었다. 이미지와 위치에 대한 정보 , 위치 범위로 이미지를 필터링하는 쿼리와 성능문제, 관련 db추천등 몰랐던 새로운 재밌는 이야기를 많이 접했다. 또한 머리속에 어떻게 구현하지? 계속 고민했던 문제들도 어느정도 그려지기 시작했다.
Swagger
Spring Rest Docs 와 Swagger중 여러 정보를 찾아 처음에 문서화에 더 적합한 Spring Rest Docs라이브러리 도입을 준비하였다가, 시간 효율성에 따라 Swagger로 선회하여 적용하였다.
###
5월 13일차
5월 14일 (15일차)
database 선정
POSTGIS사용
Connection Refused문제
Postgresql/pg_hba.conf의 권한 설정 문제임을 파악
Docker 이미지의 기본 설정으로 인한 문제로 현재 로컬테스트중에 문제를 해결해도 서버에서 다시 이설정을 해줘야 한다고 판단하여 docker이미지를 다른 이미지로 변경
dmillon/postgis -> kartoza/postgis로 이미지 소스 변경
- Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.문제
postgres를 사용할때 나타나는 경고메세지
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
설정
해결책은 있지만 문제 원인은 알수없어 검색하다 이와같은 글을 찾음 https://ryudaewan.wordpress.com/2018/02/08/pgsql_jpa/ 하지만, 이해하려면 시간을 더 투자해야할것 같습니다. 차후 공부로 남깁니다.
- Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.에러
구버전의 PgJDBC사용으로 인한 문제(https://mvnrepository.com/artifact/postgresql/postgresql/9.1-901-1.jdbc4)
하지만 PostgreSQL JDBC의 최신버전 사용에도 같은에러 발생
maven repository에 업로드 되지않은 9.4버전까지 업데이트 해야한다는 답변
- 다른 방안을 찾을수 있었습니다. PostGIS를 사용한 깃허브에서 build.gradle의 파일에서 PostgreSQL JDBC를 따로 사용하지 않고, hibernate -> hibernate spatial로 사용한것을 확인하였습니다.
https://github.com/lomasz/spatial-spring/blob/master/README.md
- Hibernate Spatial 정보탐색
hibernate Spatial은 4버전까지 hibernate의 확장으로 존재하다가. 5버전 부터 hibernate ORM 프로젝트로 포함되면서, Hibernate에서 제공하는 geoData 관리를 위한 ORM의 표준으로 제공된다. 또한 hibernate프로젝트에 포함되면서 부터 springboot에서 버전관리를 해준다.
현재 공간데이터는 java 표준라이브러리 JDBC에서 제공해주지 않는다. 이로인한 문제들이었던 것으로 보임.
Hibernate Spatial은 지리 데이터 저장 및 질의 함수에 대한 표준화 된 교차 데이터베이스 인터페이스를 제공합니다.
http://www.hibernatespatial.org/
https://www.baeldung.com/hibernate-spatial http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#spatial
정리:
- 따로 jdbc 의존성을 추가하지 않고, Hibernate Spatial을 이용한다.
- Docker 이미지 ( kartoza/postgis)를 사용한다.
- Hibernate Spatial에 관한 geo 관련 메서드를 학습하여 적용한다.
POSTGIS를 사용하기 위해서는 Hibernate + geo Info인 Hibernate Spatial을 사용해야한다.
호환성 문제.
compile group: 'org.hibernate', name: 'hibernate-spatial'
spatial5 부터 hibernate에 포함됨. 버전관리 자동으로 하도록 버전 삭제해줌
https://github.com/pgjdbc/pgjdbc/issues/1102
서버 설정
vi 한글 설정
https://harryp.tistory.com/457
5월 15일 (16일차)
이미지 자동수집
python
http request 보내기
https://dgkim5360.tistory.com/entry/python-requests
이미지 주소 긁어오기
https://blog.naver.com/93immm/220913503981
웹에서 파일 다운로드
이미지 GPS 정보 추출하기
https://cpuu.postype.com/post/23100
파이썬 request
https://dgkim5360.tistory.com/entry/python-requests
멀티파일
https://toolbelt.readthedocs.io/en/latest/uploading-data.html#streaming-multipart-data-encoder
https://toolbelt.readthedocs.io/en/latest/user.html
pip install BeautifulSoup4
pip install lxml
pip install pillow
pip install python-magic
sudo pip install python-magic-bin==0.4.14
JAVA
자바 웹 크롤러
http://blog.naver.com/PostView.nhn?blogId=kjh3864&logNo=220912789230
Subscribe via RSS