안녕하세요~! 이번에는 부스트코스 에이스 미션4 - 프로젝트 5를 리뷰할게요.

PJT5의 주제는 네트워킹입니다. 웹서버와 통신하는 걸 기본으로 하죠. 그래서 요구사항 역시 그에 관련되어 있어요.

 

기존에는 액티비티, 프래그먼트 화면의 이미지와 텍스트 등의

 

리소스를 내부에서 정의하거나 저장해서 보이게 했다면, 그 리소스 대신 서버에서 받은 걸로 대체하는 게 목표입니다.

 

사진에 있는 요구사항은 총 6가지이지만 그 맥락은 비슷하다고 볼 수 있겠네요. 특히 1~4번이 그렇죠.

 

좀 더 자세히 살펴볼까요?

 

 

 

1~4) 제공되는 API를 보고 서버에 요청하고 응답을 받아 화면에 표시하자!

 

부스트코스에서 프로젝트를 위한 API를 제공합니다. 해당 API에 표시된 것들을 보고 적절하게 서버와 통신하면 되죠.

 

Host 주소 = http://boostcourse-appapi.connect.or.kr:10000

+ 영화순위 리스트 조회 /movie/readMovieList

+ 영화상세 조회 /movie/readMovie

등등...

 

호스트 주소를 기본으로 작업에 알맞은 추가 정보를 url로 사용하면 됩니다.

 

2번 요구사항의 영화목록 화면은 영화순위 리스트 조회에서

 

3번 요구사항의 영화상세 화면은 영화상세 조회에서 요청하는 식입니다.

 

자세한 코드 구현은 부스트코스 강의를 보면서 그대로 따라하면 어느 정도 할 수 있습니다.

 

강의 코드를 응용하는 건 각자의 몫이겠죠. (강의에서는 Volley와 Gson 등을 사용합니다. 다른 라이브러리가 더 빠르고 좋다는 내용도 본 게 기억나는데 강의 내용에서 사용하는 걸 사용하는 게 좋을 듯하네요.)

 

제가 이 작업을 하면서 기존의 코드를 바꾼 게 있는데 리스트뷰에 대한 것들입니다.

리스트뷰 강의에서 나와있듯 요즘은 리스트뷰보다 리사이클러뷰를 더 많이 사용한다고 하여서

리스트뷰에서 리사이클러뷰로 바꿨습니다.

 

리스트뷰처럼 어댑터를 이용하면 간단히 사용할 수 있어요.

 

 

5) 데이터를 서버에 보내어 저장하기

 

저는 이 부분이 가장 헷갈렸습니다. 일단 강의에서 나오진 않거든요... 그래서 정말 별 짓 다 했습니다.

 

기존 코드(서버에서 데이터를 받아오는)와 크게 다르지 않은 방식일 듯하여 그 코드를 이리저리 변형하면서 했죠.

 

그러다가 어처구니없는 실수를 할 뻔했습니다.

 

url을 데이터를 저장시킬 서버로(http://boostcourse-appapi.connect.or.kr:10000/movie/createComment

 

그 이후에 EditText나 RatingBar 등의 데이터를 뒤에 url += "" 방식으로 붙여주고 서버에 데이터를 요청한 것처럼 그대로 사용했더니... 놀랍게도 EditText의 String과 RatingBar의 float 데이터 등의 코멘트 데이터가 서버에 저장이 되었습니다.

 

하지만... 아무리 생각해도 이건 아닐 것이다 라는 생각이 들어서 엄청 고생했죠...

 

결론은 간단했습니다. 서버에서 응답을 받을 때 GET으로 받았다면, 이번에는 POST로 서버에 보내면 되었습니다.

 

(이 간단한 걸 몰라서 이틀을...!! Rest api에 대한 개념 자체를 공부 안해서 헛짓을 했습니다ㅠㅠ)

 

데이터를 받을 때와 달리 추가적으로 Map과 관련된 코드를 추가해야하니 주의해야 합니다.(구글링하면 나와요.)

 

 

6) 이미지 다운로드

 

이것 역시 부스트코스의 강의에서 나온대로 따라하면 어려움 없이 수행할 수 있습니다.

 

그러나 제가 이상한 것인지 ImageView가 있는, 그러니까 이미지 다운로드를 사용하는 화면을 보다가 다른 화면으로 넘어간 이후, 다시 원래 화면으로 돌아오려고하면 Bitmap recycle 에러가 나와 앱이 강제로 종료되는 사태가 일어났습니다.

 

(이에 관련된 토론이 없는 걸 보니 저 빼고는 안 그런 거 같아요... 왜 나만...?)

 

이 역시 이틀 정도 헤매다가 결국 부스트코스 강의에 있는 오픈 코드에서

 

recycle 해주는 코드를 지워버리니 정상으로 동작했습니다. 그러나 recycle을 해주지 않으면 메모리에서 나중에 문제가 일어날 수 있다는 걸 알고 있었기 때문에...

 

해당 화면을 종료(onDestory)할 때만 recycle하는 코드를 새롭게 추가했습니다.

 

 

이것으로 모든 요구사항을 충족시켰습니다. 반나절 정도 코드를 정리하고 주석을 달고 밤에 제출했습니다.

 

결과를 볼까요?

 

 

PASS!!

 

뭔가 제 노력을 알아주신 거 같아 뿌듯함이 ㅠㅠ 이런 작은 칭찬 하나가 원동력이 되더군요 ㅎ;

 

이제 남은 프로젝트가 3개... 그거까지 열심히해서 잘 마무리하도록 하겠습니다.

 

감사합니다.

+ Recent posts