์๋น ! ์ค๋์ ์ด๋๊ฐ์? - ์ฌ์ฉ์ ์๋น์ค FE
์๋น์ค ๊ฐ์
์๋น์ค ๊ฐ๋ฐ ๊ณผ์
์๋น์ค ์ฃผ์ ๊ธฐ๋ฅ
"์๋น ! ์ค๋์ ์ด๋๊ฐ์?"๋ ์์ด์ ์ด๋ค ์ฅ์์ ๊ฐ์ผ ํ ์ง ๊ณ ๋ฏผํ๊ฑฐ๋, ๋
ธํค์ฆ์กด, ํธ์์์ค ๊ฒ์์ ์ง์ณ ์ธ์ถ์ ํฌ๊ธฐํ๋ ๋ถ๋ชจ๊ฐ ์๋
์ ๋ฐฉ๋ฌธํ๊ธฐ ์ข์ ์ฅ์(๋ฌธํ, ๋ง์ง, ๊ต์ก, ์๋ฐ ๋ฑ)๋ฅผ ์ง๋ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ํ ์ ์๋๋ก ํ ์๋น์ค์
๋๋ค.
์์ด์ ํจ๊ป ๊ฐ ์ฅ์๋ฅผ ์ฐพ๋ ์ฌ์ฉ์๊ฐ ์๋
๋ํ์ ํนํ๋ ์ฒดํ, ์ฌ๊ฐ, ์๋ฐ, ์์ฌ์ฅ์ ์ ๋ณด๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ป์ ์ ์์ต๋๋ค.
2022.10. ~ 2022. 12. (์ฝ 2๊ฐ์)
๐ ์๋น์ค ๊ฐ๋ฐ ๊ณผ์
์ปจ์คํ
๋ฐ ์ฌ์
๊ธฐํ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ํ๋ก์ ํธ ๊ธฐํ์์ ์์ฑํ์ต๋๋ค.
โ๏ธ์คํฌ๋ผ ๊ธฐ๋ฐ ํ๋ก์ ํธ ๋งค๋์ง
๋งค ์ฃผ ์คํ๋ฆฐํธ ํ์๋ฅผ ์งํํ๋ฉฐ ๊ฐ๋ฐ ์ํฉ์ ์ฒดํฌํ๊ณ ๋ชฉํ๋ฅผ ์ค์ ํ์ต๋๋ค.
์คํ๋ฆฐํธ ์ข
๋ฃ๋ง๋ค ์์
์ ํ๊ณ ํ ํ ์ฐจํ ์คํ๋ฆฐํธ ๊ณํ์ ์๋ฆฝํ์ต๋๋ค.
์คํ๋ฆฐํธ ๊ณํ
์คํ๋ฆฐํธ ํ๊ณ ๋ฐ ๋ฐ์ฑ
๋งค์ผ ๊ฐ๋ฐ ์ค ๊ฒช์๋ ์ด๋ ค์์ด๋ ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ฅผ TIL๋ก ์์ฑํ์ต๋๋ค.
๋ํ ๋งค ์ฃผ ์ฃผ๊ฐํ๊ณ ๋ฅผ ์์ฑํ๋ฉฐ ๊ฐ๋ฐ ์ง์ฒ๋๋ฅผ ํ์ธํ๊ณ ๋ค์ ์คํ๋ฆฐํธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ์ก์
ํ๋์ ์ธ์ ์ต๋๋ค.
โ๏ธ๊ฐ๋ฐ๋ฌธ์์ ํ
์คํธ ์์ฑ์ ํ ๋๋ก ๊ฐ๋ฐ ์งํ
1. ์๋น์ค ๊ธฐ๋ฅ ๋ชฉ๋ก list-up
๊ธฐํ์์ ๋ฐํ์ผ๋ก ์๋น์ค ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์์ฑํ์ต๋๋ค.
๋ชฉ๋ก์ ํตํด ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ๊ณผ ์์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ช
ํํ ํ์
ํ ์ ์์๊ณ , ๊ตฌํ์ด ๋ถ๊ฐํ๊ฑฐ๋ ์ค๋ณต๋๋ ๊ธฐ๋ฅ๋ค์ ๋ํ ๋์ฒด์์ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์์ต๋๋ค.
๊ธฐ๋ฅ ๋ชฉ๋ก ์์ 1
๊ธฐ๋ฅ ๋ชฉ๋ก ์์ 2
2. ์ฌ์ฉ์ ์คํ ๋ฆฌ ์์ฑ
์ฌ์ฉ์ ์คํ ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์ฌ์ฉ์๊ฐ ์ป์ ์ ์๋ ๊ฐ์น๋ฅผ ์ ์ํ์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ค์ง์ ์ธ ๊ฐ์น๋ฅผ ์ป๊ฑฐ๋ ๋๋ ์ป์ง ๋ชปํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ ์ธํ๋ ๊ณผ์ ์ ํตํด ๊ฐ๋ฐ์ ์ค์๋์ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ์ต๋๋ค.
3. ์ธ์ํ
์คํธ & ๋จ์ํ
์คํธ
์ธ์ํ
์คํธ์ ๋จ์ํ
์คํธ ์์ฑ์ ํตํด ์๋น์ค์ ์์ ์ฑ์ ๋์ด๊ณ ์ ๋
ธ๋ ฅํ์ต๋๋ค.
CodeceptJS๋ก ์ธ์ํ
์คํธ๋ฅผ ์๋ํํ์ฌ ์๋ง์ ๊ธฐ๋ฅ์ ์ฌ๋์ด ์ง์ ํ
์คํธํด์ผ ํ๋ ๋ถ๋ด์ ์ต์ํํ๊ณ , ๋๋ฝ๋๊ธฐ ์ฌ์ด ์ค๋ฅ ์ํฉ์ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ์ฌ ๋์ํ๊ณ ์ ํ์ต๋๋ค.
// ์ธ์ํ
์คํธ ์์
Scenario(' #3. ์ฌ์ฉ์๊ฐ ๋ฆฌ๋ทฐ ์์ฑํ๊ธฐ ํ์ด์ง์์ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑ ์๋ฃํจ(๋ก๊ทธ์ธ ์ ์ , ๋ณธ์ธ์ด ์์ฑํ ๋ฆฌ๋ทฐ๋ ์์)' , ({ I }) => {
// Given
// TODO. ๋ก๊ทธ์ธ ์ฌ์ฉ์ ์ธํ
I.setupUserReviewsId0 ();
I.amOnPage(' /places/0/user-review' );
I.click(' ๋ฆฌ๋ทฐ ์์ฑํ๊ธฐ' );
// When
// TODO. ๋ฐฉ๋ฌธ์ผ ์ ํ
I.selectOption(' ํ์ ' , ' โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ' );
I.fillFiled(' ํ ์ค ๋ฆฌ๋ทฐ' , ' ์์ด์ ํจ๊ป ๊ฐ์ ์ฆ๊ฒ๊ฒ ๋ ๋งํ ์ฅ์์์!' );
I.see(' 24 / 50์' );
I.click(' ๋ฑ๋กํ๊ธฐ' );
// Then
I.see(' 4.4 / 5์ ' );
I.see(' 5๋ช
์ฐธ์ฌ' );
I.see(' ๋ด์ด์๋ง(๋ฐฉ๋ฌธ์ผ: 2022-11-15' );
I.see(' ์์ด์ ํจ๊ป ๊ฐ์ ์ฆ๊ฒ๊ฒ ๋ ๋งํ ์ฅ์์์!' );
});
๋จ์ํ
์คํธ๋ฅผ ์งํํ๋ฉฐ ์ปดํฌ๋ํธ๊ฐ ๋น์ ์์ ์ผ๋ก ๋น๋ํด์ง๋ ํ์์ ์ฌ์ ์ ๊ฐ์งํ๊ณ , ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ ์์ค์ผ๋ก ๋ฆฌํฉํฐ๋ง ํ์ต๋๋ค.
// ๋จ์ํ
์คํธ ์์. Components-MyBookmarks.test.jsx
import { fireEvent , render , screen } from '@testing-library/react' ;
import MyBookmarks from './MyBookmarks' ;
const goPlaceDetailPage = jest . fn ( ) ;
const removeBookmark = jest . fn ( ) ;
let bookmarks ;
const context = describe ;
describe ( 'MyBookmarks' , ( ) => {
function renderMyBookmarks ( ) {
render ( < MyBookmarks
goPlaceDetailPage = { goPlaceDetailPage }
removeBookmark = { removeBookmark }
bookmarks = { bookmarks }
/ > ) ;
}
context ( 'a user accesses mypage' , ( ) => {
beforeEach ( ( ) => {
bookmarks = [
{ placeId : 1 , name : '์์ธ๋๋' , address : '์์ธ ๊ณผ์ฒ' } ,
{ placeId : 3 , name : '์์ธ์ฒ' , address : '์์ธ์ ์ฑ๋๊ตฌ~' } ,
] ;
} ) ;
it ( 'renders a page with mybookmarks' , ( ) => {
renderMyBookmarks ( ) ;
screen . getByText ( '์์ธ๋๋' ) ;
screen . getByText ( '์์ธ์ ์ฑ๋๊ตฌ~' ) ;
fireEvent . click ( screen . getByTestId ( 1 ) ) ;
expect ( removeBookmark ) . toBeCalled ( ) ;
} ) ;
} ) ;
context ( 'a user accesses mypage, but there are no bookmarks' , ( ) => {
beforeEach ( ( ) => {
bookmarks = [ ] ;
} ) ;
it ( 'renders a page with mybookmarks' , ( ) => {
renderMyBookmarks ( ) ;
screen . getByText ( '์ฆ๊ฒจ์ฐพ๊ธฐ ํ ์ฅ์๊ฐ ์์ต๋๋ค' ) ;
} ) ;
} ) ;
} ) ;
๐ ์๋น์ค ์ฃผ์ ๊ธฐ๋ฅ
โ๏ธ๊ฐํธ ๋ก๊ทธ์ธ๊ณผ ๋๋ฌ๋ณด๊ธฐ ๋ชจ๋
์นด์นด์ค, ๋ค์ด๋ฒ ๊ณ์ ์ ์ด์ฉํ์ฌ ๊ฐํธ ๋ก๊ทธ์ธ์ ์งํํ ํ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
๊ธฐ์กด ํ์์ ์์
๋ก๊ทธ์ธ๊ณผ ๋์์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ ๊ท ํ์์ ๊ฒฝ์ฐ ๋๋ค์์ ์
๋ ฅํ๋ฉด ์์ ๋กญ๊ฒ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
์ ๊ท ํ์ ์์
๋ก๊ทธ์ธ
๊ธฐ์กด ํ์ ์์
๋ก๊ทธ์ธ
๋ํ ์๋น์ค๋ฅผ ์ฒดํํด๋ณธ ํ ํ์๊ฐ์
์ ์ํ๋ ์ฌ์ฉ์๋ฅผ ์ํด ๋๋ฌ๋ณด๊ธฐ ๋ชจ๋๋ฅผ ๊ตฌํํ์์ต๋๋ค.
๋๋ฌ๋ณด๊ธฐ ๋ชจ๋ ์ฌ์ฉ์๋ Local Storage์ accessToken ๊ฐ ์ธ์๋ mode์ 'trial' ๊ฐ์ด ์ ์ฅ๋์ด ์ผ๋ฐ ํ์๊ณผ ๊ตฌ๋ณ๋ฉ๋๋ค.
์ ํ ์์ด ์๋น์ค๋ฅผ ์ฌ์ฉํด๋ณผ ์ ์์ผ๋ฉฐ, ์ฒดํ ์ข
๋ฃ ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋น ์ฌ์ฉ์์ ๊ธฐ๋ก์ด ๋ชจ๋ ์ญ์ ๋ฉ๋๋ค.
โ๏ธTOP3 ์ฅ์ ๋ฐ ๊ด๋ จ YouTube ์ปจํ
์ธ ์์ฒญ
ํ์๋ค์ด ๋จ๊ธด ํ์ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก TOP3 ์ฅ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ํ TOP3 ์ฅ์์ ๊ด๋ จ๋ YouTube ์ปจํ
์ธ ๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์์ ๊ด์ฌ์์๋ฅผ ๋ค์ํ๊ฒ ์ถฉ์กฑ์ํค๊ณ ์ ํ์ต๋๋ค.
ํนํ ๋ธ๋ผ์ฐ์ /์ฌ์ดํธ ์ด๋ ์์ด ์๋น์ค ๋ด์์ ๊ตฌํํ ํ๋ ์ด์ด๋ฅผ ํตํด ๋ณผ ์ ์๋๋ก ํ์ฌ ์ฌ์ฉ์๋ค์ ์๋น์ค ์ดํ์จ์ ๋ฎ์ถ๊ณ ์ ํ์ต๋๋ค.
๋ฉ์ธํ๋ฉด(TOP3)
์๋น์ค ๋ด์์ YouTube ์์ ์์ฒญ ๊ฐ๋ฅ
โ๏ธ์ง๋ ๊ฒ์, ํํฐ๋ง์ผ๋ก ์ํ๋ ์ฅ์ ๊ฒ์
Kakao Map API๋ฅผ ์ด์ฉํด ์ง๋๋ฅผ ๊ตฌํํ๊ณ , ๊ฐ์กฑ ๋ง์ถคํ ์ฅ์๋ค์ ๋ง์ปค๋ก ํ์ํ์ต๋๋ค.
๋ ๋๋ง ์ ํ๋ฉด์ ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ ์ฌ์ฉ์์ ํธ์์ฑ์ ๋์ด๊ธฐ ์ํด ์ธ์ ํ ๋ง์ปค๋ ๋ฌถ์ด์ ํ์ํ๋ ํด๋ฌ์คํฐ๋ง ๋ง์ปค๋ฅผ ์ ์ฉํ์์ต๋๋ค.
ํํฐ๋ง ๊ธฐ๋ฅ์ ํตํด ์ํ๋ ์ง์ญ(์/๋, ์/๊ตฐ/๊ตฌ)๊ณผ ์ฅ์ ์ ํ(์นดํ
๊ณ ๋ฆฌ)์ ์ค์ ํ์ฌ ์ฅ์๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
๊ฒ์ํ ์ฅ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ง๋ํ, ๋๋ ๋ฆฌ์คํธํ์ผ๋ก ์ฅ์๋ชฉ๋ก์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฒ์ ๊ฒฐ๊ณผ ์์
๊ฒ์ ๊ฒฐ๊ณผ ์์
โ๏ธ์ฅ์ ์์ธ์ ๋ณด & ๋ถ๋งํฌ
๋ง์ปค ํด๋ฆญ ์ ์ฅ์์ ๋ํ ๊ฐ๋ตํ ์ ๋ณด๋ฅผ ๋ด์ ํ์
์ฐฝ์ด ๋น๋๋ค.
์๋น์ค ์ฌ์ฉ ์์ผ์ ๋ฐ๋ผ ์ด์์๊ฐ์ด ํ๊ธฐ๋์ด ์๋น์ค๋ฅผ ์ด์ฉํ๋ ์ฌ์ฉ์๋ค์ ํธ์์ฑ์ ๋์์ต๋๋ค.
์๋ฅผ๋ค์ด, ์ด์ฉ์ผ์ด ๊ธ์์ผ์ด๋ผ๋ฉด ํด๋น ์์ผ์ ์ด์์๊ฐ์ ์๋ดํฉ๋๋ค.
๋ง์ปค ํด๋ฆญ ์ ํ์
์ฐฝ ๋
ธ์ถ
์ด์ฉ์ผ์ ๋ฐ๋ฅธ ๋ง์ถคํ ์ ๋ณด ์ ๊ณต
ํ์
์ฐฝ์ ํด๋ฆญํ๋ฉด ์ฅ์์ ์์ธ์ ๋ณด ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์์ธ์ ๋ณด ํ์ด์ง๋ ์๋
์ ๋ํํ๋ ๋ถ๋ชจ์๊ฒ ๊ผญ ํ์ํ ํธ์์์ค ์ ๋ณด(์์ฝ, ์ฃผ์ฐจ, ์ธ๋ถ์์ ๋ฐ์
, ์์ ์ค)์ ํจ๊ป ์ฅ์ ์ ๊ฒฝ, ์ฐ๋ฝ์ฒ ๋ฑ์ ํ์ธํ ์ ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์ฌ์ฉ์๋ ๋ง์์ ๋๋ ์ฅ์๋ฅผ ๋ถ๋งํฌํ ์ ์์ผ๋ฉฐ, ์ ์ฅํ ๋ถ๋งํฌ ๋ชฉ๋ก์ ๋ง์ดํ์ด์ง์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ถ๋งํฌ๋ ์ธ์ ๋ ์ง ์ญ์ , ๋๋ ์ฌ์ค์ ํ ์ ์์ต๋๋ค.
โ๏ธ๋ค์ด๋ฒ ๋ฆฌ๋ทฐ๋ณด๊ธฐ & ํ์ ๋จ๊ธฐ๊ธฐ
์ฅ์์ ๋ํ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด Naver ๊ฒ์ API๋ฅผ ์ด์ฉํ์ฌ ๋ธ๋ก๊ทธ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ด๋ จ๋ ๋์ ์ปจํ
์ธ ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด '์ฅ์๋ช
+ ์๊ธฐ๋' ํค์๋๋ก ๊ฒ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฅ์์ ์ง์ ๋ฐฉ๋ฌธํ ํ์๋ค์ด ํ์ ๊ณผ ํจ๊ป ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธธ ์ ์์ต๋๋ค.
ํด๋น ์ฅ์์ ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธด ์ด๋ ฅ์ด ์์ ๊ฒฝ์ฐ '๋ฆฌ๋ทฐ ์์ฑํ๊ธฐ' ๋ฒํผ์ด ๋
ธ์ถ๋๊ณ , ์ด๋ ฅ์ด ์์ ๊ฒฝ์ฐ ๊ณผ๊ฑฐ์ ์์ฑํ ํ์ ๊ณผ ๋ฆฌ๋ทฐ๊ฐ ๋
ธ์ถ๋ฉ๋๋ค.
ํ์ /๋ฆฌ๋ทฐ ์์ฑ ์
ํ์ /๋ฆฌ๋ทฐ ์์ฑ ํ