{{packageMeta.displayName}}의 로고

Express.js

ver 4.21.2 ∙ 2025.01.06 업데이트됨

개요

Express.js, Node.js를 위한 빠르고 개방적이며 간결한 웹 프레임워크. 자유롭게 활용할 수 있는 수많은 HTTP 유틸리티 메소드 및 미들웨어를 통해 쉽고 빠르게 강력한 API를 작성할 수 있음

관련 게시물

모두 보기

Node.js의 오래된 웹 프레임워크인 Express.js 저장소에 대량으로 스팸 PR이 등록되는 문제가 발생했습니다.


구독자가 486만명이나 있는 한 인기 유튜버가 GitHub에서 Pull Request로 기여하는 방법을 설명하면서 express.js 저장소를 대상으로 설명한게 발단이 되었습니다. 유튜버는 Express.js를 포크해서 사용했지만 시청자들이 아마 포크를 정확히 구분하지 못해서 이를 따라하는 과정에서 express.js 원 저장소에서 README를 수정하는 수십개의 Pull Request가 올라오게 되었고 메인테이너들은 이를 계속 닫느라고 한참동안 고생을 했습니다.


소프트웨어 엔지니어가 인기 직종이 되고 오픈소스 기여가 하나의 스팩처럼 되면서 오픈소스 생태계에 안좋은 영향을 주고 있다는 의견도 나오고 대부분의 사람은 오픈소스에 기여하지 말아야 한다는 이야기까지 나오고 있습니다.


오픈소스를 이해하고 기여하는 것이 중요하다고 생각하는 편이라 이런 사건이 벌어질 때마다 많은 생각이 교차합니다.


https://socket.dev/blog/express-js-spam-prs-commoditization-of-open-source

Express.js Spam PRs Incident Highlights the Commoditization of Open Source Contributions - Socket

Socket

Express.js Spam PRs Incident Highlights the Commoditization of Open Source Contributions - Socket

프론트 / 백엔드 / 모바일 개발 과외

안녕하세요, ​

현재 스타트업에서 풀스택 개발자로 재직중인 개발자입니다.

​입문개발자로서 실무개발을 희망하시는 분, 개발에 입문하고자 하시는 분등등

학교에서 교양과목으로 모바일, 웹, front/beck -end 두루 경험해보고 싶으신 분,

취미로 하시는분등등 각각에 환경에 맞춰서 과외해 드립니다. ^^

 

iOS 앱 개발 부터 웹 / 백엔드 등 자바 스프링 / 자바스크립트 기반의 프레임워크 (NodeJS, React, ReactNative 등등)강의도 가능합니다. 

​가능한 커리큘럼은 아래와 같구요. 보통 2달만에 원하시는 목표가 가능한 수준까지 맞춰 드립니다.

iOS - Basic Swift, RxSwift, Reactive Programming, Open Source …

React/ReactNative - Html/Css, Class/Functional Component, Typescript, Hooks(with Custom) …

Server - ExpressJS - TypeScript, NestJS, Java/Kotlin Spring

실무에 맞는 커리큘럼이고, 입문자들도 무난하게 들으실수 있을겁니다.

단기간에 빠르게 배우시길 원하시는 분이나 체계적으로 배우고 싶으신 분들에게 적합할듯 합니다.

참고로 찔러보기 하시는 분들 많으시는데.... 그러지 맙시다^^

​문의/관심 있으신 분은 메일로 연락 부탁드립니다. 참고로 유료입니다.


joke716@naver.com

Node.js 하는데 같은 오류가 계속 발생합니다. 도와주세요

```

const express = require('express');

const { MongoClient, ObjectId } = require('mongodb');

const app = express();


app.use(express.static(__dirname + '/public'));

app.set('view engine', 'ejs');

app.use(express.json());

app.use(express.urlencoded({ extended: true }));


let db;


MongoClient.connect('mongodb+srv://sikim0721:********@cluster0.tqbj5n0.mongodb.net/?retryWrites=true&w=majority', { useNewUrlParser: true, useUnifiedTopology: true })

.then(client => {

console.log('DB 연결 성공');

db = client.db('forum');

app.listen(8082, () => console.log('서버 리스닝 중'));

})

.catch(err => console.error('DB 연결 실패: ', err));


app.get('/news', (req, res) => {

const postData = { title: 'Node.js기초' };

db.collection('post').insertOne(postData, (err, result) => {

if (err) return res.status(500).send('데이터 삽입 오류');

console.log('데이터 삽입 성공: ', result.ops);

res.status(200).send('데이터 삽입 성공');

});

});


app.get('/list', async (요청, 응답) => {

let result = await db.collection('post').find().toArray();

응답.render('list.ejs', { 글목록: result });

});


app.get('/time', async (요청, 응답) => {

응답.render('time.ejs', { data: new Date() });

});


app.get('/write', async (요청, 응답) => {

응답.render('write.ejs');

});


app.post('/newpost', async (요청, 응답) => {

try {

console.log(요청.body);


const { title, content } = 요청.body;


if (title === '' && content === '') {

응답.send('제목과 내용을 입력하지 않았습니다.');

} else {

await db.collection('post').insertOne({ title, content });

응답.redirect('/list');

}

} catch (e) {

console.error(e);

응답.status(500).send('서버 에러 발생');

}

});


app.get('/detail/:id', async (요청, 응답) => {

try {

const postId = 요청.params.id;


// 숫자 형태의 ID를 ObjectId로 변환

const objectId = new ObjectId(postId);


const result = await db.collection('post').findOne({ _id: objectId });


if (!result) {

return 응답.status(404).send('게시물을 찾을 수 없습니다.');

}


응답.render('detail.ejs', { result: result });

} catch (err) {

console.error(err);

응답.status(500).send('서버 에러 발생');

}

});

```



