강의를 들으며 협업 진행!

Ahn yi·2022년 9월 23일
0

java

목록 보기
15/22

대부분의 기능을 강의 내용을 보며 진행하였다.
우선, API를 활용하여 조회 기능에 대해서는 GET 방식으로 사용하였고, 그 외에는 POST 방식을 사용하여 client와 서버간의 통신을 하였다. GET 방식과 POST 방식의 눈에 보이는 가장 큰 차이는 응답받은 url 뒤, 데이터의 유무였다. (GET 방식의 경우 /url?data=user_data)
그리고 JWT 라는 새로운 내용을 배우며 사용하였다. JWT(JSON Web Token) 토큰은 헤더, 페이로드, 서명으로 구성되어 있으며, 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준으로 페이로드는 몇몇 클레임(claim) 표명(assert)을 처리하는 JSON을 보관하고 있다. 이 중, 내가 이해하고 사용한 내용은 JWT 토큰은 데이터를 암호화 하여 cookie에 저장된다는 것이었다. 이 중에서, 데이터 외에 만료시간을 정하기 위해 'exp' 라는 것을 사용하였다. 이것이 페이로드의 클레임 중 하나였으며, 이러한 클레임은 선택사항이다. 진행 방식으로는 다음과 같다.
1. 로그인을 할 경우, payload 에 암호화된 값과 선택사항인 클레임을 넣는다.
2. JWT 토큰의 헤더, 페이로드, 서명 과 SecretKey를 사용하여 access token을 만들어내어 client에 전달한다.
(일반적으로 로컬 또는 세션 스토리지. 쿠키를 사용할 수도 있음 )
3. 사용자는 access token으로 로그인 정보가 필요한 기능에 따라 헤더 안에 token을 서버에 보내야 한다.
4. 서버에서 token을 검증한 후에, 디코딩하고 데이터를 가져온다.

내가 미니프로젝트에서 자체적으로 사용한 내용은 다음과 같다.

  1. 로그인 여부에 따라 jinja2로 로그인 데이터 정보를 확인하여 홈페이지 내용을 다르게 노출시켰다.
  2. 사용자가 url 뒤쪽에 직접 타이핑을 하는 경우 JWT 토큰이 없는 사용자라면 초기 화면으로 return 해주었다.
  3. logout 할 경우 cookie의 JWT 토큰 정보를 삭제하였다.

가장 기억에 남았던 것은 회원 비밀번호 관리하는 기능이다. 기능 자체는 어렵지 않았지만, 강의에 없었으면서 Hash값으로 비밀번호를 암호화 하여서 복호화 하는 방법을 찾지 못하였다.
그래서 마이페이지를 만든 후에, 비밀번호 입력란의 값 유무에 따라 업데이트 당시 비밀번호 변경 여부를 결정하였다.
그리고나서 테스트를 진행하던 도중 비밀번호를 까먹게 된 일이 발생하였는데 찾을 방법이 없었다.

테스트 도중에 사용자는 아니지만 사용자 입장에서 불편한 점을 찾게 되었다.

그래서 user_id, password의 데이터만이 필수값이었던 것에 더해 다른 데이터까지 필수요소로 넣고 그것이 같을 경우 default 비밀번호를 정하여 사용자에게 alert 으로 띄워주고, 그 값의 hash 값을 해당 사용자의 password에 넣어주었다. 기능 자체는 별 거 아니지만 프로젝트를 진행하던 도중 내가 만든 홈페이지의 불편함을 깨닫고 개발한 내용이어서 기억에 남았다.

미니프로젝트가 끝나고 느낀점은 오랜 시간을 고민하다가 원하는 기능이 정상적으로 됐을때의, 성취감을 느낄 수 있었다. 사소한 실수도 있었으며 로직의 오류도 있었지만 성취감을 통하여 그것을 찾아가는 재미를 느끼게 되었다.
그리고 프로젝트 세팅과 협업의 어려움을 느꼈다. 각각 local 에서 버전이 달라 코딩을 하지도 못하고 시간을 많이 버렸으며, 배포를 하고난 후에도 local과 달라 수정한 부분이 있었다. 대표적으로 pymongo 버전 및 접속정보를 계속해서 수정하며 사용하였다. 앞으로의 프로젝트를 진행할때는 각각의 local과 배포 환경까지도 초기에 세팅을 해준 후에, 진행을 해야 된다는 것을 깨달았다. 그리고 github 사용에 능숙하지 않아 코드를 날리고 복구하고를 반복하였다. github 에 관련해서는 프로젝트를 진행함으로써 익숙해질거라 생각한다. (개인 공부도 필요하다고 생각한다)

아쉬움을 뒤로 하고 처음 접한 알고리즘 문제는 생각보다 할만한 거 같았다.
java의 LocalDate class와 DayOfWeek enum으로 요일을 구하였다.
그 후, 생각보다 간단한 for 문과 if 문으로 대처하였다.

그러다가 hashmap을 사용하는 알고리즘이 나왔다.
배열 두개의 값이 중복도 가능하고 값이 여러모로 사용하기 애매하였다.
이것 저것 시도해보다가 hashmap의 key값에 하나의 String, value에는 1을 넣었다.

중복되는 값이 있다면 해당 key 값의 value를 +1씩 해주었다.
그리고 다른 배열의 key값에 해당하는 value는 -1씩 해주었다.

그렇게 되고나니 key, value의 모음이 String, 0의 집합이 되었다.

value에 1이 남은 값이 정답이었다.

힘들었던 hashmap 사용을 끝마치며....

profile
소통을 잘하고싶은 백엔드 개발자

0개의 댓글