학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 계속 "내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다." 라고 뜹니다.
안녕하세요! 언제나 멋진 강의 감사드립니다. 다름이 아니라, 프로젝트를 Vercel에 배포하는 과정에서 아래와 같은 컴파일 실패 에러가 빌드 로그에서 검출되어서 이에 대해 여쭤보고 싶습니다. 화면 상에서는 src/app/(with-searchbar)/search/page.tsx 에 선언한 generateMetaData 함수가 Next.js 페이지의 요구조건을 충족시키지 못한다라는 내용으로 보여지는데요, 이런 경우에는 해당 요소에서 어떤 부분을 확인해볼 수 있을까요? 해당 페이지에 대한 코드도 함께 첨부해 드리겠습니다. \app\(with-searchbar)\search\page.tsx import BookItem from "@/components/book-item"; import BookListSkeleton from "@/components/skeleton/book-list-skeleton"; import { BookData } from "@/types"; import { delay } from "@/util/delay"; import { Metadata } from "next"; import { Suspense } from "react"; //index 페이지와 다르게 search 페이지는 QueryString과 같은 동적인 값에 의존하고 있기 때문에 static 페이지로는 설정할 수 없지만, 데이터 캐시를 최대한 이용하는 것으로 최적화 async function SearchResult({q}:{q:string}) { await delay(2000); const response = await fetch( `${process.env.NEXT_PUBLIC_API_SERVER_URL}/book/search?q=${q}`, {cache: "force-cache"} ); if(!response.ok){ return <div>오류가 발생했습니다 ...</div> } const books: BookData[] = await response.json(); return ( <div> {books.map((book) => ( <BookItem key={book.id} {...book} /> ))} </div> ); } //현재 페이지의 메타데이터를 동적으로 생성하는 함수 export async function generateMetaData({ searchParams, }: { searchParams: Promise<{q?: string}>; }): Promise<Metadata> { const {q} = await searchParams; return { title: `${q} : 검색 결과`, description : `검색어 ${q}의 검색 결과입니다`, openGraph: { title: `${q} : 검색 결과`, description : `검색어 ${q}의 검색 결과입니다`, images: ["/thumbnail.png"], } } } export default async function Page({ searchParams, }: { searchParams: Promise<{ q: string }>; }) { const {q} = await searchParams; return ( <Suspense key={q || ""} fallback={<BookListSkeleton count={3} />}> <SearchResult q={q ||""} /> </Suspense>); }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 중복 회원 예외()에서 오류가 자꾸 발생합니다. @Test public void 중복_회원_예외() throws Exception { //Given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //When memberService.join(member1); IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); //Then assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } } Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended java.lang.IllegalStateException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:39) at java.base/java.util.Optional.ifPresent(Optional.java:178) at hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:38) at hello.hello_spring.service.MemberService.join(MemberService.java:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.aop.support .AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) at hello.hello_spring.service.MemberService$$SpringCGLIB$$0.join(<generated>) at hello.hello_spring.service.MemberServiceIntegrationTest.중복_회원_예외(MemberServiceIntegrationTest.java:45) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
선생님! 안녕하세요. 항상 잘 듣고 있습니다! 다름이 아니고, 6분 대부터 나오는 케이스 6, 7에 대해 오류가 있는 거 같아 질문 드립니다. 강의 자료는 class Parent { ~라고 잘 되어있는데 다운 받는 자료에는 class Person [ ~ 이라고 되어있어 Parent 클래스가 없는 거 같습니다. 별개로 이런 상황에서는 person을 parent로 고치던지 class Child extends Person이라고 고치면 될까요?? --- 하나 더 질문을 드리자면 11:12 즈음에 '3. 생성자와 멤버변수를 부를 때 같은 키워드를 쓰니 주의' 라는 부분은 this = 자기자신 객체 super = 부모 객체 . = 멤버의 변수나 메서드 접근 () = 생성자나 메서드 호출 이렇게 생각하면 될까요?? 항상 감사합니다!
Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부
안녕하세요, 좋은 강의 감사합니다. 쉬운 예제코드와 그림설명 덕분에 Java 8 stream API, Spring Batch ItemStream 과 대조해가며 쑥쑥 이해하고 있습니다. ContextAPIExmaple02 에서 궁금한 점이 있습니다. contextWrite() 호출 순서에 의문이 생겨 순서를 변경해보니, 무조건 아래에서 위로 진행되는 걸로 확인되었습니다. 이 규칙이 적용되는 원리가 궁금합니다. 현재 추측하기로는 "subscription signal 에 따라 upstream 으로 이동하는 operator 들은 모두 아래에서 위 순서대로 이동(반전)된다." 인 것 같은데, 확신이 생기지 않습니다. 참고 할 수 있는 자료나 내부 클래스가 있을까요?
안녕하세요! 실습문제 풀다가 질문이 있어서 올려봅니다 제가 코드를 작성할때는 흐름대로 쭉 작성하고 마지막에는 간결하게 줄일 수 있는 부분은 줄여서 표현하고 있는데, 이게 저는 흐름대로 쭉 작성을 하고나서 변수를 합치거나 하니깐 괜찮은데 동료들이 이 코드를 보게 되면 변수를 선언하지 않고 합쳐서 표현해놓는 경우 이해가 바로 안되는 경우가 있을 수 있을거 같은데, 이런 경우에는 합치지 않고 두는게 좋을까요? 영한님이 생각하시는 운영관점에서 인라인 활용에 대해 궁금합니다!
안녕하세요, 강의 너무 잘 수강하고 있습니다. 강의 수강 중 질문이 생겨서요 refresh Token을 사용하지 않는 이유가 있을까요? access 토큰 하나를 하루의 유효기간을 부여해서 사용하는 이유가 궁금합니다. jwt 버전이 0.11.5로 진행해주셨는데 0.12.x 버전도 있는 걸로 알고 있어요 버전의 올라감과 동시에 로직의 변화도 있는 거로 알고 있습니다. 요것도 0.11.x로 진행하신 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 배우는 언어들 자바,c언어,파이썬 기본 문법을 먼저 다 수강하는게 좋을까요 아니면 자바를 주력 언어로 공부하면서 틈날때 다른 언어들을 공부해야할까요? 학점 챙기려면 기본언어들만 수강하는게 좋아보이는데 문법 공부만 하루종일 하면 좀 헷갈리기도하고 지루할거같아서 질문드립니다.
[ 👍 좋은 질문을 했을 때 좋은 답변이 돌아 옵니다] 안녕하세요 일프로님! 혼자서 해결해보려다가 하루종일 해봤는데 계속 같은 문제가 반복 되어서 질문드립니다. 현재까지 트러블 슈팅 해본 경험으로는 VM의 시스템 단의 문제 인걸로 파악이 됩니다. 계속해서 일어나는 현상이 VM이 CPU 사용률이 높아서 K8s kube-system 내의 오브젝트들이 죽는 것이 반복 되는데 죽었다 살았다가 지속 되다가 VM도 멈춰버립니다. 이 환경을 최적화 하고 리소스 낭비가 있는 곳이 있다면 줄여서 정상적으로 실습을 하고 싶습니다. 참고로 제 노트북은 14코어에 렘 16Gb 입니다. CPU는 CICD 서버와 master node가 있는 서버가 돌아가도 50% 미만으로 여유가 있습니다. 렘 사용률은 90% ~ 95% 정도를 유지합니다. 1. 실습 중 본인의 환경이 가이드와 다른 부분이 있었다면 말씀해주세요. Jenkins step3 blue-green 배포 진행 하다가 VM이 커널이 뻗어 버려서 리소스들이 부족한가 생각이 들어서 VM 종료 후 VitualBox 설정에서 VCPU 프로세서를 6 -> 12로 고쳐 다시 기동했습니다. Deployment들이 startupProbe 밑 설정들이 파드 로그들을 봤을 때 java 앱 기동도 전에 재시작이 되어 10초마다 60번 까지 체크 하는 걸로 고쳤습니다. 2. 해당 문제의 발생 빈도(재설치 여부)와 문제 해결을 위해 시도해본 케이스를 말씀해 주시면 원인 파악에 큰 도움이 됩니다. 지속적으로 VM에 문제가 발생합니다. [root@k8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE app-1-2-2-1-78cbbff668-7vkls 0/1 Unknown 1 2d app-1-2-2-1-78cbbff668-jvzxq 0/1 Error 5 2d [root@k8s-master ~]# Message from syslogd@k8s-master at Jun 12 15:42:16 ... kernel:watchdog: BUG: soft lockup - CPU#2 stuck for 21s! [portmap:50410] 커널이 멈춰버리는 치명적인 버그가 있어서 검색해보니 사용 중인 리눅스 배포판(Rocky Linux 등)의 커널 버전에 알려진 버그일 수 있다고 들었습니다. 그래서 sudo dnf update -y 위 명령어로 커널 업데이트 했습니다. 업데이트 후에도 계속에서 top으로 조회 해도 cpu 사용률이 100% 를 넘어 가는 경우가 많아서 그럴 때 마다 여러번 VM을 재시작했습니다. 재시작 후 kubelet 과 containerd 도 재시작 하고 정상작동할 때 까지 기다리고 실습을 다시 진행했습니다. 혹시나 전에 배포 했던 오브 젝트들이 차지 하고 있는 리소스 때문에 그런가 해서 anotherclass-2** 으로 시작하는 네임 스페이스들을 anotherclass-221 제외하고 모두 삭제했습니다. 3. 에러 메시지만 봐서는 저도 모르는 경우가 많아요. 그전에 했던 작업이 포함된 캡쳐 화면도 부탁 드려요. 반복해서 kubeapi-server가 죽습니다. 제 기동 되면 다시 kubectl 명령어가 됬다가 일정 시간이 지나고 다시 재시작 됩니다. 그 동안 VM 이 느리지 않았는데 오늘 실습을 하고나서 kubectl 명령실행 시 꽤나 시간 약 (5초~30초) 후에 실행이 되거나 60초가 지나서 명령이 실행되지 않습니다. AI 한테 kube-apiserver 에러로그를 보여주고 답변 받은 내용도 보냅니다 3번 overflow는 2번 이 발생 해서 일어나는 현상이라고 생각이 되어서 3번 오류에 대한 AI 의 답변은 캡쳐 하지 않았습니다. 4. 영상 내용에 대한 질문 시 해당 시간을 같이 올려 주시면 답변을 드리는 시간이 더 빨라집니다. 5. 긴 로그는 제 메일로 보내주세요. ( k8s.1pro@gmail.com ) 6. 카페 [ 강의 자료실 ]에도 많은 질문과 답변들이 있어요!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 영한님 안녕하세요 Spring Data JPA를 사용해서 벌크 연산 관련해서 공부하던 중에 이상한 점을 발견했습니다. (Spring Data JPA 지만 영속성 컨텍스트 flush는 이 강의와 관련이 깊다 생각해 이 강의에 질문 드립니다) ..... 우선 실제 제가 겪었던 상황의 코드가 아닌 다른 같은 상황의 예제 코드이기 때문에 완전하지 않은 점 양해 부탁드립니다.. 3개의 엔티티 (User, UserRole, Comment) 가 존재하고 연관관계 매핑 및 외래키 제약조건은 존재하지 않습니다. // 코드 ~~ List<User> userList = new ArrayList<>(); // 코드 ~~~~ userRepository.saveAll(userList); // 저장 userRoleRepository.save(user_role_map); // 저장 Comment c = new Comment("1", "코멘트"); commentRepository.save(c); // 저장 // 코멘트는 제가 직접 객체를 생성해서 테스트 해보려고 추가하였습니다. 로직과는 관련없습니다. // 위의 userList와 다른 리스트 updateName(userListToUpdate); public interface UserRepository extends JPARepository<User,Long> { @Modifying(clearAutomatically = true) @Query(UPDATE User u SET u.name ="AA" WHERE u IN :users) int updateName(@Param("users") List<User> users); } User에 대해 벌크연산을 진행했습니다. 여기서, userList가 비어있고, userRole와 Comment c에 대해 insert 쿼리가 나가지않고 벌크 연산 업데이트만 진행됩니다..! 이 부분은 당연히 영속성 컨텍스트가 clear 됐기 때문에 그런거라고 이해했습니다. 하지만, userList가 비어있지 않은 경우에는 saveAll로 인해 insert 쿼리가 나가면서 userRole, c 까지 모두 insert 쿼리가 실행되는데 이 부분이 잘 이해가 가질 않습니다... 요약하면, user에 대해 insert 쿼리가 실질적으로 나갈 때에만 다른 엔티티들도 @Modifying(clearAutomatically = true) 되면서 같이 insert 쿼리가 나가고, 비어있지않은 경우에는 insert 쿼리가 나가질 않습니다. 이 벌크 연산이 User에 대한 것이기 떄문에 user에 대한 동기화쿼리는 나가고, 그게 나가면서 다른 엔티티까지 같이 나가는 원리일까요? userRole과 comment는 모두 연관관계매핑도 되어있지않은데 왜 insert 쿼리가 같이 나가는지 궁금합니다
const getStringedDate = (targetDate) => { let year = targetDate.getFullYear(); let month = targetDate.getMonth() + 1; let date = targetDate.getDate(); if (month < 10) { month = `0${month}`; } if (date < 10) { date = `0${date}`; } return `${year}-${month}-${date}`; }; 초기값 설정 할 때 input 태그가 date 객체를 해석하지 못해서 위의 getStringedDate() 함수로 문자열로 변환하여 value 속성으로 넣어줘야 한다고 하셨는데요, 사용자 입력값을 넣을 때는 input을 수정하면 문자열로 들어가기 때문에 다시 date 객체로 바꿔주는 함수를 새로 사용해야 하던데 <input name="createdDate" onChange={onChangeInput} value={getStringedDate(input.createdDate)} type="date" /> 이미 여기서 getStringedDate() 로 객체에서 문자열 변환하는 함수를 사용해서 값을 나타내야하기 때문에 onChangeInput() 함수를 사용해야 하는건가요? 이 흐름이 맞는 거 같긴한데 왠지 좀 번거로운거 같아서 제가 이해한게 맞는지 궁금해서요 참고로 섹션13 12.14)강의의 10:22 부분을 듣고 생긴 질문입니다!
안녕하세요. 젠킨스 파이프라인 기본 구성 및 배포 세분화 강의를 보던 중 궁금한 점이 생겨 질문을 남기게 되었습니다. 강의 영상의 8분 25초쯤을 보시면, Github project에 Project url을 지정하는 곳이 보입니다. 그리고, 9분쯤에 Repository URL이라는 부분도 보입니다. 이 두 속성의 차이점이 궁금합니다. 제 개인적인 생각으로는 Project URL의 경우 해당 Repo가 Private일 경우 Jenkins에서 접근할 방법이 없기 때문에 단순히 명세의 개념이라고 생각했습니다. 반대로, 실제로 Project 소스를 가져오기 위해 참조되는 것은 Credentials 속성을 가지고 있는 Repository URL일 것이구요. 혹시나, 제가 잘못 알고 있는 부분이 있다면 알려주시면 감사하겠습니다 !!
위 이미지는 교재 376페이지의 상단 부분입니다. testUpload()를 실행시켰더니 "Tests Passed:"라는 메시지와 함께 실행성공되었습니다. 그런데, 위 이미지에 나와있는, "S3의 버킷"을 AWS 어디에서 찾을 수 있는 지 모르겠습니다. 아래 이미지는 나의 AWS S3 버킷 부분입니다.
6:46초에서 설명하시는대로 패치 조인을 사용하지 않고, 기본 조회만 했을 때 프록시로 인해 지연 로딩이 발생할 것으로 기대했으나, 마치 패치 조인처럼 한번만 조회되고 모든 데이터가 출력됩니다. 원인을 잘 모르겠는데 알려주세요. Team은 LAZY 조인으로 설정되어 있음 Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("USER1"); member1.changeTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("USER2"); member2.changeTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("USER3"); member3.changeTeam(teamB); em.persist(member3); List<Member> noFetchJoin = em.createQuery("SELECT m FROM Member m", Member.class).getResultList(); for (Member member : noFetchJoin) { System.out.println("member: " + member.getUsername() + " | Team: " + member.getTeam().getName()); } 결과: