728x90

UMC 연합동아리 활동으로 앱개발 프로젝트를 진행했다.

1월 6일 ~ 3월 22일 까지 진행했으며 개인적인 사정으로 프로젝트 팀을 나오게되었다.

마침 오늘 Play스토어에 안드로이드 버전을 런칭하여 해당 프로젝트의 리뷰를 남긴다.

 

프로젝트 주제

OTT 서비스들에대해 작품을 추천하는 어플리케이션이다. 넷플릭스와 디즈니+, Apple TV 등등 다양한 OTT서비스들의 작품들을 디비에 저장하고 유저들 개개인의 취향에 맞게 작품을 추천하는것이 최종 목표이다.

 

팀 구성

1월~2월까지는 백엔드 Spring 4명, 프론트 android 3명, 디자이너 1명으로 팀으로 진행했으며,

3월 22일 현재까지는 spring 3명, android 2명, ios 1명, 디자이너 1명으로 진행했다.

나는 Spring 파트로 프로젝트 진행을 했으며, 개인적인 사정으로 오늘까지만 프로젝트에 참여했다.

Android 어플리케이션은 현재 Play스토어에서 다운받을 수 있으며, IOS 버전도 출시될 예정이다.

 

프로젝트 구조

Spring, Mysql 등을 사용했으며 Spring은 intellij 프로그램을 통해 작성했다. 서버는 AWS의 Ubuntu 환경에서 작동하며 이미지 파일의 경우 S3에서 처리했으며, DB처리의 경우 JDBC로 정상적인 서비스를 구현하고 이후 JPA로 변경하는 작업을 수행했다.

대략적인 어플리케이션 동작 구조이다.

나는 서버인 Spring파트를 맡아서 프론트에서 보내는 요청에따라 DB에서 데이터를 가져와 프론트에 전송하는 기능들을 구현 했다.

 

Spring 구조

Spring 내부구조이다. 회원가입이나 회원탈퇴, 정보수정 등 디비의 Update, insert, delete 관련된 API들은 UserService에 구현했으며, 정보수정 및 회원 정보조회, 로그인과 같이 select구문을 사용하는경우 UserProvider에 구현했다.

프로젝트 진행

Spring에서 소셜로그인, 회원가입, 나의정보보기, 나의 정보수정, 회원 탈퇴 API를 만드는 것을 담당했다.

 

로그인

소셜로그인 기능으로는 카카오로그인과 네이버 로그인을 구현했다. 그중 위 코드는 카카오 로그인이다.

PostLoginReq 데이터 객체 형식으로 들어오는 데이터를 받아 유저가 디비에 존재하는지 확인하여  디비에 존재한다면 바로 로그인을 존재하지 않는다면 회원가입으로 이동하도록 설계했다.

 

소셜로그인 기능의 경우 사용은 많이해봤지만 구현된코드나 UMC교육기간동안 접해보지 못하여 처음에는 어려움을 많이 겪었다. 물론 관련된 코드들은 구글링을 통해서도 많이 공부할 수 있었고 해당 소셜로그인 관련 공식홈페이지에도 친절하게 알려준다. 어렵게 느껴졌던 이유는 로그인 프로세스를 이해하지못했다.

카카오 로그인 프로세스의 경우 아래와 같다.

프론트에서 카카오로그인 클릭 후 계정 로그인 -> 카카오 서버로 전송

-> 카카오서버에서 해당 유저확인후 kakao access token 발급 -> Spring에서 해당 access token을 통해 kakao 서버에 유저관련 정보 획득 -> 디비에 저장후 로그인 및 회원가입 데이터로 사용

 

회원가입

회원가입의 경우 사용자가 입력한 정보를 받아서 디비에 저장하는 방식이다.

nickname, 프로필사진, 성별, 생년월일, 구독하는 ott 서비스, 좋아하는 장르 등의 데이터를 받아 디비에 저장한다.

 

Spring에서 사진을 처리하는것이 어려웠다. MultipartFile 데이터가 들어가는 경우 front에서 Json 형태로 데이터를 받지못한다. 사진파일을 별도로 처리할수가 없어 데이터형식을 form-data 형식으로 바꾸고 각각 데이터들을 따로 받았다.

