inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

현재 서버 문제있나요?

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

http://practice.codebootcamp.co.kr/graphql <-- 해당 사이트 접속이 불가하고 위 사이트의 mutation 코드도 어제까지는 됐는데 오늘은 실행이 안되네요

  • react
  • node.js
  • seo
  • graphql
  • next.js
dasd 댓글 1 좋아요 0 조회수 423

Service에 @Transactional(readOnly=true)는 필수적으로 넣어줘야 하는 것인지 궁금합니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 클래스 영역에서 트랜잭션을 걸어두는 것이 필수적인 내용인지 궁금합니다! 실무에서도 마찬가지로 동일하게 클래스 영역에 사용해서 적용하게 되는 것일까요? 저는 작업할 때 수정이 필요한 메서드에만 @Transactional을 선언해줬었는데 이렇게 처리했던 부분들이 잘못된 부분이었던 것인지 고민이 되어 질문드리게 되었습니다. 정리하자면 클래스단에서 무조건 '@Transactional(readOnly=true)' 를 작성해주는 것을 권장한다면 그렇게 해야하는 이유가 무엇인지 궁금하고, 무조건 걸었을 때 매번 '@Transactional(readOnly=true)' 값을 작성해줘야 하는데 매번 작성하지 않을 수 있는 방법은 없을지 궁금합니다. 감사합니다!

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
chaerin920 댓글 1 좋아요 0 조회수 722

updateUseditem 에러 "Cannot read property '_id' of undefined"

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

안녕하세요. 강사님께서 직접 답글 주셨으면 좋겠습니다,, updateUseditem api 요청 시 useditemAddress를 제외하고 아래와 같이 테스트하면 정상동작하는데 useditemAddress를 붙인 후 요청 시 아래와 같이 에러가 발생합니다. 며칠 째 해결이 안되어 강사님께서 직접 봐 주셨으면 좋겠습니다. 감사합니다.

  • react
  • node.js
  • seo
  • graphql
  • next.js
용준 댓글 1 좋아요 0 조회수 253

강의 듣는 방법에 대한 질문이 있습니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

안녕하세요. ver2가 있는줄 모르고 현재 섹션 12까지 들었습니다. 지금부터라도 복습 겸 바로 ver2로 넘어가서 강의를 들어보려 했는데 괜찮을까요? 아직 한 것 보다 할게 더 많이 남은거 같아 질문 드립니다.

  • react
  • node.js
  • seo
  • graphql
  • next.js
Milkyway 댓글 1 좋아요 0 조회수 388

27강 포트폴리오 리뷰 - Failed to fetch

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

강의를 따라서 했는데도 Failed to fetch 오류가 떠서 첨부된 git 링크를 clone해서 실행하고 작성자, 비밀번호, 제목, 내용을 작석하고 등록하기 버튼을 눌러도 동일한 오류가 뜹니다. 어떻게 해야하죠 ㅠㅠ?

  • react
  • node.js
  • seo
  • graphql
  • next.js
윤예지 댓글 1 좋아요 0 조회수 542

graphQl updateUseditem 에러입니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

안녕하세요. 아래와 같은 에러가 발생하는데 쿼리문을 잘못작성한게 있을까요? 왜 이런 에러가 발생하는지 잘 모르겠습니다. 해결해주시면 감사드립니다. 감사합니다.

  • react
  • node.js
  • seo
  • graphql
  • next.js
용준 댓글 1 좋아요 0 조회수 335

핸드폰 번호 인증번호 에서

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

안녕하세요 섹션 5 . 수학 객체 파트 3분 19 초 에서 077215 는 존재할 수 없다 라고 하셨는데 왜 존재할 수 없다라는 것인가요 ? 077215에서 0을 인식할 수 없어 77215로 인식하기 때문에 그런 것 같은데 제 입장에서는 급 ?뜬금없이 ? 라는 느낌이 있어서 정확히 왜 존재할 수 없다고 하신지 이해가 가지 않습니다..

  • react
  • node.js
  • seo
  • graphql
  • next.js
매력적인 토끼 댓글 1 좋아요 0 조회수 415

분산 락 질문드립니다.

