그렇게 내 첫 웹앱이 단순히 localhost 에서만 그친 게 아니라 자체 도메인을 가진 하나의 웹 서비스로 완성되었다. 프로젝트에 참여하기 전에는 개발하고 배포하면 끝이라고 생각했지, 실 사용자들에게 내가 만든 것을 서비스해보는 건 상상조차도 하지 못했다. 그리고 운영을 하다보니 느낀 점은, 개발하다 삽질하는 건 사실 아무 것도 아니라는 점이다. 피해를 보는 ‘사용자’ 가 없기 때문에 수정하면 끝나지만, 운영 도중 에러가 발생한다면 사용자가 피해를 입는다. 운영을 하는 순간 내가 만든 서비스가 서비스하는 기간 동안 사용자에게 피해를 덜 끼치도록 책임져야 하는데, 왕초보 개발자인 나는 그 책임의 범위가 어디까지이고, 어떻게 져야 하는 지 몰랐다. 물론 아직도 운영 경험은 없다... 기회가 된다면 반드시 ..
전체 글
백엔드 개발자 | 프로젝트를 하며 겪은 일들을 기록합니다.당시 프론트엔드는 html 과 css를 다루는 것이라고만 알고 있어서 흥미가 없었다. 내심 ‘백엔드 개발자로 취직할건데 프론트엔드 알아서 뭐해’ 라는 마음도 있었다. 그래도 이미 프로젝트를 하기로 수락했으니 어떻게든 해내야 했다. 나는 보통 라이브러리나 프레임워크를 공부할 때 하나의 애플리케이션을 만들어보며 학습을 하는 편이다. 학습을 위한 토이 프로젝트 주제를 뭐로 할지 생각하다가, 어차피 서비스를 만드는 게 목적이니 이 서비스의 프로토타입을 만들기로 했다. 🖼️ 프론트엔드는 재밌다 프론트엔드 라이브러리로는 React.js를 선택했다. 특별히 다른 라이브러리보다 이점이 있어서라는 이유는 아니었고, 단순히 프로젝트와 비슷하게 생긴 애플리케이션을 만드는 강좌에서 React.js를 사용해서였다. 그때 본 내..
localhost 띄운 걸로도 기뻐하던 학부생 시절, 뭘 모르는 상태에서 개발을 하다 보니 참 많은 일들이 있었다. 그 중에서 기억에 남는 개발 이슈들을 꼽자면 DB에 데이터를 어떻게 그렇게 무식하게 넣었는지와 서버를 호스팅하기 위해 무료 서비스를 찾아 헤맨 일이다. 😱 DB에 데이터 '끔찍하게' 넣기 우리 프로젝트에 필요한 데이터는 OpenAPI로 제공되지 않아서 데이터팀이 직접 수집하고 프로젝트에 적합한지 아닌지 검수하고 그 내용을 정리했다. 개발자인 나는 데이터팀이 그 데이터를 어떻게 정리해줘야 개발을 할 수 있는지, 그러니까 데이터를 DB에 넣기 위해 엑셀에 어떤 양식으로 작성해주어야 하는지 말씀드려야 했다. 처음에는 완벽하게 만들고 싶어서 정규화할 수 있는 건 싹 정규화했다. 그러나 최종으로는 ..
운영 도중 인력 부족으로 아쉽게 동결 됐던 프로젝트가 다시 부활했다. 애정만으로 참여했던 프로젝트였고 그렇게 끝났던 게 아까워서 PM에게 당장 참여 의사를 밝혔다. 프로젝트 리부트 계획을 말하던 중 자연스레 프로젝트를 처음 시작했을 때의 이야기가 나왔다. 개발의 🐶 도 잘 몰랐던 내가 이제는 '그때 만든 프로젝트 지금 보면 개선할 점이 한두가지가 아니다' 고 말할 수 있을 정도로 꽤나 성장했다는 느낌이 들었다. 집에 돌아와서 대화를 곱씹다보니 문득 얼마나 성장했는지 지표가 없어서 단순히 느낌만으로 끝난 것이 아쉬워졌다. 그때의 경험을 기록으로 남겨놨다면 읽으면서 회고해볼 수 있었을텐데… 꽤 많이 늦었지만, 리부트에 참여하는 새로운 팀원들에게 내 이전 경험을 공유할 겸 지금이라도 이 글을 작성해본다. 💬 ..
코드 컨벤션은 읽기 용이하고 관리하기 쉽게 규정한 일관된 코드 스타일이다 깐깐한 규칙을 하나하나 따르다보면 오히려 시간을 더 잡아먹을 수도 있지만, 코드 가독성이 높아져 이후 읽기에도 편하고 특히 다른 개발자와 의사소통이 훨씬 수월해진다는 장점을 가진다. 이번에 새로운 사이드 프로젝트를 시작하기 전 코드 컨벤션을 정하고 가기로 했다. 유명한 구글의 자바 코드 컨벤션을 따를 생각이다. 구글에서 xml 파일을 제공해주고 있어 IDE 에 설정해두면 코드 정렬 단축키로 편하게 적용할 수 있다. 구글 코드 컨벤션 IDE에 적용하는 방법 구글 깃허브에서 자신이 사용하는 언어와 IDE 환경에 맞는 파일을 다운받는다. 나는 Java 와 IntelliJ 조합으로 intellij-java-google-style.xml 파..
Git 브랜치 전략이란 브랜치 전략이란 여러 명의 협업자가 Git의 브랜치를 사용해 하나의 공동 저장소를 효율적으로 사용하기 위한 전략이다. 브랜치 전략을 세우지 않고 개발하면 체계 없는 브랜치 생성과 병합 중구난방 흩어진 이슈와 커밋 그에 따른 협업의 어려움 의 문제가 발생할 수 있다. 대표적인 브랜치 전략들인 Git Flow 와 Github Flow 를 살펴보고자 한다. Git Flow Git Flow 는 브랜치를 크게 5가지 목적으로 나누어 개발한다. master 최종으로 배포되는 브랜치. 배포 후 버전 태그(v1.0, v1.1 등) 를 추가한다. release 배포하기 전 QA를 진행하는 브랜치. develop 브랜치에서 생성되고 QA에 통과하면 master 브랜치에 머지한다. 수정 사항이 있다면..
Concurrency Control, 병행제어 임계영역이란? 임계영역이란 프로세스가 공유자원에 동시에 접근하지 못하도록 한번에 하나의 프로세스만 이용하게끔 해주는 영역이다. 임계영역 보장 조건 임계영역을 보장해주기 위해서는 3가지 조건을 충족해야 한다. 1) Mutual exclution 하나의 프로세스가 임계영역에 진입시 다른 프로세스는 진입 불가 2) Progress 임계영역에 아무 프로세스가 없는 상태에서 들어가려는 프로세스가 여러개라면 어떤 프로세스가 먼저 들어갈지 결정해줘야 함. 3) Bounded waiting 다른 프로세스의 starvation 을 방지하기 위해 한번 임계영역에 들어간 프로세스는 다음번에 들어갈 때 제한을 둬야 함. Concurrency Control, 병행 제어 or 프로세..
등록/조회/수정 API 만들기 각 코드 상세 설명은 주석으로 달았다. 또 Entity 클래스와 Repository 클래스는 👉 Spring boot 에 Spring Data JPA 적용하기 에서 작성했다. DTO 만들기 DTO는 데이터를 View Layer 와 주고받을 때(request, response) 감싸는 객체이다. 외부에 노출되는 객체이므로 안에 비즈니스 로직을 담지 않는다. 여기서는 Entity 와 유사하나, 이렇게 View 와 주고받는 데이터들은 자주 수정이 일어난다. Entity 는 DB와 밀접한 객체고 비즈니스 로직도 담고 있으므로 자주 수정하게 되면 관련된 여러 클래스들에 영향을 끼치기 때문에 Entity 를 dto 용도로 쓰지 않는다. 즉, Entity 클래스와 Controller 에..