주차장 솔루션

공부는 혼자하는 거·2021년 11월 20일
0

업무

목록 보기
6/15

주차장 관리 웹 솔루션 벡엔드 개발 프로젝트가 맡겨졌다. 원래 개발을 맡아서 해오던 분이 대전으로 파견을 나가게 되면서, 내가 대신 진행하게 되었다. 원래 코드는 전자정부프레임워크 기반으로 만들어졌다. 정상적인 인수인계 같은 걸 기대하지 못하는 상황에서 코드를 살펴보는 중 그냥 새로만들기로 마음먹었다.

springboot 기반으로, DB table도 전부다 새로 만들면서 프로젝트를 진행했다. 기존 코드는 전자정부프레임워크 + next.js(react.js) + mariaDB 로 구성되어있었다. 내가 벡엔드 로직을 새로 짜면서 API 규격서를 REST API 규격대로 좀 더 수정하고, 기존 프론트엔드 코드도 API 호출과 상태관리를 Redux + redux saga를 통해 일률적으로 관리하기로 결정했다. 그래서 프론트엔드 개발자에게 그런 식으로 뜯어고치자고 제안했더니 다행히 내 의견을 따라주었다. ㅎ

개발 과정

  1. 기존 코드에서 아무래도 가장 거슬렸던 점은 DB Table 자체가 고유ID를 나타내는 칼럼이 없었다는 점이다. 그래서 이 부분을 수정했다.

  2. 스프링 시큐리티를 도입했다. 전 개발자가 만드는 도중에 파견을 나갔기 때문에 인증, 권한 처리가 제대로 되어있지 않았다. 유저의 암호화도 프론트 쪽에서 암호화해서 전달하기도 했고, 전부 다 벡엔드 쪽에서 처리하고 관리하기로 대체했다.

  3. 시큐리티를 도입하는 과정에서 JWT Bearer Token 인증방식을 도입했다. 원래는 보안상 ACCESS Token과 Refresh Token을 만들어, Access Token 만료 기한을 10분, Refresh Token 만료 기간을 10일 잡고 사용자가 권한이 필요한 요청을 할 때, Redis DB에 저장히여 교차검증하는 로직을 작성하려 했으나... 귀찮기도 하고. 일단은 사내용으로 만드는 거라, 그렇게까지 보안에 신경 쓸 필요는 없다고 판단, Access Token 만 발급. 만료기간은 10일로 잡았다. 프론트쪽은 Local storage에 JWT를 저장하고, 권한이 필요한 요청을 할때마다 헤더에 담아서 보내주기로 했다.

  4. 시큐리티 과정에서 보안 상 살짝 아쉬운 점이 있는데, 내가 프론트쪽에서 로그아웃 요청을 보내면, 강제로 JWT Token 기간을 만료시켜버리고 싶은데.. 한 번 만든 토큰은 강제 만료가 안 되더라.. 할거면 쿠키에 담아서 보내고, 요청이 올 때.. 쿠키 자체를 삭제하는 방법이 있는데.. 귀찮아서 그냥 이대로 마무리지었다.

  5. 페이지네이션 같은 경우, 기존에는 전자정부프레임워크 관련 라이브러리를 사용한 것 같은데.. 그냥 내가 쓰기 편리한 Mybatis-pageHelper 로 대체했다.

  6. Mybatis에서 Enum을 적극적으로 도입했다. 담당하는 쪽에서 만든 Excel List들을 자바에서 읽어서 DB로 Insert 하는 로직을 작성했다.

  7. 주차장 목록에서 현재 주차한 입주사별 주차 대수 표시를 하기 위해서 3개의 table을 join과 group by를 적용해야했다. 덕분에 쿼리 공부는 바싹 했다..

  8. 방문신청 시, Telegram bot api를 이용해 메시지를 채팅방에 전달해줘야 했다. 여기까지는 문제없는데, 출차 시에 는 출차이미지와 함께 사용자 정보를 다시 전달해줘야 했다. api 요청은 restTemplate로 했는데, 여기서 image file을 못 읽어들어서 조금 시간을 소모했다. unirest와는 다르게, File 객체를 통으로 던지면 안 되고, FileSystemResource로 감싸줘야 되더라..

  9. 기기에서 주차장 id만 던지므로서, n개의 회원사가 입차 또는 출차버튼을 30초 이내에 클릭했을 시, 다른 회원사 이름으로 입출차 처리가 될 위험이 존재한다. 이럴 경우, 차량번호가 고유하다는 가정 하에, 입출차 처리를 하긴 하는데,

  10. 위 문제와 연동하여 기기에서 사진 인식률이 높지 않아 미인식의 경우, 그냥 가장 오래된 입차 기록은 있는데 출차기록은 없는 차량을 출차처리하게끔 한다. 이런 게 좀 불합리하게끔 느껴지긴 한다.. 하지만 따로 방법이 없다.

  11. NEXT.JS에서 이미지 태그를 쓸 시, local 환경의 서버로 get 요청을 날리 시, 포트 번호를 생략해주어야 한다더라.. 이 부분을 몰라서 test 시, 의아한 점이 있긴 했다.

  12. 그 외의 front에서 ajax로 정보들을 불러오는 시점에서 비동기로 통신 때문에 데이터가 일치하지 않는 문제점들은 프론트 개발자와 내가 협의해서 해결하였다.

profile
시간대비효율

0개의 댓글