5월 2일 (1일차)

“저.. 제가요?”

네이버 핵데이에 선정되었다. 약간은 얼떨떨하기도 하고 최근에 지원한것중에 합격문자가 적힌 메일을 처음 받다보니 감격스럽기도 하였다. 연이은 불합격 소식에 마음을 내려놓고 지내고 있었는데 지금까지 한 노력들이 인정받는거 같아서 다행이었다.

진행중이었던 CI(배포 자동화)실습을 마무리 짓고 네이버 핵데이 준비를 시작해야겠다.

5월 3일 (2일차)

image-20190505213643883

마음이 붕 - 떠서 지금껏 재미있게 하던 공부들이 손에 잡히지 않는다. 천천히 하고싶은대로 하는 스프링 공부도 재미있었고, 스터디에서 하는 스프링 실습 단계별 프로젝트도 재미있었는데. 지금은 둘중 어느것도 차분하게 즐길수가 없다.

슬슬 핵데이를 준비해야겠다고 생각했다. 진행중이던 스터디 3단계는 어제 오늘에 거쳐서 해결했고 새벽 12시쯤에 얼추 마무리 지을 수 있었다.

5월 4일 (3일차)

“부담된다.”

핵데이 팀원들과 첫 인사를 나누니 점점 실감이 나기 시작했다. 프로젝트 주제는 아직 아무것도 모르겠고, 기술스택인 React는 걱정되기만 한다.

걱정되는 마음을 안고 핵데이 준비겸 기술스택 사용준비겸 해서 새 프로젝트를 시작했다. 혹시 모르니 빌드툴은 처음써보는 Gradle로 준비를 하고, 간단한 기능부터 시작하였다.

“이거 괜찮을까..?”

gradle은 처음 사용은 maven보다 약간 복잡한듯 하다. 아니 사실 조금 많이 복잡했다. React는 어떻게 해야할지 도저히 모르겠다. 그래서 마음을 다잡기 위해 간단한 일부터 시작했다. 그래도 가장 자신있던 RestAPI CRUD를 ATDD로 구현하기 시작했다. 모델을 간단히 설계하고 acceptanceTest 추상 클래스를 만들고, create와 delete 통합테스트를 작성하고, 컨트롤러 서비스에 대한 단위테스트를 각각 작성했다.

벌써부터 삐그덕댄다. maven을 통해 사용하던 모듈을 gradle에서 사용하려다 보니 scope설정부터 헷갈린다. 테스트로 사용하던 Assertions.assertThat은 import가 안된다. @Autowired된 객체는 null이기 일쑤이다.

아차 싶었다. 겨우 테스트를 작성하는데 거의 하루를 모두 써버린거 같다. 다른 것 보다 당황스러움이 컸다.

테스트는 수도없이 작성해 보았다. 프로젝트를 처음부터 만들어본 경험도 있다. 만들면서 사용한 라이브러리, 모듈에 대해 나름 치열하게 공부하고 학습하고 정리했다. 그런데도 온갖 것에서 실수를 낸다.

이제 깨달았다. 공부하는것과 숙달되는것은 또 다르구나. 내가 공부한 모든것을 기억하고 있지는 않구나.

이번 핵데이 준비기간이 스프링 숙달을 위한 기회가 될 것 같다.

5월 5일 (4일차)

기능의 추가이며 어제의 반복을 한다.

비즈니스 로직과 컨트롤러를 완성해서 테스트를 통과하고 예외를 추가하고 이것을 처리할 ControllerAdvice를 추가한다. 컨트롤러 단위테스트에 주입해서 테스트를 성공했다.

약간 슬프기 시작했다.

하루하루 즐거웠던 스프링 공부였는데, 핵데이라는 목적이 생긴 순간 짐이 된거 같다.

React에 대한 실습을 했다.

document를 열고 파일 구조에 대해 분석했다. 처음엔 전혀 모르겠다가도 그래도 계속 뒤져보니 어떤 구조인지 조금씩 알 수 있었다.

