...

static
static ๋ฏธ๋ค์จ์ด๋ express์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋ฏธ๋ค์จ์ด์ด๋ฉฐ express ๊ฐ์ฒด ์์์ ๊บผ๋ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
app.use('์์ฒญ ๊ฒฝ๋ก', express.static('์ค์ ๊ฒฝ๋ก'));
app.use('/', express.static(path.join(__dirname, 'public')));
๊ธฐ๋ณธ ๊ฒฝ๋ก์ธ / ๋ก ์์ ๋, express๋ public ํด๋ ์์ ์๋ ํด๋น ๊ฒฝ๋ก์ ํ์ผ์ ์ฐพ๋๋ค.
์ฆ https://localhost:3000/css/style.css ์ ๊ฐ์ ์์ฒญ์ ํ๊ฒ ๋๋ฉด, ์ค์ static์์ ๋ฐํํ๋ ํ์ผ์ ./public/css/style.css๊ฐ ๋๋ค.
public ๋๋ ํ ๋ฆฌ ์๋์ ์๋ ๋ค์๊ณผ ๊ฐ์ ํด๋์ ํ์ผ๋ค์
Express/public/index.html
Express/public/css/style.css
Express/public/js/main.js
Express/public/css/style.css
์๋์ ๊ฐ์ ๊ฒฝ๋ก๋ก ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
http://localhost:3000/index.html
http://localhost:3000/css/style.css
http://localhost:3000/js/main.js
http://localhost:3000/css/style.css
์ด ๊ฒฝ์ฐ ์ค์ ์๋ฒ์ ํด๋ ๊ฒฝ๋ก์๋ public์ด ๋ค์ด ์๋๋ผ๋ ์์ฒญ ์ฃผ์์๋ public์ด ๋ค์ด ์์ง ์๋ค.
์๋ฒ์ ํด๋ ๊ฒฝ๋ก์ ์์ฒญ ๊ฒฝ๋ก๊ฐ ๋ค๋ฅด๋ฏ๋ก ์ธ๋ถ์ธ์ด ์๋ฒ์ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ณด์์ ํฐ ๋์์ด ๋๋ค.
ํ์ง๋ง public์ ์๋์ ์ ๋ช ํ๋, public-3030 ๊ฐ์ด ์จ์ ์๋ฒ ๊ตฌ์กฐ์ ๋ํ ๋ณด์์ ์ ๊ฒฝ์ ์จ์ค๋ค.
๋ํ ์ ์ ํ์ผ๋ค์ ์์์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ผ์ผํ fs.readFile๋ก ํ์ผ์ ์ง์ ์ฝ์ด์ ์ ์กํ ํ์๊ฐ ์๋ค.
๋ง์ฝ ์์ฒญ ๊ฒฝ๋ก์ ํด๋นํ๋ ํ์ผ์ด ์์ผ๋ฉด ์์์ ๋ด๋ถ์ ์ผ๋ก next๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฌ๋ ํ์ผ์ ๋ฐ๊ฒฌํ๋ค๋ฉด ๋ค์ ๋ฏธ๋ค์จ์ด๋ ์คํ๋์ง ์๋๋ค. ์๋ต์ผ๋ก ํ์ผ์ ๋ณด๋ด๊ณ next๋ฅผ ํธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
// ๋ง์ผ publicํด๋์์ index.png๋ผ๋ ์ฌ์ง ํ์ผ์ด ์๊ณ , ์ฌ์ฉ์๊ฐ localhost:3000/index.png ์์ฒญ์ ํ๋ค๋ฉด
app.use(morgan('dev')); // get 200 ~ ์์ฒญ ๋ก๊ทธ๊ฐ ์ฐํ๋ค.
app.use('/', express.static(path.join(__dirname, 'public'))); // static๊ฒฝ๋ก๋ก์ pngํ์ผ์ ์ ๊ณตํ๊ณ ๋๋๋ค. ์ฆ, next()๋ฅผ ์ํด๋ฒ๋ฆฐ๋ค.
app.use(express.json()); // ๋ฏธ๋ค์จ์ด ์คํ์ด ์๋๋ค.
app.use(express.urlencoded({ extended: false })); // ๋ฏธ๋ค์จ์ด ์คํ์ด ์๋๋ค.
app.use(cookieParser(process.env.COOKIE_SECRET)); // ๋ฏธ๋ค์จ์ด ์คํ์ด ์๋๋ค.
// ๋ง์ผ publicํด๋์์ about์ด๋ผ๋ ๊ฒฝ๋ก๊ฐ ์๊ณ , ์ฌ์ฉ์๊ฐ localhost:3000/about ์์ฒญ์ ํ๋ค๋ฉด
app.use(morgan('dev')); // get 200 ~ ์์ฒญ ๋ก๊ทธ๊ฐ ์ฐํ๋ค.
app.use('/', express.static(path.join(__dirname, 'public'))); // ๊ฒฝ๋ก์ about์ด ์์ผ๋ next()๋ฅผ ํ๋ค.
app.use(express.json()); // next()๋ฅผ ํ๋ค.
app.use(express.urlencoded({ extended: false })); // next()๋ฅผ ํ๋ค.
app.use(cookieParser(process.env.COOKIE_SECRET)); // next()๋ฅผ ํ๋ค.
app.get('/about', (req, res) => {
// ... ์คํ ๋๋ค.
}
express.static ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ ์ ์ ํ์ผ์ ์ ๊ณตํ ๋ next ๋์ res.sendFile ๋ฉ์๋๋ก ์๋ต์ ๋ณด๋ธ๋ค.
๋ฐ๋ผ์ ์ ์ ํ์ผ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๊ทธ ๋ค์ ๋ฏธ๋ค์จ์ด๋ค์ ์คํ๋์ง ์๋๋ค.
๋ฏธ๋ค์จ์ด ํ์ฅ๋ฒ
[๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ํ์ด์ง๋ทฐ ์ค์ ]
๋ก๊ทธ์ธ ํ ํด๋ผ์ฐ๋์๊ฒ๋ ํน์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์๋๋ฉด ์๋ณด์ฌ์ฃผ๋ ํ์์ ๋ง๋ค์ด๋ณด์.
app.use(morgan('dev');
app.use(cookieParser(process.env.COOKIE_SECRET);
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
// ์ผ๋ถ๋ฌ ์๋ ๋๋ค.
app.use('/', (req, res, next) => {
// ๋ฏธ๋ค์จ์ด ์์๋ค ๋๋ค.
if (req.session.id) // ์ธ์
์์ด๋๊ฐ ์๋ค๋ฉด (๋ก๊ทธ์ธ ์ํ๋ผ๋ฉด)
express.static(path.join(__dirname, 'public'))(req, res, next); // public์์ ์์
์ ๋ณด์ฌ์ค๋ค
else // ์ธ์
์์ด๋๊ฐ ์๋ค๋ฉด
next(); // ๋ค์ ๋ฏธ๋ค์จ์ด ์คํ
}
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use ์์์ ๋ฃ๋ ์ฝ๋ฐฑํจ์๋ ๋ธ๋ก ๋ด์์, ์ต์คํ๋ ์ค๊ฐ ์์์ (req, res, next)๋ฅผ ๋ถ์ฌ ํธ์ถํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ฏธ๋ค์จ์ด ์์ ๋๋ express.static์ ๋๊ฐ ๋ฐ๋ก (req, res, next)๋ฅผ ๋ถ์ด๋ ๊ฒ ์์ผ๋ฏ๋ก ์ง์ (req, res, next)๋ฅผ ๋ถ์ฌ ํธํด์ผ ํ๋ค.
express.static(path.join(__dirname, 'public'))(req, res, next);
์ฐธ๊ณ ๋ก (req, res, next) => { ... }๋ app.use ์์ ๋ฃ์์ผ๋ฏ๋ก ์ต์คํ๋ ์ค๊ฐ (req, res, next)๋ฅผ ๋ถ์ฌ ํธ์ถ ํ๋ ํํ์ด๋ค.
Reference
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.