티스토리 뷰

7장 익스프레스 프로젝트를 모듈화하기

모듈화 방법 자세히 살펴보기

기능별로 코드를 구분한 후 독립된 파일 (모듈) 로 분리시키는 것이 좋다.

다양한 방법으로 모듈 만들기

  • 자바스크립트 파일을 새로 만들고, 그 파일 안에서 exports 전역 변수를 사용
  • 위의 모듈을 사용할 파일에서 require() 메소드로 불러들임. require() 메소드로 불러들인 모듈을 변수에 할당하면 그 변수에는 exports 가 속성으로 할당된다.
exports.getUser = function() {
    return { id: "test01", name: "Presto" }
}
exports.group = { id: "group01", name: "Friend" }
const user1 = require("./user1")
function showUser() {
    return `${user1.getUser().name}, ${user1.group.name}`
}
console.log("사용자 정보 : %s", showUser())

첫 번째 코드 블록에서 모듈화, 두 번째 코드 블록에서 모듈을 불러와 사용함.

exports 에 객체 지정하기

아니 안되는걸 왜 소개한거지...

노드는 모듈을 처리할 때 exports 를 속성으로 인식한다. 이 속성에 함수나 객체를 속성으로 추가하면 모듈을 불러들인 쪽에서 exports 에 추가된 속성들을 참조할 수 있다.

그러나 exports 에 객체를 할당하면 모듈 파일 안에서 선언한 exports 는 모듈 시스템에서 처리할 수 있는 전역 변수가 아닌 단순 변수로 인식된다.

그러므로 모듈을 불러들인 쪽에서 exports 를 참조할 수 없게 되고 결과적으로 모듈 파일을 불러들일 때 객체에는 아무것도 들어 있지 않게 된다.

module.exports 를 사용해서 객체를 그대로 할당하기

const user = {
    getUser: function() {
        return { id: "test01", name: "Presto" }
    },
    group: { id: "group01", name: "Friend" }
}

module.exports = user
const user = require("./user2")
console.dir(user)
function showUser() {
    return `${user.getUser().name} ${user.group.name}`
}
console.log(showUser())

module.exports 에 객체를 할당하여 모듈화할 수 있음.

객체를 그대로 할당 : module.exports

객체나 함수 등을 할당 : exports

module.exports 에 함수만 할당하기

함수도 객체이므로 함수만 할당할 수도 있다.

require() 메소드는 익명 함수를 반환하므로 이를 할당받는 변수에 소괄호를 붙여 함수를 실행할 수 있다.

exportsmodule.exports 를 함께 사용하기

module.exports 가 우선순위가 더 높으며, 함께 사용하면 exports 전역 변수는 무시된다.

module.exports 사용을 권장한다.

require() 메소드의 동작 방식 이해하기

require() 메소드는 다른 모듈 파일에서 만든 객체를 참조할 수 있음

별도의 모듈 파일로 분리하면 module.exports 에 객체를 할당하고 이 모듈 파일을 require() 메소드로 불러와서 변수에 저장하는 과정이 추가된다.

모듈을 분리할 때 사용하는 전형적인 코드 패턴

코드 패턴설명
함수 할당모듈 안에서 함수를 만들어 할당
모듈을 불러온 후 소괄호를 붙여 모듈 실행
인스턴스 객체 할당모듈 안에서 인스턴스 객체를 만들어 할당
모듈을 불러온 후 해당 객체의 메소드를 호출하거나 속성을 사용
프로토타입 객체 할당모듈 안에서 프로토타입 객체를 만들어 할당
모듈을 불러온 후 new 연산자로 인스턴스 객체를 만들어 사용

함수를 할당하는 코드 패턴

//user7.js
exports.printUser = function() {
    console.log("print user")
}
const printUser = require("./user7").printUser
printUser()

인스턴스 객체를 할당하는 코드 패턴

//user8.js