BSONError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integer

at new ObjectId (/Users/SaintKim/Documents/NodeJs/node_modules/bson/lib/bson.cjs:2055:23)

at /Users/SaintKim/Documents/NodeJs/server.js:65:22

at Layer.handle [as handle_request] (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/layer.js:95:5)

at next (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/route.js:144:13)

at Route.dispatch (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/route.js:114:3)

at Layer.handle [as handle_request] (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/layer.js:95:5)

at /Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:284:15

at param (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:365:14)

at param (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:376:14)

at Function.process_params (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:421:3)

BSONError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integer

at new ObjectId (/Users/SaintKim/Documents/NodeJs/node_modules/bson/lib/bson.cjs:2055:23)

at /Users/SaintKim/Documents/NodeJs/server.js:65:22

at Layer.handle [as handle_request] (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/layer.js:95:5)

at next (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/route.js:144:13)

at Route.dispatch (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/route.js:114:3)

at Layer.handle [as handle_request] (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/layer.js:95:5)

at /Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:284:15

at param (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:365:14)

at param (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:376:14)

at Function.process_params (/Users/SaintKim/Documents/NodeJs/node_modules/express/lib/router/index.js:421:3)


아무리 수정을 많이 해도 결국엔 [nodemon] app crashed - waiting for file changes before starting... 오류와 서버 ObjectId오류가 나온다고만 반복합니다. node.js 기초에서 유저가 /detail/ 뒤에 글_id를 입력해서 get 요청을 보내면 detail.ejs 페이지를 보여주는건데 실행이 안됩니다.. 도와주세요ㅠㅠㅠ

사용자가 공유한 콘텐츠

-

사용자가 공유한 콘텐츠

관련 개발자 Q&A

모두 보기

Next.js SSR + react-query 조합에서의 serializing 에러

안녕하세요! Next.js SSR + react-query 조합을 사용하려고 하는데요, page 컴포넌트 내 getServerSideProps 함수에서 prefetching을 받아온 후에 serializing 에러가 발생합니다. (Next.js는 13버젼입니다.) 에러 내용은 다음과 같습니다. Error: Error serializing `.dehydratedState.queries[0].state.data.headers` returned from `getServerSideProps` in "/top". Reason: `object` ("[object AxiosHeaders]") cannot be serialized as JSON. Please only return JSON serializable data types. 해당 에러 내용으로 구글링을 해보니, 대부분 getServerSideProps 함수 반환 코드에서 return { props: { dehydratedState: JSON.parse(JSON.stringify(dehydrate(queryClient))), }, }; 와 같이 dehydrate(queryClient)값을 JSON화 -> Object화를 하라고 하는데요, 이와 같이 사용해도 또 다시 아래와 같은 에러가 납니다. TypeError: Converting circular structure to JSON --> starting at object with constructor 'ClientRequest' | property 'socket' -> object with constructor 'Socket' --- property '_httpMessage' closes the circle Backend API는 Express.js를 사용하고 있으며, res.status(200).json({ data: ~ })와 같은 방식으로 응답을 주고 있습니다. 어떻게 해결할 수 있을까요? 코드 첨부가 안되네요, 아래는 page 컴포넌트가 위치한 파일의 전체 코드입니다. import type { ReactElement } from 'react'; import { dehydrate, QueryClient, useQuery } from '@tanstack/react-query'; import { format } from 'date-fns'; import TopMusicContainer from '~containers/TopMusicContainer'; import Layout from '~layouts/Layout'; import type { NextPageWithLayout } from '~pages/_app'; import TopMusicService from '~services/topMusicService'; import * as MusicType from '~types/musicType'; export async function getServerSideProps() { const queryClient = new QueryClient(); await queryClient.prefetchQuery(['fetchTopMusic'], () => { const params: MusicType.ListRequestType = { filter: 'title', keyword: '', page: 1, limit: 25, time: format(new Date(), 'yyyyMMddHH'), }; return TopMusicService.list(params); }); return { props: { dehydratedState: JSON.parse(JSON.stringify(dehydrate(queryClient))), }, }; } const Top: NextPageWithLayout = (): JSX.Element => { const { data, isLoading } = useQuery({ queryKey: ['fetchTopMusic'], queryFn: () => { const params: MusicType.ListRequestType = { filter: 'title', keyword: '', page: 1, limit: 25, time: format(new Date(), 'yyyyMMddHH'), }; return TopMusicService.list(params); }, }); return ( <section> <TopMusicContainer /> </section> ); }; Top.getLayout = function getLayout(page: ReactElement) { return <Layout>{page}</Layout>; }; export default Top;

