모던 자바스크립트에서는 객체의 key 이름을 알면 { key 이름 }
으로 변수를 선언하는 구조 분해 할당을 하여 바로 key의 이름으로 된 변수에 value값을 저장할 수 있다.
const aAndBobject = {
a: 1,
b: "가나다라"
}
const { a, b } = aAndBobject;
console.log(a); // 1
console.log(b); // "가나다라"
배열에서는 key가 존재하지 않기 때문에 [ 임의의 변수 이름 ]
을 선언해서 구조 분해 할당이 가능하며, 선언한 변수 안에 배열의 값이 인덱스 순서대로 담기게 된다.
const aAndBArray = [ "가나다", "abc", 3 ];
const [a, b] = aAndBArray;
console.log(a); // "가나다"
console.log(b); // "abc"
require()
문에서의 객체 구조분해 할당 응용// auth.js
const validateToken = async (req, res, next) => {
// ...이하 코드 내용
}
module.exports = {
validateToken
};
위는 auth.js 에서 validateToken 이라는 함수를 정의한 후 module.exports = {validateToken} 객체를 이용해 파일 외부로 export 하는 구조이다.
이 함수를 다른 파일에서 사용하기 위해서는 require를 이용해 호출해야 한다.
// app.js
const auth = require('./middleware/auth');
console.log(auth)
// { validateToken: [AsyncFunction: validateToken] }
auth.validateToken()
auth 라는 변수를 선언하고 middleware/auth 파일을 호출해 할당하였다. 이렇게 일반적인 변수 선언 형태로 모듈을 호출하게 되면 해당 모듈은 module.exports에서 객체로 내보냈듯이 객체 형태로 불러와지게 된다. (key 는 함수명인 "validateToken", value 는 해당 함수 내용)
이 경우 auth 객체 안의 validateToken 함수를 꺼내 사용하기 위해서는 auth.validateToken() ~ 이라는 식으로 모듈명.속성명 을 지정하여 사용해야 한다.
auth 파일 내에 많은 함수가 있고 그 여러 함수를 app.js 안에서 각각 사용해야 한다면 그런 식으로 선언하여 사용하는 편이 나을 수도 있다. (예 : userDao.getUser(), userDao.createUser(), ...)
그러나 validateToken 함수 하나만을 꺼내 쓰는 상황이라면 구조 분해 할당을 이용하는 편이 훨씬 간단하고 컨벤션에도 맞게 사용할 수 있다. 그 경우 호출시 아래처럼 선언하면 된다.
// app.js
const { validateToken } = require('./middleware/auth');
console.log(validateToken) // [AsyncFunction: validateToken]
validateToken()
dataSource.query()
에서의 배열 구조분해 할당 응용const getUserByEmail = async (email) => {
const user = await appDataSource.query(
`SELECT
id,
password
FROM users
WHERE email = ?;
`,
[email]
);
console.log(user) //
[
{ id : 1,
password : "alskdjhfl"
}
]
console.log(user[0].id) // 1
console.log(user[0].password) // "alskdjhfl"
reture user[0]
SELECT 쿼리문 결과 데이터가 하나뿐이더라도 데이터는 배열에 담겨 반환된다. 그러므로 위 코드에서 유저의 값을 사용하려면 user[0].password, user[0].id로 배열의 인덱스를 명시하여 사용해야 한다.
구조 분해 할당을 통해 user 변수를 선언하게 되면 아래와 같다.
const getUserByEmail = async (email) => {
const [ user ] = await appDataSource.query(
`SELECT
id,
password
FROM users
WHERE email = ?;
`,
[email]
);
console.log(user) //
{ id : 1,
password : "alskdjhfl"
}
console.log(user.id) // 1
console.log(user.password) // "alskdjhfl"