이번 시간은 이 시리즈의 마지막 시간으로 1인 개발 시작시에 미리 알았으면 좋았을 것들을 정리하였습니다.
(모든 코드는 Github에 있습니다.)
회사나 팀 단위의 서비스가 아닌, 1인 개발로 서비스 구축시 Tip을 나열하였습니다.
회사나 팀 단위의 서비스라면 전혀 다를수 있습니다.
Tip)
회사 혹은 팀 단위 서비스라면 권남님의 신규 Web 서비스시 고려해 볼 사항을 참고해보시길 추천드립니다.
실전 초고수 손권남님의 경험을 토대로 작성된 노하우라서 정말 많은 도움이 됩니다.
백엔드 개발자라면 비법서와 같은 팁들이 넘치기 때문에 꼭꼭 보시길 추천드립니다.
내용이 계속 추가되고 있기 때문에 정기적으로 방문해서 보시는것도 좋습니다.
1인 개발이라 하더라도 개인마다 느낀 점이 전혀 다를수 있기 때문에 저 개인의 경험을 토대로 했다는점을 먼저 말씀드립니다.
Tip
회원 서비스
- 회원 서비스는 웬만하면 OAuth로 구축하는 것을 추천
- 직접 구현할 경우 배보다 배꼽이 커지는 경우가 자주 발생
- 직접 구현시 다음을 전부 구현해야함 (OAuth에도 구현해야하는 것 제외)
- 로그인 보안
- 회원가입시 이메일, 전화번호 인증
- 비밀번호 찾기
- 비밀번호 변경
- 개인정보 수정
- 개인정보 보안
- 회원 관련 CS 대응
- OAuth 로그인 구현시 위 부분을 모두 구글/네이버/페이스북 등에 맡기면 되서 심플해짐
- 서비스 개발에 집중할수 있음
- 서비스 초기에는 세션 저장소로 꼭 Nosql(Memcache, Redis) 등을 쓰지 않아도 됨
- 초기에는 RDS도 세션 저장소로 괜찮음 (이전 포스트 참고)
- Spring Session 모듈로 인해 저장소 솔루션 변경이 용이하기 때문에 RDS를 썼다고 Redis 변경이 어렵지 않음
- 기본 세션(톰캣 세션)을 쓰게 되면 톰캣이 재시작하는 순간 (배포나 스위치) 모든 로그인이 풀려버리니 기본 세션보다는 JDBC Session 추천
캐시
- API 결과 데이터 혹은 HTML 렌더링 결과는 클라이언트에서도 캐시할 수 있음
- 웹 서비스라면 브라우저 변수를 적극 활용하여 서버 자원을 아낄수 있음
- 예를 들어 화면의 탭을 누를때마다 화면이 변경된다면, 탭의 결과와 탭 클릭시간을 브라우저 변수로 저장
- 이전에 동일 탭 클릭시간에서 5초 이내(서비스 특징에 따라 변경)로 다시 탭을 클릭하면 변수에 저장된 랜더링 결과를 그대로 다시 반환하고, 5초 이상 지났다면 다시 Ajax로 데이터를 반환해서 저장하고 랜더링하면 됨
- 잦은 API 요청에 대한 서버 자원을 아낄수 있음
- kingbbode님의 Cache 참고
관리자 페이지
- 관리자 페이지와 사용자에게 제공되는 서비스는 분리해서 구현할것
- 같은 프로젝트로 있으면 다음과 같은 문제가 발생
- 외부에서 접근할 수 있기 때문에 그에 따라 인증/권한 관련 기능이 추가로 필요하게 됨
- 관리자 페이지와 서비스 페이지의 코드가 중구난방으로 교차 사용될 확률이 높음
- 중복 코드가 생기면 (Entity 클래스 등) Copy & Paste 하더라도 둘은 분리하는걸 추천
- 분리만 되있으면 이후 Gradle 멀티 모듈 전략과 같은 방법으로 개선 가능
- 초기에는 8-1-2. YAML(.yml) 수정처럼 로컬PC에서 관리자 페이지 운영환경을 실행시키는 것도 좋은 방법
- 외부에서 접근할 수가 없음
- EC2를 한대 더 사용할 필요가 없음
- 배포환경을 추가로 구축할 필요가 없음
- 메인 서비스가 안정화 된 후 관리자 페이지 개선해도 늦지 않음
써드파티
- 메인이 되는 기능 외에 나머지는 전부 써드파티 라이브러리에 의존하는걸 추천
- 1인 개발은 무엇보다 개발 시간이 부족하기 때문에 최대한 외부 서비스를 이용할 것
- 댓글: DISQUS
- 외부 API 연동: Zapier
- 페북 API와 Slack & 본인 API 연동 등을 클릭만으로 해결
- 월 100회 요청까지 무료
- 웹로그: Google Analytics
- 실시간 모니터링: Pinpoint
- CDN: Cloud Flare
- Editor: tui.editor
어플리케이션 & DB
- JPA 사용시 OSIV 옵션은 끌것
- 트랜잭션 범위가 커져 실제 설정한 시간 보다 훨씬 오래 DB 커넥션을 붙잡고 있어 성능 이슈의 주 원인이 됨
- 안그래도 낮은 사양의 장비를 사용하니 최대한 이런 요소는 미리 제거하고 시작하는것 추천
- 데이터 변경 로직은 모두 어플리케이션에서 처리할 것
- DBMS에서 데이터 생성 금지
- ex)
now()
,password()
, 스토어드 프로시져 등 - View 템플릿 엔진에서 데이터 로직 금지
- ex) FreeMarker, Velocity 등에서 데이터 변경하는 등 금지
- 차후 기능 변경/확장, 시스템 변경 등에서 고려해야할 요소가 너무 많아짐
- 주요 기능은 무조건 테스트 코드를 작성할 것
- QA팀이 없기 때문에 본인이 직접 테스트 해야함
- 직접 테스트하는 시간을 줄여줄수 있는 것이 테스트 코드
개발
- 욕심부리지 말것
- 수많은 고려사항들과 기능들이 생각남
- 다 무시하고, 출시를 목표로 할것
- 이런 저런 사항을 모두 고려하면 머릿속에서 구상만 되다가 좌초됨
- 가장 자신 있고, 자주 사용하는 언어와 환경을 사용할 것
- 리액트 & 웹팩도 공부할겸 서비스 출시해보겠다고 하면 출시 하는 경우를 거의 못봄
- 오히려 jQuery로 서비스 출시 -> 리액트 & 웹팩 별도 공부 -> 출시된 서비스에 적용이 성공 확률이 더 높음
- 말 그대로 혼자 개발하는게 출시 확률이 더 높음
- 사업이 아니고, 개인 서비스 출시이기 때문에 이것 저것 논의하다보면 판만 커지고 구현 완료를 못하게 됨
- 인프런 사례 참고
중요
가장 중요한 팁은, 웹 서비스를 하는 회사에서 몇년간 일해보는 것입니다.
SI, SM이 아니라 자사 서비스를 하는 곳에 가서 "제대로된 웹 서비스를 개발/운영하는 곳에선 어떻게 문제를 해결하고 어디까지 고려하는지" 경험해보는게 가장 좋습니다.
즉, 자신만의 서비스 출시를 목표로 하신다면 흔히 말하는 대기업 SI 보다는 네이버/라인/카카오/쿠팡/우아한형제들/푸드테크/야놀자/토스 등으로 취업 & 이직하시는게 좋습니다.
연봉이 대기업 SI보다 낮을수도 있지만, 웹 서비스 개발/운영 경험을 얻게 됩니다.
로그 관리, Exception 처리, 성능개선, 모니터링, 대규모 트래픽 처리 등은 이런 회사가 아니면 제대로 익히기 어렵습니다.
아직 취업 준비생이시라면 창업으로 개발자 커리어를 시작하시기 보다는 이런 회사로 취업하는걸 먼저 목표로 하는게 개발자로서 더 멀리 갈 수 있지 않을까 생각합니다.
후기
후아!
드디어 스프링부트로 시작하는 웹 서비스 시리즈가 끝났습니다!
12월부터 시작했는데 어느새 2월이 끝나가고 있습니다.
2016년에 이번처럼 시리즈로 IE 7,8에서 모던하게 JS 개발하기를 연재했습니다.
당시에 생각보다 너무 호응이 없어서 이번 시리즈도 그렇게 되지 않을까 걱정이 많았습니다.
특히 끝까지 마무리 할 수 없을까봐, 너무 잘못 알고 있을까봐 등의 부담도 있어서 시작하기 앞서 고민이 많았습니다.
초보개발자모임을 구현하면서 삽질을 너무 많이해서 "누가 전반적으로 짚어주는 자료를 만들어주지 않나" 라고 한숨쉬던 기억이 납니다.
저와 같이 고민하시는 분들이 있지 않을까 하는 마음을 계기삼아 시작할 수 있었습니다.
다행히 여기저기 많이 공유되기도 하고, 많은 분들이 댓글도 달아주시고, 좋은이야기도 해주셔서 하길 잘했다고 생각합니다.
작년 회고를 통해 다짐했던 1분기 목표를 하나씩 달성하고 있어 개인적으로는 굉장히 뿌듯한 마음으로 후기를 작성하고 있습니다.
이번주 주말에 있는 행사만 잘 마무리 되면 1분기 목표는 모두 달성하는거라 두근두근 합니다.
시리즈물을 하다보면 전체적인 큰 구조를 익히는데 도움이 되지만 회사 업무를 통해 얻은 내용들, 좀 더 깊숙한 내용들을 정리하는 시간이 없어 3월에는 좀 더 작은 범위로 한정해서 공부하고 정리할것 같습니다.
(미뤄둔 포스팅 주제들이 너무 많네요 ㅠㅠㅠ)
끝까지 봐주신 분들 정말 고맙습니다!
덕분에 마무리 할수 있었습니다.
앞으로도 좋은 주제, 도움이 되는 주제로 계속 기록하겠습니다.
감사합니다!
(마무리하면 가장 먼저 생각나는 꼭두각시 서커스의 마지막 표지로 마치겠습니다.)
'Spring' 카테고리의 다른 글
Gradle Multi Module에서 Spring Rest Docs 사용하기 (0) | 2018.05.10 |
---|---|
Spring Rest Docs를 Markdown으로 작성하기 (0) | 2018.04.26 |
10) 스프링부트로 웹 서비스 출시하기 - 10. 1인 개발 시작시 알았으면 좋았을 것들 (18) | 2018.02.19 |
9) 스프링부트로 웹 서비스 출시하기 - 9. 도메인구매, HTTPS 연결, 타임존 수정 (0) | 2018.02.17 |
8) 스프링부트로 웹 서비스 출시하기 - 8. 운영 환경 설정 (2) | 2018.02.08 |
7) 스프링부트로 웹 서비스 출시하기 - 7. Nginx를 활용한 무중단 배포 구축하기 (11) | 2018.02.02 |
좋은 자료 이렇게 만들어 주셔서 감사합니다!
고생하셨습니다.!
답글
현우야 고마워!! ㅋㅋㅋ 덕분에 힘이 난다!
깔끔하게 정리해주신 덕분에 정주행하며 완주할 수 있었습니다. 좋은 글 감사합니다.
이번 KCD2018의 발표자로 참여하시나요?
답글
넵넵! 발표자로 참석했습니다^^;
이번 시리즈 처음부터 매우 재미있게 잘 봤습니다. 너무나 훌륭한 내용이고 앞으로도 두고두고 볼 것 같네요.
감사합니다~
답글
고맙습니다^^ 좋은 글 계속 올리도록 노력하겠습니다.
자주 방문 부탁드리겠습니다^^
매번 강의 잘 보고 있습니다. 지금까지 고생하였어요ㅎㅎ.
질문이 하나 있습니다!
혹시 이클립스에서 생성한 스프링부트 프로젝트를 GIT을 통해 인텔리J로 가져오려고 하는데,
실행이 안 되는데 왜 그런지 조그마한 힌트라도 얻을 수 있을까요?
Run/Debug configuration을 설정해줘야 하는지..project struecture에서 뭔가를 설정해줘야 하는지..
보통 인텔리j 자체적으로 프로젝트를 생성하면 run/debug congfiguration에 spring boot실행 아이콘이 있는데,
깃을 통해서 프로젝트를 가져오면 빈칸이고..어떻게 설정해야 되는지 모르겠어요 ㅜㅜㅜ
귀찮지 않으시다면 알려주시면 정말 감사하겠습니다.
답글
안드로이드의 경우긴하지만 예전
이클립스로 안드로이드 개발을 하다가 그 프로젝트의 내용을 그대로
안드로이드 스튜디오(Intellj)로 옮기기가 불가능했습니다.
아마 비슷하지 않을까 조심스레 예상해봅니다 ㅠ
그당시(2015년도 말쯤)
어쩔수 없이
이클립스 패키지들만 복사해서
Intellj로 옮겨서 작업했던 기억이 나네요
soulduse// 흑흑..정말 어떻게 해야할지.......모르겠네요.
이곳에 있는 이클립스프로젝트를 인텔리j로 import하는 방식대로 해도..계속 안 되네요..
뭔가 파일이 누락된걸수도 있는데, 프로젝트 깃헙 주소를 좀 알수있을까요?
비밀댓글입니다
답글
주말 잘 보내시고 댓글 남겨주셔서 항상 감사합니다.
오늘까지도 제대로 해결은 못했습니다..ㅎ
1. 현재 외부 tomcat으로는 실행은 되는데..뭔가 devtool 실행도 안 되고, 약간 반쪽으로 실행된다는 느낌입니다.
2. import시킬때 외부프로젝트로서 maven으로 임포트를 하면 정상적으로 spring boot앱이 실행이 됩니다.(외부톰캣을 따로 설정을 안 해줘도) 다만 white label error가 뜹니다. 이곳의 강의를 따라 항상 해왔는데 최근 협업을 하는 과정에서 이러한 문제가 생겨 너무나도 난감합니다..
답글
안녕하세요!
말씀주신대로 지금 받아서 실행해보니 해당 프로젝트가 잘 실행되어서요!
스프링부트 프로젝트로 실행했는데 잘 실행되었습니다.
제 생각에는 git에 올라간 프로젝트가 프로젝트 폴더까지 같이 올라가서 그런것 같습니다.
일반적으로 git에서 관리되는 프로젝트는 프로젝트 폴더까지 포함해서 올리진 않습니다.
현재 git 올라간 내용을 보면
Littleone
- src
- pom.xml
- mvnw
- 기타등등
Littleone 로 한번 감싸여진 상태입니다.
IntelliJ에서 바로 받아서 실행하려면 Littleone 프로젝트 없이
src
pom.xml
mvnw
기타등등
으로 되있어야 합니다.
(참고: https://github.com/jojoldu/translator)
현재 방식에서는 Source Tree로 프로젝트를 받고 IntelliJ로 실행해보시면 될것 같습니다.
창천향로 창천향로// 한 번 저도 해볼게요! 잠시만요1!
비밀댓글입니다
답글
whitelabel error page 가 떴으면 그때부터 git & IntelliJ의 문제는 아닌것 같습니다.
(해당 페이지는 보통 서버 코드 오류가 나서 500에러가 발생하면 나는거라서요
부트가 제대로 실행안됐으면 아에 페이지가 노출자체가 안됐을꺼라..)
부트가 실행은 됐지만 코드에서 화면을 못보여주는 코드상의 문제가 있어서 그런것 같습니다.
IntelliJ 콘솔창에 뜨는 오류 메세지를 보면서 해결하셔야할것 같아요!
로그에서는 어떤 에러가 없습니다.
white label error가 왜 뜨는 지 ..이놈이 정말 절 괴롭히네요.ㅠㅠ
그래도 시간내서 답글 내줘서 감사합니다!
넵 500에러는 이슈 원인이 워낙 많아서 IDE의 콘솔상 출력되는것에서 볼수밖에 없는데 그게 안되면 다 추측으로 잡는수밖에 없겠네요 ㅠ
혹시나 JSP가 문제일수도 있으니
@RestController 하나 생성해서 JSP 사용하지 않고 데이터만 출력하는 컨트롤러로 테스트 해보세요
거기서 데이터 잘 출력되면 JSP 문제고
거기서도 안되면 다른 원인을 찾아보셔야할것 같아욤!