안녕하세요. Axios response를 그대로 사용하시면 함수 등 JSON으로 변환이 불가능한 것들이 포함되어 있어서 axios response에서 data만 추출해야 하는 것으로 알고 있는데요. 혹시 TopMusicService.list(params); 의 리턴 타입이 어떻게 되나요? 참고한 SO 포스트: - https://stackoverflow.com/questions/67204170/getserversideprops-functions-response-cannot-be-serialized-as-json-in-next-js

Java Spring vs Node.js

안녕하세요 서울 수도권 대학교 3학년 재학중이며 내년 4학년 재학 이전 기업 인턴을 희망하고 있는 학생입니다. 최근 클라우드 네이티브에 관심이 생겨 관련 국비지원교육을 수료하고 CKA 자격증을 취득한 상태입니다. 또한 최종적으로는 백엔드 개발자가 아닌 클라우드 엔지니어로 커리어의 목표로 설정하고자 합니다. 더 정확하게는 백엔드 개발자로 시니어 개발 경험을 쌓고 MSA를 이해하고 최종적으로는 SE, 클라우드 엔지니어 분야로 경험을 쌓고 싶습니다. 또한 이러한 상황에서 내년 상반기 및 졸업 이후의 진로에 도움이 될 수 있도록, 이력서를 작성하고 미리 자기소개서를 작성하려고 합니다. 중학교 시절부터 컴퓨터에 관한 공부와 사이드 프로젝트로 여러 경험을 해오며 해당 글의 제목의 논제를 여러번 접하고 저 스스로도 많은 고민을 해온 상태입니다. 이전까지 군을 제외하고 3년동안 Express.js와 NoSQL을 위주로 다양한 초기 창업 팀에서 여러 종류의 프로젝트들을 진행해왔으며 FE, AI Serving 서버의 경우 ChatGPT를 활용한다면 초보적인 수준으로 개발이 가능합니다. 하지만 곧 취업 시장에 뛰어들 시기가 되니 많이 부족한 스스로보다는 여러 개발자 선배님들의 의견을 여쭈어보고자 해당 글을 작성하게 되었습니다. Java Spring에 대해 현재 제가 접한 정보는 다음과 같습니다 - 기존의 시스템을 변경하기 어려운 (중견기업 이상, 금융권) 등의 기업에서는 기존 Java Spring을 활용하는 것이 유리하며, 개발자에 대한 수요도 더 높다 - 대규모 시스템을 관리하고 개발하기 적합하다 - 규모가 큰 기업의 시스템은 다른 프레임워크로 변경되기 어렵다 Node.js에 대해 현재 제가 접한 정보는 다음과 같습니다 - Nest.js와 Typescript로 Node.js 프레임워크들의 문제를 해결했지만 아직 안정성이 떨어지며 개발자가 별도로 Spring에서의 기능들을 구현해야 한다 - MSA 형태의 서비스를 개발하는 기업에서는 Node.js 프레임워크에 대한 수요가 높다 - 스타트업과 같이 신사업을 Agile하게 개발하는 기업에서는 Node.js를 활용하는 것이 유리하다 하지만 커뮤니티 (검증되지 않았습니다) 등의 의견으로는 '이름있는 기업을 목표로 한다면 Node.js를 커리어의 시작으로 가져간다면 불리하다', 'Java Spring은 대기업, Node.js는 스타트업'과 같은 의견이 많아 프레임워크와 언어는 도구일 뿐이지만 더 효율적인 도구를 선택하고자 하는 마음에 아래와 같은 질문을 드리고자 합니다. 1. 현재 공고를 조사해봤을 때 Java Spring보다는 적지만 인지도가 높은 곳과 비교적 낮은 곳의 Node.js (Express.js, Nest.js)의 인턴 공고가 존재했습니다. 추후 커리어를 위해 꼭 중견기업 이상이 아니더라도 해당 기업에서 활동하는 것이 좋을까요? 2. Node.js를 선호하는 이유는 '시간', '취향'입니다. Node.js관련 경험들이 비교적 많으며 (+스크립트형 언어) 코드 스타일이 Java에 비해서 저와 더 잘 맞는다고 느꼈습니다. 또한 새로운 프레임워크를 배우고 적용하는데의 시간이 부족하다는 생각이 듭니다. 해당 이유들이 현 취업시장에서 Java Spring을 선택하지 않는 이유가 되기에는 비합리적일까요? 3. 개인적으로 어떠한 서비스를 개발하는데에 있어 처음부터 제작하고 배포까지 경험해보고자 합니다. 따라서 스스로 스타트업, 혹은 중견기업 이상의 신사업 팀이 더 맞는다고 생각하지만 연차가 쌓이며 저 스스로가 더 큰 시스템과 기업이 아니라 초기 스타트업에 머물게 될 것이라는 불안감이 존재합니다. 더 정확하게 말씀드리자면 더 좋은 기업으로의 이직 자체가 추후 불가능해질 수 있다는 불안감이 있습니다. 해당 부분에 대해서 어떻게 생각하시나요? 3. 앞으로의 Serverless, MSA의 관점에 대해서 어떻게 생각하시나요? 만약 최종적으로 클라우드 엔지니어를 희망한다면 Java Spring 혹은 Node.js 중 어떤 프레임워크가 더 트렌디해질 것이라고 생각하시나요? 4. 만약 Java Spring을 배우는 것이 더 전략적이라면 현재 진행하고 있는 스타트업 프로젝트의 서버를 Node.js에서 Spring으로 변경하는 것이 좋을까요? 물론 연차가 쌓이고 더 깊은 지식을 쌓아나가면 언어, 프레임워크 모두를 잘 다룰 수 있게 되겠지만 '한국에서 Node.js는 불리하다'는 의견을 계속 접하게 되니 불안감이 생겨 '신입 개발자로 어떤 역량을 가져야 할까'하는 고민으로 이 글을 작성하게 되었습니다. 부족한 점이 많지만 너그럽게 봐주시면 정말 감사하겠습니다. 소중한 시간 내주셔서 정말 감사합니다!

