클라이언트 컴포넌트에서 서버 컴포넌트 임포트
해결됨
한 입 크기로 잘라먹는 Next.js
수업에서 Next.js에서는 클라이언트에 import 되는 서버 컴포넌트를 자동으로 클라이언트 컴포넌트로 변경해주는 동작을 한다. 라고 하셨는데요. 공식문서나 구글 문서를 아무리 찾아봐도 관련 언급이 없던데요. 혹시 출처를 알수 있을까요? 언제 업데이트 된건지 확인해보고 싶어서요
- react
- typescript
- next.js
172만명의 커뮤니티!! 함께 토론해봐요.
해결됨
한 입 크기로 잘라먹는 Next.js
수업에서 Next.js에서는 클라이언트에 import 되는 서버 컴포넌트를 자동으로 클라이언트 컴포넌트로 변경해주는 동작을 한다. 라고 하셨는데요. 공식문서나 구글 문서를 아무리 찾아봐도 관련 언급이 없던데요. 혹시 출처를 알수 있을까요? 언제 업데이트 된건지 확인해보고 싶어서요
미해결
한 입 크기로 잘라먹는 Next.js
6.5 에러핸들링 24:04 (with-searchbar) 레이아웃을 살리기위해 error.tsx를 app/book/[id] 로 옮겨도 <Searchbar />가 보이지 않는 현상이 있습니다. 그리고 영상에서도 app/book/[id] 가 에러인 상황임에도 검색바 레이아웃이 보이는 장면이 없어서 헷갈리는 것 같습니다!
미해결
김영한의 실전 자바 - 기본편
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 1. 클래스와 데이터 26p 최상단 Student students = new Student[2]이 옳바른 문장인것인가요? 강의 내용처럼 객체로 배열을 만드는 상황이라면 Student[] students = new Student[2] 이렇게 바꿔야되는 것이 아닌지 궁금합니다.
미해결
Do it! 알고리즘 코딩테스트 with JAVA
영상에서 탐색 순서가 1 > 3 > 4 > 6 > 2 > 5 로 되어있는데 왜 5 > 2 가 아닌 2 > 5가 되는지 궁금합니다. 진행 되는 순서가 노드를 넣고 > 노드를 꺼내고 가 맞지 않나요? 아님 2 > 5로 되어도 상관 없는건가요?
미해결
따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
섹센6의 마지막 강의를 진행 중입니다. docker-compose up 명령어 이후, containers에는 redis가 남아 있습니다. node는 내려가고, redis는 유지되는 이유가 궁금합니다.
해결됨
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] MemberApiController.java MemberService.java 쿼리 실행이 select - update - select가 로그에 출력될꺼라고 예상 했는데 실제 로그는 select - update 까지만 출력되는데 이유를 알 수 있을까요?
미해결
한 입 크기로 잘라먹는 Next.js
import { type NextRequest, NextResponse } from 'next/server'; import { fetchData } from '@/shared/apis/fetch-data'; import type { IAcademyCreateDTO, IPostEnrollAcademyResponse } from '@/shared/types/acadmy'; export async function POST(req: NextRequest) { const body = (await req.json()) as Promise<IAcademyCreateDTO>; const data = await fetchData<IPostEnrollAcademyResponse>('/api/v1/academies', 'POST', body); if (!data.isSuccess) { return NextResponse.json( {}, { status: 500, statusText: data.message, }, ); } return NextResponse.json(data); } 서버에, 에러시 아래와 같은 데이터 구조를 준다고 했을떄 위의 방식처럼, 에러 핸들링을 하는 것이 맞는지 궁금합니다... Route Handler의 보편적인 에러처리 방식이 너무 궁금합니다!! (직접 에러 메시지를 작성하는것이 아닌 서버에서 내려주는 에러메시지를 화면에 표기하고 싶습니다.) export type CommonResponse<T = unknown> = { code: string; isSuccess: boolean; message: string; result: T; };
미해결
Next + React Query로 SNS 서비스 만들기
안녕하세요 next-auth로 토큰 갱신 로직을 개발하는 중에 해결되지 않는 문제가 발생하여 질문 드립니다. 현재 클라이언트에서 api 요청을 하면 middleware에서 const token = await auth(); 이런식으로 세션 정보를 가져와 accessToken을 헤더에 삽입하는 방식을 구현하였습니다. if (request.nextUrl.pathname.startsWith("/gateway")) { const session = await auth(); const accessToken = session?.accessToken; const { device } = userAgent(request); const localeFromCookie = cookieStore.get("dp_lang")?.value as string; const defaultLocale = getLanguageCodeFromLocale(localeFromCookie); request.headers.set("Accept", "*/*"); request.headers.set("Authorization", `Bearer ${accessToken}`); request.headers.set("Access-Control-Allow-Origin", "*"); request.headers.set("deviceType", "1"); request.headers.set("deviceId", getDeviceIdFromCookie(cookieStore)); request.headers.set("osType", getOsTypeFromCookie(cookieStore)); request.headers.set("User-Agent", device.model ?? ""); request.headers.set("locale", localeFromCookie); request.headers.set("language", defaultLocale); const response = NextResponse.next({ request: { headers: request.headers, }, }); return response; } 따라서 미들웨어에서 세션에 접근하는 순간에 jwt콜백이 실행되어 jwt 토큰에 저장되어 있는 토큰 expire 시간을 비교하여 만료여부를 판단 한 뒤에 토큰 갱신이 되도록 구현을 하였습니다. async jwt({ token, account, user }) { // Initial sign in if (account && user) { return { accessToken: user.accessToken, expiresAt: new Date( Date.now() + (user?.expiresIn ?? 0) ).toISOString(), refreshToken: user.refreshToken, serviceAvailable: true, }; } // Return previous token if the access token has not expired yet if ( new Date() < new Date(new Date(token.expiresAt as string).getTime() - 5000) ) { console.log("@@@@@@valid"); return token; } else { if (token.error === "RefreshTokenInvalid") { return token; } // Access token has expired, try tㄴo update it try { console.log("@@@@@@expired"); const refreshedTokens = await authApi.refreshAuthToken({ refreshToken: token.refreshToken as string, accessToken: token.accessToken as string, }); console.log("==========token refreshed========"); // reissue token return { ...token, accessToken: refreshedTokens.accessToken, expiresAt: new Date( Date.now() + (refreshedTokens.expiresIn ?? 18000) ).toISOString(), refreshToken: refreshedTokens.refreshToken ?? token.refreshToken, error: null, }; } catch (error) { console.error("Token refresh failed", error); if (error.status === RestApiErrorType.invalidTokenException) { return { ...token, error: "RefreshTokenInvalid", }; } return { ...token, error: "RefreshAccessTokenError" }; } } }, 기존에는 세션에 접근을 할때 next-auth의 jwt 콜백이 돌고 값이 리턴되면 쿠키의 session-token값에 암호화된 값들이 업데이트 되는 걸로 알고 있었는데 찾아보니 현재 세션에 접근하고 갱신하는 부분이 서버단에 있어서 쿠키가 업데이트 되지 않는다고 합니다. 따라서 현재 토큰이 만료된 후 한번에 3가지의 api 콜을 요청했을때 첫번째 api요청에서는 정상적으로 토큰 refresh가 요청이 되며 middleware에서 세션에 접근해 갱신된 토큰이 가져와져 요청이 성공되나 그 뒤 요청부터는 쿠키에 업데이트가 되지 않아서인지 세션에서 갱신 전 토큰이 가져와지는 현상이 발생하고 있습니다. 클라이언트에서 세션 업데이트 후 세션에 접근을 해야 쿠키값이 갱신이 된다고 하는데 다른 방법이 있는지 문의드립니다.
해결됨
김영한의 실전 자바 - 중급 2편
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 8번째 pdf파일 set의 주요 메서드 설명을(3page) 보고 있는 도중에, 글씨가 안 보이는 부분이 있어서 여쭤 봅니다. pdf파일로 열어서 보고 있는데 표 끝부분이 정확히 안나와서, 저만 그런건지 알고 싶어서 질문을 올립니다. 혹 저만 그런 건가요? 아니면 다들 똑같은신지요?
해결됨
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요. 강의 잘 보고 있습니다. 마지막에 와서 의문이 드는게 있어 질문 남겨봅니다. 첫 번째 예제 TestPublisherTestExample01 에서는 source.next 로 테스트를 진행했고, 세 번째 예제 TestPublisherTestExample03 에서는 source.emit 으로 테스트를 진행했는데요. emit의 경우 내부적으로 complete()을 통해 signal을 발생 시키는 것으로 이해했습니다. 그런데, 말씀대로라면 첫 번째 테스트에서 expectComplete() 이 통과하는게 이해가 가지 않아서요. 둘의 차이는 결국 Flux를 create 해주는 방식에 있는 것 같은데, 첫 번째 예제의 경우 zipWith을 통해 complete이 발생하는 걸까요? 잘 감이 오지 않는데, 설명해주시면 감사하겠습니다!
미해결
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의를 다시 보며 개인적으로 복습하던 중 만약 MySQL까지 배포를 완료한 후에 깃허브에 코드를 올리게 되면 Repo가 Public이라서 application에 설정해둔 저의 DB정보와 password도 함께 보여지게 될 텐데 이를 방지하는 방법이 있을까요? Private일 때 배포하는 방법은 강의 내용에 없어서 아쉽지만ㅠ Public일 때 깃허브에 application 설정을 gitignore을 통해서 push하지 않아도 배포하는 데에 있어서 지장이 없는지 궁금합니다!
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' } group = 'hello' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } 제 프로젝트에 "toolchain { languageVersion = JavaLanguageVersion.of(21)" 라고 기술했는데요. 제 시스템에 설치된 jdk버전이 꼭 21 버전이어야만 빌드가 되더라구요. 자바 버전이 17이면, jdk가 17이상만 되면 빌드가 된다고 어디서 들었던 것 같은데, 혹시 툴체인이랑은 별개의 내용인건가요?
해결됨
개발자를 위한 쉬운 도커
파트 9. 도커 실무에 적용하기 듣고 있는대요. 강의 중에 vscode로 실습하시는 파일을 저도 git clone하고싶은대, 강의자료나, 강의 내용에도 없고, 따로 clone하지마시라고 하신걸까요? 스크래치 빌드하는강의 듣고있네요.
해결됨
실전도커: 도커로 나만의 딥러닝 클라우드 컴퓨터 만들기
안녕하세요 다니엘 선생님, 좋은 설명해주셔서 수업을 즐겁게 다 들을 수 있었습니다. 수업을 마치며, 한가지 궁금한 점이 있어 질문 드립니다. 도커를 배우기 전 윈도우 운영체제에서 CUDA와 tensorflow를 설치하는 데 고생했던 기억이 있습니다. 자신의 GPU에 맞는 그래픽 드라이버와 이에 호환되는 CUDA버전, cudnn 버전을 맞춰야 하는게 그 이유였는데, 도커에서 이미지로 빌드한 컨테이너 안에서 돌린 keras예제는 잘 실행되었습니다. pytorch도 마찬가지였습니다. 어떻게 따로 버전을 맞추지 않아도 자연스럽게 환경이 맞춰진건가요? VM에서 사용된 Tesla T4 gpu가 특이한건가요? 전공자가 아니라 질문이 황당하게 느껴지실 수도 있겠지만, 정말 궁금해서 여쭤봅니다!
미해결
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네 [질문 내용] 안녕하세요! 책으로 공부 할 땐 어려웠는데 영한님 덕분에 편하게 공부 하고 있습니다. 감사합니다. 다름이 아니라 블로그에 배운 내용을 작성 하려고 하는데 쓰레드 섹션 2,3의 경우 영한님 코드가 노출 되어도 괜찮나요?.. 출처는 당연히 남깁니다! 섹션 2,3 경우 코드가 많지 않아서 이걸 블로그에 올려도 될까 고민입니다.
미해결
백엔드 프레임워크 만들기 (개정판)
저는 자바스크립트로 Front, 그리고 간단한 서버(단순 CRUD 수준)를 개발하다가, 이제 막 JAVA 문법을 익혔습니다. 제 프로젝트의 서버 개발을 위해 Spring을 배우려고 하는데요. 스프링부터 배울지 이 강의를 먼저 수강후 스프링을 배울지 고민이 됩니다. 고민이 되는 주된 이유는 난이도 때문에 그렇습니다. 당장 필요한 서버 기능을 위해 스프링을 배울까 하다가도 결국 객체지향을 이해하는게 핵심이겠다 싶어 이 강의를 먼저 듣는게 낫겠다 싶기도 합니다. 그러나 제가 따라 갈 수 있을지 고민이 됩니다. 이미 강의 결제는 했지만, 어떤 과정이 효율적일지 판단이 안됩니다. 혹시 조언을 부탁드려도 될까요?
해결됨
[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
import java.util.*; public class Main { static int N, M, R; static int[] answer; static ArrayList<Integer>[] graph; static boolean[] visited; static int order = 1; public static void dfs(int idx) { visited[idx] = true; answer[order] = idx; order++; for(int i = 0; i < graph[idx].size(); i++) { if(!visited[graph[idx].get(i)]) dfs(graph[idx].get(i)); } } public static void main(String[] args) { Scanner input = new Scanner(System.in); N = input.nextInt(); M = input.nextInt(); R = input.nextInt(); answer = new int[N+1]; visited = new boolean[N+1]; graph = new ArrayList[N+1]; for(int i = 1; i <= N; i++) { graph[i] = new ArrayList<>(); } for(int i = 0; i < M; i++) { int x = input.nextInt(); int y = input.nextInt(); graph[x].add(y); graph[y].add(x); } for(int i = 1; i < graph.length; i++) { Collections.sort(graph[i], Collections.reverseOrder()); } dfs(R); for(int i = 1; i < answer.length; i++) { System.out.println(answer[i]); } } } 이렇게 구현한 경우, 틀렸다고 나오는데, ide로 돌리고 출력해보면 1 4 3 2 0 으로 정상 출력되는데.. 이유를 모르겠습니다ㅠㅠ! 선생님이 작성해주신 코드 answer[idx] = order; order++; 제가 작성한 코드 answer[order] = idx; order++; 이렇게해도, 제가 하나씩 디버깅해서 따라가보면, 정답과 맞게 나오는데, 틀렸다고합니다.. !
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
강사님과 똑같이 했는데 h2에서 member 테이블이 사라지고 결과 값엔 Table "MEMBER" not found; SQL statement 라고 나옵니다. 그래서 테이블 생성을 위해 @Table(name = "Member")로 생성을 시도했지만 생성 또한 되지 않습니다. 제가 원하는건 강사님과 똑같은 결과 값이 나오게 하려면 어떤 부분을 수정해야할까요?
해결됨
한 입 크기로 잘라먹는 Next.js
안녕하세요. 컴포넌트 스트리밍 적용하기에서 searchParams가 Promise 값을 반환하는 형태로 바뀌었는데요. Suspense에서 key 값을 어떻게 처리하나요? searchParams 자체는 비동기 처리하는 함수를 분리해서 검색이 가능하게는 처리가능한데 Suspense는 마땅한 방법이 없어보여서 질문 드려봅니다. searchParams: Promise<{ q?: string; }>;
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
무신사와 비슷하게 만들고 있는데 하나의 옷은 여러개의 카테고리를 가질 수 있잖아요 Ex) [상품] 버버리코트 - [카테고리]상의, 코트, 겨울 등등.. 그런데 하나의 카테고리 또한 여러개의 상품에 등록되는 거 같아요 Ex) [상품]아디다스 저지, 빨간색니트, 반팔티 - [카테고리]상의 이래서 N-M으로 연관관계 매핑이 되는 줄 알고 중간테이블로 둬서 1:N , N:1로 만들었습니다. 그런데 아이템을 넣고 확인해보니 중간테이블과 카테고리의 아이디가 동일하게 올라갈 수 밖에 없는 로직으로 구성되어 있습니다. 왜냐하면 옷 하나를 등록할 때 보통 많은 카테고리를 넣기 때문입니다. Item item = ItemRegisterDto.Request.toItemEntity(itemRegisterDto, findMember); itemRepository.save(item); Set<String> categoryNames = itemRegisterDto.getCategoryNames(); for (String categoryName : categoryNames) { Category category = ItemRegisterDto.Request.toCategoryEntity(categoryName); category.addItemCategories(item, category); categoryRepository.save(category); } public void addItemCategories(Item item, Category category) { this.itemCategories = new ArrayList<>(); this.itemCategories.add(ItemCategory.builder() .category(category) .item(item) .build()); } 중간테이블과 카테고리의 아이디가 동일하게 올라가므로 굳이 중간테이블을 쓰지 않고 옷과 카테고리를 1:N 양방향 매핑으로 연관관계를 만들면 될 거 같다고 생각했습니다. 만약, 옷과 카테고리를 1:N 양방향 매핑이 맞다면 하나의 옷은 여러개의 카테고리를 가질 수 있고 하나의 카테고리 또한 여러개의 옷을 가질 수 있는데 다대다관계가 아닌 이유도 궁금합니다. 마지막으로 어떻게 생각해야 연관관계 매핑에 있어서 잘 지을 수 있을까요?