-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[#349] 메타 데이터 추가 #617
[#349] 메타 데이터 추가 #617
Conversation
- 북카이브, 도서 검색, 독서 모임, 내 프로필 - 비회원 북카이브에 노출되는 책장 및 도서 - 전체 독서 모임
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
⚡️ Lighthouse Average Scores Across Reports:
⚡️ Average Details Across All Reports:
|
src/utils/getSitemaps.ts
Outdated
const getBookArchiveBookshelves = async () => { | ||
const bookshelves: APIRecommendedBookshelf = await fetch( | ||
`${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`, | ||
options | ||
) | ||
.then(response => { | ||
if (!response.ok) { | ||
return Promise.reject(); | ||
} | ||
return response.json(); | ||
}) | ||
.catch(() => { | ||
return []; | ||
}); | ||
|
||
return bookshelves; | ||
}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
해당 파일의 데이터 패칭은 서버사이드에서 실행되요
그래서 axios나 react-query같은 클라이언트 펑션은 사용이 불가능합니다!
참고해주세요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
axios는 클라이언트와 서버 사이드 모두에서 사용가능한 라이브러리라고 알고 있어요! (서버사이드에서는 axios 내부적으로 fetch 메서드를 사용하는걸로 알고 있어요.)
await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`,
options
)
fetch 대신
await RecommendAPI.getUnAuthRecommendedBookshelf();
axios를 사용해도 동일한 결과가 나오긴 하더라구요!
다만 api 호출을 위해 정의해뒀던 publicApi
axios 인스턴스에는 auth를 위한 로직이 포함되어 있기도 하고, 서버사이드에서 기본 fetch를 사용했을 때 캐싱 등에 이점이 있는걸로 알고 있어서, 기본 fetch를 사용하는건 좋아보여요! (그리고 왜인지는 모르겠으나.. fetch와 axios를 비교해봤을 때 api 응답 속도에.. 약 2배 정도의 차이가 있더라구요..?🙄 axios가 좀 더 느리더라구요..)
src/utils/getSitemaps.ts
Outdated
const filteredBooksId = booksId.filter((bookId, idx) => { | ||
return booksId.indexOf(bookId) === idx; | ||
}); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
booksId
은 북카이브 책장에 노출된 책들의 Id값을 담은 배열이에요
booksId
에는 중복되는 책 Id가 존재할 수 있어요.
filteredBooksId
은 중복되는 책 Id를 필터링한 배열이에요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
오.. 중복이라는 단어를 보자마자 Set이 생각났어요! Set 객체를 활용해보면 어떨까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Set 객체를 활용했을 때 나타나는 타입 에러에요..!
해당 에러가 나타나는 이유는 TypeScript
에서 Set
은 이터러블(iterable)하지만, ECMAScript 2015(ES6)
이전의 타겟 버전으로 컴파일할 경우에는 기본적으로 이터레이션(iteration)을 지원하지 않기 때문이라고해요!
tsconfig.ts
에 있는 target
을 es6
로 수정했을때는 해당 타입에러가 발생하지 않아요!
(현재 저희 프로젝트는 target: 'es5'
로 되어있습니다.)
es6
로 변경 후에 빌드했을 때 사이드이펙트가 생기진 않는 것 같네요!
규란님의 의견이 궁금해요!! 저는 바꾸어도 될 것 같아요 👀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const books = new Set<APIBook['bookId']>();
data.bookshelfResponses.forEach(bookshelf =>
bookshelf.books.forEach(book => books.add(book.bookId))
);
const filteredBooks = Array.from(books);
books 변수 자체를 set 객체로 생성하고, Array.from() 메소드를 사용해서 배열로 변환하는 방법을 사용하면 어떨까요?!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
반영하였습니다! 25bd581
javascript 기본기의 필요성을 느꼈습니다 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
각 상세페이지에 대한 url을 동적으로 생성하는데 어려움이 많았을 것 같아요 😞 수고 많으셨습니다!! 👏🏻 코멘트가 좀 긴데.. 고민되는 부분을 담은거라 편하게 읽어주시면 감사하겠습니당..ㅎㅎ 🙇🏻♀️
책, 책장, 모임 상세 페이지처럼 동적으로 생성해야하는 url들은 사이트맵을 분할해서 관리해도 좋겠다는 생각이 들었어요.
물론 sitemap 파일 하나당 최대 url 개수가 50000개라 (Google 기준) 다독다독 정도의 사이즈에서는 분할했을 때 이점이 크지 않을 수 있지만, getSitemaps.ts
파일 내에서 각 상세 페이지에 대한 url 리스트를 따로 만들고 있는만큼 각 route에서 sitemap 생성을 관리하는 구조도 괜찮을 것 같다는 생각이 들었어요! 이렇게 구현해둔다면 추후 상세 페이지 수가 많아졌을 때 next.js에서 제공하는 generateSitemaps()
를 통해 더 작은 사이즈의 sitemap으로 분할도 가능하다는 이점이 있을 것 같아요.
// app/bookshelf/sitemap.ts
// 생성된 sitemap > https://local.dev.dadok.app:3000/bookshelf/sitemap.xml
import { MetadataRoute } from 'next';
import { APIRecommendedBookshelf } from '@/types/bookshelf';
export async function getBookshelves() {
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`,
options
);
if (!res.ok) {
return Promise.reject();
}
const data: APIRecommendedBookshelf = await res.json();
return data.bookshelfResponses.map(({ bookshelfId }) => ({
bookshelfId,
}));
} catch {
return [];
}
}
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const bookshelves = await getBookshelves();
return bookshelves.map(({ bookshelfId }) => ({
url: `${process.env.NEXT_PUBLIC_HOST}/bookshelf/${bookshelfId}`,
lastModified: new Date(),
}));
}
이렇게 작성했는데 잘 동작하더라구요!!
다만.. 한가지 이슈가 있어요..🫠
sitemap을 분할한 경우, sitemap index 파일을 생성해서 하위의 여러 sitemap을 한번에 제출하는 형태가 일반적인데 nextjs에서는 sitemap을 분할하는 기능만 제공하고 아직 sitemap index 파일을 생성해주진 않는 것 같더라구요..😭
관련 discussion을 찾았는데 아직까지는 sitemap index 파일을 생성하려면 이렇게 동적으로 생성하는게 최선의 방법인 것 같았어요!
그래서 고민해봤는데, 추후 확장성을 생각해서 각 route에서 sitemap을 생성하는 코드는 추가하되, sitemap index를 생성하는 대신 root sitemap에서 하위 sitemap들을 합쳐주는 형태로 작성해보는건 어떨까요?!
import { MetadataRoute } from 'next';
// bookgroup, book sitemap도 아래와 같은 형태로 추가
import bookshelvesSitemap from '@/app/bookshelf/sitemap';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
return [
{
url: 'https://dadok.app/bookarchive',
lastModified: new Date(),
},
{
url: 'https://dadok.app/book/search',
lastModified: new Date(),
},
{
url: 'https://dadok.app/group',
lastModified: new Date(),
},
{
url: 'https://dadok.app/profile/me',
lastModified: new Date(),
},
...(await bookshelvesSitemap()),
];
}
sitemap index 파일 생성에 복잡함이 있어서 차선의 방법을 작성해보긴 했지만.. 지금 방식도 현재 수준에서는 충분히 괜찮아보여요! 그리고 위와 같이 작성했을 때 sitemap index 파일을 생성하지 않는 이상 하위 sitemap이 생성만 되고 사용되지 않는다는 점도 리소스 낭비가 될 수 있을 것 같다는 생각이 들기도 하구요..
- 현재처럼 getSitemaps 파일에서 모든 url 동적으로 생성
- app 디렉토리 내부에서 route별로 sitemap 생성 후 root sitemap에서 import하여 url 동적으로 생성
- app 디렉토리 내부에서 route별로 sitemap 생성 후 sitemap index 파일 생성
위 3가지 중 어떤 방법이 좋을지 선택하면 될 것 같은데.. 재현님 의견이 궁금해요!! 두서없이 작성한 것 같은데.. 천천히 확인해주세요!!ㅎㅎ 긴 글 읽어주셔서 감사합니다! 🙇🏻♀️
src/app/sitemap.ts
Outdated
|
||
return [ | ||
{ | ||
url: 'https://dadok.app/bookarchive', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
문득.. 지난번처럼 부득이하게 도메인을 수정해야하는 경우, sitemap 관련 파일의 url을 모두 수정해야하기 때문에 불편함이 있을 것 같다는 생각이 들었어요. process.env.NEXT_PUBLIC_HOST
환경변수를 사용하면 어떤 문제가 있을까요..?!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
src/utils/getSitemaps.ts
Outdated
const getBookArchiveBookshelves = async () => { | ||
const bookshelves: APIRecommendedBookshelf = await fetch( | ||
`${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`, | ||
options | ||
) | ||
.then(response => { | ||
if (!response.ok) { | ||
return Promise.reject(); | ||
} | ||
return response.json(); | ||
}) | ||
.catch(() => { | ||
return []; | ||
}); | ||
|
||
return bookshelves; | ||
}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
axios는 클라이언트와 서버 사이드 모두에서 사용가능한 라이브러리라고 알고 있어요! (서버사이드에서는 axios 내부적으로 fetch 메서드를 사용하는걸로 알고 있어요.)
await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`,
options
)
fetch 대신
await RecommendAPI.getUnAuthRecommendedBookshelf();
axios를 사용해도 동일한 결과가 나오긴 하더라구요!
다만 api 호출을 위해 정의해뒀던 publicApi
axios 인스턴스에는 auth를 위한 로직이 포함되어 있기도 하고, 서버사이드에서 기본 fetch를 사용했을 때 캐싱 등에 이점이 있는걸로 알고 있어서, 기본 fetch를 사용하는건 좋아보여요! (그리고 왜인지는 모르겠으나.. fetch와 axios를 비교해봤을 때 api 응답 속도에.. 약 2배 정도의 차이가 있더라구요..?🙄 axios가 좀 더 느리더라구요..)
src/utils/getSitemaps.ts
Outdated
const filteredBooksId = booksId.filter((bookId, idx) => { | ||
return booksId.indexOf(bookId) === idx; | ||
}); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment;
오.. 중복이라는 단어를 보자마자 Set이 생각났어요! Set 객체를 활용해보면 어떨까요?
src/app/sitemap.ts
Outdated
export default async function sitemap(): Promise<MetadataRoute.Sitemap> { | ||
return [ | ||
{ | ||
url: `${process.env.NEXT_HOST}/bookarchive`, | ||
lastModified: new Date(), | ||
}, | ||
{ | ||
url: `${process.env.NEXT_HOST}/book/search`, | ||
lastModified: new Date(), | ||
}, | ||
{ | ||
url: `${process.env.NEXT_HOST}/group`, | ||
lastModified: new Date(), | ||
}, | ||
{ | ||
url: `${process.env.NEXT_HOST}/profile/me`, | ||
lastModified: new Date(), | ||
}, | ||
...(await booksSitemap()), | ||
...(await bookshelvesSitemap()), | ||
...(await bookGroupSitemap()), | ||
]; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
규란님의 코멘트 너무 유익하게 잘 보았어요!!
결론부터 이야기 하면 제시하셨던 방법중 2번째 방법을 채택하여 반영하였습니다 682d150
2번째 방법을 채택한 이유는
- Next.js 공식문서에서 route별로 나누어
layout
,template
,not-found
등을 작성하는 것을 의도하는것 처럼 보였어요. - 3번째를 선택할 수 있지 않았을까? 라는 물음에는 아직 Next.js에서 route별로 나누어진 sitemap을 합쳐주진 않지만 추후에 next에서 index파일로 합쳐주는 기능이 생긴다면 2번이 좀 더 유연하게 마이그레이션이 가능할 것 같아서였습니다!
- 1번 방법도 나쁜건아니지만... Next측에서 써보라고 내놓은 기능을 조금 더 활용해볼 기회는 이제 거의 없을 것 같아서였어요! 😄
- 불필요하게 sitemap을 여러번 생성하는게 아닌가 하는 단점도 있지만 많은 리소스가 소모되는것은 아니라 괜찮다고 판단했습니다!
한번 더 제가 작성한 코드에 대해 생각해보고 고민해볼 수 있어서 좋았어요 감사합니다!!! 🙇 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍🏻
* feat: 오픈그래프 이미지 추가 * feat: 메타데이터 title, description * feat: 오픈그래프 이미지와 크기 수정 * fix: 오픈그래프 이미지 용량 축소 * fix: opengraph-image.tsx 파일 수정 * fix: Image Generator 제거 * feat: 오픈그래프 이미지 업데이트 * feat: RootLayout에 메타데이터 추가 * feat: Sitemap 작성 - 북카이브, 도서 검색, 독서 모임, 내 프로필 - 비회원 북카이브에 노출되는 책장 및 도서 - 전체 독서 모임 * feat: robots 작성 * fix: 오픈그래프 이미지 업데이트 * feat: site-verification 추가 (구글, 네이버) * refactor: url주소 매직스트링을 환경변수로 교체 * refactor: sitemap을 route별로 분리 * chore: 불필요한 util 파일 삭제 * chore: 코드 리뷰 반영 * refactor: book sitemap 병합 및 route 변경 * refactor: route 위치 통일성 부여
* Revert "[#634] v1 디렉토리 네이밍 수정 (#635)" This reverts commit 86c304a. * Revert "[#632] 사용하지 않는 라이브러리 제거 (#633)" This reverts commit 34b4efb. * Revert "[#627] 불필요한 utils, hooks, constants 정리 및 import문 통일 (#631)" This reverts commit 254f6bb. * Revert "[#629] tailwind config color 정리 (#630)" This reverts commit 595f476. * Revert "[#622] BottomActionButton 패딩 수정 (#626)" This reverts commit 9796dab. * Revert "[#625] Toast 컴포넌트 icon이 잘리는 문제 해결 (#628)" This reverts commit e868efc. * Revert "[#623] [도서 검색] Input 검색 아이콘 Layout Shift 해결 (#624)" This reverts commit d0392d6. * Revert "[#619] PWA 구현 (#621)" This reverts commit 587f990. * Revert "[#616] 책장 좋아요 뱃지 UI 수정 (#620)" This reverts commit 70af27a. * Revert "[#349] 메타 데이터 추가 (#617)" This reverts commit 209ba3e. * Revert "[#556] 버튼 컴포넌트 disabled style 작성 (#615)" This reverts commit 0425223. * Revert "[#610] 로그인 페이지 구현 (#614)" This reverts commit badcf8e. * Revert "[#608] 페이지 접근 권한 부여 (#611)" This reverts commit 7f1cd21. * Revert "[#612] 북카이브 페이지에서 발생하는 무한 리랜더링 버그 수정 (#613)" This reverts commit bac4ff2. * Revert "[#605] Google LightHouse CI 추가 (#606)" This reverts commit d6cccdb. * Revert "[#602] [모임 생성] 퍼널 progress bar, stepper 구현 (#607)" This reverts commit bcbdc67. * Revert "[#603] [내 프로필] ErrorBoundary 제거 (#604)" This reverts commit f044cd2. * Revert "feat: start-ssl script 작성 (#601)" This reverts commit 8de7079. * Revert "[#596] accessToken이 만료된 직후 다른 페이지 접근할 때 에러 페이지를 보여주지 않고 새로고침 (#600)" This reverts commit 59407c6. * Revert "[#592] [도서 검색] 검색 키워드 및 결과 유지 기능 구현 (#593)" This reverts commit af2413c. * Revert "[#595] Toast UI 개선 (#597)" This reverts commit 52e9992. * Revert "[#591] 3D 책 컴포넌트, 책장 페이지 개선 (#594)" This reverts commit 2beb0f2. * Revert "[#570] [도서 검색] 도서 검색 결과 렌더링 시 search 헤더 숨기고 input sticky 적용 (#589)" This reverts commit 0ff4ca0. * Revert "[#588] 폰트 디자인 시스템 적용 (#590)" This reverts commit 6a054a4. * Revert "[#557] [도서 검색] 최근 검색어 api 요청 (#587)" This reverts commit 591e9a8. * Revert "[#585] [프로필 페이지] '참여한 모임' 영역 사용자가 모임장인 모임에 마크 추가 (#586)" This reverts commit 3a3f263. * Revert "[#575] Drawer 컴포넌트 개선 (#576)" This reverts commit cff01fd. * Revert "[#581] [모임 생성] 모임 생성 퍼널 페이지 작성 (#582)" This reverts commit 55a08ee. * Revert "[#583] Switch 컴포넌트 style 수정 (#584)" This reverts commit e7798f7. * Revert "[#578] iOS 환경에서의 DatePicker UI 수정 (#579)" This reverts commit 24b42bf. * Revert "[#574] FloatingButton 버그 수정 (#577)" This reverts commit dd37ff5. * Revert "[#559] BookInfoCard 컴포넌트 수정 및 goToBookSelectStep 이벤트 추가 (#572)" This reverts commit f1c6a3c. * Revert "[#571] Drawer 컴포넌트 style 개선 (#573)" This reverts commit f21ada4. * Revert "[#561] [모임 생성] 모임 상세 퍼널 개선 (#567)" This reverts commit bbd1123. * Revert "[#552] next custom server 구동 시 hmr이 동작하지 않는 문제 해결 (#569)" This reverts commit 019abd5. * Revert "[#563] [모임 생성] 모임 가입문제 퍼널 (#568)" This reverts commit 4d6a14f. * Revert "[#564] BottomActionButton 컴포넌트 position 속성 수정 (#566)" This reverts commit 94365ee. * Revert "[#562] [모임 생성] 모임 이름 퍼널 (#565)" This reverts commit 0bd1349. * Revert "[#543] [모임 생성] 책 선택 퍼널 (#560)" This reverts commit b2f5236. * Revert "[#553] [모임 생성] 모임 상세 퍼널 (#558)" This reverts commit 31a6d84. * Revert "[#554] 스토리북 preview decorator에서 Layout 제거 (#555)" This reverts commit 495321e. * Revert "[#549] 'unable to verify first certificate' 에러 해결 (#550)" This reverts commit bdfa458. * Revert "fix: 모바일 환경에서의 스크롤 버그 수정 (#551)" This reverts commit 1d56794. * Revert "[#546] [독서모임] 모임 페이지 누락된 작업 및 버그 수정 (#547)" This reverts commit 448e8b5. * Revert "[#531] 로컬 서버에 https 적용 (#541)" This reverts commit f2f4a82. * Revert "[#540] [모임 생성] 모임 상세 퍼널 마크업 (#542)" This reverts commit 5d23ab3. * Revert "[#544] vscode react component snippet 작성 (#545)" This reverts commit 68dc181. * Revert "[#535] [독서모임] 독서모임 목록 페이지 개선 (#539)" This reverts commit 56137df. * Revert "[#505] [모임 상세] 모임 삭제 기능 구현 (#537)" This reverts commit efdb2c5. * Revert "[#530] FloatingButton 컴포넌트 적용 (#536)" This reverts commit 3671624. * Revert "[#529] redirect 페이지 개선, 토큰 업데이트 로직 개선 (#532)" This reverts commit 0867ee4. * Revert "[#523] [모임 상세] 모임 수정 페이지 (#527)" This reverts commit f889a79. * Revert "[#526] 도서 검색 페이지 개선 (#528)" This reverts commit 81b39b7. * Revert "[#524] Menu 컴포넌트 개선 (#525)" This reverts commit 52687da. * Revert "[#521] TextArea 컴포넌트 (#522)" This reverts commit a1673f6. * Revert "[#518] Input 컴포넌트 style 추가 (#519)" This reverts commit 2bd859a. * Revert "[#516] DatePicker 컴포넌트 (#520)" This reverts commit 63af14d. * Revert "[#504] [모임 상세] 모임 게시글 작성 기능 구현 (#517)" This reverts commit e6f8d87. * Revert "[#509] [레이아웃] BottomNavigation 버그 및 UI 수정 (#510)" This reverts commit ada909a. * Revert "feat: 모임 게시글 수정, 삭제 기능 구현 (#513)" This reverts commit 36c1e71. * Revert "[#507] [프로필] 로그아웃 햄버거 구현 (#508)" This reverts commit 90c5855. * Revert "feat: hosts 파일을 수정할 수 있는 updateDevHost script 작성 (#511)" This reverts commit cd297e9. * Revert "[#497] [책 상세] 책 상세 페이지 api 연결 (#500)" This reverts commit 7842028. * Revert "[#498] useFunnel 작성 (#501)" This reverts commit e6f7878. * Revert "[#489] [도서 검색] 도서검색 페이지 개선 작업 (#490)" This reverts commit 0043fe7. * Revert "[#491] [도서 검색] 베스트셀러 클릭 시 라우팅 경로 수정 (알라딘 -> 다독다독) (#492)" This reverts commit e68d1d3. * Revert "[#493] 에러 페이지 (#494)" This reverts commit e95c940. * Revert "[#495] [책 상세] 책 상세 페이지 마크업 (#496)" This reverts commit 052e6d4. * Revert "[#474] 리프레시 토큰이 만료된 경우 에러 페이지로 넘어가는 이슈 수정 (#483)" This reverts commit 633da9f. * Revert "[#486] [책 상세 / 모임 상세] 코멘트 목록 컴포넌트 (#487)" This reverts commit f452642. * Revert "[#443] TopNavigation 컴포넌트 스타일 fixed 적용 (#488)" This reverts commit 60d3311. * Revert "[#468] [검색] 검색 페이지 작성 (#478)" This reverts commit 313d61a. * Revert "[#481] [책 상세] 책 정보 컴포넌트 (#482)" This reverts commit 03fa16e. * Revert "[#442] 스켈레톤 컴포넌트 작성 (#480)" This reverts commit 22b06a2. * Revert "[#453] [모임] 모임 목록 페이지 개선 (#475)" This reverts commit c6b1ab1. * Revert "typo: 오타 수정 (#485)" This reverts commit 395e050. * Revert "[#476] [모임 상세] 비로그인 시 모임 참여하기 버튼 비활성화 (#479)" This reverts commit a2e628d. * Revert "[#472] Drawer 컴포넌트 (#477)" This reverts commit 5e54b72. * Revert "[#470] Menu 컴포넌트 (#471)" This reverts commit 0a4705d. * Revert "[#465] [모임] BookInfoCard 컴포넌트 추상화 (#466)" This reverts commit 81bc6d8. * Revert "[#467] 내가 가입한 모임 상세 페이지 (#469)" This reverts commit 75070ce. * Revert "[#463] Loading 컴포넌트 animation 버그 해결 (#464)" This reverts commit 8219f67. * Revert "[#456] [프로필] 프로필 페이지 (#461)" This reverts commit 150592c. * Revert "[#455] [모임 상세] 모임 가입 문제 페이지 (#462)" This reverts commit 7bbdbaf. * Revert "[#459] [유저 로그인] 로그인 BottomSheet 컴포넌트 작성 (#460)" This reverts commit da3fb33. * Revert "[#457] LikeButton 컴포넌트 (#458)" This reverts commit 9d1a5c7. * Revert "베이스 컴포넌트 위치 변경 (#454)" This reverts commit fd8ad31. * Revert "[#447] [모임 상세] 모임 참여 여부, 모임장 여부에 따른 UI 구현 (#450)" This reverts commit 61ada97. * Revert "[#449] [책장] 책장 상세 페이지 (#451)" This reverts commit 1f389e4. * Revert "[#445] Layout 컴포넌트에서 TopHeader 컴포넌트 분리 (#452)" This reverts commit 9d11c70. * Revert "[#415] [프로필] 프로필 생성 페이지 (#427)" This reverts commit 4175612. * Revert "[fix] group 페이지 타입 에러 수정 (#448)" This reverts commit 66005ea. * Revert "[#434] [모임 상세] 독서모임 상세 페이지 api 연결 (#441)" This reverts commit 617614f. * Revert "[#439] [독서모임] 모임 목록 페이지 리팩토링 (#440)" This reverts commit f50f393. * Revert "[#414] [프로필] 프로필 수정 페이지 (#426)" This reverts commit 91b8171. * Revert "[#437] [독서모임] Avartar, bookGroupStatus 적용 및 typo 수정 (#438)" This reverts commit b56d3d5. * Revert "[#412] [북카이브] 북카이브 페이지 (회원) (#436)" This reverts commit 434dd73. * Revert "[refactor] bookcover v1 폴더로 이동 (#433)" This reverts commit 434dd8c. * Revert "[refactor] 폴더 및 파일 구조, 네이밍 수정 (#432)" This reverts commit 5ba2e21. * Revert "[fix] github 에서 대소문자 구문하지 못하는 문제 해결 (#431)" This reverts commit 549a5e9. * Revert "[#403] [모임 상세] 모임 정보 컴포넌트 (#423)" This reverts commit 378828c. * Revert "fix: 이벤트 핸들러 명칭 변경" This reverts commit de6588c. * Revert "fix: 컴포넌트명 변경" This reverts commit 03899d7. * Revert "fix: 스타일 관련 코드 수정 및 불필요한 요소 제거" This reverts commit 14a6b84. * Revert "feat: 내가 가입한 모임 simple ui 구현" This reverts commit 5dd3e60. * Revert "[#410] [북카이브] 북카이브 페이지 (비회원) (#425)" This reverts commit 08c919d. * Revert "[#411][독서 모임] Detail 독서 모임 컴포넌트 (#428)" This reverts commit cbb032a. * Revert "[#408] [모임 상세] 게시글 컴포넌트 (#429)" This reverts commit 2277b0d. * Revert "[#404][독서모임] 모임 검색 컴포넌트 (#419)" This reverts commit 281beee. * Revert "[#418] Avatar 컴포넌트 (#420)" This reverts commit 51d471e. * Revert "[#406] [모임 상세] 멤버 목록 컴포넌트 (#424)" This reverts commit 199a234. * Revert "[#399] Toast 컴포넌트 (#402)" This reverts commit 9333f87. * Revert "[#405] [레이아웃] 공통 레이아웃 (#421)" This reverts commit fb8d8d6. * Revert "[#398] RadioButton 컴포넌트 (#400)" This reverts commit 9c8bdc2. * Revert "[#413] Issue 템플릿에 v1.0 라벨 추가 (#417)" This reverts commit facb746. * Revert "[#363] BottomActionButton 컴포넌트 (#395)" This reverts commit a653d3b. * Revert "[#366] BottomSheet 컴포넌트 (#394)" This reverts commit a43dea4. * Revert "[#364] Badge 컴포넌트 (#396)" This reverts commit 86edc76. * Revert "[#362] TopNavigation 컴포넌트 리팩터링 (#393)" This reverts commit 55a6b98. * Revert "[#361] BottomNavigation 컴포넌트 (#392)" This reverts commit d7d8ca6. * Revert "[#388] Input, Select 컴포넌트 에러 처리 (#389)" This reverts commit f5bf5ef. * Revert "[#390] storybook snippet 작성 (#391)" This reverts commit 97984a7. * Revert "[#365] Modal 컴포넌트 (#387)" This reverts commit 8e931fc. * Revert "[#367] Switch 컴포넌트 (#386)" This reverts commit e1b1ae9. * Revert "[#382] Assets 정리 (#384)" This reverts commit 182def7. * Revert "[#383] Select 컴포넌트 (#385)" This reverts commit 7c189bc. * Revert "[#357] TopHeader UI 컴포넌트 및 스토리북 작성 (#379)" This reverts commit 4dfbcc8. * Revert "[#358] TopNavigation 컴포넌트 (#378)" This reverts commit 41f8f99. * Revert "[#360] Input 컴포넌트 작성 (#380)" This reverts commit e28792d. * Revert "[#359] Button 컴포넌트 (#381)" This reverts commit 6b84755. * Revert "[#376] Storybook 설정 및 GlobalTheme, Font 수정 (#377)" This reverts commit 3a7a9e6. * Revert "[#374] Tailwind 클래스를 정렬하기 위한 Prettier 플러그인 추가 (#375)" This reverts commit e365160. * Revert "[#372] Theme, GlobalStyle, Font 세팅 (#373)" This reverts commit 4f7df42. * Revert "[#370] Storybook & Headless UI 추가 (#371)" This reverts commit 7ad8aef.
구현 내용
메타 데이터를 추가했어요
무엇이 추가되었는지 항목별로 볼 수 있도록
리스트형식으로 PR을 정리해 보았어요 ㅎ
메타태그 리스트
(네이버의 경우엔 release에 Merge되면 정상적으로 등록될거에요!)
사이트맵
api를 활용하여 동적으로 사이트맵을 생성하고있어요!
사이트맵에 포함된 주소 리스트에요 사이트맵 프리뷰
(api가 한정적이다보니 더 많은 사이트맵을 확보하는대엔 무리가 있었어요 😢 )
Etc.
(robots.ts의 역할은 검색 엔진 크롤러가 사이트에서 액세스할 수 있는 URL을 알려줘요)
스크린샷
추가 된
메타태그
이미지 👀PR포인트
getSitemap.ts
해당 파일의 fetch는 서버사이드에서 실행되요
그래서 axios나 react-query같은 클라이언트 펑션은 사용이 불가능합니다! 참고해주세요!
비로그인의 사용자가 서비스에 접근할 수 있는 최대한의 페이지를
api를 활용하여 동적으로 사이트맵에 담도록 도와주는 유틸 함수 입니다.
관련 이슈