코드를 짜는 것부터 어떤 일을 할때 항상 생각해볼 지점인 것 같다. 어떤 일을 지시 혹은 한다고 가정하였을 때 그 일의 우선순위를 정하고 그 역할을 분해하여서 좀 더 빨리 할 수 있는 작업으로 나누거나 연관성이 있는 일로 나누는 것을 생각하고 작업한다면 일의 효율은 매우 빠른 속도로 오르는 것을 알게 되었다.그 방식이 최근에 디자인 패턴을 만드는 기초 단계이자 OOP 의 핵심 컨셉이라는 것도 알게 되었다. factiory
위와 같은 객체 방식에서 사용하는 하나하나의 스타일 정의가 문제이고 이것을 외부에서 작업이 가능하도록 의존성을 부여하는 방식이 필요하다라는 점에 대한 공부가 좀 더 필요하다는 것을 느꼈다.
알고리즘에 대한 정확한 인식
이진트리를 예시로 든다고 하면 전위, 후위에 대한 정확한 파악 그리고 Doubly linked list(이중 연결 리스트) 와 같은 구조를 스스로 직접 만드는 방식도 완전히 머리에 추가하고 다시 한번 더 공부해야한다는 것을 알게 되었다. 또한 살짝만 알고 있었던 제네릭 알고리즘에 대해서도 코드를 보고 직접 만져보고 직접 쳐보고 경험해봐야 할 것 같다.
최근에 몇년차 개발자라고 해서 나도 모르게 으쓱한 부분이 있었다고 생각한다. 사실 아는게 아무 것도 없는 사람인데..
뒤에서 출발한다는 것을 인정하자
나이도 있고 개발 경력도 있기는 하지만 사실 개발에서 크게 뛰어난 성과를 이뤄낸 것은 없다. 주도적으로 api를 써서 데이터를 스프레드 시트에 자동화하는 것과 같은 작은 성과정도야 있지만 그거야 회사에서 일하면 당연히 해야할 일이지 칭찬받을 일은 아니다. 다시 하나부터 차근차근 공부를 하고 컴퓨터의 기본 원리부터 알고리즘 그리고 현재 사용되는 라이브러리들의 현황 파악과 원리까지도 차근차근 공부해보자
개발자로서 다시 취업된다면 끊임없이 공부하자
지금도 공부하고 있지만 과거에 머리속에서 쓸데없는 것으로 낭비했던 시간을 상기하면서 많은 것을 공부해보자. 그리고 기초를 중시하자. 컴퓨터는 모는 것을 데이터로 변환할 수 있다. 그 부분을 잊지말자
기록으로서 자주 남기자
현재의 마음가짐도 곧 휘발될 수 있다. 이 당시 내가 가지고 있던 마음가짐을 리마인드하기 위해서 좀 더 많은 글을 써보자. 일기도 좋고 개발 이력도 좋고 안되면 깃에 commit 이라도 남겨두자. 개발할때는 정답이라고 생각하고 개발하지만 지금보면 말도 안되는 코드는 항상 존재한다. 마음가짐도 마찬가지이다.
전체적으로 부족함이 많았던 것이 사실이다. 초기에 브랜치 전략을 정리하지 못한 점, 컨플릭트도 자주 나왔었고 git 관련해서도 좀 더 섬세함이 필요한 것을 확인했다. 홀로 잘하는 것이 정답이 아니고 각자 아는 부분을 통합하고 그것을 전략화하는 것이 중요하다고 본다.
향후 코드
초기에 너무나도 빠른 시기에 개발한 측면이 있어서 코드가 이상하게 정리된 부분이 있어서 하나씩 정리중이다. 개별 react component안에서 비동기 api 호출을 자제하는 것은 기본이기에 최대한 axios는 리덕스에서 thunk 방식을 통해서 정리하여 dispatch 하는 방향으로 정리중이고 부분적으로 알아보기 힘든 부분이 너무 많기에 typescript로 마이그레이션도 실행중이다. 개별 api에서 받아오는 데이터를 좀 더 불변적으로 정리하여 error를 미연에 방지하고 cypress 를 통해서 e2e 테스트를 하면서 기초적인 앱이라는 것에 필수적인 것을 체크하고 있다.
그렇다고 해도 완성이란 없다
코드에 완성은 존재하지 않는다. 이 프로젝트를 가능한 최대로 리펙토링 하면서 공부를 해보려고 한다. 방식은 틀릴지도 모르지만 접근 자체는 나쁘지않다고 생각한다.
추가 1
이후 typescript 로 마이그레이션 작업을 하였으며 , 그 뒤에 코드의 중복이나 네이밍이 이상하다고 생각하는 부분을 전체적으로 수정하였다. 물론 전부 수정은 못 하였지만 공부에 많은 도움이 되었다고 생각한다. -2022.12.03
추가 2
2023년이 되어서 다시 살펴 본 결과 이 사이트를 유지 보수 한다는 것은 매우 힘들다는 것을 깨달아서 초기 개발 시기에 설계가 얼마나 더욱 중요한지 깨닫게 되었다. 11월말부터 작업한 monorepo 작업은 매우 흥미 있는 작업이었지만 yarn breey 로 맞춰서 작업하는 것도 다른 의미로서 공수가 필요하다라는 것을 알게 되었으며 , 어떤 ui 를 공용으로 쓸지 어떤 라이브러리를 공통으로 쓸지에 대해서도 경험이 부족해서 좀 더 배워야겠다는 생각이 들었다. -2022.01.01
const localData:Person=function(name:string,age:number){ console.log(`hello my name is ${name}`); }
위에서의 코드에서 문제는 무엇일까? name:string,age:number라는 곳에서 문제를 찾아볼 수 있다. localData는 결국 Person이라는 interface를 참조하였고 그 방식으로 실행하는 것인데 interface에서 age:number의 방식은 옵셔널 프로퍼티 방식이다. 값이 다르니 결국 실행되지 않으며 위와 같은 방식으로 문제를 접근한다면 좀 더 구조가 잘짜여진 코드를 만들 수 있을까 하는 생각이 든다.
2. Readonly Interface
Readonly라는 특성은 간단하다. 값은 지정가능하지만 그 값을 변경하지 못하도록 설정하는 것이다.
1 2 3 4 5 6 7
interface Person{ name:string; age?:number; Readonly id:number } //id 값은 변경불가능
const kim2:User={ id:1, name:"kim gi tae",age:33,skills:["game","painting"] }
한사람의 데이터를 정의할때 위와 같은 User interface를 지정하고 그 데이터에서 반드시 필요한 id,name,age는 정의하지만 다른 데이터는 정의할 필요가 없다. 그것이 Optional property 이다.
2번 Optional property는 필요한 값을 자신이 편하게 만들수 있다는 의미의 Optional property라고 할 수 있다. 사용예시 같은 경우는 위의 예시와 같이 그 데이터에서 필요한 skills과 같은 값을 지정하고 내부 값은 string으로 지정하겠다라는 옵션적인 선언 방식이다.
void라는 방식으로 지정한다면 값을 return 하지 않고 실행만하는 방식으로 지정한다는 뜻이다. 위의 예시의 kim 변수와 같이 말이다. 재미있는 건 getData()의 내부 값에서 this의 값도 interface로 지정이 가능하다는 것이다. getData(this:User)라고 지정하는 것으로 this는 User의 규칙을 맞춰서 쓰는 것이 가능해진다라는 것이다.
3. class implements interface
아까전 만들어둔 interface를 통해서 class를 만들수도 있다. implements라는 방식을 통해서 만드는 것인데 매우 간단하게 class 생성이 가능해진다.
간단하게 우리가 웹이란 곳을 이용해서 일을 한다는 시점에 웹에서 일어나는 문제중 중요한 지점 즉 트래픽의 중요성을 정리해보았다.
트래픽(traffic)
서버에 사람이 많아지면 traffic 높아지고 그 결과로 server의 과부하로 인해 server컴퓨터가 죽어버린다. 그렇기에 우리는 항시 traffic을 파악하고 모니터링 할 수 있어야한다.
가장 기초적인 모니터링은 서버 가용성의 파악이다
서버 가용성
기초적인 단계로 실험해볼 수 있는 개인용 서버로서 보통 vercel이나 aws를 통해 서버를 만드는데 그 경우 프론트엔드도 바로 서버의 가용성을 체크하는 것은 문제없이 가능하다. traffic은 서버의 사람의 유동성만의 문제는 아니다. js를 어떻게 사용하는지 혹은 이미지 파일을 어떤 방식으로 쓰냐에 따라서 트래픽을 급격하게 낮출수도 있으며 그것이 프론트엔드 기술의 핵심이라고 할 수 있다. DB와 API를 어떤 방식으로 쓰는지 정도도 프론트엔드가 파악할 일중 하나일 수 있다. DB 서버가 죽었는지 안죽었지정도도 프론트엔드가 파악해야 일을 원활하게 할 수 있다.
서버 가용성과 같은 문제를 공부하기 위한 방법
직접 rest api 서버와 aws서버를 하나 만들어두고 테스트를 해보려고 생각중이다. 현재 aws에 db서버는 완성되어있으며 rest api 서버는 간단하게 nextjs를 통해서 만들어보려고 준비중이다.
요즘 정신이 없어서 블로그 작성을 좀 미뤘는데 간단하게나마 미니프로젝트 소회를 정리해보려고 한다.
배운것
변수명의 중요성 (못한점)
변수명의 중요성 : 팀프로젝트로 시작해서 어느정도 작업이 시작되고 나서 서로간의 규칙을 지정하지않은 것이 결국 중반이 가니 조금씩 문제가 되었다. 어떤 것을 지칭하는지 잘 알수 없는 변수명이 계속 RP되고 서로간도 알아볼 수 없는 파일 하나씩 생기는 것을 직접적으로 경험하게 되었다. 그렇기에 다시 한번 팀원분들께 변수명을 같이 정리해보자고 이야기를 하게 되었다.
폴더 구분의 중요성 (잘한점)
전체적으로 기능부분과 redux 부분 그리고 view 로 관리를 시작했는데 생각보다 이렇게 나누는 것이 중요한 것을 다시한번 배웠다. 기본적인 MVC구조라고 생각하고 관리하니 다른 팀원도 크게 불편함이 없었다.
상태관리의 어려움
데이터 흐름을 단방향으로 흐르게 하는 상태관리 툴 redux를 사용하긴 했지만 그 관리 방식을 크게 다뤄보지 못해 어려 시행착오가 많았다. 순서와 병합 useSelecter 의 데이터 관리 방식 등 좀 더 공부할 점이 많다는 것을 배운 미니 프로젝트가 아니었나 생각해본다.