개요
•
국내 브랜드사와 해외 매장을 연결하며, 해당 국가의 고객들에게 상품을 판매할 수 있는 서비스를 제공하는 플랫폼 개발이 목적으로 개발하였습니다.
•
QR을 통한 제품 추적과 물류 단계에서의 유통 관리, 그리고 매장의 상품과 판매 데이터 등을 관리해 주는등 다양한 서비스를 함께 제공하는 것을 목적으로 개발하였습니다.
주요 이슈
•
공통 인프라 로직을 AOP로 분리
◦
프로젝트 중 Controller 에서 로그인 관련 중복된 로직이 계속해서 작성되는 것을 발견하였음.
◦
이후 해당 로직을 수정 해야하는 일이 생겼고, 모든 로직을 수정해야했기 때문에 시간과 비용이 크게 발생함.
◦
Spring AOP 를 활용하여 해당 로직을 분할하였으며, Logging 로직 또한 중복되는 로직이었기 때문에 AOP 를 활용하여 분리하였음. 이를 통해 코드의 가독성과 유지보수성이 크게 좋아졌음.
•
Syncronized 를 활용한 재고 수량 동시성 이슈 해결
◦
재고 수량이 1개일 때, 동시에 여러 스레드에서 접근하면, 재고 수량이 마이너스가 되고 주문도 가능한 동시성 문제가 발생
◦
해당 프로젝트에서는 WAS 서버를 하나만 운영하기 때문에, Syncronized 를 활용하여 한 번에 여러 스레드가 접근 할 수 없게끔 하여 해당 동시성 문제를 해결하였음.
•
JOIN과 인덱스를 활용한 페이지 성능 개선
◦
메인 페이지 상품 조회 시 로딩이 오래걸리는 문제가 발생하였음.
◦
여러번 쿼리문을 접근하여 데이터를 불러오던 로직을, JOIN 을 활용하여 한 번에 불러올 수 있게끔 수정하였음.
◦
또한, DB에도 인덱스 테이블을 수정함으로써 기기에 따라 최대 5~7초가량 걸리던 로딩 시간을 1~2초까지 단축할 수 있었음.
▪
성능 개선을 위해 방법을 찾아보니, LIKE ‘%상품명%’을 활용하여 검색을 하면, 인덱스를 타지 않는다는 것을 알게 되었음.
▪
ngram 방식의 Full Text Index 를 적용하여 문제를 해결 할 수 있었으며, 상품 검색 외에 LIKE 를 굳이 사용하지 않아도 되는 기능은 LIKE 를 제거하거나, ‘검색명%’ 방식으로 수정하여 문제를 해결하였음.
•
Self-Invocation 문제 해결
◦
Transaction 의 격리 수준이 requires_new 였던 메서드가 있었고, 해당 트랜잭션이 정상적으로 동작하지 않는 문제를 발견하였음.
◦
requires_new 에 대하여 알아보다보니, 논리적 트랜잭션과 물리적 트랜잭션에 대하여 알 수 있었고, 더 나아가 프록시 객체와 Self-invocation 문제에 대하여 알게 되었음.
◦
별도의 Service 를 만들어 트랜잭션이 정상적으로 동작할 수 있게 수정하여 문제를 해결하였음.
•
JSTL 도입으로 가독성 문제 해결
◦
사내에선 아직 스크립틀릿 방식으로 JSP 개발을 진행하고 있었고, 이를 통한 가독성 문제와 유지보수 문제가 발생하였음.
◦
사내 회의에서 적극 건의를 통하여 JSTL 을 도입하였고, 스크립틀릿으로 되어있던 로직을 JSTL 로 수정하였음.
◦
그 과정에서 직원들을 대상으로 JSTL 교육 담당을 맡게 되었고, JSTL로 교체함으로써 가독성과 유지보수성이 크게 향상되었음.
담당한 기능 및 역할
•
User 용 하이브리드 웹 애플리케이션 Back-end 개발
•
User 용 하이브리드 웹 애플리케이션 Front-end 개발
•
Owner 용 하이브리드 웹 애플리케이션 Back-end 개발
•
Owner 용 하이브리드 웹 애플리케이션 Front-end 개발
•
물류 하이브리드 웹 애플리케이션 Back-end 개발
•
DB 설계 보조
•
고객과의 커뮤니케이션을 통한 요구사항 분석
•
QA 테스트
•
단기간 운영 및 유지보수
프로젝트 진행 과정
•
고객과 회의 ( 솔루션 방향 제시 )
•
요구사항 작성
•
WBS 작성
•
DB 설계, 클래스 설계
•
환경 구축
•
프로젝트 개발
•
테스트
•
서버 구축 및 운영
•
산출물 작성