stringify()
๋ฅผ ์ฌ์ฉํ์! โ ๊ทผ๋ฐ ์๋ ๋๋ ค์ ํจ์จ์ฑ ๋จ์ด์ง๋ ^^;;a = [1]
b = [1]
a === b // false
JSON.stringify(a) === JSON.stringify(b) // true ,"[1]" == "[1]" ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ
// ์๋ก ๊ฐ์
ํ๋ ์ ์ ๋ค์ด ์์ด๋ ๊ท์น์ ๋ง์ง ์๋ ์์ด๋๋ฅผ ์
๋ ฅํ์ ๋,
// ์
๋ ฅ๋ ์์ด๋์ ์ ์ฌํ๋ฉด์ ๊ท์น์ ๋ง๋ ์์ด๋๋ฅผ ์ถ์ฒํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํด์ผ ํ๋ค.
// ๋ค์์ ์์ด๋์ ๊ท์น์
๋๋ค.
// ์์ด๋์ ๊ธธ์ด๋ 3์ ์ด์ 15์ ์ดํ์ฌ์ผ ํฉ๋๋ค.
// ์์ด๋๋ ์ํ๋ฒณ ์๋ฌธ์, ์ซ์, ๋นผ๊ธฐ(-), ๋ฐ์ค(_), ๋ง์นจํ(.) ๋ฌธ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ๋จ, ๋ง์นจํ(.)๋ ์ฒ์๊ณผ ๋์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ํ ์ฐ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
/*
1๋จ๊ณ new_id์ ๋ชจ๋ ๋๋ฌธ์๋ฅผ ๋์๋๋ ์๋ฌธ์๋ก ์นํํฉ๋๋ค.
2๋จ๊ณ new_id์์ ์ํ๋ฒณ ์๋ฌธ์, ์ซ์, ๋นผ๊ธฐ(-), ๋ฐ์ค(_), ๋ง์นจํ(.)๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
3๋จ๊ณ new_id์์ ๋ง์นจํ(.)๊ฐ 2๋ฒ ์ด์ ์ฐ์๋ ๋ถ๋ถ์ ํ๋์ ๋ง์นจํ(.)๋ก ์นํํฉ๋๋ค.
4๋จ๊ณ new_id์์ ๋ง์นจํ(.)๊ฐ ์ฒ์์ด๋ ๋์ ์์นํ๋ค๋ฉด ์ ๊ฑฐํฉ๋๋ค.
5๋จ๊ณ new_id๊ฐ ๋น ๋ฌธ์์ด์ด๋ผ๋ฉด, new_id์ "a"๋ฅผ ๋์
ํฉ๋๋ค.
6๋จ๊ณ new_id์ ๊ธธ์ด๊ฐ 16์ ์ด์์ด๋ฉด, new_id์ ์ฒซ 15๊ฐ์ ๋ฌธ์๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฌธ์๋ค์ ๋ชจ๋ ์ ๊ฑฐํฉ๋๋ค.
๋ง์ฝ ์ ๊ฑฐ ํ ๋ง์นจํ(.)๊ฐ new_id์ ๋์ ์์นํ๋ค๋ฉด ๋์ ์์นํ ๋ง์นจํ(.) ๋ฌธ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
7๋จ๊ณ new_id์ ๊ธธ์ด๊ฐ 2์ ์ดํ๋ผ๋ฉด, new_id์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ new_id์ ๊ธธ์ด๊ฐ 3์ด ๋ ๋๊น์ง
๋ฐ๋ณตํด์ ๋์ ๋ถ์
๋๋ค.
*/
// ์ ๊ท ์ ์ ๊ฐ ์
๋ ฅํ ์์ด๋๋ฅผ ๋ํ๋ด๋ new_id๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋,
// ์ค๊ณํ 7๋จ๊ณ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์น ํ์ ์ถ์ฒ ์์ด๋๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
// new_id๋ ๊ธธ์ด 1 ์ด์ 1,000 ์ดํ์ธ ๋ฌธ์์ด์
๋๋ค.
// new_id๋ ์ํ๋ฒณ ๋๋ฌธ์, ์ํ๋ฒณ ์๋ฌธ์, ์ซ์, ํน์๋ฌธ์๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
// new_id์ ๋ํ๋ ์ ์๋ ํน์๋ฌธ์๋ -_.~!@#$%^&*()=+[{]}:?,<>/ ๋ก ํ์ ๋ฉ๋๋ค.
const filter = 'qwertyuiopasdfghjklzxcvbnm1234567890-_.';
function solution(new_id) {
// 1. ๋ชจ๋ ๋๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ์นํ
new_id = new_id.toLowerCase()
// 2. ์ํํซ ์๋ฌธ์, ์ซ์, -, _, . ์ ์ ์ธํ ๋๋จธ์ง ๋ชจ๋ ๋ฌธ์๋ฅผ ์ ๊ฑฐ
let answer = ""
for( let i = 0; i <new_id.length ; i++ ){
if( filter.includes( new_id[i] ) ) {
answer += new_id[i]
}
}
// 3. ๋ง์นจํ(.)๊ฐ ๋ ๋ฒ ์ด์ ์ฐ์๋๋ค๋ฉด ํ๋์ ๋ง์นจํ๋ก ์นํ
while( answer.includes("..") ){
answer = answer.replace("..",".")
}
// 4. ๋ง์นจํ(.)๊ฐ ์ฒ์์ด๋ ๋์ ์์นํ๋ค๋ฉด ์ ๊ฑฐ
if ( answer[0] === "." ){
answer = answer.substring( 1 )
}
function removeLastdot() {
if ( answer[answer.length-1] === "." ){
answer = answer.substring( 0, answer.length-1 )
}
}
removeLastdot()
// 5. ๋น ๋ฌธ์์ด์ด๋ฉด ์๋ฌธ์ a ๋์
if( answer.length === 0 ) { //if(answer==="")
answer = "a"
}
// 6. ๊ธธ์ด๊ฐ 16์ ์ด์์ด๋ฉด ์ฒซ 15๊ฐ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฌธ์๋ฅผ ๋ชจ๋ ์ ๊ฑฐ,
// ์ ๊ฑฐ ํ ์์ด๋ ๋์ .์ด ์๋ค๋ฉด ๋ง์นจํ(.)๋ฅผ ์ ๊ฑฐ
if( answer.length >= 16 ){
answer = answer.substring( 0, 15 )
removeLastdot()
}
// 7. ๊ธธ์ด๊ฐ 2์ ์ดํ๋ฉด ๊ธธ์ด๊ฐ 3์ด ๋ ๋ ๊น์ง ์์ด๋์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ๋ฐ๋ณต
if ( answer.length <= 2 ) {
answer = answer.padEnd( 3, answer[ answer.length -1 ] )
}
return answer
}
// ๋ฐฐ์ด๊ณผ filter(), slice(), padEnd(), concat()์ ์ฌ์ฉํ ํ์ด
const filter = 'qwertyuiopasdfghjklzxcvbnm1234567890-_.';
function solution(new_id) {
// 1. ๋ชจ๋ ๋๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ์นํ
new_id = new_id.toLowerCase().split("")
// 2. ์ํํซ ์๋ฌธ์, ์ซ์, -, _, . ์ ์ ์ธํ ๋๋จธ์ง ๋ชจ๋ ๋ฌธ์๋ฅผ ์ ๊ฑฐ
let answer = new_id.filter( str => {
return filter.includes( str )
})
// 3. ๋ง์นจํ(.)๊ฐ ๋ ๋ฒ ์ด์ ์ฐ์๋๋ค๋ฉด ํ๋์ ๋ง์นจํ๋ก ์นํ
answer = answer.filter( (str , i) => {
return str !== "." || (str === "." && answer[i+1] !== "." )
})
// 4. ๋ง์นจํ(.)๊ฐ ์ฒ์์ด๋ ๋์ ์์นํ๋ค๋ฉด ์ ๊ฑฐ
if( answer[0] === "."){
answer = answer.slice( 1 )
}
function removeLastDot(){
if ( answer[answer.length -1] === "." ){
answer = answer.slice( 0, answer.length-1 )
}
}
removeLastDot()
// 5. ๋น ๋ฌธ์์ด์ด๋ฉด ์๋ฌธ์ a ๋์
if ( answer.length === 0 ) {
answer.push("a")
}
// 6. ๊ธธ์ด๊ฐ 16์ ์ด์์ด๋ฉด ์ฒซ 15๊ฐ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฌธ์๋ฅผ ๋ชจ๋ ์ ๊ฑฐ,
// ์ ๊ฑฐ ํ ์์ด๋ ๋์ .์ด ์๋ค๋ฉด ๋ง์นจํ(.)๋ฅผ ์ ๊ฑฐ
if (answer.length >= 16){
answer = answer.slice ( 0, 15 )
removeLastDot()
}
// 7. ๊ธธ์ด๊ฐ 2์ ์ดํ๋ฉด ๊ธธ์ด๊ฐ 3์ด ๋ ๋ ๊น์ง ์์ด๋์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ๋ฐ๋ณต
if (answer.length <= 2){
const add = new Array( 3 - answer.length ).fill(answer[ answer.length-1 ] )
answer = answer.concat( add )
// answer = [...answer, ...add]
}
return answer.join("")
}
ํธ๋ฆฌ๊ฑฐ(trigger)
: ํ
์ด๋ธ์ ๋ํ ์ด๋ฒคํธ์ ๋ฐ์ํด ์๋์ผ๋ก ์คํ๋๋ ์์
์ผ๋ก ๋ฐ์ดํฐ ๊ด๋ฆฌ ์๋ํ์ ์ฃผ๋ก ์ฐ์, ๐ฌย โA๊ฐ ๋๋๋ฉด B ์คํํด์ค~โ ex) ๋ก๊ทธ ๊ธฐ๋กํ๊ธฐ, ๊ฐ๋จํ ํต๊ณ ๋ด๊ธฐ
ํ๋ก์์ (procedure)
: DB์์ ํจ์ ๋ง๋ค๊ธฐ ex) ๋๋ฏธ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐBigQuery
: ๋ฐ์ดํฐ ๋ค ์ฌ๊ธฐ๋ค๊ฐ ๋ฃ๋๋ค<aside> ๐ก ์ต๊ทผ์๋ ๊ฐ๊ธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ชฝ์์ ํธ๋ฆฌ๊ฑฐ๋ ํ๋ก์์ ๋ฅผ ๋ง๋ ๋ค!
</aside>
product
์ entities
์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ์คํ๋๋ ํจ์๋ฅผ ์๋ํ subscriber
๋ฅผ ์์ฑ// src/apis/products/entities/product.subscriber.ts
import { Connection, EntitySubscriberInterface, InsertEvent } from 'typeorm'
import { Product } from './product.entity'
@EventSubscriber()
export class ProductSubscriber implements EntitySubscriberInterface<Product> {
constructor(connection: Connection){
// ProductSubscriber๋ฅผ ๋ฃ์ด์ db์ ์ฐ๊ฒฐํด์ค๋ค
connection.subscribers.push(this)
}
// Product ํ
์ด๋ธ์ ๋ฆฌ์จํ๋ค
listenTo(){
return Product
}
afterInsert( event: InsertEvent<Product> ){
console.log(event)
}
}