1. 좋습니다. 일해보세요. 2. 많은 분들이 보면 프레임워크 선택을 뭔가 엄청나게 중요한 것처럼 여기는거 같습니다. 중요도가 낮다할 수는 없으나 개발자 역량을 판가름 짓는 제 1의 잣대는 아니라고 생각합니다. 에초에 제대로된 개발자라면 프레임워크는 뭘 골라도 상관 없다고 생각합니다. 또한 제대로 학습할 의지가 있는 사람이라면 지금 모른다고 나중에도 모를 것이 아니기 때문에 비합리적인 선택이라고 볼 수 없습니다. 3. 더 처우가 좋은 곳 또는 높은 자리로 가고자 한다면 자기 직무를 떠나서 '비즈니스'에 대한 이해가 수반되어야 한다고 생각합니다. '난 개발자니까 개발만할거야' 마인드를 없앤다면 문제가 없을거라고 봅니다. 4. 트렌디라...트렌디는 잘 모르겠으나 서버리스나 MSA 환경으론 node 계열이 더 좋다고 봅니다. 5. 막상 안에 내용 까보면 그게 그거입니다. 굳이 바꾸지 마세요. 괜찮습니다. 노드 베이스에서 잘할 수 있다면 스프링 베이스에서도 좀만 공부하시면 잘 합니다.

프론트엔드 개발자를 지망하는 취준생인데 이력서에 뭐가 부족한 것일까요?

5월 19일에 국비 부트캠프를 수료한 후 현재까지 5개월 동안 구직 활동을 하고 있는 취준생입니다. 현재까지 100군데 넘게 스타트업, 중소, 중견, 대기업 가리지 않고 다 지원했는데 면접은 커녕 서류 통과가 되는 곳이 한 군데도 없습니다. 취업에 먼저 성공했던 동료 취준생과 디스코드의 개발자 커뮤니티를 통해 이력서를 수정하고 있는데 현재 맞게 진행되고 있는지 긴가민가 합니다. 그래서 여기 계시는 현직자 분들한테 피드백 요청드리고자 합니다. 가감없는 솔직한 평가 부탁 드리겠습니다. 1. 이력서 제목: '이력서 | 안녕하세요, 정연준입니다!' -부족해도 멈추지 않는 개발자 -아는 것과 모르는 것을 구분할 줄 아는 개발자 2. 자기 소개: `안녕하세요, 신입 React 프론트엔드 개발자 정연준입니다. -시행 착오를 통해 성장해나갑니다. -잘하는 것과 부족한 것을 구분하여 잘하는 것을 부각시키고, 부족한 것을 채울려고 노력하는 개발자가 될려고 합니다. -좋은 서비스와 더불어 사용자가 편하게 이용할 수 있는 서비스를 만드는 것을 목표로 하고 있습니다. ` 3. 개발 직무: 프론트엔드 개발자 4. 프로젝트: -기간: 2023.04.17 ~ 2023.05.19 -서비스 제목: One-Line -한 줄 요약: AI모델이 사용자가 작성한 게시글을 한 줄 요약 및 제목 생성 -프로젝트 종류: 팀 프로젝트 -역할: 프론트엔드 파트(메인 페이지 게시글 목록 전체 조회, 인증 페이지 구현) *메인페이지 게시글 목록 전체 조회 1) Trending 섹션 2) Recent Posts 섹션 *메인 헤더(Global Navigation 메뉴) *인증 페이지에 Firebase Authentication 기능 적용 5. 교육 이력: -기간: 2022.11.28 ~ 2023.05.19 -주관 기관: 엘리스 -교육 프로그램 이름: 엘리스 AI트랙 6기 -학습한 기술 스택: React, Express.js, MongoDB, HTML5, CSS3, JavaScript, GitLab, Python, MySQL, TensorFlow, Pandas, Node.js -세부 사항 *JavaScript 1) JavaScript 기초 2) 싱글 스레드, Event, Promise 개념 숙지 *React 1) React 기초 *Express.js 1) Express.js 기초 *MongoDB + Mongoose 1) DBMS 기초 2) MongoDB, Mongoose 기초 *데이터 분석 1) Python, SQL 기초 2) Pandas 기초 *인공지능 1) 데이터 과학 기초 2) 이미지 처리 기초 6. 링크 -프로젝트 링크: https://10team.vercel.app/ -프로젝트 시연 영상: https://drive.google.com/file/d/16Qni0swyC8HbAY2iqnEy5QWze9ianjln/view?usp=sharing -개인 블로그: https://chadolbaegi128.tistory.com/