미해결

재고시스템으로 알아보는 동시성이슈 해결방법

안녕하세요 강의 잘 들었습니다! 완강하고 나서 몇 가지 궁금증이 생겨 질문드립니다. 분산 락을 "분산" 락이라고 부르는 이유가 뭔가요? Redis가 인메모리 DB이다보니 서버마다 Redis를 가지고 있어 여러 서버에서 모두 가지고 있어 분산 락이라고 부르는 걸까요? Redis가 여러 서버에 분산되어 있다보니 서로 싱크를 맞추기가 쉽지 않을 것 같은데 이런 부분은 어떻게 해결할 수 있나요? 서로 싱크가 맞지 않는다면 synchronized 키워드의 문제점처럼 여러 프로세스에서 접근할 수 있어 정합성이 보장되지 않을 것 같아서요! Redis는 인메모리 DB라 휘발성인데 서버가 다운될 경우 복구는 어떤식으로 이뤄지는지 궁금합니다!

  • java
  • spring
  • 동시성
니나니노 댓글 1 좋아요 0 조회수 567

리눅스 mysql 설치 오류 뜨시는 분들

해결됨

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

저도 설치할 때 아래와 같은 문제가 발생 했었는데요 Error: Problem: conflicting requests - nothing provides libcrypto.so .10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 - nothing provides libssl.so .10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 - nothing provides libcrypto.so .10( libcrypto.so .10)(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 ...... 아마존 리눅스 2023을 쓸 때는 el9 버전 레포지토리를 사용해주어야 한다고 합니다! [ wget dev.mysql.com/get/mysql80-commuity-release-e17-5.noarch.rpm rpm -ivh mysql-community-release-e17.5.noarch.rpm ] 이렇게 작성하던 부분을 [ sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm sudo dnf install mysql-community-server ] 이렇게 작성하시면 잘 설치 돼요! 출처: https://dev.classmethod.jp/articles/ec2-mysql-install-confilicting-requests-error-kr/

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
한지면 댓글 3 좋아요 8 조회수 5494

회원가입 과제 코드

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

회원가입 과제는 따로 정답 코드가 없는건가요?

  • react
  • node.js
  • seo
  • graphql
  • next.js
박세은 댓글 1 좋아요 0 조회수 453

서버

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

http://practice.codebootcamp.co.kr/graphql 서버에 문제가 있나요? 어제는 잘 되었는데 안들어가지네요.

  • react
  • node.js
  • seo
  • graphql
  • next.js
미노 댓글 1 좋아요 0 조회수 410

DTO에 Entity 포함

해결됨

실전! Querydsl

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요. public class MemberTeamDto { private Member member; private Team team; @QueryProjection public MemberTeamDto(Member member, Team team) { this.member = member; this.team = team; } } 이런식으로 DTO에 엔티티를 직접 포함해도 되나요?? 실행은 잘되는거 같은데 이렇게 활용해도 되는지 궁금합니다

  • java
  • jpa
11 댓글 1 좋아요 0 조회수 1567

final 과제

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

강사님 안녕하세요. 파이널 과제를 하면서 궁금한 점이 있어 질문 드립니다..! 질문이 많지만 피드백 주시면 감사하겠습니다! ( _ _ ) 화면이 100% 일때는 회원가입 폼의 높이가 잘리고, 80%로 줄여야 그때부터 폼이 화면 안에 다 들어간 상태로 확인할 수 있습니다. 이러한 현상은 브라우저 별 차이로 생각하면 되는 걸까요? 또 저는 화면이 100%일 때도 폼이 안잘렸으면 하는데, 혹시 이때 해결할 수 있는 방법이나 대안이 따로 있을까요? // 노션 파일에 있는 코드와 동일합니다. * { box-sizing: border-box; margin: 0px; } body { width: 100vw; height: 100vh; display: flex; flex-direction: row; justify-content: center; align-items: center; } 성별 인풋에서 radio 동그라미 부분에 따로 스타일을 주고 싶어서 아래와 같이 작성했는데, 적용이 안됩니다. 제가 시도해본 방법은 label 내부에 input을 두고 id와 for을 묶어서 스타일을 적용해보았으나, 실패했습니다. 혹시 적용이 안되는 이유와 해결 방법을 알려주실 수 있을까요? <input type="radio" name="gender" class="gender-radio" />여성 .gender input[type="radio"] { background: #ebebeb; border: 1px solid #d2d2d2; } 하단 가입하기 버튼 바로 위에 있는 수평선을 <hr> 태그가 아닌, 버튼을 감싸는 div 박스에 border-top을 주어 스타일을 작성했는데요, 아래와 같이 footer와 버튼이 겹쳐버리는 현상이 발생했습니다. 저는 이를 마진 겹침 현상으로 생각하고, 부모 요소에 padding, inline-block, overflow:hidden을 적용해 보았지만 결국 문제를 해결하지 못했습니다. 저는 html 코드를 줄이고자 버튼을 감싸는 박스로 가로선을 해결하고 싶었는데, 이러한 현상이 발생하는 이유와 이 경우 어떤 식으로 해결할 수 있는지 궁금합니다. <div class="footer"> <button id="signup-button">가입하기</button> </div> .footer { width: 380px; height: 1px; margin: 32px 0px 20px 0px; border-top: 1px solid red; } #signup-button { width: 380px; height: 75px; background: #ffffff; border: 1px solid #0068ff; border-radius: 10px; font-size: 18px; line-height: 27px; text-align: center; }

  • react
  • node.js
  • seo
  • graphql
  • next.js
차롱 댓글 1 좋아요 0 조회수 352

중고마켓 리스트 질문

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

export const FETCH_USEDITEMS = gql` query fetchUseditems($page: Int, $search: String, $isSoldout: Boolean) { fetchUseditems(page: $page, search: $search, isSoldout: $isSoldout) { _id name remarks contents images tags price pickedCount seller { _id email name } } } `; 중고마켓에 fetchUseditems 대해 질문이 있습니다. isSoldout을 true와 false로 각각 가져와서 데이터를 화면에 띄우려고 하는데 어떤 식으로 가져와야 하나요? const { data } = useQuery< Pick<IQuery, "fetchUseditems">, IQueryFetchUseditemsArgs >(FETCH_USEDITEMS); 이부분에서 무엇을 더 추가해야하는지 아니면 presenter에서 가져와야하는지 갈피를 못잡겟네요. ㅠㅠ

  • react
  • node.js
  • seo
  • graphql
  • next.js
임프런 댓글 1 좋아요 0 조회수 400

중고 마켓 부분 백엔드

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

중고 마켓의 백엔드 부분은 수업에서 제공돼는 기본적인 CRUD 로 가능한건가요??

  • react
  • node.js
  • seo
  • graphql
  • next.js
togussla16 댓글 1 좋아요 0 조회수 362

중고마켓 리스트 질문입니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

현재 중고마켓 리스트 부분을 하고 있습니다. 이 부분에서 판매중상품 판매된상품 을 하고있는데 fetchUseditems에 있는 isSoldout 부분을 어떤식으로 가져와야 할 지 모르겠네요.. refetch 를 사용해야 하는 건가요..?

  • react
  • node.js
  • seo
  • graphql
  • next.js
임프런 댓글 1 좋아요 0 조회수 367

Log out 이슈

미해결

[리뉴얼] React로 NodeBird SNS 만들기

middlewares까지 구현하고, 로그아웃 router에 isLoggedIn 필터링 해서 실행했는데 로그아웃을 누를때마다 '로그인이 필요합니다.' 라는 Message를 받습니다. 로그인하는 과정이 문제라는 가설을 세워서 passport 세팅도 확인했고, login route도 확인했습니다. 하지만 로그아웃 했을때 같은 에러 메세지를 받았습니다. middlewares를 적용 안하고 terminal 확인을 했을때 이런 메시지를 받았습니다. req.logout에 콜백함수가 필요하다고 해서 router.post('/logout', (req, res) => { req.logout((err)=>{ console.error(err) }); req.session.destroy(); res.send('ok'); }); logout router를 이렇게 바꾸고 로그아웃 해봤는데, LOG_OUT_SUCCESS는 뜨는데, 서버가 crushed 됬다고 하고, 그 후 로그인이 안됩니다. 음..혹시 이 부분 외에 어딜 더 체크해봐야 하는지 조언 해주실 수 있을까요? 항상 좋은 강의에 감사합니다 :)

  • react
  • redux
  • node.js
  • express
  • next.js
