-
[WIL]항해99 5주차 주특기 심화 회고록항해99[WIL] 2021. 12. 5. 18:20
weekend I Learned
5주차 주특기 심화 주차 (11 . 29 월 ~ 12. 4 토 )
목차
- 주특기 심화 주차 개인 과제
- Middleware
- Jest
- 5주차 소감 및 부족한 점
1. 주특기 심화 주차 개인 과제
이번 주는 주특기 심화 주차 개인 과제를 테스트 코드를 작성하는 과제를 진행했다. Javascript Class와 객체에 대한 개념만 알면 풀 수 있는 문제였다.
과제를 봤을 때 어떻게 하지 하다가 우선 Class와 객체에 대한 개념을 배우기 위해서 공부를 했지만 기초가 무너진 느낌이라서 Javascript기초를 아예 처음부터 공부를 했다. 과제 제출일이 토요일 이었지만 기초를 알아야 과제를 할 수 있을 것 같다는 생각이 들어서 기초를 공부했다.
금요일에는 무조건 과제를 시작해야겠다고 생각을 하고 월요일부터 금요일 오전까지 진짜 잠을 줄여가면서 기초를 다졌던 것 같다.
공부를 다 하고 과제를 시작하는데 Class와 객체에 대한 개념을 알고 있으니까 어떻게 코드를 짜야할지 눈에 보였다. 예상치 못하게 4시간 안에 과제를 다했다.
테스트를 해보니까 다 PASS여서 당황해서 팀원들끼리 코드를 공유했는데 이렇게 해도 되는건가라는 의심이 공유해보니까 다들 비슷해서 아 이렇게 하는 거구나 하고 과제 제출을 했다.
주특기 심화 주차 개인 과제
https://github.com/kwak9898/abstract-site.git
2. Middleware
Middleware란
- 미들웨어 함수는 req(요청) 객체, res(응답) 객체, 그리고 어플리케이션 요청-응답 사이클 도중 그 다음의 미들웨어 함수에 대한 엑세스 권한을 갖는 함수이다.
- 간단하게 클라이언트에게 요청이 오면 그 요청을 보내기 위해서 응답하려고 하는 중간(미들)에 목적에 맞게 처리를 해주는 거쳐가는 함수들이다.
- 미들웨어 함수에 대한 엑세스는 next 함수를 이용해서 다음 미들웨어로 현재 요청을 넘길 수 있다.
- next 함수를 통해서 middleware는 순차적으로 처리가 되므로, 순서가 중요하다.
HTTP 메서드
미들웨어가 작동할 path
미들웨어 함수
다음 미들웨어로의 액세스 함수
HTTP response 객체
HTTP request 객체
Middleware 특징
- 모든 코드를 실행할 수 있다.
- 미들웨어가 순차적으로 실행이 되므로 순서가 중요하다.
- res(응답), req(요청) 객체를 변경을 할 수 있다.
- 요청-응답 주기를 종료(res methods)는 res method를 이용해서 클라이언트에게 응답을 전송한다는 의미이다.
Middleware 유형
expresss는 여러 유형의 Middleware가 있다.
- 어플리케이션 레벨 미들웨어
- 라우터 레벨 미들웨어
- 오류 처리 미들웨어
- 써드파티 미들웨어
- 어플리케이션 레벨 미들웨어
app.method() 함수(.get .use 등) 를 이용해서 app object의 인스턴스에 바인드를 시킨다.
미들웨어를 어플리케이션 영역에서 지정한 path대로 처리 가능하게 하도록 한다.
const app = express(); app.use("/", function (req, res, next) { console.log(req); next(); }); app.get("/", (req, res) { res.send('hello!!') }); app.listen(3000);
이 예시코드를 보면 중간에 app.use라는 미들웨어를 쓰겠다고 하는 부분이다.
이 코드는 어떤 요청이 들어오더라도 console에 req라는 로그를 찍고나서 순차적으로 실행이된다.
- 라우터 레벨 미들웨어
- express.Router() 인스턴스에 바인드 된다는 점을 제외하면 어플리케이션 레벨 미들웨어와 동일한 방식으로 작동이 된다.
- Router객체를 이용해 router.use() 및 router.Method()함수를 사용해서 라우터 레벨 미들웨어를 가지고 올 수 있다.
- Router 객체는 그 자체가 미들웨어처럼 움직이므로 app.use()의 인수로 사용이 될 수 있고, 다른 router의 use() method에서 사용될 수 있다.
- const router = express.Router()로 router객체를 생성한 후 app.use()를 통해 지정해줘여만 사용할 수 있다.
- app.use()에서 지정한 경로와 같은 것이 들어오면 모두 적용을 시키기 때문에 중복이 될 수 있다.
- router를 사용하는 이유는 특정 root url을 기점으로 기능이나 로직별로 라우팅을 나눠서 관리를 할 수 있다.
- 서드 파티 미들웨어
- 기능적으로 express app에 미들웨를 추가하기 위해서 서드 파티 미들웨어 사용을 권고한다.
- node.js 모듈을 사용하고 싶으면 어플리케이션 레벨이나 라우터 레벨을 가져와서 사용하면 된다.
- npm에서 설치를 할 수 있다.
3. Jest
1. Jest란?
Node 환경에서 주로 사용이 되는 테스트용 종합 프레임워크다. 프론트엔드와 백엔드 환경에서도 활용할 수 있다. Jest는 페이스북에서 만든 테스트 패키지이다.
2. Jest 이용 방법
(1) Jest 모듈 설치
npm init npm i jest -D
위와 같이 터미널 창에 코드들을 하나씩 작성 후 Jest를 설치 해준다.
(2) package.json 파일 수정하기
{ ... "scripts": { "test": "echo \\"Error: no test specified\\" && exit 1" }, ... }
"scripts": { "start": "nodemon server", "test": "jest",
package.json에 "scripts"안에 "test"를 "jest"로 바꿔준다. 바꿔줘야만 jest를 사용해서 테스트 코드를 진행할 수 있다.
(3) 테스트 할 간단한 함수 만들어보기
// validation.js module.exports = { isEmail: (value) => { const email = value || ""; const [localPart, domain, ...etc] = email.split("@"); if (!localPart || !domain || etc.length) { return false; } else if (email.includes(" ")) { return false; } else if (email[0] === "-") { return false; } else if (!/^[a-z0-9+_-]+$/gi.test(localPart)) { return false; } else if (!/^[a-z0-9.-]+$/gi.test(domain)) { return false; } return true; }, };
(4) Jest로 간단한 단위 테스트 코드 작성해보기
일반적인 관례로 "테스트할파일이름.spec.js"와 같은 파일 형식으로 파일을 만든다. 그 이유는 Jest가 "테스트할파일이름.spec.js"와 같은 파일을 읽어서 테스트 코드를 실행하는게 기본 설정이기도 한다.
Jest가 테스팅을 위해 기본적으로 제공하는 함수들이 있다.
- test() : 단위 테스트를 묶어주는 함수다.
- expect() : 특정 값이 정상적인지 확인하기 위한 표현식을 작성할수 있게 해주는 함수다.
// 코드 예시 const { isEmail } = require("./validation"); test('입력한 이메일 주소에는 "@" 문자가 1개만 있어야 이메일 형식이다.', () => { expect(isEmail("my-email@domain.com")).toEqual(true); // 1개만 있는 상황 expect(isEmail("my-email@@@@domain.com")).toEqual(false); // 여러개 있는 상황 expect(isEmail("my-emaildomain.com")).toEqual(false); // 하나도 없는 상황 }); test("입력한 이메일 주소에 공백(스페이스)이 존재하면 이메일 형식이 아니다.", () => { expect(isEmail("myemail@domain.com")).toEqual(true); expect(isEmail("my email@domain.com")).toEqual(false); }); test("입력한 이메일 주소 맨 앞에 하이픈(-)이 있으면 이메일 형식이 아니다.", () => { expect(isEmail("e-m-a-i-l@domain.com")).toEqual(true); expect(isEmail("-email@domain.com")).toEqual(false); }); test("입력한 이메일 주소중, 로컬 파트(골뱅이 기준 앞부분)에는 영문 대소문자와 숫자, 특수문자는 덧셈기호(+), 하이픈(-), 언더바(_) 3개 외에 다른 값이 존재하면 이메일 형식이 아니다.", () => { expect(isEmail('_good-Email+test99@domain.com')).toEqual(true); expect(isEmail('my$bad-Email9999@domain.com')).toEqual(false); }); test("입력한 이메일 주소중, 도메인(골뱅이 기준 뒷부분)에는 영문 대소문자와 숫자, 하이픈(-) 외에 다른 값이 존재하면 이메일 형식이 아니다.", () => { expect(isEmail('my-email@my-Domain99.com')).toEqual(true); expect(isEmail('my-email@my_Domain99.com')).toEqual(false); expect(isEmail('my-email@my$Domain99.com')).toEqual(false); });
위와 같은 예시를 저장 후에 npm test 명령어를 실행했을 때
위와 같이 PASS를 했다면 정상적인 테스트 코드를 진행한 것으로 볼 수 있다.
하지만 만약에 모든 코드가 성공을 한다면 작성한 테스트 코드에 빈틈이 많으며, 자신의 코드의 결함을 찾지 못하는 테스트 코드를 작성한거다.
4. 5주차 소감 및 부족한 점
소감
주특기 심화 주차인 5주차를 끝으로 주특기 커리큘럼이 끝났다. 3주동안 진행된 주특기 커리큘럼이 도움이 됐다하면 도움이 됐지만 한편으로는 아쉬움이 컸다.
개인 프로젝트에서 더 잘 만들 수 있을 것 같았는데 원하는대로 못 나온 것 같아서 아쉬운 마음이 있던 것 같다. 하지만 한달이 조금 지나서 이정도로 만들어서 원하는 요구사항을 해냈다는 거에 의의를 두고 시간이 될때 한번 더 만들어서 퀄리티를 높여가는 연습을 해봐야 할 것 같다.
3주동안 잠을 줄여가면서 열심히 했던것을 보면 내가 선택한 Node.js에 흥미를 느끼는 것 같다. 이제 다음주 부터는 프론트엔드와 협업을 통한 미니 프로젝트2와 클론코딩 그리고 실전프로젝트가 있다.
기대도 되지만 걱정이 있는게 잘 못해서 팀에 민폐를 끼칠 것 같다는 생각이 들지만 1주차때 아무 것도 몰랐을때 미니 프로젝트를 만들었던 기억을 되짚어보면 그때와 같이 해낼 수 있다는 생각이 든다.
이제 3개의 커리큘럼이 남았는데 별 탈없이 잘 해내서 수료하는 날까지 최선을 다 해보려고 한다.
부족한 점
너무 아쉬웠던 점은 언어 기초에 대해서 아쉬웠던 것 같다. 하지만 그 부분을 캐치해서 기초를 공부해서 기초를 닦고 다음 주 부터 있을 미니프로젝트2를 들어가기 전에 기초 공부를 할 수 있었던 것에 대해서 좋았던 것 같다.
이번주 처럼 부족한게 있다면 바로 인지해서 부족한 점을 채우려고 노력을 하는 모습을 잃지 않고 계속해서 내 것으로 만들어내면 뭐든지 해낼 수 있을 것 같은 느낌이든다.
'항해99[WIL]' 카테고리의 다른 글
[WIL]항해99 6주차 주특기 미니 프로젝트 회고록 (0) 2021.12.12 [S.A] 항해99 미니 프로젝트2 S.A (0) 2021.12.06 [WIL]항해99 4주차 주특기 숙련 회고록 (0) 2021.11.29 [WIL]항해99 3주차 주특기 기본 회고록 (0) 2021.11.21 [WIL]항해99 2주차 알고리즘 코딩테스트 회고록 (0) 2021.11.14