1. 모듈화실습
A. require 이해하기
// exports 객체 속성으로 함수 추가 exports.getUser = function() { return {id:'test01', name:'소녀시대'}; } // exports 객체 속성으로 객체 추가 exports.group = {id:'group01', name:'친구'}; |
// require() 메소드는 exports 객체를 리턴함 var user = require('./user1'); function showUser() { return user.getUser().name + ', ' + user.group.name; } console.log('사용자 정보 : %s', showUser()); |
| |
// user1.js의 코드는 exports에 객체를 할당하는 것과 같으나, exports에는 속성만 추가할 수 있고 객체를 할당할 수는 없음 // Reason : exports는 속성으로, exports에 속성을 추가하면 모듈에서 접근하지만, // exports에 객체를 할당하면 자바스크립트에서 새로운 변수로 처리함 exports = { getUser: function() { return {id:'test01', name:'소녀시대'}; }, group: {id:'group01', name:'친구'} } | // users2는 {} 로 리턴됨 // 오류 발생함 // Reason : user2.js 파일에서 exports에 객체를 할당하였으므로, exports 전역변수에는 아무것도 할당되지 않음 // require() 호출 시 자바스크립트에서 새로운 변수로 처리함 // 결국 아무 속성도 없는 {} 객체가 리턴됨 var user = require('./user2'); console.dir(user); function showUser() { return user.getUser().name + ', ' + user.group.name; } console.log('사용자 정보 : %s', showUser()); |
-> 노드는 모듈를 처리할 때 exports를 속성으로 인식합니다. 이 속성에 함수나 객체를 속성으로 추가하면 모듈을 불러들인 쪽에서 exports에 추가된 속성들을 추가할수 있으나 exports에 객체를 할당하면 모듈 파일 안에서 선언한 eexports는 모듈 시스템에서 처리할 수 있는 전역변수가 아닌 단순 변수로 인식되기 때문입니다. 그러므로 모듈을 불러들인 쪽에서 exports를 참조할 수 없게 되고 결과적으로 모듈 파일을 불러들일 때 그 결과 객체에는 아무것도 들어 있지 않게됩니다. | |
// 객체를 그대로 할당할 수 있음 var user = { getUser: function() { return {id:'test01', name:'소녀시대'}; }, group:{id:'group01', name:'친구'} }
module.exports = user; | // require() 메소드는 객체를 리턴함 var user = require('./user3'); function showUser() { return user.getUser().name + ', ' + user.group.name; } console.log('사용자 정보 : %s', showUser()); |
| |
// 인터페이스(함수 객체)를 그대로 할당할 수 있음
module.exports = function() { return {id:'test01', name:'소녀시대'}; }; |
// require() 메소드는 함수를 리턴함 var user = require('./user4'); function showUser() { return user().name + ', ' + 'No Group'; } console.log('사용자 정보 : %s', showUser()); |
| |
// module.exports가 사용되면 exports는 무시됨 module.exports = { getUser: function() { return {id:'test01', name:'소녀시대'}; }, group:{id:'group01', name:'친구'} } exports.group = {id:'group02', name:'가족'}; | // require() 메소드는 exports가 아닌 module.exports로 설정된 속성을 리턴함 var user = require('./user5'); function showUser() { return user.getUser().name + ', ' + user.group.name; } console.log('사용자 정보 : %s', showUser()); |
- exports.group = {id:'group02', name:'가족'}; 이 할당되지 않았다. 그러므로 module.exports를 사용하는것을 권장함 |
B. 모듈을 분리할때 사용하는 전형적인 코드 패턴
함수를 할당하는 경우 |
모듈안에서 함수를 만들어 할당합니다. 모듈을 불러온후 소괄호를 붙여 모듈을 실행합니다 |
인스턴스 객체를 할당하는 경우 |
모듈안에서 인스턴스 객체를 만들어 할당합니다. 모듈을 불러온 후 해당 객체의 메소드를 호출하거나 속성을 사용할 수 있습니다. |
프로토타입 객체를 할당하는 경우 |
모듈안에서 프로토타입 객체를 만들어 할당합니다. 모듈을 불러온 후 new 연산자로 인스턴스 객체를 만들어 사용할 수 있습니다. |
1) 함수를 할당하는 경우
// 사용 패턴 : exports에 속성으로 추가된 함수 객체를 그대로 참조한 후 호출함
exports.printUser = function() {
console.log('user 이름은 소녀시대입니다.');
};
// 사용 패턴 : exports에 속성으로 추가된 함수 객체를 그대로 참조한 후 호출함
var printUser = require('./user7').printUser;
printUser();
2) 인스턴스 객체를 할당하는 경우
// 사용 패턴 : module.exports에 인스턴스 객체를 만들어 할당함
// 생성자 함수
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:'친구'};
User.prototype.printUser = function() {
console.log('user 이름 : %s, group 이름 : %s', this.name, this.group.name);
}
module.exports = new User('test01', '소녀시대');
// 사용 패턴 : module.exports 에 객체로부터 new 연산자로 생성된 인스턴스 객체를 할당한 후 그 인스턴스 객체의 함수 호출함
var user = require('./user8');
user.printUser();
exports.user 속성으로 인스턴스 객체 추가시 아래와 같이 변경
...
exports.user = new User('test01', '소녀시대');
// 사용 패턴 : exports의 속성 이름을 주면서 추가하되 인스턴스 객체를 만들어 할당함
var user = require('./user9').user;
user.printUser();
3) 프로토타입 객체를 할당하는 경우
- User 객체 자체를 module.export에 할당
- 장점 : 이렇게 하면 User객체를 정의하는 부분만 별도의 모듈 파일로 분리할수 있으니 다른 파일에서 필요할 때 마다 직접 인스턴스 객체를 만들어 사용할 수 있음
...
module.exports = User;
// 사용 패턴 : module.exports에 프로토타입 객체를 정의한 후 할당함
var User = require('./user10');
var user = new User('test01', '소녀시대');
user.printUser();
이또한 exports.User 속성으로 가능
...
exports.User = User;
// 사용 패턴 : exports의 속성 이름을 주면서 추가하되 프로토타입 객체를 정의한 후 할당함
var User = require('./user11').User;
var user = new User('test01', '소녀시대');
user.printUser();
'WEB > Node JS' 카테고리의 다른 글
Nodejs기초 - 12일차 정리(pug템플릿 사용 및 상속, 패스포트 정의) (0) | 2019.01.26 |
---|---|
Nodejs기초 - 11일차 정리(Semantic UI 활용, MVC패턴, 응답 페이지 모듈화[ejs]) (0) | 2019.01.26 |
9일차 정리 (0) | 2019.01.14 |
8일차 정리 (0) | 2019.01.12 |
7일차 정리 (0) | 2019.01.11 |