Spencer Kwon 댓글 1 좋아요 0 조회수 396

site-map ssr 작성 시 문제점

해결됨

Next.js 시작하기(feat. 지도 서비스 개발)

강의에 나온 https://www.npmjs.com/package/next-sitemap 라이브러리를 받고 문서 따라서 server side sitemap (getServerSideSitemap) 을 보고 문서대로 경로 만들고 라우터 만들어서 getServerSideSitemap() 로 리턴하여 사이트맵을 생성하였습니다. .next 에 server-sitemap.xml.body이 잘 만들어졌습니다 문제는 한 파일에 15만개가 넘게 작성이 된 것입니다. 구글 검색엔진에서 사이트맵의 URL 50,000개로 제한두고 있습니다. 문서따라서 config 에 sitemapSize: 10000, 설정을 적용하여도 스플릿팅 되지 않습니다. 어떻게 해결해야 하나요? node: 18.15.0 "next-sitemap": "4.0.9" "next": "^13.4.2",

  • seo
  • next.js
  • vercel
  • csr
  • ssg
  • ssr
콩팥팥죽 댓글 1 좋아요 1 조회수 460

invaratiant violation 에러가 뜹니다

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

Uncaught at new InvariantError ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\ts-invariant\lib\invariant.cjs:16:28) at Object.invariant ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\ts-invariant\lib\invariant.cjs:28:15) at parser ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\@apollo\client\react\parser\parser.cjs:34:23) at Object.verifyDocumentType ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\@apollo\client\react\parser\parser.cjs:93:21) at useMutation ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\@apollo\client\react\hooks\hooks.cjs:431:12) at BoardWrite (webpack-internal:///./pages/src/components/units/board/write/BoardWrite.container.js:34:86) at processChild ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3353:14) at resolve ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3270:5) at ReactDOMServerRenderer.render ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3753:22) at ReactDOMServerRenderer.read ( file://C:\Users\82109\OneDrive\바탕 화면\codecamp-frontend-mentee\freeboard_frontend\node_modules\react-dom\cjs\react-dom-server.node.development.js:3690:29) 콘솔창에는 이렇게 찍히고 콘테이너 코드입니다 import { useMutation } from "@apollo/client"; import { useRouter } from "next/router"; import { useState } from "react"; import CREATE_BOARD from "./BoardWrite.queries"; import BoardWriteUI from "./BoardWrite.presenter"; export default function BoardWrite() { const router = useRouter(); //입력값 받는 훅 const [writer, setWriter] = useState(""); const [password, setPassword] = useState(""); const [title, setTitle] = useState(""); const [contents, setContents] = useState(""); //오류코드 받는 훅 const [writerError, setWriterError] = useState(""); const [passwordError, setPasswordError] = useState(""); const [titleError, setTitleError] = useState(""); const [contentsError, setContentsError] = useState(""); //입력값 저장하는 훅 const [createBoard] = useMutation(CREATE_BOARD); //입력값(작성자) 받는곳 & 오류창 없애는곳 function onChangeWriter(event) { setWriter(event.target.value); if (event.target.value !== "") { setWriterError(""); } } function onChangePassword(event) { setPassword(event.target.value); if (event.target.value !== "") { setPasswordError(""); } } function onChangeTitle(event) { setTitle(event.target.value); if (event.target.value !== "") { setTitleError(""); } } function onChangeContents(event) { setContents(event.target.value); if (event.target.value !== "") { setContentsError(""); } } //등록 함수 const onClickInformation = async () => { if (!writer) { setWriterError("작성자를 입력해주세요"); } if (!password) { setPasswordError("비밀번호를 입력해주세요"); } if (!title) { setTitleError("제목을 입력해주세요"); } if (!contents) { setContentsError("내용을 입력해주세요"); } if (writer && password && title && contents) { try { const result = await createBoard({ variables: { createBoardInput: { writer, password, title, contents, }, }, }); console.log(result.data.createBoard._id); router.push(`/portfolio/boards/${result.data.createBoard._id}`); } catch (error) { alert(error.message); } } }; return ( <div> <BoardWriteUI aaa={onChangeWriter} bbb={onChangePassword} ccc={onChangeTitle} ddd={onChangeContents} eee={onClickInformation} aaaa={writerError} bbbb={passwordError} cccc={titleError} dddd={contentsError} /> </div> ); } 유아이 코드입니다 import { Container, MainTitle, InformationBox, WriterBox, WriterInput, Title, TitleContents, TitleBox, Input, ContentsContent, AddressNumber, AddressBox, ButtonOne, AddressBtnBox, PicContentsBox, CheckBoxes, CheckBoxesContainer, CheckBoxSpan, OkBtn, UploadBtn, Address, ErrorText, } from "./BoardWrite.styles"; export default function BoardWriteUI(props) { return ( //html 자리 <Container> <MainTitle>게시물 등록</MainTitle> <InformationBox> <WriterBox> <Title>작성자</Title> <WriterInput type="text" placeholder="이름을 적어주세요." onChange={props.aaa} ></WriterInput> <ErrorText>{props.aaaa}</ErrorText> </WriterBox> <WriterBox> <Title>비밀번호</Title> <WriterInput type="password" placeholder="비밀번호를 적어주세요." onChange={props.bbb} ></WriterInput> <ErrorText>{props.bbbb}</ErrorText> </WriterBox> </InformationBox> <TitleBox> <Title>제목</Title> <TitleContents type="text" placeholder="제목을 작성해주세요." onChange={props.ccc} ></TitleContents> <ErrorText>{props.cccc}</ErrorText> </TitleBox> <TitleBox> <Title>내용</Title> <ContentsContent type="text" placeholder="내용을 작성해주세요." onChange={props.ddd} ></ContentsContent> <ErrorText>{props.dddd}</ErrorText> </TitleBox> <AddressBox> <Title>주소</Title> <AddressBtnBox> <AddressNumber type="text" placeholder="07250"></AddressNumber> <ButtonOne>우편번호 검색</ButtonOne> </AddressBtnBox> <Address type="text"></Address> <Address type="text"></Address> </AddressBox> <TitleBox> <Title>유튜브</Title> <Input type="text" placeholder="링크를 복사해주세요."></Input> </TitleBox> <TitleBox> <Title>사진 첨부</Title> <PicContentsBox> <UploadBtn>+</UploadBtn> <UploadBtn>+</UploadBtn> <UploadBtn>+</UploadBtn> </PicContentsBox> </TitleBox> <TitleBox> <Title>메인 설정</Title> <CheckBoxesContainer> <CheckBoxes type="checkbox"></CheckBoxes> <CheckBoxSpan className="youtube">유튜브</CheckBoxSpan> <CheckBoxes type="checkbox"></CheckBoxes> <CheckBoxSpan className="youtube">사진</CheckBoxSpan> </CheckBoxesContainer> </TitleBox> <OkBtn onClick={props.eee}>등록하기</OkBtn> </Container> ); } 쿼리 코드입니다 import { gql } from "@apollo/client"; export const CREATE_BOARD = gql` mutation createBoard($createBoardInput: CreateBoardInput!) { createBoard(createBoardInput: $createBoardInput) { _id } } `; 마지막으로 인덱스 코드입니다, import BoardWrite from "../../../src/components/units/board/write/BoardWrite.container"; export default function board() { //자바스크립트 자리 return ( //html 자리 <div> <BoardWrite /> </div> ); } 화면에는 Server Error Invariant Violation: Argument of undefined passed to parser was not a valid GraphQL DocumentNode. You may need to use 'graphql-tag' or another method to convert your operation into a document 요렇게 적혀있는데 어떤 에러일까요?

  • react
  • node.js
  • seo
  • graphql
  • next.js
지우혁 댓글 1 좋아요 0 조회수 546

인기 태그

인프런 TOP Writers

주간 인기글