안녕하세요! 여러 회사에 지원도 하고 피드백도 열심히 구하시는 것을 보아 많은 노력을 하고 계신 것 같은데, 좋은 결과가 없어서 많이 아쉬우실 것 같습니다. 개발자 취업 시장 자체가 얼어붙은 상태다보니 어려운 상황이다보니 요런 부분들은 어쩔 수가 없네요. 다만 제가 내용을 살펴보았을 때 더 나아질 수 있는 점이 보이긴 해서, 요청 주신 것처럼 따끔한(?) 피드백 드려보겠습니다. 아발란체 님께서 남겨주신 피드백과 저도 비슷하게 생각하는 부분이 많긴 합니다. 1. 우선 이력서 전반적으로 "왜"에 대한 내용이 없습니다. 구현한 내용과 선택한 기술에 대한 나열이 있을 뿐입니다. 이력서 내용에 적어주신 모든 문장 하나하나에 '왜?' 라는 꼬리 질문을 달아보면서 추가할 내용이 있는지 검토해보면 좋을 것 같습니다. 2. 프로젝트 개발 과정에서 문제 상황을 해결한 경험이 드러나 있지 않습니다. 기술적인 것일 수도 있고, 팀원들과 협업 하는 과정에서 분명히 문제가 있었을텐데 그것을 해결한 내용이 들어가야 좋을 것 같습니다. 3. 프로젝트 개수가 하나 뿐인 것은 조금 아쉽습니다. 면접관 입장에서는 이 사람을 불러놓고 질문할 내용이 별로 없어보입니다. 4. 프로젝트에 대한 코드 공개가 필요해보입니다. 링크와 시연 연상을 올려주신 것은 좋지만 면접관들이 더 궁금해하는 내용은 "이 사람이 코드를 어떤 스타일로 짜는가?" 이기 때문입니다. 깃허브에 코드를 공개할 수 있다면 올려주세요. 5. 이력서 제목과 자기소개 문구가 다소 추상적입니다. "부족해도 멈추지 않는", "시행 착오를 통해 성장하는" 과 같은 문구가 그 예시인데요. 이런 문구들은 사실 누구나 할 수 있는 당연한 이야기이기 때문입니다. 저런 문구를 쓰기 위해서는, 나머지 이력서 내용 등에서 그에 대한 근거가 뒷받침되어야 합니다. 그래서 저는 추상적인 문구는 한 두개 정도만 남기고, 나의 경험과 자신있는 부분을 드러내는 팩트 위주의 소개를 적는 것을 추천드립니다. 6. 지원한 직무와 연관 없는 기술 스택은 적지 않아도 될 것 같습니다. 다양한 직무를 경험했다는 것이 장점이 될 수도 있지만, 특정 직무에 지원하는 경우라면 전문성에 대한 의구심을 들게 만드는 행위라고 생각합니다. 7. 기술 스택 별 능숙도는 추상적인 것이라 적지 않아야 합니다. 면접관 입장에서는 "이 사람이 생각하는 기초는 뭐지?" 라고 생각이 듭니다. 면접관의 질문을 받고 자신있게 대답할 수 없는 기술 스택이라면 과감히 제외해야 합니다. 8. 이력서에 적어주신 프로젝트 내용은 너무 기초적인 것들이라 면접관 입장에서 기술적인 흥미가 가진 않는 것 같습니다. 추가적인 프로젝트를 하면서 다양한 도메인과 라이브러리를 써보시는 것을 추천합니다. 9. 여기에는 드러나있지 않지만 이력서의 레이아웃도 중요합니다. 글씨체가 너무 크거나 작지는 않은지, 여백이 적당히 있어서 읽기에 피로하지 않은지 등에 대해서도 신경 써야 합니다. 이렇게 해서 피드백을 드려봤는데요, 저도 취준생일 때 이력서에 대한 고민을 많이 해봤던 터라 질문자 님의 입장에 많은 공감이 됩니다. 저 같은 경우에는 지금까지의 경력을 바탕으로 최근에 자기소개 웹 페이지를 새로 만들었는데요, 요게 이력서 작성에 도움이 될까 해서 링크를 남겨봅니다. 화이팅이에요~ https://wormwlrm.github.io/resume/

대기업 신입 노드 개발자가 가능한가

