node
명령어를 입력합니다.node
>
> 1 + 1
2
> console.log("Hello, World!")
Hello, World!
> const greet = (name) => `Hello, ${name}!`;
> greet("Alice")
'Hello, Alice!'
;
)을 사용하지 않고 Enter 키를 누르면 자동으로 다음 줄로 넘어갑니다. 만약 괄호나 중괄호가 열려 있다면, Enter를 누르면 계속 입력할 수 있습니다.> function add(a, b) {
... return a + b;
... }
> add(2, 3)
5
fs
모듈을 사용하여 파일 시스템 작업을 수행할 수 있습니다.> const fs = require('fs');
> fs.readdirSync('.')
[ 'file1.txt', 'file2.txt', ... ]
Ctrl + C
를 두 번 누르기.exit
입력 후 Enter 누르기예시: app.js
파일
// app.js
console.log("Hello, Node.js!");
cd
명령어를 사용하여 디렉토리를 변경합니다.cd /path/to/your/file
node app.js
Hello, Node.js!
예시: 인수 처리
app.js
파일을 수정하여 인수를 출력해 보겠습니다:
// app.js
const args = process.argv.slice(2);
console.log("Arguments:", args);
node app.js arg1 arg2
Arguments: [ 'arg1', 'arg2' ]
예시: 파일 읽기
readFile.js
파일을 생성하고 다음 코드를 작성합니다:
// readFile.js
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
example.txt
파일을 같은 디렉토리에 만들고 몇 가지 텍스트를 추가합니다. 그런 다음, 다음 명령어로 파일을 실행합니다:
node readFile.js
예시: 비동기 함수
// asyncExample.js
const fs = require('fs').promises;
async function readFileAsync() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readFileAsync();
example.txt
의 내용이 출력됩니다.module.exports
를 사용하여 외부에서 사용할 수 있는 기능을 정의합니다.예시: math.js
파일
// math.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
module.exports = {
add,
subtract
};
add
와 subtract
)를 외부로 내보냅니다.require()
함수를 사용하여 모듈을 가져옵니다.예시: app.js
파일
// app.js
const math = require('./math');
const sum = math.add(5, 3);
const difference = math.subtract(5, 3);
console.log(`Sum: ${sum}`);
console.log(`Difference: ${difference}`);
app.js
를 실행하여 결과를 확인합니다:node app.js
Sum: 8
Difference: 2
fileSystem.js
파일// fileSystem.js
const fs = require('fs');
fs.writeFileSync('example.txt', 'Hello, Node.js!');
console.log('File written successfully');
example.txt
파일이 생성됩니다.프로젝트 디렉토리를 만들고 npm init
명령어를 사용하여 package.json
파일을 생성합니다.
mkdir my-module
cd my-module
npm init -y
index.js
파일을 만들고 모듈 코드를 작성합니다.
예시: index.js
// index.js
const greet = (name) => `Hello, ${name}!`;
module.exports = greet;
npm 로그인: npm 계정이 필요합니다. npm login
명령어를 사용하여 로그인합니다.
조직(Organizations)를 생성합니다.
package.json 파일의 name 값을 생성한 조직 이름/모듈이름 형태로 바꿔줍니다.(ex 조직이름이 kisudevel 이라면 @kisudevel/my-module
패키지 배포: npm publish
명령어로 패키지를 배포합니다.
이제 다른 프로젝트에서 이 모듈을 설치하고 사용할 수 있습니다.
다른 프로젝트에서 이 모듈을 설치하려면 다음 명령어를 사용합니다:
npm install my-module
설치 후, 다음과 같이 사용할 수 있습니다:
const greet = require('@kisudevel/my-module');
console.log(greet('Alice')); // Hello, Alice!
객체/함수 | 설명 | 예제 |
---|---|---|
global | 전역 객체 | global.someVar = 'Hello'; |
console | 출력 및 디버깅 도구 | console.log('로그'); |
setTimeout | 일정 시간 후 1회 실행 | setTimeout(() => {}, 1000); |
setInterval | 일정 간격 반복 실행 | setInterval(() => {}, 1000); |
__filename | 현재 파일의 절대 경로 | console.log(__filename); |
__dirname | 현재 파일의 디렉터리 경로 | console.log(__dirname); |
module | 현재 모듈 객체 | module.exports = {} |
exports | 모듈 내보내기 객체 | exports.someFunc = () => {}; |
require | 모듈 가져오기 | const fs = require('fs'); |
process | 프로세스 관련 정보 및 제어 | console.log(process.platform); |
process.env | 환경 변수 접근 | process.env.NODE_ENV |
process.nextTick | 이벤트 루프가 끝난 후 콜백 실행 | process.nextTick(() => {}); |
process.exit | 프로세스 종료 | process.exit(0); |
global
객체global
객체에 등록된 변수나 함수는 어디서나 접근 가능window
객체와 유사global.appName = 'My App';
console.log(appName); // 'My App'
global
객체에 중요한 값을 등록하는 것은 권장되지 않습니다. 모듈 간의 의존성 문제를 초래할 수 있기 때문입니다.console
객체console.log('일반 로그'); // 일반 출력
console.error('에러 메시지'); // 에러 출력
console.warn('경고 메시지'); // 경고 출력
console.info('정보 메시지'); // 정보 출력
console.table([{ name: 'Node' }, { name: 'React' }]); // 객체 표 형태로 출력
console.time('timer'); // 타이머 시작
setTimeout(() => {
console.timeEnd('timer'); // 타이머 종료 및 경과 시간 출력
}, 500);
timer
함수setTimeout
setTimeout(() => console.log('2초 후 실행'), 2000);
setInterval
let count = 0;
const interval = setInterval(() => {
console.log(`1초마다 실행: ${++count}`);
if (count === 5) clearInterval(interval); // 5회 후 중단
}, 1000);
setImmediate
setImmediate(() => console.log('이벤트 루프 종료 후 즉시 실행'));
__filename
/ __dirname
__filename
: 현재 파일의 절대 경로__dirname
: 현재 디렉터리의 절대 경로console.log(__filename); // /path/to/your/file.js
console.log(__dirname); // /path/to/your
const path = require('path');
const filePath = path.join(__dirname, 'data.json');
console.log(filePath); // /path/to/your/data.json
module
객체와 exports
객체// a.js
const greeting = 'Hello';
module.exports = { greeting };
// b.js
const { greeting } = require('./a');
console.log(greeting); // 'Hello'
exports
는 module.exports
의 참조입니다. 하지만 객체 전체를 덮어쓸 때는 module.exports
를 사용해야 합니다.require
함수require
는 다른 모듈이나 파일을 가져올 때 사용합니다.const os = require('os'); // 내장 모듈
console.log(os.platform()); // 'win32' 또는 'linux'
const customModule = require('./customModule'); // 사용자 정의 모듈
console.log(customModule);
require
는 캐싱되므로 같은 모듈이 여러 번 호출되어도 처음 한 번만 로드됩니다.process
객체process
는 현재 실행 중인 Node.js 프로세스에 대한 정보를 제공합니다.process.env
: 환경 변수 접근process.env.NODE_ENV = 'development';
if (process.env.NODE_ENV === 'development') {
console.log('개발 모드');
} else {
console.log('프로덕션 모드');
}
NODE_ENV=development node app.js
NODE_ENV=development(원하는 초기값) node app.js(파일명)
작성npm init -y
package.json
파일을 빠르게 생성하는 명령어-y
옵션을 사용하면 기본 설정을 자동으로 채택package.json
파일을 생성할 때 하나씩 설정할 필요 없이 기본값으로 자동 생성process.cwd()
: 현재 작업 디렉터리__dirname
과 같음process.cwd()
는 프로그램이 실행된 작업 디렉토리를 반환__dirname
은 현재 파일이 위치한 디렉토리 경로 반환console.log(process.cwd()); // 현재 실행 중인 디렉터리 경로
process.platform
: 운영 체제 확인console.log(process.platform); // 실행 중인 운영 체제 확인
// 'win32', 'darwin', 'linux'
process.nextTick()
: 현재 이벤트 루프가 끝난 후 실행console.log('첫 번째');
process.nextTick(() => console.log('nextTick 실행'));
console.log('두 번째');
첫 번째
두 번째
nextTick 실행
process.exit()
: 프로세스 종료if (process.env.NODE_ENV !== 'production') {
console.error('개발 모드에서는 종료할 수 없습니다.');
process.exit(1); // 에러 코드 1로 종료
}
require()
로 불러와서 사용해야 됨fs
, path
, http
, url
, os
npm install dotenv
작성os
)const os = require('os');
console.log('플랫폼:', os.platform()); // 'win32', 'linux', 'darwin' 등
console.log('CPU 아키텍처:', os.arch()); // 'x64' 등
console.log('CPU 정보:', os.cpus()); // CPU 코어 정보
console.log('메모리(총량):', os.totalmem()); // 총 메모리 (바이트 단위)
console.log('메모리(사용 가능):', os.freemem()); // 사용 가능한 메모리
console.log('네트워크 인터페이스:', os.networkInterfaces()); // 네트워크 정보
console.log('호스트 이름:', os.hostname()); // 호스트 이름
console.log('시스템 업타임:', os.uptime(), '초'); // 시스템 가동 시간
path
)const path = require('path');
const filePath = '/user/local/bin/file.txt';
console.log('확장자:', path.extname(filePath)); // '.txt'
console.log('디렉터리명:', path.dirname(filePath)); // '/user/local/bin'
console.log('파일명:', path.basename(filePath)); // 'file.txt'
console.log('절대 경로:', path.resolve('bin', 'file.txt')); // /current/dir/bin/file.txt
console.log('경로 결합:', path.join('/user', 'local', 'bin')); // '/user/local/bin'
url
)const { URL } = require('url');
const myURL = new URL('https://example.com:8000/path?name=John#fragment');
console.log('호스트:', myURL.host); // 'example.com:8000'
console.log('경로명:', myURL.pathname); // '/path'
console.log('쿼리:', myURL.searchParams.get('name')); // 'John'
console.log('프래그먼트:', myURL.hash); // '#fragment'
querystring
)const querystring = require('querystring');
const query = 'name=John&age=30';
const parsed = querystring.parse(query);
console.log(parsed); // { name: 'John', age: '30' }
console.log(querystring.stringify(parsed)); // 'name=John&age=30'
// url + queryString 조합
const { URL } = require('url');
const querystring = require('querystring');
const myURL = new URL(
'https://example.com:8000/path?name=John&age=20#fragment'
);
const q = querystring.parse(myURL.searchParams.toString());
console.log(q.name); // John
console.log(q.age); // 20
crypto
)const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('Hello').digest('hex');
console.log('SHA-256 해시:', hash);
const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
function encrypt(text) {
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
function decrypt(encryptedText) {
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(encryptedText, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
const encrypted = encrypt('Hello World');
console.log('암호화된 텍스트:', encrypted);
console.log('복호화된 텍스트:', decrypt(encrypted));
"타자 연습"
이 네 글자로 오늘 하루를 정리할 수 있을 것 같다.
너무 빠른 속도의 수업으로 강사님이 작성하시는 코드를 받아적기에 바빴고,
어떤 내용인지 이해는 당연히 안 됐을 뿐더러 뭘 하고 있는지 조차 몰랐다..
비단 나의 문제만은 아니었고 다른 팀원들도 똑같은 얘기를 하는 걸 보니
문제가 확실히 있어보인다.
코드 작성을 중간에 틀리기라도 한다면 그 이후에 작성된 것들은 그냥 날려야한다.
이게 뭘 하고 있는지.. 갑자기 왜 이렇게 수업이 되어 버렸는지 모르겠다..
모두를 데려가는 수업이 아니라 따라오는 사람만 데려가는 그런 수업
정말 눈물이 왈칵 터질 것 같이 가슴이 많이 먹먹하고 머리가 아팠다.
뭘 어디서부터 어떻게 해야될 지를 몰라서 너무 답답하다.
그나마 필기와 강의 노트를 보면서 어떤 내용을 했는지 감은 잡았지만,
정신적으로 너무 힘들다.
팀원들이 모두 응원을 해주고 도움을 주기 위해서 노력해주는게
말로 표현이 다 안 될 정도로 감사하다...
내 지인이 비전공에다가 그동안 그 어떤 관련 공부를 해보지 않은 사람이라면
난 무조건 말릴 예정이다.
아예 하지 말라는 게 아니라 전반적인 얕은 공부는 하고 들어야한다.
제로베이스의 사람들에겐 그리 친절하진 않은 수업이다.
물론 지금까지 계속 그래왔던 것은 아니다.
정말 꼼꼼하게 차근차근 알려주셨고 그때까지만 해도 잘 따라갔다.
근데 우리 수업에 공부를 오래해왔던 사람들이 있다는 걸 강사님께서 아시고
그때부터 달라지기 시작한 것 같다.
대다수가 그렇다보니 소수에 해당하는 나 같은 사람은 어쩔 수 없는 것 같다.
나처럼 되돌아갈 수 없는 사람들은 어떻게든 이 악물고 버티고 공부하겠지만
그게 아닌 사람들은 바로 포기할 수 있을 것 같다.
그래도 난 이 공부가 정말 재밌다. 그래서 더 버틸 수 있는 것 같기도 하고
잘하고 싶은 욕심이 너무 커서 나를 괴롭게 만드는 것 같기도 하다.
그리고 잠을 서서히 줄여나가야겠다.
잘 하는 분들도 새벽까지 공부하는데 내가 12시까지만 공부하는게 말이 안된다.
지치더라도 어쩔 수 없을 것 같다...
나이 먹고 늦게 공부를 하는 만큼
힘들고 지칠 때 그 누구한테도 쉽게 터놓지 못한다는게
많이 외로운 것 같다.
그래도 오늘처럼 내일도 힘내서 하루를 또 버텨보자