5월 6일 (5일차)

React앱으로 지도 띄우기

드디어 React app으로 지도를 띄우는데 성공하였다.

image-20190506112823100

계속 이런 로그가 나오길래. 해당 react 모듈이 예전버전이라 그런줄 알았는데… key에러였다. 정확히는 key와 request요청을 보낸 IP가 매칭이 안되서 그런거였다.

Key를 수정하니 단박에 되버린것

이제 프론트와 백엔드의 기본 프로젝트 초기화를 완료했으니 기능들을 구현해보자.


KakaoTalk_Image_2019-05-06-12-09-09

사용이 예상되는 주요기능들을 4가지로 분류하였다. 이에 각각 구현해보고 학습을 진행한다.

이미지 Springboot 서버에 저장하는 기능

Proxy

리액트 앱의 서버와 api서버간에 이미지 저장을 어떻게 처리할까 조사하다가. Proxy라는 단어가 계속 나오는 것을 발견했다. 검색해보니 정확하게 내가 사용해야할 기술이었다. (포트포워딩 비슷한개념) 비슷한 기능을 nginx에서 했었던 것도 깨달았다.

InitBinder

스프링 에서 file Data를 받을경우 @RequestBody로는 DTO와 매핑이 되지않는다. @RequestBody는 MediaType을 Json또는 xml데이터로 가정하기 때문이다.

RequestBody

이러한 에러가 났다. 이는 주요 HttpMessageConverter에 해당타입을 처리해주는 컨버터가 없기 때문이다.

HttpMessageConverter

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarywY7ByvgonAjDoaCT;charset=UTF-8' not supported

파일업로드 예제

Spring boot Rest API 파일 업로드 다운, 다중 파일업로드 포함

Spring Boot File Upload / Download with JPA, Hibernate, and MySQL database

파일 업로드 처리 5가지 방법

@RequestParam

@RequestParam vs @RequestBody vs @ModelAttribute

컨트롤러의 전달인자 @RequestParam vs @PathVariable

https://kimyhcj.tistory.com/259

@RequestParm으로 uri가 아닌 폼 데이터를 받는것에 대한 설명

@ModelAttribute의 좀더 심화 설명 by 댓글

MultipartFile 객체

MultipartFile 객체의 메서드와 사용법

SpringBoot에서 multipartResolver 빈을 등록하지 않아도 되는 이유

예제 https://www.callicoder.com/spring-boot-file-upload-download-rest-api-example/

image-20190506174035803

와 드디어!!!!!!! 와 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

드디어드디어 저장을 성공했다!!

너무 DTO 매핑에 집중해서 acceptanceTest가 아닌 실제 테스트로 진행을 하였다. 이에 해당하는 AcceptanceTest를 만들어야겠다.

5월 7일 (6일차)

이미지 저장에 대한 acceptanceTest만들기

안된다… jackson에서 에러가 나는데 원인을 알수 없다.

실제이미지를 전송할때는 에러가 안나는데, MockMultipartFile를 통해서 테스트하려고 할경우 에러가 난다.

Controller Test는 수정완료하였으나, acceptance Test는 아직 모르겠다.구현해야함

원인

https://forgiveall.tistory.com/427

RestTemplate의 기본 MessageConverter는 InputStream에 대한 직렬화를 제공하지 않는다.

https://codeday.me/ko/qa/20190402/223420.html

직렬화를 제공하지 않는이유

Stream은 이미 직렬화 되어있는 값임. 직렬화는 객체를 바이트 시퀀스로 또는 바이트 시퀀스로 변환하는 과정

https://coderanch.com/t/278938/java/serialize-InputStream-OutputStream-object

먼저 http://tutorials.jenkov.com/java-json/jackson-annotations.html#jsonsetter Jackson 문서에서 직렬화방식을 확인하였다.

이미지 가져오기

mysql에 인코딩되서 저장된 이미지스트림을 불러와서 react 앱에서 이미지를 띄우는 기능을 구현한다.

구현해야함