안녕하세요. 저는 현재 신입 백엔드 개발자로 취업 준비 중입니다. 사용할 줄 아는 언어는 하나라도 제대로 하자는 마음으로 js/ts만 다뤄왔습니다. 사실 프론트를 먼저 접하고 백엔드의 필요성을 느껴 빠르게 백을 구축하기 위해 nodejs로 백을 시작하게 되었어서 지금까지도 nodejs를 메인으로 expressjs, nestjs 등으로 계속 공부를 하고 있네요. 하지만 휴학 기간 동안 취업 준비를 하기 위해 채용 공고들을 보고 있는데 이름있는 기업들은 거의 대부분 자바 개발자만 뽑더라구요.. 물론 부서마다 언어가 다르다고 하긴 하지만 대부분 자바 아니면 파이썬이 메인이고, 노드는 뒷순위에 경력자들만을 뽑더군요.. 무슨 신입이 처음부터 이름있는 기업에 가려하냐, 눈이 너무 높은거 아니냐 하고 생각하실 수 있지만 제 성격상 목표가 뚜렷해야 집중이 잘 되고, 생각보다 취준 기간이 넉넉하고 네카라쿠배 급 정도에서 요구하는 기술 스택들, 예를 들면 docker, ci/cd, redis, msa, message broker, DDD, TDD, serverless 등을 완벽히 까지는 아니더라도 충분히 시간을 들여 공부하고 이를 사용한 본격적인 프로젝트를 진행하기 전에 언어를 확실히 정하고 가고 싶어서 질문 드립니다. 아직 expressjs, nestjs도 제대로 이해하고 있는 것은 아니며 당연히 배워야할 점들이 수도 없이 많기에, 남은 1년의 기간 동안 노드쪽의 부족한 점을 채워야할지, 자바를 새롭게 배우고 충분히 공부하며 제대로 된 프로젝트를 진행해야 할지 고민입니다. 더불어, 현재 저의 역량을 확인하기 위해 풀스택으로 제대로 된 쇼핑몰을 혼자 전부 구현 및 배포를 하는 프러젝트가 진행 중에 있습니다. 만약 제가 자바를 공부하는 것이 맞다면 현재 진행하고 있는 프로젝트는 잠깐 중단하고, 자바를 충분히 공부한 후 이 프로젝트를 자바로 진행하는 것이 좋을지, 아니면 일단 현재 프로젝트는 완성하고 나중에 자바를 공부한 후 똑같이 만들어보는 것이 나을지 고민입니다. 후자가 맞는거 같지만서도 이 경우에는 시간이 너무 오래 걸릴 것 같아 질문드립니다.. 정리하자면, 배경: 취준 기간 1년이 있고 목표는 대기업 혹은 중견기업 신입이다. expressjs, nestjs를 다룰 줄 알고 현재까지 진행한 토이 프로젝트들을 봤을때 개인적으로 기본적인 부분들은 할 줄 알고 있다고 생각한다. 질문 1. 하지만, 아직 부족한 점이 많은데 남은 1년을 노드쪽을 더 파서 취업을 노릴지, 아니면 이제라도 자바를 공부해서 조금 더 유리하게 가야할지? 질문 2. 내 역량을 확인할 겸 제대로 된 프로젝트를 하고 싶어서 쇼핑몰 구현 중에 있다. 만약 제가 자바를 공부하는 것이 맞다면, 현재 이 프로젝트를 노드로 완성하고, 자바로 옮길지. 아니면, 일단 멈추고 자바를 공부한 후 자바로 처음부터 만들지. (프로젝트는 이제 막 초기 단계라 기본적인 기능만 구현 후 배포 전 ci/cd를 위해 테스트 코드 작성 중에 있습니다.) 충분한 고민을 해보고 질문을 드리는게 맞겠지만 대기업 혹은 중견기업 채용 공고에 노드 백엔드 개발자가 거의 없는걸 보니 조급해져서 이렇게 질문드립니다. 긴 글 읽어주셔서 감사드리고 답변 꼭 부틱드립니다...!