즉 로그인처럼 하나의 객체형식으로 받지못하고, 각각의 데이터를 송신받았다. 이후 Spring에서 처리하기 쉽도록 하나의 객체에 데이터들을 삽입하여 회원가입을 진행하도록 했다.

 

컨파머 어플리케이션의 경우 휴대폰번호, 본인인증, 본명, 패스워드 등을 요청하지 않기 때문에 디비에서도 해당 유저가 누구인지 전혀 식별할수 없다. 100% 익명성을 보장한다. 

 

나의 정보보기

여기서부터 jwt가 쓰인다. jwt는 spring 서버에서 발급해주는 토큰이다. 해당 토큰을 통해서 로그인한 유저를 식별하고, 본인의 정보를 조회할 수 있게 해준다. 타인의 정보를 조회할수 있는 상황을 방지하기 위하여 jwt 토큰을 사용한다.

 

 나의 정보수정

정보수정 코드이다. 회원가입과 많이유사하다. 닉네임이나 프로필사진, 구독중인 ott 서비스, 좋아하는 장르 등을 수정할 수 있다. S3 를 사용하여 이미지 파일들을 관리하였는데 해당 url이 노출되는것을 막기위해 검은색으로 칠했다. 저곳에는 s3 url이 들어간다. 회원가입과 다르게 사진파일을 처리하는것에 조금 어려움이 있었다. 프로필 사진을 없앨경우, 변경할경우 등등 을 고려하여 코드를 작성했다.

 

여기까지가 구현한 UserController 코드들이다.

이외에도 유저가 디비에 저장되어있는지 확인하는기능, 회원의 닉네임을 호출하는기능 등등 UserService 200줄, UserProvider 200줄, UserDao 350줄 정도를 작성했으나 모두 리뷰하기에는 너무 길기때문에 UserController까지만 진행하겠다.

 

3월 JPA

1~2월동안 정상적으로 서비스하는 Spring 코드를 완성했다. 이후 어플리케이션 성능 개선을 위해 DB 접근방식을 JDBC에서 JPA로 변경하는 작업을 했다. JPA관련학습은 인프런의 김영한님의 JPA강의를 학습했다.

Entity 설계부터 JPARepository를 이용한 쿼리문 작성 등 한달동안 JPA를 경험할 수 있었다.

 

Entity를 통해 디비테이블을 객체화하여 관리하는방식이 신기하고 재밌었으며, JPARepository또한 간편하게 CRUD 쿼리를 생성해주어 편했다. 해당 쿼리문을 100%신뢰 할 수 없다고생각하여 Extract JPQL Query 옵션을 통해 쿼리문을 확인했다.

Extract JPQL Query옵션을 사용하면 위처럼 쿼리문을 확인할 수 있다. 

JPARepository가 자동으로 쿼리문을 생성해주지만 해당 쿼리문들을 직접 확인하는과정은 꼭 필요하다고 생각한다.

 

최대한 Controller를 수정하지않고 JDBC를 JPA로 교체할려 노력했으나 이후 팀원들의 방향에 따라 Controller의 코드도 달라질 수 있다고 생각한다.

개인적인 일정으로 JPA 교체작업을 완료하지 못하여 아쉬움이 있으나 내가 작성한 Controller의 기능들에 한해서는 모두 JDBC에서 JPA로 교체하는 코드를 작성했기 때문에 어느정도 JPA를 경험할 수 있었다.

후기

초기에 기본적으로 코드작성할때는 편하게 작성했던것으로 기억한다. User를 처리하는 부분은 구글링하면 코드도 많고, UMC 교육과정동안 User관련 데이터 처리를 가볍게나마 접했으며, 해당 프로젝트 이전에 공부했던 김영한의 스프링 기초 강의에서도 User관련 처리에대해 학습했기 때문에 순수 코드를 구현하는 부분에서는 편하게 구현 했다.

 

이후 자체적인 코드 테스트에서부터 어려움이 생겼다. 디비쿼리문들이 오류를 출력하거나 정상적으로 작동되지 않았으며, 기존에 처리해주지 않았던 소셜로그인, 이미지파일처리 등을 구현하면서 어려움이 많아졌다.

 

 회원가입 및 회원정보보기 정보수정 코드들의 모든 디비쿼리들이 정상작동하지않았으나 UserDao의 디비 쿼리문 수정을 통해 해결했으며, 소셜 로그인 기능 구현의 경우 Android를 담당하시는 팀원분들과 함께 진행해야 했기 때문에 계속해서 의견을 주고받으며 오류들을 수정해 나갔다.

 

