현수네 반은 오늘 회장선거를 합니다. 현수네 반 N명의 학생은 각자 자기가 좋아하는 학생을 회장후보로 추천합니다. 한 학생이 여러명을 추천할 수 있습니다. 추천횟수가 k번 이상인 학생들만 회장선거에 출마할 수 있습니다. 회장선거에 출마한 학생들 은 자기를 추천해준 학생들에게 감사의 이메일을 보내기로 했습니다. 매개변수 votes에 추천정보가 주어지면 0번 학생부터 N-1번 학생까지 각 학생이 감사이메일 을 받는 횟수를 알아내는 프로그램을 작성하세요
Access-Control-Allow-Origin을 통해 CORS 문제를 방지하였고 sql문을 통해서 전체적인 내용이 나오도록 처리하였다. 혹시 id를 개별로 GET방식으로 쿼리를 날렸을때는 따로 볼수있도록 처리해보았다. laravel 이 되었다면 이런 하나하나 짤 필요도 없을것은 엄청 고생해서 설정하게 되었다.
remote ssh 사용을 통해 좀더 원할하게 서버 접근가능하게 하기
vscode 확장기능을 통해서 설치하였고 설정방식은 윈도우라면 ctrl+shift+p를 하고 remote ssh의 내용을 체크한뒤 비밀키 장소를 설정하고 도메인주소를 입력하면 성공적으로 동작할 것이다.
생각보다 너무 오래 걸려서 좀 더 쉽게 api 서버를 만들 방법을 찾는중
생각보다 aws 람다식과 게이트웨이 방식으로 쉽게 만들수 있다는 이야기가 있어서 현재 공부중인데 이것보다 엄청 간단한것같다. 다 만들어진다면 한번 블로그에 정리할 예정이다.
그 외 여러가지 문제 생긴 것 공유
npm은 여전히 동작하지 않는다. 아직도 이유를 모르겠다
curl 도 동작하지 않는다 이것도 이유를 모르겠다. apt-get이 된다는건 보안상 문제는 아닌 것으로 생각되는데..
먼저 요구사항을 분석하고 설계 구현 테스트 라는 단계를 걸처셔 완성적인 사이트 혹은 앱이 개발된다. 그렇다면 요구사항의 분석이 일단 완벽하게 되었다고 가정해보자.
설계라는 것은 어떤 것을 설계해야 할 것인가
지금까지 경험해온 부분과 그리고 현재 정리를 해보려고 한다.
어떻게 테스트를 할 것인가? 유닛 테스트 그리고 단위 테스트와 Cypress 와 같은 tool로 테스트하는 것은 누구나 생각할 수 있지만 react 와 같은 경우 컴포넌트 단위에서 초기부터 어떤 테스트를 통과해야 할지는 정하는 것이 필요할 것으로 생각한다. 예를 들면 input html 이 존재한다면 모든 input은 여러가지 값을 넣어서 submit해도 아무런 error가 나지 않게 설계할 것을 처음부터 명시한다면 좋을 것으로 생각한다. 물론 테스트 중요사항은 요구사항에 따라 매우 크게 달라질수도 있다. 아래부분도 마찬가지이다.
어떻게 그리고 어디에 배포를 할것인가? aws를 통해서 배포를 할 것인지 혹은 작은 단위에서 배포를 통하여 vercel과 같은 사이트를 통해서 배포를 한다고 할때도 기본적인 준비사항이 필요하다. 그것을 공부할 필요도 있다.
tool은 어떤 것을 사용할 것인가 create-react-app 을 그대로 사용할 것인지 혹은 처음부터 하나하나 webpack 설정까지 하나로 할 것인지도 설계 단계에서 생각해낼 부분이다.
api와 데이터 파싱의 방식을 정하는 것
db를 사용한다면 어떤 db를 사용할것인지 그리고 api 라면 그 api의 구조를 개발인원끼리 파악하는 것이 중요하다. 이미지 처리는 어떻게 할 것이며, 영상이 있다면 또 어떻게 처리할지도 고민해볼 사항이라고 생각한다.
요구사항이 중간에 변경되었을때를 대비하는 것
실제 자주 있는 일이기에 요구사항이 변경될 수도 있다는 것을 대비하며 설계를 준비하는 것도 필요할 것으로 생각한다.
아직 익숙치 않은 javascript 방식중에서 reduce는 아직 제대로 써보지않아서 연습중이다. 연습한 내용을 한번 적어보면서 복습을 해보자
1 2 3 4 5 6 7 8 9 10
functionsolution(arr){ var sum = arr.reduce(function (prev, cur) { return prev + cur; },0);
return sum } solution([5, 3, 7, 2, 3]) // 최종 합 20 출력
prev는 누산기로서의 역할을 하며 그전값을 대신해주기도 한다. cur은 현재 값이라서 실행 순서는 prev=0 + cur= 5 => prev=5 +cur =3 => prev=8+cur=7 => prev=15+cur=2=> prev=17+cur=3 라는 실행을 한번에 실행하여 결과값을 제시해주는 것이 reduce이다.
1 2 3 4 5
let arr = ["경기도", "수원시", "팔달구"]; let result = arr.reduceRight((acc, element) => acc + " " + element);
먼저 thunk란, 특정 작업을 나중에 하도록 미루기 위해서 함수형태로 감싼것을 칭합니다. 그것이 바로 미들웨어를 통하기때문이 아닐까 생각해본다
왜 redux-thunk 를 쓸까
redux의 기본 골격은 보면 순수함수로 이루어진 action.type으로 스위치문으로 판별뒤 값을 리턴하는 방식으로 진행됩니다. 그렇기에 어떤 액션을 통해 dispatch 함수를 실행시킬 경우 결과는 항상 return 값으로만 남기 때문에 비동기를 실행을 시켜버리는 것과 값을 가져오는 것은 큰 차이가 있기에 기본적으로 불가능하다. 그렇기에 아래와 같은 미들웨어를 만들어주고 그 뒤에 typeof action=== ‘function’ 이라는 구문을 추가해 함수를 파악하고 그 자체를 실행시켜주는 방식으로 하는 것이 필요해져서 store.dispatch를 이용하는 것이라고 할 수 있다.
img 파일을 불러올때 next config 에서 설정을 해주지 않으면 Invalid src prop 라는 에러가 생긴다. 이부분에서 좀 더 설정에 대해서 공부를 해보자 라는 생각이 들었다. 이부분을 해결하는 방식은 간단한데 유효하지 않은 src 라는 것이니 유효한 src라고 config 파일에서 선언해주면 된다는 것이다.
reactStrictMode 라는 것은 애플리케이션의 잠재적인 문제를 강조하기 위한 개발 모드 전용 기능이다. 수명 주기, 레거시 API 사용 및 기타 여러 기능을 식별하는 데 사용된다. 왠만하면 개발 공부중에는 써볼 예정이고 안쓸때와 쓸때의 다른 점을 좀 더 공부해보려고 한다.
swcMinify라는 부분도 조금 공부해봤는데 바벨과 비교해서 생각해보니 나중에 좀 더 깊게 공부할 내용이라 생각되었다. 일단 써보기로… 바벨보다 빠르다고 한다!
일반적인 reducer 함수이다. 이와 같은 함수를 redux에서는 매개변수로 받기에 값을 받지 않으면 undefined 가 나와 버린다. 예를 들어 ActionType.INCREASE: return { …state, count: state.count + 1 }; 이 아니고 setTimeout과 같은 함수를 리턴 해버리면 결국 값은 나오지 않는다. 순수함수이기 때문이다. 그렇기에 middleware를 reducer와 같이 받아서 createStore 와 같은 기초적인 redux 함수로 처리하는 것이 필요하다.
결국 웹사이트 혹은 웹에서의 상태는 매우 중요하다. 현재 사용자가 어떤 component를 다루는 것에 따라 최상단의 상태정보가 필요할 수도 있고 반대도 가능하다. 하지만 그렇다고 해서 props로 모든 정보를 끌어오는 것은 유지 보수 관점에서 따지면 최악일수 밖에 없다. 예를 들어 form component 에서 받은 정보를 최상단 app컴포넌트에서 가장 밑 딴인 data component에서 추가적으로 상태를 추가했을때 어디서부터 어디까지 수정이 필요할지 파악하기가 매우 힘들것을 예상할 수 있다.
그렇기에 최상단에서 필요한 정보만을 가져오고 또한 변경할 수 있는 수단이 현재 react에서 많이 사용하는 redux이다 강의에서 배운건 자바스크립트로도 쉽게 표현 가능하다. 김민태 강사님이 말해주는 방식이 매우 정리가 잘되서 여기도 올려서 한번 정리해보고자 한다.