안녕하세요. 많은 기업에서 자바/스프링 계열의 기술 스택을 선호하는 이유가 오랜 기간 동안 안정적인 서비스 운영이 있어 왔고, 많은 개발자들을 거치면서 보편화된 아키텍처로 설계되어 있는 경우가 많고, 또한 꾸준한 업데이트가 이뤄져 버그 및 보안 이슈에도 잘 대응이 되며, 무엇보다 널리 알려진 기술 스택으로 인해 보다 많은 개발자 풀을 확보할 수 있다는 것에 그 장점이 있다고 생각합니다. 조직의 규모가 커질수록 안정적인 것을 추구하는 경향이 있습니다. 어떤 곳은 버전 업데이트도 아주 크리티컬 한 이슈가 없는 한 최대한 늦추기도 하죠. 그리고 모든 개발자가 같은 기술 스택을 사용하기도 합니다. 하지만 그 규모가 더 커지면 조직이 나뉘고, 각 조직별로 또 다른 개발 문화를 만들어 갑니다. 네카라쿠배 급 정도의 기업이 되면 전사적으로 어떤 일관화된 기술 스택을 모든 조직에 강제하기 어려워집니다. 따라서 채용공고를 잘 살펴보시면 조직에 따라 자바/스프링이 아닌 nodejs 기반의 웹어플리케이션 개발자를 뽑는 곳도 있습니다. 그러므로 본인의 강점을 최대한 살릴 수 있는 방향으로 전략을 세우시는 것도 하나의 방법입니다. 물론 상대적으로 다양한 기술 스택을 선호하는 스타트업도 선택지 중에 하나가 될 수도 있구요. 다만, 제가 추천드리고 싶은 것은 것은 보다 다양한 경험을 해 보시길 권장 드립니다. 1년이라는 시간은 상당히 긴 시간입니다. 기본적인 웹 어플리케이션을 구축하는데 있어서 자바/스프링은 한 두 달, 아니 몇 주, 이해가 빠르다면 몇 일 이내에도 가능한 기술 스택입니다. 그렇기에 많은 곳에서 채택해서 쓰는 이유이기도 하구요. 처음부터 깊게 들어가려고 하지 말고 가볍게 시작하고 전체적인 흐름을 이해하는 것이 중요합니다. 궁극적으로는 결국 자바/스프링이냐, nodejs 프로젝트냐가 중요한 것이 아니라, 언급하신 것처럼 쇼핑몰을 구현한다면, 이를 어떤 기술 스택으로든 구현하고, 관련된 도메인을 보다 심화적으로 접근하여 도메인을 이해하는 그 과정과 최종 배포, 그리고 일부 운영까지 쌓는 그 경험이 더 값질 것으로 생각합니다. 여유가 된다면 클론 코딩으로 다른 기술 스택으로도 구현해 보기도 하구요.

next.js 하고 express.js 로 웹앱 개발중인데

next.js 에서 express 쪽으로 request 날릴때 express 에서 csrf 검증을 통해서 요청을 검증하고 싶은데 csrf token 발급을 어떻게 해야할지 감이 잘 안와서요 next.js 에서 express로 csrf token 발급 request를 날려서 발급받은 csrf token을 쿠키에 저장하는 방법이 좋을까요?

next.js와 express.js를 사용한 웹앱 개발에서 CSRF 보호를 적용하기 위해 다음과 같은 절차를 따를 수 있습니다. 1. `csurf` 미들웨어 설치: express.js에서 CSRF 보호를 쉽게 구현할 수 있는 csurf 미들웨어를 사용할 수 있습니다. 이를 설치하려면 다음 명령을 실행하세요. npm install csurf 2. express.js 서버 설정: express.js 서버에서 csurf 미들웨어를 설정하고 쿠키에 CSRF 토큰을 저장하도록 설정해야 합니다. 다음 예제 코드를 참조하세요.

웹 백엔드) Bcrypt를 이용하여 암호화 시 비밀번호 검증

사용중인 라이브러리: Express.js bcrypt mongoose 현재 진행중인 사내 웹 프로젝트내에 게시판을 만들려고 하는데 DC인사이드 처럼 게시글마다 비밀번호를 설정하도록 기능구현을 한 상태입니다. 비밀번호는 bcrypt를 이용해서 암호화를 진행했고 수정이나 삭제를 할 땐 비밀번호 검증 후 수정/삭제가 이뤄지도록 구현하고 있습니다. 패스워드가 bcrypt로 암호화되어 있기 때문에 수정의 경우 1. request body에 비밀번호를 보내서 백엔드에서 bcrypt.compare() 2. 비밀번호가 일치할 시 해당 게시글의 데이터를 response 3. response에서 받은 데이터를 기반으로 프론트 수정페이지에 보여준다음 4. 수정페이지 내용을 다시 PUT요청으로 수정하도록 구현되어 있습니다. 이 과정에서 API가 1. 비밀번호 검증용(GET) 2. 게시글 수정용(PUT) 이렇게 두가지가 필요한 상황이 되었는데, 비밀번호 검증 GET에서 질문이 생겼습니다. 기본적으로 GET과 DELETE요청은 request body를 가지지 않는게 규칙이라고 배웠습니다. 하지만 request body를 가지는 POST와 PUT은 그 의미가 생성/수정이라고 이해하고 있습니다. 그렇다고 비밀번호를 URL에 Query Params로 보내자니 보안상 문제가 되지않을까 걱정이 되구요... 1. GET 또는 DELETE요청에 request body를 포함하여 보낸다. - 현재 사용중인 방식이고 앞서 말한 규칙 때문에 수정을 고민중이며 구현, 사용상에 문제는 없었습니다. 2. POST 또는 PUT요청에 request body를 포함하여 보낸다. - 현재 고려중인 방식이고 의미적인 문제가 없다면 이렇게 사용하려고 합니다. 개발 자체를 공부해본지 얼마안된 개발어린이라 제 상식외의 문제가 발생하면 대처하기가 어렵네요..ㅜㅜ 위에 제시한 1, 2번 방법중 어떤게 더 Best Practice에 가까울까요? 더 좋은 방법이 있다면 의견도 제시해주시면 너무 감사하겠습니다. <(__)>