소셜로그인 기능을 구현후 테스트 및 코드 수정을 안드로이드 파트 분들과 협업을 통해 진행했는데 해당 과정이 가장 힘들었지만 가장 재미있었다. 안드로이드 파트 팀원분들이 작업시간을 배려해주어 편하게 작업할 수 있었다.

 

소셜 로그인기능을 완료한 이후 이미지파일을 처리하는 기능을 회원가입과 정보보기, 정보수정에 각각 넣는것도 어려웠다. 이미지 파일이 없는경우 모든 데이터를 json 형식으로 간단하게 처리가 되어 편하게 진행할 수 있었다.

그러나 MultipartFile 데이터가 포함된 경우 json형태로 전송하지 못하고 form-data형식으로 전송받아야 했으며, 이미지파일 추가로 인해 UserController의 Parameter, 이후 Controller에서 호출하는 모든 UserService 메소드, UserDao의 db쿼리문 등 모두 수정해 주었다.

 

1~2월 동안 JDBC를 통해 서비스를 완료한 프로그램에서 내가 작성한 코드들 모두 합쳐봐야 900 ~ 1000줄정도이다.

코드의 양은 많지않지만 코드를 구현하는데 있어서 고민하는 시간이 정말 많았던것 같다.

 구글링뿐만 아니라 보내는 데이터를 처리하는 방식에대한 고민, 팀원, 지인들에게 자문을 구하는 등 고민하고 코드를 수정하는데 정말 많은 시간이 필요하다는 것을 알게되었다. 

또한 코드를 실제로 테스트해봄으로써 작성한 코드들이 정상작동하는지 확인하고 수정하는것에도 시간이 많이 필요하며, 백엔드 담당을 맡게 되더라도 프론트와 함께 협업하는 상황이 반드시 발생한다는것 또한 알게되었다.

 

모든 기능 구현이후 자체테스트에서 문제가 발생했으며, 자체테스트를 통과하기 위해 코드를 수정했다.

이후 android와 연결하는 과정에서도 모든 기능들에 문제가 발생하여 코드를 수정하는 과정을 거쳤다.

실력이 없었기 때문에 어려움을 느낀것도 당연하다.

또한 어려움을 느꼈기 때문에 시간투자를 많이하여 어느정도 프로젝트 진행시간에 맞출 수 있었다.

 

프로젝트 팀원들에게 정말 많은 도움을 받았다. 본 프로젝트가 개발 프로젝트로서는 첫 프로젝트였으며 개발 실력이 가장 낮았기 때문에 팀원들에게 도움요청을 많이했다. 덕분에 많이 배울 수 있었고, 실력을 기를 수 있었다.

또한 대학교 지인들에게도 자문을 구해 어려움을 해결하기도 했다. 여러 방면으로 도움을 주신 지인, 팀원분들 모두에게 감사하다.

 

오류가 발생했을 때의 스트레스는 오류를 해결했을 때의 성취감에 비할바가 되지않았으며 프로젝트 기간동안 팀원분들과 함께 의논하고 문제들을 해결해 나가는과정이 정말 재미있었다.

전체적인 프로젝트의 후기는 "재미있었다" 이다.

개인적인 일정으로 함께 프로젝트를 진행하지 못함에 많은 아쉬움을 느끼지만 팀원이 아닌 컨파머 이용자로서 팀 컨파머를 항상 응원한다.

 

play스토어 컨파머 링크

https://play.google.com/store/apps/details?id=com.corn.cornfarmer_android

 

프로젝트의 후기를 최대한 생생하게 남기고자 생각나는대로 두서없이 작성했다.

이글을 마지막으로 블로그 관리 또한 개인적인 일정으로 못하게 될 예정이다.

728x90

'ETC > Review' 카테고리의 다른 글

2022  (0) 2022.12.31
2022 4회 정보보안기사 필기 후기  (0) 2022.10.24
2021 회고록  (0) 2021.12.31

+ Recent posts