π‘ νλͺ : FLOrida
- λͺ¨ν°λΈλ‘ ν μ¬μ΄νΈ : https://www.music-flo.com/
- FE : κΉμ§μ κΉμΆ©λ§ μμ§μ μ΅μΉμ²
- BE : κΉκ΅μ μ΄μ ν¬
- κ°λ°κΈ°κ° : 9/19(μ) ~ 9/30(λͺ©) 14:00 (12μΌ)
μ¬μ©ν κΈ°μ μ€ν
FE :JavaScript
React.js
styled-component
react-h5-audio-player
MUI
λ±
BE :JavaScript
Node.js
MySQL
Express.js
jwt
bcrypt
λ±
JUSTCODE κ³Όμ μμ μ§νλ 2μ°¨ ν νλ‘μ νΈμ λλ€.
μ΄ νλ‘μ νΈλ νμ₯μ λ°λ‘ μκ³ FE μ΄ 4λͺ , BE 2λͺ μΌλ‘ μ΄λ£¨μ΄μ§ νμΌλ‘ μ§ννμ΅λλ€.
μ²μμ μ μ·¨λ―Έκ° μμ κ°μμ΄λΌ μμ νλ μ΄μ΄ λ° κ°μΈ νλ μ΄λ¦¬μ€νΈ κ΄λ¦¬ λ±μ κΈ°λ₯μ ν΄λ³΄κ³ μΆκΈ°λ νκ³ , 1μ°¨ νλ‘μ νΈλ³΄λ€ κΈ°λ₯λ λ€μνκΈ° λλ¬Έμ μ μνκ³ νμλΆλ€λ λͺ¨λ λμν΄ μ£Όμ μ FLO μ¬μ΄νΈλ₯Ό λͺ¨ν°λΈλ‘ μ μνκ² λμμ΅λλ€.
μ¬κΈ°μ λͺ¨ν°λΈλ‘ μ μνμλ€λ 건, λκ΅°κ°μ μ½λλ₯Ό κ·Έλλ‘ λ³΅μ¬ λΆμ¬λ£κΈ° ν κ²μ΄ μλ νμ΄μ§μ ꡬ쑰λ₯Ό μ°Έκ³ νμ¬ μ§μ μ½λλ₯Ό μμ±νκ²μ λ»ν©λλ€.
μ κ° λ§‘μ λΆλΆμ μλ²κ° μ΄λ €μμ λ 촬μνμ¬ μ νλΈμ μ λ‘λνμ΅λλ€.
μμ
νλ μ΄μ΄λ react-h5-audio-player
λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ μμ
νμ΅λλ€.
νμ¬ μ¬μλͺ©λ‘μ stateμ μΈμ μ€ν 리μ§μ μ μ₯νμ¬ κ΄λ¦¬νμ΅λλ€.
μΈμ μ€ν 리μ§λ‘λ κ΄λ¦¬νμ¬ λ§μ΄νΈ μ μΈμ μ€ν 리μ§μμ νμ¬ μ¬μλͺ©λ‘μ κ°μ Έμ€κΈ° λλ¬Έμ μλ‘κ³ μΉ¨μ ν΄λ νμ¬ μ¬μλͺ©λ‘μ΄ μ μ§λ©λλ€.
μ ν κΈ°λ₯μ λΌμ΄λΈλ¬λ¦¬μ μ‘΄μ¬νμ§ μμμ μ§μ ꡬννμ΅λλ€.
const shuffleMusic = () => {
if (JSON.parse(sessionStorage.getItem('tracks')).length !== 0) {
const randomTracks = [...musicTracks].sort(() => Math.random() - 0.5);
if (randomTracks[0] === musicTracks[0]) {
let lastIndex = randomTracks.length - 1;
let randomValue = Math.floor(Math.random() * (lastIndex - 1) + 1);
const temp = randomTracks[0];
randomTracks[0] = randomTracks[lastIndex];
randomTracks[lastIndex] = temp;
}
setMusicTracks(randomTracks);
}
};
array.sort
λ©μλλ₯Ό ν΅ν΄ λλ€νκ² νμ¬ μ¬μλͺ©λ‘μ λ€μκ³ , 첫 λ²μ§Έ κ³‘μ΄ λ°λμ§ μμμ κ²½μ° μ²« λ²μ§Έ 곑μ λ λλ€ν μΈλ±μ€μ μμΉνκ² νλλ‘ λ‘μ§μ ꡬννμ΅λλ€.
곑μ λ€μ€μΌλ‘ μ νν΄ νμ¬ μ¬μλͺ©λ‘μμ μμ λ° νλ μ΄ λ¦¬μ€νΈμ μΆκ°ν μ μλλ‘ κ΅¬ννμ΅λλ€.
곑μ μ ννμ λ, λ°°μ΄μ 곑μ IDλ₯Ό λ΄μ stateλ‘ κ΄λ¦¬νμ¬ μμ λ° λ°±μλλ‘ μ λ¬(보κ΄ν¨μ μΆκ°) ν μ μλ λ‘μ§μ λλ€.
μ¬μ μ€μΈ 곑μ λ°κΎΈλ €λ©΄ μΈλ±μ€ κ°μ λ³κ²½ν΄μΌ ν©λλ€.
κ·Έλ°λ° κ²μμ νλ©΄ λ°°μ΄μ κΈΈμ΄κ° μ€μ΄λ€κΈ° λλ¬Έμ 곑μ ν΄λ¦νλ©΄ μλ μ¬μλͺ©λ‘μ μΈλ±μ€μ ν΄λΉνλ κ³‘μ΄ μ€νλμ΄λ²λ¦½λλ€.
κ·Έλμ μκ°ν κ²μ΄ κ²μ κΈ°λ₯μ ν΅ν΄ νν°λ§λ 곑λ€μ 곑 urlμ λΉ λ¬Έμμ΄λ‘ μ€μ ν΄λ²λ € λΉ λ¬Έμμ΄μ κ°μ§ 곑λ€μ μΆλ ₯λμ§ μκ² λ‘μ§μ ꡬννμ΅λλ€.
μμ 곑 μ ν λ‘μ§κ³Ό λκ°μ΅λλ€. νλ μ΄λ¦¬μ€νΈ IDλ₯Ό λ°°μ΄μ μ μ₯νμ¬ stateλ‘ κ΄λ¦¬ν©λλ€.
const playSongs = () => {
if (playlistSongs[0].songTitle) {
fetch(`νλ μ΄λ¦¬μ€νΈμμ²URL`, {
headers: {
Authorization: sessionStorage.getItem('token'),
},
})
.then(res => res.json())
.then(plData => {
const musicTracksId = musicTracks.map(el => el.songId);
const filteredNewTracks = plData.filter(
(el, i) => musicTracksId.includes(el.songId) === false
);
setMusicTracks([...filteredNewTracks, ...musicTracks]);
setAlertOn('νμ¬ μ¬μλͺ©λ‘μ μΆκ°λμμ΅λλ€. μ€λ³΅λ 곑μ μ μΈλ©λλ€.');
})
.catch(err => {
if (sessionStorage.getItem('token'))
setAlertOn(
'μ΄μ©κΆμ ꡬ맀ν΄μΌ μμ
μ¬μ μλΉμ€λ₯Ό μ΄μ©νμ€ μ μμ΅λλ€.'
);
});
}
};
μ 체 μ¬μ λ²νΌμ λλ₯΄λ©΄ ν΄λΉ νλ μ΄λ¦¬μ€νΈμ 곑λ€μ μμ²ν©λλ€.
κ·Έλ¦¬κ³ νλ μ΄λ¦¬μ€νΈμ λͺ¨λ 곑λ€μ λ°μ λ΄ νμ¬ νλ μ΄λ¦¬μ€νΈμ μλ 곑λ€μ μμ΄λλ₯Ό ν΅ν΄ λΉκ΅ν΄ μ€λ³΅λμ§ μλ 곑λ€λ§ μΆκ°νλλ‘ λ‘μ§μ ꡬννμ΅λλ€.
μ¬μ λ²νΌμ λλ₯΄λ©΄ νμ¬ νλ μ΄λ¦¬μ€νΈμ μ€λ³΅λλ κ³‘μ΄ μλ€λ©΄ μΆκ°νμ§ μλλ‘ κ΅¬ννμ΅λλ€.
λ°λ νλ μ΄λ¦¬μ€νΈμ κ°μ λ°±μΌλ‘ μ λ¬νκ³ λ°λ‘ λ°μν©λλ€. λν useRef
μ focus
λ©μλλ₯Ό ν΅ν΄ μμ λ²νΌ ν΄λ¦ μ, λ°λ‘ ν¬μ»€μ± λλλ‘ μ€μ νμ΅λλ€.
μλ¦Ό μ°½ μ»΄ν¬λνΈλ₯Ό λ§λ€μ΄ setAlert(βλ©μΈμ§β) λ₯Ό ν΅ν΄ μνλ λ©μΈμ§λ₯Ό μΆλ ₯ν μ μλλ‘ νμ΅λλ€.
alert μ»΄ν¬λνΈλ λνλ λ€ 3μ΄ νμ μλμΌλ‘ μ¬λΌμ§λλ€.
κ·Έ μΈ νμ¬ μ¬μλͺ©λ‘ μ€λ³΅ λ°©μ§ λ° λ€μ€ μ ν κΈ°λ₯μ λμΌν©λλ€.
λ°μ΄ν°λ₯Ό λΆλ¬μ€κΈ° μ κΉμ§ λ‘λ© μ»΄ν¬λνΈκ° λΉ νλ©΄ λμ μΆλ ₯λλλ‘ νκ³ λ€λ₯Έ λͺ¨λ νμ΄μ§μ μ μ©νμ΅λλ€.
λμ€μ μκ°μ΄ λλ€λ©΄ μ€μΌλ ν€μΌλ‘λ ꡬνν΄ λ³΄κ³ μΆμ΅λλ€.
νλ‘μ νΈ μμ μ , ν°μΌ λΆλ°°μ μ€ν¨ν΄ κ°μ’ μμΈνμ΄μ§, μΈκΈ° μ°¨νΈλ₯Ό λ§‘μΌμ λΆμ΄ ν°μΌμ λ무 λ§μ΄ λ§‘κ² λμ΄ μ‘°κΈ λ λΆμ μ ν΄μ 보κ΄ν¨ μμΈνμ΄μ§λ μ κ° λ§‘κ² λμκ³ μΈκΈ° μ°¨νΈλ λ€λ₯Έ ν λΆμ΄ λ§‘κ² λμμ΅λλ€.
보κ΄ν¨ μμΈνμ΄μ§λ₯Ό ꡬννκ² λ μ°¨λ‘κ° λμ΄μ μμ μ»΄ν¬λνΈλ₯Ό μ¬νμ©ν΄μΌν μ§, μλλ©΄ μ΄λ»κ² ν΄μΌ ν μ§ ν μνλ€κ° μκ° κ΄κ³μ κ²°κ΅ κ°μ λ§λ€μ΄λμ μμ μ»΄ν¬λνΈμ μ κ° λ§λ μ¬μ λ‘μ§, λ€μ€ μ ν λ‘μ§, λ΄ λ¦¬μ€νΈμ μΆκ°, λ 보기 κΈ°λ₯ λ±μ κ·Έλλ‘ μ μ©νκΈ°λ‘ κ²°μ λμ΅λλ€.
λ¬Έμ μ μμ μ»΄ν¬λνΈ β
νμ§λ§ μ κ° λ§λ μ¬μ λ‘μ§, λ€μ€ μ ν, λ΄ λ¦¬μ€νΈ μΆκ°, λ 보기 λ±μ νμλ€μ μ»΄ν¬λνΈμ μ μ©νλ κ³Όμ μμ μκΈ°κ° λ₯μ³μμ΅λλ€.
μ μΆ μ λ μ΄ λμ΄μμΌ λ€λ₯Έ λΆλ€μ μ»΄ν¬λνΈμ μ λ‘μ§μ μ μ©νλ€ λ³΄λ μ무λλ μμ λ° λ³μ λͺ λ λ€λ₯΄κ³ μ»΄ν¬λνΈ κ΅¬μ‘° μ체λ λ¬λΌ μ μ©νκΈ°κ° μ½μ§ μμμ΅λλ€.
κ²°κ΅ κ±°μ λ°€μ μμ μ΄λ μ λ λλ§μΉκ³ λ°ν λΉμΌ μμΉ¨μ λ€μ νλ² μ λΉν΄ κ²°κ΅ μ±κ³΅μ μΌλ‘ μλνκΈ΄ νμ§λ§, νλ‘μ νΈλ₯Ό μμνκΈ° μ λ€ ν¨κ» μ¬μ΄νΈ μ 체 ꡬ쑰λ₯Ό νμ ν΄ μ¬νμ©ν μ»΄ν¬λνΈλ μ¬μ΄νΈ ꡬ쑰 λ±μ μκ°νκ³ μμνλ€λ©΄ μ’ λ μ’μ κ²°κ³Όκ° μμ§ μμμκΉ μΆμ΅λλ€.
1μ°¨ νλ‘μ νΈλ₯Ό μ§ννλ©΄μλ μλ§μ μλ¬λ₯Ό λ§μ£Όνμ§λ§, μ΄λ² νλ‘μ νΈμμλ μλ¬λΏλ§ μλλΌ μμ μμ±ν ν νμ κ°μ μκΈ°λ νΈλ¬λΈλ€λ κ²ͺμμ΅λλ€.
λλΆμ λ¬Έμ ν΄κ²° λ₯λ ₯λΏλ§ μλλΌ λ€μμ μ΄λ° νΈλ¬λΈμ κ²ͺμ§ μκΈ° μν΄ λ¬Έμ λ₯Ό μλ°©ν μ μλ λ₯λ ₯λ κ°μ§κ² λμμ΅λλ€.
μ¬μ€ μ΄λ² νλ‘μ νΈκΉμ§λ μ€λ‘μ§ κΈ°λ₯μ΄ μλνλ λ°μλ§ μμλ₯Ό λμ΄μ κ°λ μ±μ κ³ λ €νμ§ λͺ»νκ³ μ½λλ₯Ό μμ±νμ΅λλ€.
νμ§λ§ νλ‘μ νΈκ° λλκ³ μ μ½λλ₯Ό μ΄ν΄λ³΄λ νλμ λ€μ΄μ€μ§ μλλ€λ κ²μ μκ² λμμ΅λλ€. κ·Έλμ μ΄ νλ‘μ νΈκ° λλκ³ ν΄λ¦° μ½λλ₯Ό μμ±νλ λ°©λ²μ 곡λΆνκ³ μ μ κ°λ μ±λ κ³ λ €νλ©° μ½λ©ν μ μλ κ°λ°μκ° λμ΄κ°κ³ μλ μ€μ λλ€.