// function User(id, name) {
//     this.id = id
//     this.name = name
// }
// User.prototype.getUser = function() {
//     return { id: this.id, name: this.name }
// }
// User.prototype.group = { id: "group1", name: "Friend" }
// User.prototype.printUser = function() {
//     console.log(`${this.name} ${this.group.name}`)
// }
class User {
    constructor(id, name, group) {
        this.id = id
        this.name = name
        this.group = { id: "group1", name: "Friend" }
    }
    getUser() {
        return { id: this.id, name: this.name }
    }
    printUser() {
        console.log(`${this.name} ${this.group.name}`)
    }
}

module.exports = new User("test01", "Presto")
const user = require("./user8")
user.printUser()

ES6에서 추가된 class 키워드로 객체를 정의해 보았다. 제대로 동작하는 거니까 맞는거겠지...?


자바스크립트의 클래스 간단 정리 참고한 곳
  • 클래스의 바디에는 메소드만을 포함할 수 있다. 그러므로 멤버 변수는 생성자 내에 위치해야만 한다.

  • 생성자의 키워드는 constructor .

  • getter와 setter

    • getter는 메소드 정의 앞에 get 을 붙이며, 반드시 어떤 값을 반환해야 한다. 어떤 프로퍼티에 접근할 때마다 프로퍼티를 조작하는 행위가 필요할 때 사용한다.
    • setter는 메소드 정의 앞에 set 을 붙인다. 어떤 프로퍼티에 값을 할당할 때마다 프로퍼티를 조작하는 행위가 필요할 때 사용한다.
  • static 키워드를 붙여 정적 메소드를 정의할 수 있다.


외부에 인스턴스 객체를 노출시켰으므로 require() 메소드는 인스턴스 객체를 반환하므로 할당된 변수에서 인스턴스 메소드를 호출할 수 있다.

프로토타입 객체를 할당하는 코드 패턴

객체를 정의하는 부분을 별도의 모듈 파일로 분리할 수 있으므로 다른 파일에서 필요할 때마다 직접 인스턴스 객체를 만들어 사용할 수 있다.

그동안 프로그래밍을 해오면서 쉽게 볼 수 있던 패턴이 바로 이것인 것 같다. 클래스를 다른 파일에 정의해 두고 사용하려는 파일에서 인스턴스를 생성하거나 정적 메소드를 사용하거나 했으니까...

 

사용자 정보 관련 기능을 모듈화하기

라우팅 미들웨어가 등록된 모듈 쪽으로 요청 객체와 응답 객체를 전달하게 하여 많은 작업을 분리하여 처리할 수 있게 한다.

라우팅 미들웨어에서 사용하는 모듈들은 대부분 데이터베이스 기능을 사용하므로 데이터베이스 기능도 각 기능을 독립적으로 분리하는 것이 좋다.

스키마 파일을 별도 모듈 파일로 분리하기

app.js 파일에서 mongoose 모듈에 설정한 정보를 똑같이 사용하기 위해 모듈로 분리한 user_schema.js 에서 mongoose 모듈을 파라미터로 전달받게 작성해야 한다.

Schema 객체를 만들고 그 안에 스키마를 만드는 createSchema 함수를 정의한다.

module.exports = Schema 코드를 작성하여 Schema 객체를 외부에 노출시킨다.

app.js 에서는 require("./Database/user_schema").Schema 코드로 Schema 객체를 참조할 수 있다.

사용자 처리 함수를 별도의 모듈 파일로 분리해 보기

라우팅 미들웨어의 콜백 함수로 넘어오는 것을 별도의 모듈로 분리할 수 있다.

익스프레스는 요청 객체가 app 객체를 속성으로 가지고 있으므로 메인 파일에서 모듈 파일로 객체를 전달할 때 app 객체에 속성으로 추가한 후 전달할 수 있다. 이를 위해 app.get()app.set() 메소드를 사용할 수 있다.

아니 책을 따라할 수가 없네 내가 문제인지 책이 문제인지 모르겠지만 하...........


일단 모듈화 하는 방법은 이해했다. 걍 프로젝트를 진행하거나 블로그 보면서 하는게 낫겠다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함