전자정부프레임워크프로젝트를 끝내며 내가 배운 것
전자정부프레임워크(링크)는 이번 프로젝트에서 처음 사용해보았다. 사실 특별히 새로울 건 없었다. 왜냐하면 Spring프레임워크와 거의 똑같기 때문이다.
전자정부프레임워크란 “효율적인 정보시스템 개발을 위한 코드 라이브러리, 인터페이스규약, 설정정보 등의 뼈대를 제공하는 표준프레임워크”라고 한다.
즉, egovframework는 Spring프레임워크 + MyBatis + MySql + Jsp + Jquery 조합에다가 전자정부프레임워크가 제공하는 라이브러리나 클래스가 추가되어있다고 보면 된다.
Keep
현재 만족하고 있는 부분과 계속해서 이어갔으면 하는 부분
- 가능한 많은 기능을 담당하고자 한 것!
팀장님이 일이 많아서 팀장님이 담당하시는 기능 중 일부를 받아냈다. 덕분에 하나의 프로젝트에서 다양한 기능을 담당하여 개발할 수 있었다! 야근도 꽤 했지만 많이 성장했다! 뿌듯해! - 프로젝트 설정을 추가한 것!
프로젝트 진행 중 CSRF 방어가 필요했는데 여러 방법으로 해결할 수 있었다. 각 페이지마다 하거나 form태그마다 할수도 있었지만 프로젝트 차원에서 해결하는 방법이 가장 좋다고 판단이 들어 Spring Security도입을 건의했다. 다행히 잘 받아들여져서 프로젝트 설정을 직접 추가하는 경험을 할 수 있었다. 프로젝트 진행 중간에 프로젝트 셋팅을 건든다는 게 살짝 두려웠던 건 사실이다. 혹시나 내가 추가한 설정들때문에 잘되던 동작들이 꼬일까봐 걱정했는데 다행히 잘 작동해서 정말 뿌듯했다. - XSS와 CSRF의 차이를 명확히 안 것!
CSRF(링크)는 사이트 간 요청 위조 약자로 공격대상이 Server이다.
XSS(링크)는 사이트 간 스크립팅의 약자로 공격대상이 Client이다. - ES5와 ES6 차이를 정확히 안 것!
브라우저 호환성과 ES5와 ES6 차이(링크)를 확실히 알게되었다. - 검색조건 유지를 위해 return url을 사용 한 것!
필수기능이라고도 할 수 있는 검색조건 유지기능 시작 전에는 어려울 줄 알았는데 막상해보니 간단하게 끝났다! return url을 사용하여 목록화면에서 상세화면으로 들어갔다가 뒤로 가기를 해도 페이징과 검색조건이 그대로 유지되도록 구현했다. - 달력 라이브러리를 커스텀해서 썼다.
디자인팀에서 퍼블을 하는데 달력을 넣기 힘들다고 지원요청을 받았다. 달력 라이브러리를 구글링하며 제일 적합하고 커스텀할 수 있는 라이브러리를 선택해서 적용하고 특정 날짜를 클릭하지 못하게 막는다던지, DB에 저장된 날짜는 클릭안되게 달력에 처리한다든지 등 프론트와 백을 넘나들며 기능을 완성했다. library docs가 충분하지않아서 영어로도 엄청 검색을 하면서 구현했는데 꽤나 재미있는 경험이었다.
Problem
개선이 필요하다고 생각되는 부분
- 트리구조 메뉴를 개발하는데 쿼리로 애를 많이 먹었다. 서버로 재귀호출을 돌리면서 tree데이터를 json으로 만들어 화면에 던진 뒤에 jsTree라이브러리(링크)를 사용해 개발을 완료할 수 있었다. 고급 SQL에 대한 공부가 필요하다.
- egovframework를 충분히 활용하지 못했다. 시간도 없을뿐더라 기존 CMS를 건들이지 않는 선에서 다루느라 egovframework의 많은 기능을 활용하지못해 아쉽다.
- 프로젝트 전체 흐름을 이해하는 데 꽤나 시간이 걸렸다. 중간중간에 고객사 요구사항이 바뀌기도 했고 내가 담당해야하는 페이지가 계정 권한별로 달라서 초반에 헷갈렸다. 이윽고 적응했지만 더 빠르게 프로젝트 전체 그림을 파악하고 싶다.
Try
Problem의 해결책이 될 수 있는 부분
- recursive등 고급 SQL을 더 깊게 공부할 것
- 프로젝트셋팅때부터 질문을 미친듯이 할 것
- 프로젝트를 한 눈에 빨리 파악하기 위해서는 역시 다양한 프로젝트를 접해본 경험이 중요하다. 앞으로도 성장할 수 있는 기회가 보인다면 미리 걱정하지말고 기회를 잡을 것.
코드리뷰 및 질의응답
팀장님께 부탁드려서 코드리뷰를 진행했다! 바쁘신 와중에도 코드리뷰와 프로젝트리뷰 제안을 흔쾌히 수락해주셨다. 감사합니다 팀장님😀
코드리뷰시간을 알차게 사용하기 위해서는 준비를 철저히 해야한다. 팀장님이 구현한 기능들을 쭈욱 살피고 궁금했던 점들과 구글링을 통해 나오지 않는 질문들, 그리고 구현하던 중 궁금했던 모든 것들을 미리 한 데 모아 노션에 정리했다.
- pathvariable보다는 query parameter를 사용하는 게 더 나은가요?
이번에 디테일페이지를 들어갈때 pathvariable를 사용했는데 중간에 로직수정이 필요한 바람에 전부 query parameter를 사용하게 되었다.
그럼 처음부터 query parameter를 사용하는 게 나았을까하는 의문이 들었다. 네이버나 다음같은 대형사이트들도 대부분 query parameter를 사용하길래 pathvariable은 덜 사용되는 건지 궁금해서 문의드렸다.
팀장님이 답변해주시길 RESTful API에 맞게 설계하려면 pathvariable를 사용하면 되고 그게 아니라면 query parameter가 더 나은 프로젝트들도 있다고 답변해주셨다! - async await는 비동기일때 사용할 것!
이번에 async await를 이용하여 코드를 구현했는데 팀장님이 코드개선을 한 번해주셨다. 비동기작업이 없는 경우 async await보다는 flag변수를 선언해서 사용하면 빠르고 간단하게 동기작업을 할 수 있다! - HashMap 사용시 파라미터 정리를 쉽게할 수 있다.
파라미터가 많지 않은 경우 HashMap을 사용하여 DAO내에서 파라미터를 제대로 분리해주면 편리하게 사용할 수 있고 각 클래스의 역할도 완벽히 나눌수있다! - MariaDB나 MySQL에서는 group by 사용시 모든 select 컬럼을 넣지 않아도 되는 이유?
기본적으로 group by 사용시 select절의 모든 컬럼을 넣어줘야하는데 MariaDB나 MySQL에서는 넣지 않아도 정상작동한다.
그 이유가 무엇일까? 바로 sql_mode에 only_full_group_by속성을 on한 경우(참고글) 모든 컬럼을 넣지않아도 DB가 알아서 group by시 필요한 컬럼들을 챙긴다.
하지만 select절의 모든 컬럼을 넣지 않은 쿼리를 다른 DB에서 실행시 오류가 발행하므로 웬만하면 모든 컬럼을 다 기입하는 버릇을 들이는 것이 좋다. - 구글링을 통해 알게된 정보들 중 좋은 글을 어떻게 판단할까요?
프로젝트를 할때마다 구글링을 정말 많이하게되는데 관련 글을 읽다보면 서로 반대되는 주장을 하는 글이나 뭐보단 뭐가 더 좋다는 비교글이 많이 있다. 이때 어떤 것이 옳은 것인지 판단이 잘 안 설때가 종종 있어 팀장님께 정보글 판단 기준에 대해 여쭤보았다.
팀장님의 경우일단 수용 → 직접 테스트코드 작성 → 겪어봐야 알게 됨
주로 이 루트로 판단한다고 하셨다. 나도 글만 읽지말고 Test Unit등을 작성해보는 습관을 들여야겠다.