그런 목적으로 패스워드를 미리 검증해 보는 API가 필요하셨군요. 그런 경우 API를 통해서 하는 작업은.. DB에 저장된 패스워드를 프론트엔드로 전달한다는 의미에서의 "조회"가 아니기 때문에 GET 메서드를 사용하지 않습니다. API가 하는 동작은 프론트엔드에서 요청에 실어 보낸 비밀번호가 맞는 것인지 검증하고 검증 결과를 돌려 주는 것인데, API 이름에 동사를 사용하지 않는 것이 관례이기 때문에 적절한 명사 + 메서드의 조합을 생각해야 합니다. 한 가지 제안을 드린다면, "패스워드 검증" 이라는 리소스 (또는 컬렉션)을 POST 한다고 볼 수 있습니다. 예를 들면 (POST) /api/v1/password-verifications 어떤 선택을 하시던지 아래 두 가지는 지키는 것이 좋겠습니다. 1. 비밀번호 검증 API가 별도로 있다 하더라도, 게시글 수정 API 역시 비밀번호를 검증하는 기능을 가지고 있어야 한다. 2. 비밀번호를 querystring으로 전송하지 않는다.

node.js express.js 백엔드 개발 시 자동 로그아웃 관련

안녕하세요 헬스케어 콘텐츠 개발팀에서 근무하고있는 이제 1년 2개월이된 서버개발자입니다. 서버쪽은 저 혼자라서 서버쪽 도움을 요청할분이 없기에 이렇게 도움을 요청 드리게 되었습니다! node.js express.js로 개발중인데요! 클라이언트쪽은 다른분이 unity로 개발중에있습니다. 앱에서 로그인하고 일정시간동안 아무 이벤트가없으면 자동로그아웃이 되도록 구현하려고합니다. 알아보니 setInterval를 사용하면 될 것같아 구현은했는데 postman으로 테스트시 console에 자동 로그아웃 성공되는 부분까지 확인이 되었습니다. 그런데 클라이언트쪽 return에 대해서는 아무 반응이 없다보니 이렇게 처리하는게 맞나라는 생각이 듭니다. 개발하고 unity 클라이언트 앱 쪽과 api 통신을할껀데 setInterval로 자동 로그아웃 기능을 구현면 어떻게 unity 클라이언트쪽에서 확인하고 팝업창을 띄우거나 로그인 페이지로 돌릴지 감이 잡히지않아 이렇게 요청드립니다..!! 정리하자면.. node.js로 백엔드 개발중 일정 시간이 지나도록 이벤트(마우스,키보드,api요청)가 전혀없을때 setInterval로 만들어 놓은 자동 로그아웃이 실행되고 return 값을? unity 클라이언트쪽에서 받아서 팝업창에 띄우는 흐름대로 하려고하는데 관련 키워드나 해결방법을 알고싶어 도움 청하게 되었습니다..!!! 혹시나 제가 처리하려는 흐름이나 setInterval로 접근하는게 잘못된것일까요..?

안녕하세요 답변 드리겠습니다 😏 먼저 일정 시간동안 동작이 없을 시 로그아웃 절차는 백엔드보다 프론트에서 하는게 맞을 것 같습니다. (백엔드에서 처리해야 할 이유가 없습니다.) 예를 들어 access나 refresh 토큰의 유효시간 및 관리등은 백엔드에서 일정 주기별로 무효화하고 클라이언트에서 특정 요청을 주면 만료하거나 재발행하는 기능은 자주 사용됩니다. 하지만 백엔드에서 클라이언트의 사용양으로 로그아웃 시키고 팝업을 띄우는걸 클라이언트에 보내 관리를 한다? 라는 것은 조금 어색한 것 같습니다. 클라이언트에서 충분히 관리 가능한 부분이며 백엔드와 통신을 해서 리소스나 서버 사용량을 늘리며 setinterval로 메모리까지 사용 할 이유가 없을 듯 합니다. 클라이언트(앱)에서 일정 주기동안 반응이 없어서 로그 아웃 시키려면 토큰 삭제 후 로그아웃 처리 혹은 백엔드의 로그아웃 API를 만들어 내부 토큰을 삭제하고 로그아웃 API 사용 등이 있을 것 같습니다. 백엔드에서는 토큰이 유효한지, 어느 주기로 관리할지 등만 체크하는게 맞을 것 같습니다. ex) 이러한 시간을 꼭 백엔드에서 관리하시고 싶으시다면 setinterval 과 같이 지속적으로 메모리에 남는 기능을 사용하시는 것보다 lastAccess 필드를 만드시고 내부에 각 api (로그인 ~) 시에 현재 시간을 넣어주는 필드를 만드시고 어떤 요청이 들어왔을 때 이 lastAccess와 현재 시간을 조회하여 지정한 시간이 안 지났다면 lastAccess에 다시 현재 시간을 기록하며 지났으면 토큰을 만료시키고 401 에러를 발생시키면 됩니다. 하지만 추천드리고 싶은 방법은 아닐 것 같내요 😁

공식 홈페이지

expressjs.com

최신 버전 정보

4.21.2

최신 버전 출시일

2025.01.06

연관 라이브러리

라이브러리 로고NestJS

의견 보내기