-
[TIL] 항해 99 4주차 주특기 숙련 회고록_15일차항해[TIL] 2021. 11. 29. 22:24
Today I Learnd
(2021. 11. 25. 목)
목차
- require함수
- exports와 module.exports 차이
- 주특기 숙련 주차 4일차 소감 및 부족한 점
1. require 함수
require 함수 동작 원리
node.js 에서는 require 메서드를 통해서 외부에 있는 모듈을 가져올 수 있다. require 메서드는 node가 local object에 추가 된 메서드로서 파라미터로 추가할 모듈의 파일 경로값을 받는다.
const a = require('파일경로')
require 메서드의 소스코드는 매우 복잡하다.
const require = function(src) { // line 1 const fileAsSir = readFile(src) // line 2 const = module.exports = {} // line 3 eval(fileAsSir) // line 4 return module.exports // line 5 }
설명을 해보자면
const a = require('./file.js')
- line 1에서 인자를 받아온다. 위에 코드와 같이 'a'를 인자로 받아오는 식이다.
- line 2에서 소스 파일을 읽어서 fileAsSirdp 저장한다.
- line 3에서 module.exports 라는 빈 해시를 만들어 준다.
- line 4에서 fileAsSir을 eval 한다. 이 과정은 src를 복사 붙혀넣기 하는 것과 같다.
const a = require('./file.js') // 를 한다는 것은, 곧 require()의 src인자로 ',/file.js'를 넣는 식이고 // line 4의 require()는 eval(fileAsSir) //line 4 // 서로 같은 의미다.
const require = function(src) { const fileAsSir = readFile(src) const module.exports = {} const q = 10 exports.q = q; retrun module.exports }
위와 같이 exports 해시의 q라는 key에 value 10이 들어가는 셈이다.
- line 5에서 require는 해당 exports 해시를 아웃풋으로 내보낸다.
쉽게 설명하자면 file.js는 원래 아래와 같은 코드같이 생겼지만
const a = require('./file.js') console.log(a.a)
런타임에는 아래와 같은 모습이라고 볼 수 있다.
const a = { a : 10 } console.log(a.a)
a에서 exports에 들어간 <key,value>들이 require() 함수의 아웃풋으로 나오는 것이다.
2. exports와 module.exports의 차이
1. 모듈이란?
모듈은 특정한 기능을하는 함수나 변수들의 집합이다.
코드의 길이를 줄이고, 유지보수를 용이하게 할 수 있는 장점을 가지고 있다.
이러한 모듈을 exportsgksms 두 가지 방법인 module.exports와 exports가 있다.
2. module.exports
modules.js
const kwak = { name: 'kwak', intro: 'hi' } module.exports = kwak;
main.js
const person = require('./modules'); console.log(person);
output
$ node main { name: 'kwak', intro: 'hi' }
main.js 에서 정상적으로 modules.js 에서 작성한 kwak이라는 객체를 가져올 수 있다.
3. exports
exports.js
const kwak = { name: 'kwak', intro: 'hi' } exports = kwak;
main.js
const person = require('./exports'); console.log(person);
output
$ node main {}
의도와 다르게 원하는 객체가 제대로 가져오지 않고 있다.
프로퍼티에 접근하는 향태로 코드를 수정을 해볼 수 있다.
exports.js
const kwak = { name: 'kwak', intro: 'hi' } export.person = kwak;
main.js
const person = require('./exports'); console.log(person.person);
output
$ node main { name: 'kwak', intro: 'hi' }
전과는 다르게 코드를 수정해서 원하는 객체를 가져왔다.
4. 비교
코드로 exports와 module.exports의 차이를 코딩해보면
const module = {exports: {}}; const exports = module.exports; function require(path) { ... return module.exports; }
exports와 module.exports는 동일한 객체를 바라보고 있지만 exports는 module.exports를 참조 (call vy reference)하는 형태이다. 따라서 exports = a의 형태로 코드를 작성을 한다면 module.exports에 대한 참조가 끊어지고 변수 a의 값을 가진다.
- exports는 module.exports를 참조하고 있다.
- exports는 프로퍼티에 접근하는 방식으로 사용한다.
- module.exports는 바로 사용한다.
- 헷갈린다면 module.exports를 사용하는 것을 권장한다.
const kwak = { name: 'kwak', intro: 'hi' } module.exports.person = kwak; // O module.exports = kwak; // O exports.person = kwak // O exports = kwak // X
출처: https://cotak.tistory.com/103
3. 주특기 숙련 주차 4일차 소감 및 부족한 점
소감
4일차를 지나오면서 지금 현재 개인 프로젝트를 엎었다. 자꾸 코드가 꼬이고 애초에 DB설계도 안한 탓인지 에러가 너무 자주 나고 하나 에러를 해결할 때 몇 시간이 걸려서 너무 비효율 적이라고 생각해서 프로젝트를 엎고 다시 만들었다.
다시 만들면서 의도치 않게 전주에 했던 개인 프로젝트를 복습을하게 됐다. 스키마를 다시 만들고 API도 다시 만들었다. 그래도 전주에 했던 프로젝트를 해본거여서 빠르지는 않지만 8시간만에 만들었다. 전주에는 이거 만들려고 3일이 걸렸다...
이제 본격적으로 전주 프로젝트에 이번주 프로젝트의 조건들을 추가해야하는 작업을 하는데 모르겠다... 토요일까지 제출이 됐으면 좋겠다.
'항해[TIL]' 카테고리의 다른 글
[TIL] 항해 99 5주차 주특기 심화 회고록_19일차 (0) 2021.11.30 [TIL]항해99 5주차 주특기 심화 회고록_18일차 (0) 2021.11.30 [TIL] 항해 99 4주차 주특기 숙련 회고록_15일차 (0) 2021.11.28 [TIL] 항해 99 4주차 주특기 숙련 회고록_14일차 (0) 2021.11.27 [TIL] 항해 99 4주차 주특기 숙련 회고록_13일차 (0) 2021.11.23