์ค์๊ฐ์ผ๋ก ์ผ๊ตฌ ๊ฒฝ๊ธฐ๋ฅผ ๋ณด๋ฉฐ ํฌ๋ค๊ณผ ์ํตํ๋ ํ๋ซํผ ํ๋ก ํธ์๋ ๐ฅ
์ฃผ์ ๊ธฐ๋ฅ โข ์ค์น ๊ฐ์ด๋ โข ํ๋ก์ ํธ ๊ตฌ์กฐ โข ๊ฐ๋ฐ ๊ฐ์ด๋
BLC Frontend๋ Vue.js 3๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์ผ๊ตฌ ํฌ๋ค์ ์ํ ์ค์๊ฐ ์ํต ํ๋ซํผ์ ํ๋ก ํธ์๋์ ๋๋ค. ํ๋์ ์ธ SPA(Single Page Application) ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ๐ฑ ๋ฐ์ํ ๋์์ธ - ๋ชจ๋ฐ์ผ๋ถํฐ ๋ฐ์คํฌํฑ๊น์ง ์๋ฒฝ ์ง์
- โก ์ค์๊ฐ ํต์ - Socket.io๋ฅผ ํตํ ์ฆ์ ๋ฉ์์ง ์ ์ก
- ๐จ ํ๋ณ ๋ธ๋๋ฉ - ๊ฐ ์ผ๊ตฌํ์ ๊ณ ์ ์์๊ณผ ๋ก๊ณ ์ ์ฉ
- ๐ ์ํ ๊ด๋ฆฌ - Pinia๋ฅผ ํ์ฉํ ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ
- ๐ ์ค์๊ฐ ์ค์ฝ์ด ๋ฐ ์ด๋ ์ ๋ณด
- ๐ ๊ฐ ํ์ ๋ก๊ณ ์ ๋ธ๋๋ฉ ์์ ํ์
- โฐ ๊ฒฝ๊ธฐ ์ํ (LIVE, ์ข ๋ฃ, ์์ ) ์ค์๊ฐ ์ ๋ฐ์ดํธ
- ๐ ์ธ๊ธฐ ๊ฒฝ๊ธฐ ์์ ๋ฐ ์์ฒญ์ ์
- ๐ด ํํ ์์๋จ vs ๐ต ์์ ํ ์์๋จ ๋ ๋ฆฝ์ ์ธ ์ฑํ ๋ฐฉ
- โก ์ค์๊ฐ ๋ฉ์์ง ์ ์ก ๋ฐ ์์
- ๐ช ๋น ๋ฅธ ์์ ๋ฉ์์ง ํ ํ๋ฆฟ
- ๐ค ์ฌ์ฉ์๋ณ ๋ฉ์์ง ๊ตฌ๋ถ ํ์
- ๐ ๋ฉ์์ง ๊ธธ์ด ์ ํ ๋ฐ ์ ๋ ฅ ๊ฐ์ด๋
- ๐ฅ ๊ฒฝ๊ธฐ์ ์ฃผ์ ์๊ฐ๋ค์ ์ค์๊ฐ ์ ๋ฐ์ดํธ
- โพ ํฌ๊ตฌ๋ณ, ํ๊ตฌ๋ณ ์์ธ ์ํฉ ์ ๋ฌ
- ๐ ์๋ ์คํฌ๋กค ๋ฐ ์ต์ ์ ๋ณด ์ฐ์ ํ์
- ๐ ๊ฐ ํ์ ๊ณ ์ ์์ ํ ๋ง ์ ์ฉ
- ๐ผ๏ธ ํ ๋ก๊ณ ์ด๋ฏธ์ง ์ง์
- ๐ฑ ๋ชจ๋ฐ์ผ ์ต์ ํ๋ ํฐ์น ์ธํฐํ์ด์ค
- โก ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ๊ณผ ์ ํ ํจ๊ณผ
- Vue.js 3.3.0 - Composition API๋ฅผ ํ์ฉํ ๋ชจ๋ ํ๋ก ํธ์๋
- Vue Router 4.2.0 - SPA ๋ผ์ฐํ ๊ด๋ฆฌ
- Pinia 2.1.0 - ์ง๊ด์ ์ธ ์ํ ๊ด๋ฆฌ
- Axios 1.4.0 - HTTP ํด๋ผ์ด์ธํธ
- Socket.io Client 4.7.0 - ์ค์๊ฐ ์๋ฐฉํฅ ํต์
- Vue CLI 5.0 - ํ๋ก์ ํธ ๋น๋ ๋๊ตฌ
- ESLint - ์ฝ๋ ํ์ง ๊ด๋ฆฌ
- Prettier - ์ฝ๋ ํฌ๋งทํ
- CSS3 - ๋ฐ์ํ ์คํ์ผ๋ง
Node.js 16.0.0 ์ด์
npm 8.0.0 ์ด์ ๋๋ yarn 1.22.0 ์ด์
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/your-username/blc-project.git
cd blc-project/blc_frontend
# 2. ์์กด์ฑ ์ค์น
npm install
# 3. ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run serve๐ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080 ์ ์
# ๊ฐ๋ฐ ์๋ฒ ์คํ (ํซ ๋ฆฌ๋ก๋ ํฌํจ)
npm run serve
# ํ๋ก๋์
๋น๋
npm run build
# ESLint๋ก ์ฝ๋ ๊ฒ์ฌ
npm run lint
# ESLint๋ก ์ฝ๋ ์๋ ์์
npm run lint:fix
# Prettier๋ก ์ฝ๋ ํฌ๋งทํ
npm run formatblc_frontend/
โโโ ๐ public/
โ โโโ ๐ images/
โ โ โโโ ๐ teams/ # ํ ๋ก๊ณ ์ด๋ฏธ์ง
โ โ โโโ doosan.png # ๋์ฐ ๋ฒ ์ด์ค
โ โ โโโ lg.png # LG ํธ์์ค
โ โ โโโ ...
โ โโโ index.html
โโโ ๐ src/
โ โโโ ๐ components/
โ โ โโโ ๐ common/
โ โ โ โโโ Header.vue # ๊ณตํต ํค๋
โ โ โโโ ๐ game/
โ โ โ โโโ GameCard.vue # ๊ฒฝ๊ธฐ ์นด๋
โ โ โ โโโ GameStatus.vue # ๊ฒฝ๊ธฐ ์ํ
โ โ โ โโโ RankingSection.vue # ์ธ๊ธฐ ์์
โ โ โโโ ๐ chat/
โ โ โ โโโ TeamChatSection.vue # ํ๋ณ ์ฑํ
๋ฉ์ธ
โ โ โ โโโ TeamChatInput.vue # ์ฑํ
์
๋ ฅ
โ โ โ โโโ ChatMessage.vue # ์ฑํ
๋ฉ์์ง
โ โ โโโ ๐ commentary/
โ โ โโโ LiveCommentary.vue # ์ค์๊ฐ ๋ฌธ์์ค๊ณ
โ โ โโโ CommentaryItem.vue # ์ค๊ณ ์์ดํ
โ โโโ ๐ views/
โ โ โโโ Home.vue # ๋ฉ์ธ ํ์ด์ง
โ โ โโโ GameDetail.vue # ๊ฒฝ๊ธฐ ์์ธ ํ์ด์ง
โ โโโ ๐ stores/
โ โ โโโ game.js # ๊ฒฝ๊ธฐ ์ํ ๊ด๋ฆฌ
โ โ โโโ chat.js # ์ฑํ
์ํ ๊ด๋ฆฌ
โ โ โโโ commentary.js # ๋ฌธ์์ค๊ณ ์ํ ๊ด๋ฆฌ
โ โโโ ๐ utils/
โ โ โโโ teamUtils.js # ํ ์ ๋ณด ์ ํธ๋ฆฌํฐ
โ โโโ ๐ router/
โ โ โโโ index.js # ๋ผ์ฐํฐ ์ค์
โ โโโ ๐ assets/
โ โ โโโ ๐ styles/
โ โ โโโ main.css # ๊ธ๋ก๋ฒ ์คํ์ผ
โ โโโ App.vue # ๋ฃจํธ ์ปดํฌ๋ํธ
โ โโโ main.js # ์ฑ ์ง์
์
โโโ package.json # ํ๋ก์ ํธ ์ค์
โโโ vue.config.js # Vue CLI ์ค์
โโโ README.md # ํ๋ก์ ํธ ๋ฌธ์
-
์ด๋ฏธ์ง ์ค๋น
- ๊ถ์ฅ ํฌ๊ธฐ: 100x100px - ํ์: PNG (ํฌ๋ช ๋ฐฐ๊ฒฝ ๊ถ์ฅ) - ํ์ผ๋ช : ํ๋ช .png (์: doosan.png) -
์ด๋ฏธ์ง ์ ์ฅ ์์น
public/images/teams/ โโโ doosan.png # ๋์ฐ ๋ฒ ์ด์ค โโโ lg.png # LG ํธ์์ค โโโ samsung.png # ์ผ์ฑ ๋ผ์ด์จ์ฆ โโโ kia.png # ๊ธฐ์ ํ์ด๊ฑฐ์ฆ โโโ lotte.png # ๋กฏ๋ฐ ์์ด์ธ์ธ โโโ nc.png # NC ๋ค์ด๋ ธ์ค โโโ hanwha.png # ํํ ์ด๊ธ์ค โโโ kt.png # KT ์์ฆ โโโ ssg.png # SSG ๋๋์ค โโโ kiwoom.png # ํค์ ํ์ด๋ก์ฆ -
ํ ์ ๋ณด ์ค์
// src/utils/teamUtils.js์์ ํ ์์ ๋ฐ ์ ๋ณด ์์ export const TEAM_INFO = { ๋์ฐ: { name: '๋์ฐ ๋ฒ ์ด์ค', image: '/images/teams/doosan.png', color: '#131230', // ๋ฉ์ธ ์์ bgColor: '#f8f9ff' // ๋ฐฐ๊ฒฝ ์์ }, // ... ๋ค๋ฅธ ํ๋ค }
- ๊ฒฝ๊ธฐ ๋ชฉ๋ก ๋ฐ ์ธ๊ธฐ ์์ ํ์
- ๊ฐ ๊ฒฝ๊ธฐ ์นด๋ ํด๋ฆญ ์ ์์ธ ํ์ด์ง๋ก ์ด๋
- ๊ฒฝ๊ธฐ ์์ธ ์ ๋ณด ๋ฐ ์ค์๊ฐ ์ฑํ
- ๋ฌธ์์ค๊ณ์ ํ๋ณ ์ฑํ ์ ๋์ ํ์
<TeamChatSection
:gameId="gameId"
:game="gameData"
/><TeamChatInput
:selectedTeam="selectedTeam"
:homeTeam="homeTeam"
:awayTeam="awayTeam"
:homeColor="homeColor"
:awayColor="awayColor"
@sendMessage="handleMessage"
/><ChatMessage
:message="messageData"
:teamColor="teamColor"
/>// ๊ฒฝ๊ธฐ ๊ด๋ จ ์ํ ๊ด๋ฆฌ
const gameStore = useGameStore()
// ์ฌ์ฉ ์์
gameStore.fetchGames() // ๊ฒฝ๊ธฐ ๋ชฉ๋ก ์กฐํ
gameStore.fetchGameDetail(id) // ๊ฒฝ๊ธฐ ์์ธ ์กฐํ
gameStore.cheerForTeam(id, team) // ํ ์์// ์ฑํ
๊ด๋ จ ์ํ ๊ด๋ฆฌ
const chatStore = useChatStore()
// ์ฌ์ฉ ์์
chatStore.connectToGame(gameId, gameData) // ์ฑํ
๋ฐฉ ์ฐ๊ฒฐ
chatStore.setSelectedTeam('home') // ์์ํ ์ ํ
chatStore.sendMessage(content, team) // ๋ฉ์์ง ์ ์ก
chatStore.disconnect() // ์ฐ๊ฒฐ ํด์ // ๋ฌธ์์ค๊ณ ๊ด๋ จ ์ํ ๊ด๋ฆฌ
const commentaryStore = useCommentaryStore()
// ์ฌ์ฉ ์์
commentaryStore.fetchCommentaries(gameId) // ์ค๊ณ ๋ด์ฉ ์กฐํ
commentaryStore.addCommentary(data) // ์ ์ค๊ณ ์ถ๊ฐ/* ๋ฉ์ธ ์ปฌ๋ฌ */
--primary-blue: #2c5aa0;
--primary-dark: #1e3a5f;
/* ์ํ ์ปฌ๋ฌ */
--live-red: #ff4757;
--success-green: #2ed573;
--warning-orange: #ffa502;
/* ๊ทธ๋ ์ด ์ค์ผ์ผ */
--gray-100: #f8f9fa;
--gray-300: #e9ecef;
--gray-600: #666666;
--gray-900: #333333;/* ๋ชจ๋ฐ์ผ */
@media (max-width: 768px) { ... }
/* ํ๋ธ๋ฆฟ */
@media (min-width: 769px) and (max-width: 1024px) { ... }
/* ๋ฐ์คํฌํฑ */
@media (min-width: 1025px) { ... }- Vue 3 Essential ๊ท์น ์ ์ฉ
- Prettier์ ํตํฉ๋ ํฌ๋งทํ
- console.log ํ์ฉ (๊ฐ๋ฐ ๋จ๊ณ)
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 80,
"bracketSpacing": true,
"arrowParens": "avoid"
}- ์ ์ ํ ํด๋์
.vueํ์ผ ์์ฑ <template>,<script setup>,<style scoped>๊ตฌ์กฐ ์ฌ์ฉ- props์ emits ๋ช ํํ ์ ์
- Prettier ๊ท์น ์ค์
stores/ํด๋์ ์ ์คํ ์ด ํ์ผ ์์ฑdefineStore๋ฅผ ์ฌ์ฉํ Pinia ์คํ ์ด ์ ์state,getters,actions๊ตฌ์กฐ ์ค์
scoped์คํ์ผ ์ฌ์ฉ ๊ถ์ฅ- CSS ๋ณ์ ํ์ฉํ ์ผ๊ด๋ ์์
- ๋ฐ์ํ ๋์์ธ ๊ณ ๋ ค
- ํ๋ณ ์์์
teamUtils.jsํ์ฉ
npm run build๋น๋๋ ํ์ผ์ dist/ ํด๋์ ์์ฑ๋ฉ๋๋ค.
- Netlify - ์ ์ ์ฌ์ดํธ ํธ์คํ
- Vercel - SPA ์ต์ ํ ๋ฐฐํฌ
- GitHub Pages - ๋ฌด๋ฃ ํธ์คํ
- AWS S3 + CloudFront - ์ํฐํ๋ผ์ด์ฆ ๋ฐฐํฌ
# ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ฐฑ์๋ ์๋ฒ ํ์ธ ํ ์ฐ๊ฒฐ ์ค์ ์์
// src/stores/chat.js์์ ์๋ฒ URL ํ์ธ# ํด๊ฒฐ ๋ฐฉ๋ฒ: public/images/teams/ ํด๋์ ์ด๋ฏธ์ง ํ์ผ ์กด์ฌ ํ์ธ
# ํ์ผ๋ช
์ด teamUtils.js์ ์ผ์นํ๋์ง ํ์ธ# ์์กด์ฑ ์ฌ์ค์น
rm -rf node_modules package-lock.json
npm install- ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์์คํ
- ์ฑํ ๋ฉ์์ง ํํฐ๋ง
- ์ด๋ชจ์ง ๋ฐ์ ๊ธฐ๋ฅ
- PWA (Progressive Web App) ์ง์
- ์ค์๊ฐ ๋น๋์ค ์คํธ๋ฆฌ๋ฐ ์ฐ๋
- AI ๊ธฐ๋ฐ ๊ฒฝ๊ธฐ ์์ธก
- ์์ ๋ฏธ๋์ด ์ฐ๋
- ๋ค๊ตญ์ด ์ง์
- ์ด ์ ์ฅ์๋ฅผ Fork
- Feature ๋ธ๋์น ์์ฑ (
git checkout -b feature/amazing-feature) - ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐ (
git commit -m 'Add amazing feature') - ๋ธ๋์น์ Push (
git push origin feature/amazing-feature) - Pull Request ์์ฑ
- Vue 3 Composition API ์ฌ์ฉ
- ESLint + Prettier ๊ท์น ์ค์
- ์ปดํฌ๋ํธ๋ช ์ PascalCase
- ํ์ผ๋ช ์ PascalCase.vue
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ผ์ค ํ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
Frontend Developer: Your Name
๊ธฐ์ ์คํ: Vue.js, JavaScript, CSS3, Pinia, Socket.io
โพ ์ผ๊ตฌ๋ฅผ ์ฌ๋ํ๋ ๋ชจ๋ ํฌ๋ค์ ์ํ ํ๋ซํผ โพ
Made with โค๏ธ and โ by BLC Team