
장현준(Jang HyeonJun)
자기소개
현재 차량의 데이터를 가져와 차량관제, 차량제어를 제공하는 서비스 개발 및 설계를 주요 업무로 하고 있습니다.
- 차량제어에서 맡은 부분은 운영팀에서 차량제어 CS가 발생했을 때 어드민 페이지에서 차량 문제점 파악 및 해결에 대해서 어려움이 있었습니다. 이러한 문제로 운영팀과 개발팀은 업무를 계속해서 진행할 수 없었기 때문에 어드민 페이지에 운영팀이
차량 문 잠금/해제와 시동 잠금/해제 비동기 RPC를 바로 처리를 할 수 있도록 화면과 API를 개발하였습니다. 이 기능으로 인하여 개발팀에 들어오는 CS건수가 확연히 줄어들었습니다.
- 차량 관제에서 맡은 부분은 좌표를 주소로 변경하는 open GeoCode API 추가 하였습니다.
이유는 이전에는 하나의 open GeoCoder API 만 사용하였습니다. 하나의 open API로 8000대의 차량에서 올라오는 좌표 데이터를 주소로 변경하는 것은 무리가 있었습니다. 그래서 Open GeoCoder API 를 2개추가하였고 이를 번갈아 사용하게끔 구현하였습니다. 그 결과 현재까지 무리없이 좌표 → 주소로 변경할 수 있습니다.
클린 코드와 개발 효율성을 중요하게 생각하며, 자동화에 관심이 많습니다.
- 서비스 코드가 for문을 남발해서 사용하거나 레거시 코드가 많았습니다. 이런 코드는 직관성과 성능을 저하 시키기 때문에 사내 스터디(모던 자바 인 액션)를 진행하여 리팩터링을 진행하였고,
Stream, 비동기 메서드, 컬렉션 API를 사용하여 레거시 코드를 수정하였습니다.
- 매일 아침 운영팀에서 주기적으로 요청하는 설치이력, 고장 단말기와 같은 데이터들을 엑셀 다운로드 기능을 만들어 배포하였고, 해당 기능은 운영팀에게 좋은 호응을 얻었고 업무 효율성을 높였습니다.
- 최근 테스트 코드는 증가하지만 추후에 로직이 수정된 이후 테스트 코드를 관리하지 않고 있었습니다. 그 결과 초기에 작성했던 테스트 코드에서 에러를 내뱉는 문제가 있었습니다. 이러한 문제를 해결하기 위해 저는 GitAction을 사용하여 테스트 자동화를 추가하였고 테스트 코드의 무결성을 유지하고 있습니다.
테스트 코드와 코드리뷰를 중요하게 생각하고 있습니다.
- 입사했을 때 당시는 코드리뷰 문화와 테스트 코드의 중요성이 없었고 규칙이 따로 없었습니다. 그래서 PR을 보냈을 때는 사수에게 바로 피드백을 받고 코드를 수정하게끔 되어있었고 저와 동료(Nicky)는 기존에 있던 분들과 새로 입사하는 분과 CTO님에게 코드리뷰, 테스트 코드의 중요성를 설명하였고 도입해야이유에 대해서 설명을 드린 이후에 회사의 테스트 커버리지가 15%가 올라갔으며 현재는 우리만의 코드리뷰 문화를 정착해 나가는 중입니다. 또한 저는 테스트 코드를
자바와 JUnit을 활요한 실용주의 단위 테스트 리팩토링 2판 과 같은 책을 읽으며 점진적으로 확장해 나가고 있습니다.
커뮤니케이션을 중시 합니다.
- 대부분의 개발자는 기업이나 프로젝트에 속하면서 다른 사람과 협업을 통해서 결과물을 만들어내고 있습니다. 이 과정에서 개발자들 간 그리고 사용자들과의 커뮤니케이션은 필수 덕목이라고 생각합니다. 이러한 커뮤니케이션이 개발자한테 간과해서는 안된다고 생각합니다.
이러한 이유로 저는 다른 사람들의 의견을 많이 듣고자 사내 또는 외부 스터디를 하며 다른 개발자들과 의견을 주고 받으며 커뮤니케이션 능력을 쌓고있으며, 개인적으로 만남을 가지며 기술이나 고민들을 얘기하고 있습니다.
🔥 Experience
**2021.07.05-
2022.11.01**
**IMS Mobility
GitAction
TestContainer
SpringBoot
JPA
OpenAPI 비동기 JUnit5 Mockito React Javascript mariadb**
IMS MOBILITY
테스트 CI 자동화와 테스트 코드, 코드리뷰 문화 개선
- 기존 개발은 기능 구현에 집중되어 dev, prod 브랜치에 사이드 이펙트를 확인하지 않고 특정 부분 기능만 돌아가는거에 집중되어 있었습니다. 저는 코드 개발 문화부터 개선하기 위해 팀원들에게 코드리뷰와 테스트 코드의 중요성을 설명하였고, 우아한 형제들, 라인, 헤이딜러 와 같은 테크 블로그에서 코드리뷰 문화를 찾아 우리 부서에 맞는 리뷰 문화를 만들었습니다. 그 결과 팀원들이 서비스 도메인과 전체적인 로직을 더 잘 이해하게되었고, 테스트 커버리지 증가와 코드 사이드 이펙트를 줄일 수 있었습니다.
- 추후에 로직이 변경되거나 엔티티가 변경되었을 때 이전에 작성된 테스트 코드는 관리되고 있지 않았고 무결성이 깨지고 있었기 때문에 팀원들이 PR을 호출했을 때 전체 모듈의 테스트 코드를 검사하는 CI를 GitAction을 추가하여 자동화를 하였습니다. 추가적으로 테스트 코드에서 더미 데이터를 Dev DB의 데이터를 사용하고 있었는데, 테스트 코드를 작성하면서 데이터의 무결성이 깨지거나 Dev DB연결에 의존적이었습니다. 의존성과 더미 데이터를 해결하기 위해서 TestContainer 를 도입하여 사용하고 있습니다. 기존 Dev DB Connection을 하기위한 연결시간이 없어져 테스트 시간을 줄였고, 의존성도 줄일 수 있었습니다.
어드민 페이지 개발, 유지보수
차량 대량 엑셀 등록 & 다운로드
- 기존 차량 등록 할 때는 운영팀에서 1대씩 차량에 맞는 코드와 등록일과 같은 정보를 등록했어야했습니다. 최근 차량 등록 요청이 많이 들어왔기 때문에 기존 업무로서는 효율이 나오지 않는다고 판단하였습니다.
엑셀로 필요한 데이터만 기입하고 서버에서 알맞은 데이터를 기입하는 기능을 구현하였습니다. jdbcTemplate를 사용하여 직접 DB 설정을 해주었으며, 500개의 차량 데이터를 등록할 때 0.3초 속도가 나왔습니다.
Bulk 엑셀 차량 등록 개발 -
등록 속도 1.7초 → 0.3초 개선
- 매주 월요일 아침 운영팀에서
설치, 탈거, A/S 진행건을 조회할 때 하나씩 조회하는게 불편하다는 문제가 있었습니다. 운영팀과 토의를 한 이후 날짜를 선택해서 엑셀 다운로드가 좋겠다 라는 결론이 나왔고, 어드민 페이지에 날짜별 선택을 하여 엑셀 다운로드를 할 수 있도록 설계를 하였습니다. 또한 엑셀 다운로드를 할 때 설치건이 많을 때는 1000건이 넘기때문에 데이터를 한번에 조회하는 쿼리를 보내어 다운로드를 진행하다보면 시스템이 느려지거나 메모리 부족으로 인하여 시스템에 문제가 생길 수 도 있기 때문에 Paging 처리를 하여 약 250개의 데이터를 나누어 다운받을 수 있도록 구현하였습니다.
카카오 지도 API 연동
- 기존 운영팀에서 차량 등록 업체를 등록할 때 텍스트로 주소를 등록하고 있었습니다. 해당 기능은 휴먼에러와 업무효율성이 낮다고 판단하였습니다.
저는 카카오 open API의 지도와 주소검색 API를 연동하여 업체 주소를 검색했을 때 지도에 마커를 표기하여 업체 등록할 수 있도록 하였습니다. 해당 기능을 구현했을 때 운영팀에서 좋은 호응은 얻었던 것 중 하나인 프로젝트였습니다.
차량 제어 상태 체크 기능 개발
- 차량 문 잠금/해제, 시동 잠금/해제, 단말기 재기동과 같은 기능 이미 구현되어 있었지만 사용자 앱 또는 개발팀에서만 사용할 수 있었고 운영팀에서는 사용자 앱에서만 사용할 수 있었습니다. 그렇기 때문에 사용자에게 차량제어 CS가 들어오면 핸드폰으로 접속해서 문제 원인을 파악하거나 해결할 수 밖에 없었습니다.
차량 제어 기능을 운영팀에서 사용할 수 있도록 로직을 변경할 필요가 있었습니다. 왜냐하면 제어를 하는 H/W에 계속해서 RPC를 호출하면 과부하가 걸릴 수 도 있었기 때문에 제어상태를 체크하는 로직 및 테이블을 추가하여, 현재 차량 제어 RPC를 호출 할 수 있는 상태인지 체크**(IDLE, WAIT)** 이후 RPC를 호출하도록 구현하였습니다.
Installer( 설치자 앱 ) 유지보수
차량 불량 단말기 A/S 기능 활성화
- 비즈니스 로직이 계속해서 변경되면서 단말기 설치, 탈거 기능의 로직은 변경이 되었지만
A/S 기능은 초창기 서비스 로직에서 제대로 유지보수가 되지 않고 있었습니다. 그래서 운영팀에서도 불량 단말기가 있으면 A/S 기능을 사용하지 않고, 차량 단말기를 탈거 → 설치로 비효율적으로 운영을 하고 있었습니다. 이러한 비효율성을 개선하고자 운영팀과 설치엔지니어팀과 설치 현장의 얘기를 충분히 토의 이후 기능 설계및 개발에 들어갔습니다.
A/S를 신청하면 설치엔지니어는 단말기 설치/미설치로 구분할 수 있게 로직을 구현하였고, 차량제어 H/W도 필요에 따라 신규설치 or 제거를 할 수 있게 설계를 하였습니다. 또한 운영팀에서는 설치엔지니어가 차량에 설치하는 단말기를 변경했는지 안했는지 그리고 차량제어 H/W를 제거 or 설치를 했는지 자동으로 볼 수 있게 서버에서 체킹하는 로직을 추가하였습니다. 이 기능으로 인하여 A/S 정산을 자동화 할 수 있게되어 운영팀의 큰 호응을 얻었습니다.
- A/S 기능을 유지보수하면서 차량 단말기에 차량코드를 설치하는 로직을 동기에서 비동기로 변경하였는데, 이유는 동기로 설치하게되면 로직에서 문제가 생겨 blocking 되는 순간 슬로우쿼리가 발생하여, 전체적인 서비스에 영향을 주는경우가 발생하여 서버가 죽는 현상이 있었습니다. 그래서 Spring Boot에서 제공하는 비동기 메서드인 **
DeferredResult**를 ****사용하여 일정 시간동안 반환값이 오지 않으면 실패로 처리하도록 하였습니다.
2019.12.17- 2020.01.18
교내 뉴욕 인턴십
Python을 사용하여 부동산 정보 스크래핑 기능 구현
- 해당 프로젝트에서는 Backend 3명, Frontend 2명으로 구성되었고, 저는 Python으로 개발하며 리더를 겸임했습니다. 팀원들은 모두 인턴 학생으로, 다양한 국적이었습니다. 저는 브라우저에서 특정 태그의 데이터를 스크래핑해 DB에 저장하는 기능을 맡았습니다. 스크래핑 시 동일 IP로 인한 브라우저 차단 문제를 해결하기 위해 tor 라이브러리를 사용해 IP를 지속적으로 변경, 정상적으로 스크래핑을 완료했습니다.