묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
RokcyLinux 9 온프레미스 환경
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 ]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 ]3. 질문 잘하기 법을 읽어보셨나요? [예](https://www.inflearn.com/blogs/1719)[질문 하기]안녕하세요. 이번 기회에 쿠버네티스를 공부하려고 합니다.설치 과정에 문제가 있어서 질문 남깁니다.저는 현재 RokcyLinux 9버전을 온프레미스 환경으로구축한 상태입니다. (GUI 환경이 아닌 터미널만 보이는 상황) AMD x86_64이고, 16GB RAM, 256SSD, i5CPU 사양의 서버로 구동하고 있습니다. 문제1. virtualBox를 설치하려고 했으나 virtualBox 공식홈에서 centOS 8까지만 지원하고 있습니다. 그래서 지금 설정해뒀던 것을 싹 날리고 다시 처음부터 RockyOS8을 받아 설치를 해야하는건지 두려움이 있습니다 ㅠㅠ 만약 8버전으로 다운그레이드 했을 때, 터미널로 VitualBox를 설치하고, 파티셔닝을 할 수 있는지 확신이 들지 않습니다. 현재 KuberCtl, KuberSpray까지 설치해둔 상태인데 다른 방법으로 수업 환경을 따라갈 수 있는지 궁금합니다. 다른 가상환경 조합을 구성해야하는건지, 혹시 방법이 있다면 구체적으로 알려주시면 정말 감사하겠습니다 ㅠㅠ책도 구매했는데 vitualbox, vagrant가 아니면 따라가지 못하는 것 처럼 느껴져서 설치과정 이후로 손을 못 대고 있는 상황입니다 ㅠㅠ 도와주시면 감사하겠습니다 ..!
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
Kafka테스트 다른 테스트랑 같이 돌리면 실패하는데 이유를 모르겠습니다..
예시 코드대로 카프카 테스트를 실행하면 잘 성공합니다. 그런데 다른 통합테스트들과 같이 실행시키면 실패합니다.로그를 보면잘 실행되고 문제도 없는데 process메서드를 잘 실행 했음에도 불구하고 수행되지 않았다고 나오는거 같습니다. @SlowTest public void kafkaSendAndConsumeTest() { String topic = "test-topic"; String expectValue = "expect-value"; kafkaProducerService.send(topic, expectValue); var stringCaptor = ArgumentCaptor.forClass(String.class); System.out.println("-----------mock-----------start"); Mockito.verify(kafkaConsumerService, Mockito.timeout(5000).times(1)) .process(stringCaptor.capture()); System.out.println("-----------mock-----------finish"); Assertions.assertEquals(expectValue, stringCaptor.getValue()); }혹시 관련 문제에 대해 아실까요? ㅠㅠ
-
미해결대세는 쿠버네티스 [초급~중급]
대시보드 서버 죽은 후 접속 안됨
안녕하세요, 최근 질문을 많이 드리게 되네요!이전 말씀해주신대로, Longhorn 관련 설정 수정 작업 진행 완료 했고 StatefulSet 관련하여 Pod를 늘리고 해당 Pod 안에서 touch 명령어로 파일을 생성하던 도중에 대시보드 서버가 먹통이 되었고https://192.168.56.30:6443/ 주소로 다시 접속을 하려 하면아래와 같은 JSON 형식으로 에러가 발생하면서 접속이 되지 않습니다.] 혹시나 해서 대시보드를 삭제후 재설치를 하여도 여전히 같은 문제가 발생하는데요. 해당 대시보드를 재부팅하거나 대시보드를 다시 살릴수 있는 명령어 있을까요?혹시나 해서 master 노드의 로그도 첨부드립니다.[대시보드 삭제후 재설치 명령어]# kubetm 가이드로 Dashboard대로 설치했을 경우 아래 명령으로 삭제 kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml # 다시 Dashboard (2.7.0) 설치 - <https://github.com/kubernetes/dashboard/releases/tag/v2.7.0> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml [대시보드 접속시 에러화면][해당 오류 JSON 데이터 전체 내용]{ "paths": [ "/.well-known/openid-configuration", "/api", "/api/v1", "/apis", "/apis/", "/apis/admissionregistration.k8s.io", "/apis/admissionregistration.k8s.io/v1", "/apis/apiextensions.k8s.io", "/apis/apiextensions.k8s.io/v1", "/apis/apiregistration.k8s.io", "/apis/apiregistration.k8s.io/v1", "/apis/apps", "/apis/apps/v1", "/apis/authentication.k8s.io", "/apis/authentication.k8s.io/v1", "/apis/authorization.k8s.io", "/apis/authorization.k8s.io/v1", "/apis/autoscaling", "/apis/autoscaling/v1", "/apis/autoscaling/v2", "/apis/batch", "/apis/batch/v1", "/apis/certificates.k8s.io", "/apis/certificates.k8s.io/v1", "/apis/coordination.k8s.io", "/apis/coordination.k8s.io/v1", "/apis/crd.projectcalico.org", "/apis/crd.projectcalico.org/v1", "/apis/discovery.k8s.io", "/apis/discovery.k8s.io/v1", "/apis/events.k8s.io", "/apis/events.k8s.io/v1", "/apis/flowcontrol.apiserver.k8s.io", "/apis/flowcontrol.apiserver.k8s.io/v1beta2", "/apis/flowcontrol.apiserver.k8s.io/v1beta3", "/apis/longhorn.io", "/apis/longhorn.io/v1beta1", "/apis/longhorn.io/v1beta2", "/apis/networking.k8s.io", "/apis/networking.k8s.io/v1", "/apis/node.k8s.io", "/apis/node.k8s.io/v1", "/apis/operator.tigera.io", "/apis/operator.tigera.io/v1", "/apis/policy", "/apis/policy/v1", "/apis/projectcalico.org", "/apis/projectcalico.org/v3", "/apis/rbac.authorization.k8s.io", "/apis/rbac.authorization.k8s.io/v1", "/apis/scheduling.k8s.io", "/apis/scheduling.k8s.io/v1", "/apis/storage.k8s.io", "/apis/storage.k8s.io/v1", "/healthz", "/healthz/autoregister-completion", "/healthz/etcd", "/healthz/log", "/healthz/ping", "/healthz/poststarthook/aggregator-reload-proxy-client-cert", "/healthz/poststarthook/apiservice-discovery-controller", "/healthz/poststarthook/apiservice-openapi-controller", "/healthz/poststarthook/apiservice-openapiv3-controller", "/healthz/poststarthook/apiservice-registration-controller", "/healthz/poststarthook/apiservice-status-available-controller", "/healthz/poststarthook/bootstrap-controller", "/healthz/poststarthook/crd-informer-synced", "/healthz/poststarthook/generic-apiserver-start-informers", "/healthz/poststarthook/kube-apiserver-autoregistration", "/healthz/poststarthook/priority-and-fairness-config-consumer", "/healthz/poststarthook/priority-and-fairness-config-producer", "/healthz/poststarthook/priority-and-fairness-filter", "/healthz/poststarthook/rbac/bootstrap-roles", "/healthz/poststarthook/scheduling/bootstrap-system-priority-classes", "/healthz/poststarthook/start-apiextensions-controllers", "/healthz/poststarthook/start-apiextensions-informers", "/healthz/poststarthook/start-cluster-authentication-info-controller", "/healthz/poststarthook/start-deprecated-kube-apiserver-identity-lease-garbage-collector", "/healthz/poststarthook/start-kube-aggregator-informers", "/healthz/poststarthook/start-kube-apiserver-admission-initializer", "/healthz/poststarthook/start-kube-apiserver-identity-lease-controller", "/healthz/poststarthook/start-kube-apiserver-identity-lease-garbage-collector", "/healthz/poststarthook/start-legacy-token-tracking-controller", "/healthz/poststarthook/start-system-namespaces-controller", "/healthz/poststarthook/storage-object-count-tracker-hook", "/livez", "/livez/autoregister-completion", "/livez/etcd", "/livez/log", "/livez/ping", "/livez/poststarthook/aggregator-reload-proxy-client-cert", "/livez/poststarthook/apiservice-discovery-controller", "/livez/poststarthook/apiservice-openapi-controller", "/livez/poststarthook/apiservice-openapiv3-controller", "/livez/poststarthook/apiservice-registration-controller", "/livez/poststarthook/apiservice-status-available-controller", "/livez/poststarthook/bootstrap-controller", "/livez/poststarthook/crd-informer-synced", "/livez/poststarthook/generic-apiserver-start-informers", "/livez/poststarthook/kube-apiserver-autoregistration", "/livez/poststarthook/priority-and-fairness-config-consumer", "/livez/poststarthook/priority-and-fairness-config-producer", "/livez/poststarthook/priority-and-fairness-filter", "/livez/poststarthook/rbac/bootstrap-roles", "/livez/poststarthook/scheduling/bootstrap-system-priority-classes", "/livez/poststarthook/start-apiextensions-controllers", "/livez/poststarthook/start-apiextensions-informers", "/livez/poststarthook/start-cluster-authentication-info-controller", "/livez/poststarthook/start-deprecated-kube-apiserver-identity-lease-garbage-collector", "/livez/poststarthook/start-kube-aggregator-informers", "/livez/poststarthook/start-kube-apiserver-admission-initializer", "/livez/poststarthook/start-kube-apiserver-identity-lease-controller", "/livez/poststarthook/start-kube-apiserver-identity-lease-garbage-collector", "/livez/poststarthook/start-legacy-token-tracking-controller", "/livez/poststarthook/start-system-namespaces-controller", "/livez/poststarthook/storage-object-count-tracker-hook", "/logs", "/metrics", "/metrics/slis", "/openapi/v2", "/openapi/v3", "/openapi/v3/", "/openid/v1/jwks", "/readyz", "/readyz/autoregister-completion", "/readyz/etcd", "/readyz/etcd-readiness", "/readyz/informer-sync", "/readyz/log", "/readyz/ping", "/readyz/poststarthook/aggregator-reload-proxy-client-cert", "/readyz/poststarthook/apiservice-discovery-controller", "/readyz/poststarthook/apiservice-openapi-controller", "/readyz/poststarthook/apiservice-openapiv3-controller", "/readyz/poststarthook/apiservice-registration-controller", "/readyz/poststarthook/apiservice-status-available-controller", "/readyz/poststarthook/bootstrap-controller", "/readyz/poststarthook/crd-informer-synced", "/readyz/poststarthook/generic-apiserver-start-informers", "/readyz/poststarthook/kube-apiserver-autoregistration", "/readyz/poststarthook/priority-and-fairness-config-consumer", "/readyz/poststarthook/priority-and-fairness-config-producer", "/readyz/poststarthook/priority-and-fairness-filter", "/readyz/poststarthook/rbac/bootstrap-roles", "/readyz/poststarthook/scheduling/bootstrap-system-priority-classes", "/readyz/poststarthook/start-apiextensions-controllers", "/readyz/poststarthook/start-apiextensions-informers", "/readyz/poststarthook/start-cluster-authentication-info-controller", "/readyz/poststarthook/start-deprecated-kube-apiserver-identity-lease-garbage-collector", "/readyz/poststarthook/start-kube-aggregator-informers", "/readyz/poststarthook/start-kube-apiserver-admission-initializer", "/readyz/poststarthook/start-kube-apiserver-identity-lease-controller", "/readyz/poststarthook/start-kube-apiserver-identity-lease-garbage-collector", "/readyz/poststarthook/start-legacy-token-tracking-controller", "/readyz/poststarthook/start-system-namespaces-controller", "/readyz/poststarthook/storage-object-count-tracker-hook", "/readyz/shutdown", "/version" ] }
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
Window에서 Volume이 작동하지 않는 문제
Window에서 Volume을 적용할 때 작동하지 않는 경우가 있습니다.예를 들어, "Hello"를 "Hello123"으로 바꿔도 여전히 "Hello"만 나오는 경우입니다. 이런 경우 이전 강의(또는 안내)에서 알려주신 것을 잘 참고해야합니다.강사님의 안내는 다음과 같습니다.Mac의 경우 아래를 사용한다.docker run -d -p 5000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app anonymous123/nodejs하지만, 윈도우의 경우는 아래를 사용해야한다.docker run -d -p 5000:8080 -v /usr/src/app/node_modules -v %cd%:/usr/src/app anonymous123/nodejs 하지만, 저는 Window를 사용하고 있지만 Bash Shell을 사용하고 있었기 때문에 %cd%이 아닌 $(pwd)를 사용해야지 명령어가 작동이 되었습니다.예상할 수 있듯이 이렇게 하면 Volume이 작동되지 않습니다.그렇기 때문에 cmd를 이용하여 %cd% 방식으로 해줘야지 volume이 정상 작동 합니다. 결국 OS가 Window라서 그런거 같은데,,, 솔직히 잘은 모르겠습니다😂도움이 되셨으면 좋겠습니다!!
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
django에 LOGIN_URL = '/accounts/login/'의 의미?
"로그인 처리" 동영상에서 (1분 14초) LOGIN_URL = '/accounts/login/' 때문에 app 이름을 accounts으로 하신다고 하셨는데 결국 urls.py에서 새롭게 정의를 하고 있어서 결국에는 global_settings.py 안에 있는 LOGIN_URL을 안쓰고 있는게 아닌가요? template_name이 registration/login.html로 설정되어 있어서 accounts/registration/login.html로 만드는게 더 좋을까요?from django.contrib.auth.views import LoginView class LoginView(RedirectURLMixin, FormView): """ Display the login form and handle the login action. """ form_class = AuthenticationForm authentication_form = None template_name = "registration/login.html" redirect_authenticated_user = False extra_context = None
-
미해결대세는 쿠버네티스 [초급~중급]
DaemonSet - HostPort 실습중에 에러
안녕하세요 DaemonSet - HostPort 실습중에 노드 아이피로 마스터 노드에서 진행중인데 에러가 발생해서 왜 안되는지 궁금해서 문의남깁니다!혹시 서비스가 필요가 없는건가요?? 아니면 서비스 부분이 누락이 되서그런건지 .. 포트나 방화벽도 생각해야되는건지 궁금해서 여쭤봅니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
예외처리, 함수 Return type 관련하여 질문 드립니다!
안녕하세요!수업 수강 중 궁금한 부분이 생겨 질문 드립니다! 질문 1) Section 11-01 수업 중 users.service.ts 에서 create 함수를 만들 때 const user = await this.findOneByEmail({ email }); if (user) throw new ConflictException('이미 등록된 이메일입니다.');위와 같이 email을 검사하고 이미 이메일이 있으면 예외처리를 해주게 되는데Entity 구현 시 email에 { unique: true } 를 주어도 위 코드처럼 예외처리를 해주어야 하는건가요? 질문 2) Section 10의 products.service.ts 에서 create 함수를 만들 때 함수의 return type은Promise<Product> 로 구현을 했는데,const result2 = this.productsRepository.save({ ...product, productSalesLocation: result, productCategory: { id: productCategoryId, // 만약 name 까지 받고 싶으면? // => createProductInput에 name까지 포함해서 받아오기 }, productTags: tags, }); return result2;이런 식으로 result2 를 return 하게 되면 플레이그라운드에서 return 을 선택할 때 productCategory.name 까지 선택할 수 있게 되어 있더라구요.주석에 쓰여진 내용처럼 name 을 받고 싶으면 createProductInput 에 name을 포함하면 되지만, 지금 처럼 id만 save할 경우, 프론트 개발자 또는 이 API 사용자에게는 productCategory.name이 없다고 매 번 설명을 해야하는 번거로움이 있을 것 같은데 이런 경우 함수의 return type을 새로 정의하기도 하나요?ex) class ProductsServiceCreateReturn ...
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
리듀서의 의미 재확인
reducer는 '줄이는 것' 이라는 사전적 의미가 있습니다. 그래서 리액트에서의 리듀서도 dispatch에 구체적인 행위(action)를 위임함으로서 setter를 단순화(줄임) 시킨다는 의미가 있는 것으로 알고 있습니다. 강의에서도 setter로직이 다수 혼재하여 리듀서가 필요한 것으로 설명하셨구요.말씀하신 누적된다는 의미와는 거리가 좀 있는 것 같습니다.강사님 의견은 어떠실까요?
-
해결됨대세는 쿠버네티스 [초급~중급]
Longhorn, pvc,pv 활용하여 pod 생성 시 오류 발생
안녕하세요. 강의 너무나도 잘듣고 있는 수강생입니다.현재 Statefulset 강의를 듣고 있는 중인데요.PVC 생성까지는 문제없으나(PV도 자동생성),ReplicaSet으로 Pod를 생성하거나 혹은 직접 Pod를 생성하여 PVC, PV에 연결되어 longhorn의 볼륨에 연결이 되었을 때, 아래와 같이 해당 불륨이 생성이 되지 않으면서 에러가 납니다.(계속 attaching 상태)앞 강의에서 Volume 중급편에서 Longhorn과 연동하여 Pod 를 생성할때는 문제가 없었던 걸로 기억을 합니다.제가 그래서 혹시나 해서 PVC를 임의로 아래와 같이 하나더 만들고 pod를 만들어보니 pod 생성이 안되네요(정확히는 longhorn과 Volume 연결을 할때 문제가 생기네요)apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-fast1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1G storageClassName: "fast" 혹시 몰라서 아래와 같이 fast2 라는 새로운 storageclass도 만들어서 다시 pvc 생성후 replicaSet 생성하여 Pod 생성, longhorn의 volume과 연동하였으나(물론 연동작업은 자동으로 이루어지는) 문제가 해결되지 않네요ㅠ혹시 대시보드를 삭제하고 2.0으로 다시 만들면서 문제가 생긴걸까요?현상에 대해 좀더 자세히 설명드리면 아래와 같이 파드가 계속 재생성되려고하다가 생성이 안되어 다시 파드를 새로 만들어서 생성하려고 하는 현상이 지속됩니다.[Longhorn 시스템 상태][Longhorn쪽 에러]
-
미해결따라하며 배우는 MySQL on Docker
Slave 서버에서 Master 서버와 연결하는 명령어 입력하면 에러 발생 질문
Master-Slave Replication 구성하기 파트에서4:52 영상을 보시면 Slave 서버에 Master 서버와 연결하는 작업 명령어가 있는데요. 먼저 Master 서버랑 # Replication user 생성 (db001 - Master)CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';GRANT REPLICATION SLAVE ON . TO 'repl'@'%'; #Slave 서버 Replication 설정 (db002, db003 - Slave)reset master;CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;start slave;show slave status\G Slave 서버에서 mysql 접속 후 CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1; 해당 명령어를 입력 하게 되면 이런 에러가 발생됩니다. ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log. 에러가 발생되는데 이유가 무엇일까요?도커 내부 아이피 (Master 서버 db001) 172.17.0.2 체크Master 서버에 repl 유저 권한 추가 및 설정my.conf 파일 Master, Slave 서버 셋팅 확인 및 설정 값 체크 두가지 체크를 해보았지만 해결이 되지 않고 있네요...원인이 무엇일까요?
-
미해결대세는 쿠버네티스 [초급~중급]
컨테이너 내 curl 명령어 안됨. (자료실 이미지 이름 다름)
실습 자료실에 있는 스크립트의 image 이름이 kubetm이라고 올라와있습니다.컨테이너 내에서 curl 명령어가 없는 명령어라고 해서 강의를 잘 보니 강의에 사용하는 이미지는 tmkube네요.확인 부탁드립니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
레디스 적용 시 여러번응모 테스트에서 에러가 발생합니다.
@SpringBootTest class ApplyServiceTest { @Autowired private ApplyService applyService; @Autowired private CouponRepository couponRepository; @Test public void 한번만응모() { applyService.apply(1L); long count = couponRepository.count(); assertThat(count).isEqualTo(1); } @Test public void 여러번응모() throws InterruptedException { int threadCount = 1000; //ExecutorService : 병렬 작업을 간단하게 할 수 있게 도와주는 Java API ExecutorService executorService = Executors.newFixedThreadPool(32); // CountDownLatch : 다른 Thread에서 수행하는 작업을 기다리도록 도와주는 클래스 CountDownLatch latch = new CountDownLatch(threadCount); for (int i=0; i<threadCount; i++) { long userId = i; executorService.submit(() -> { try { applyService.apply(userId); } finally { latch.countDown(); } }); } latch.await(); long count = couponRepository.count(); assertThat(count).isEqualTo(100); } }@Service public class ApplyService { private final CouponRepository couponRepository; private final CouponCountRepository couponCountRepository; public ApplyService(CouponRepository couponRepository, CouponCountRepository couponCountRepository) { this.couponRepository = couponRepository; this.couponCountRepository = couponCountRepository; } public void apply(Long userId) { Long count = couponCountRepository.increment(); System.out.println("count : "+count); // long count = couponRepository.count(); if (count > 100) { return; } Coupon save = couponRepository.save(new Coupon(userId)); System.out.println("save! : "+save.getId()); } }@Repository public class CouponCountRepository { private final RedisTemplate<String, String> redisTemplate; public CouponCountRepository(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public Long increment() { try { return redisTemplate .opsForValue() .increment("coupon_count"); } catch (Exception e) { e.printStackTrace(); throw e; } } }여러번응모 테스트 케이스 실행CouponCountRepository.java의 increment 메서드에서 다음과 같은 에러가 발생하고 있습니다.제일 처음에 나는 에러메시지는 다음과 같습니다.Caused by: io.lettuce.core.RedisCommandExecutionException: MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.쿠폰도 정상적으로 등록되지 않아 아에 0개로 출력되고 있습니다.구글링을 해봤지만 도저히 원인을 찾을 수가 없어요 ..++추가로, 도커에서 레디스 컨테이너와 이미지를 삭제한 후 실행해도 동일한 결과가 나타나는 것을 확인됩니다.강의에서 나온 그대로 도커 명령어를 사용해서 레디스를 pull 하였는데 왜 컨테이너와 이미지를 삭제해도 동일한 오류가 발생하는 걸까요?도커에서 레디스 컨테이너와 이미지를 삭제하고 ApiApplication을 실행하면 정상적으로 실행됩니다...++ 정리 드리자면, 1. 강의를 그대로 따라했는데 RedisCommandExecutionException가 발생하면서 테스트 케이스를 실행할 수 없는 이유2. 강의에서 나온 그대로 도커 명령어를 사용해서 레디스를 pull 하였는데 왜 컨테이너와 이미지를 삭제해도 동일한 오류가 발생하는 이유3. 도커에서 레디스 컨테이너와 이미지를 모두 삭제하고 ApiApplication를 실행했을 때 정상적으로 실행되는 이유답변 부탁드립니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
yarn add @apollo-server 405 에러...
설치하려하는데 405 에러 나오네요....검색해서 나오는것도 몇가지 해보긴했는데...해결이 안되서 올려봅니다~## 에러메시지Error: https://registry.npmjs.org/@apollo-server: Request "https://registry.npmjs.org/@apollo-server" returned a 405
-
미해결실습으로 배우는 선착순 이벤트 시스템
redis 설정 시 application.yml을 수정하지 않는 이유
안녕하세요 강사님.spring-data-redis 의존성을 추가하여 디펜전시 받고couponcountrepository.java를 생성하였습니다.보통 yml 파일에 redis 관련 설정도 해주는 것으로 알고있었는데 강의에서는 따로 yml에 redis 설정을 하지 않아서요.redis 설정을 안해준다면 어플리케이션에서 어떻게 redis와 연결될 수 있는지.. 궁금합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
next-auth 로그인 시 unauthorized 문제
문제가 몇일째 안풀리는게 있어 문의드려요제가 next-auth를 사용해서 로그인 프로세스를 해보고 있습니다.로컬에서 별도로 배포환경 만들어서 테스트를 했을 때에는 잘 되는데 배포시에 계속 Unauthorized 에러가 발생해서요제가 작성한 [...nextauth].ts 코드입니다.import NextAuth, { User } from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; import { refreshAccessToken } from 'utils/tokenRefresh'; export default NextAuth({ providers: [ CredentialsProvider({ name: 'Credentials', credentials: { userId: { label: 'UserId', type: 'text', placeholder: 'jsmith' }, password: { label: 'Password', type: 'password' }, }, authorize: async (credentials) => { const res = await fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/v1/users/signin`, { method: 'POST', body: JSON.stringify({ userId: credentials!.userId, password: credentials!.password, }), headers: { 'Content-Type': 'application/json' }, }); const user = await res.json(); // 로그인 성공 시 사용자 객체를 반환하고, 실패 시 null을 반환 if (res.ok && user) { console.log('ok user', user); return user; } else { console.log('error user', user); return false; } }, }), ], secret: process.env.NEXTAUTH_SECRET, // session: { // strategy: 'jwt', // maxAge: 0, // 브라우저가 닫히면 세션 종료 // // updateAge: 24 * 60 * 60, // 24시간마다 세션 갱신 (옵션) // }, callbacks: { async jwt({ token, user }) { // 사용자 로그인 시 토큰 설정 if (user) { return { ...token, accessJwt: user.result?.accessJwt, refreshJwt: user.result?.refreshJwt, companyId: user.result?.companyId, userName: user.result?.userName, accessTokenExpires: Date.now() + 3600 * 1000, }; } // 토큰 만료 확인 및 리프레시 if (Date.now() > token.accessTokenExpires!) { const newAccessJwt = await refreshAccessToken(token.refreshJwt!); return refreshAccessToken(newAccessJwt); } return token; }, async session({ session, token }) { if (token && token.accessJwt) { const customUser = session.user as User; if (!customUser.result) { customUser.result = { accessJwt: '', refreshJwt: '', companyId: '', userName: '', }; } customUser.result.accessJwt = token.accessJwt; customUser.result.refreshJwt = token.refreshJwt; customUser.result.companyId = token.companyId; customUser.result.userName = token.userName; session.user = customUser; } return session; }, }, }); NEXT_PUBLIC_BACKEND_URL 환경변수는 별도의 백엔드를 구성한 주소이구요 배포는 도커를 사용했습니다.FROM node:20.10 as builder # pnpm 설치 RUN npm install -g pnpm WORKDIR /usr/src/app COPY package*.json ./ RUN pnpm install ARG NEXT_PUBLIC_BACKEND_URL ARG NEXTAUTH_SECRET COPY . . RUN NEXT_PUBLIC_BACKEND_URL=https://${NEXT_PUBLIC_BACKEND_URL} NEXTAUTH_SECRET=${NEXTAUTH_SECRET} pnpm run build FROM node:20.10 RUN npm install -g pnpm WORKDIR /usr/src/app COPY --from=builder /usr/src/app/package*.json ./ RUN pnpm install --prod COPY --from=builder /usr/src/app . # COPY --from=builder /usr/src/app/.next ./.next EXPOSE 3000 CMD ["pnpm", "run", "dev"]NEXTAUTH_SECRET은 프론트 주소를 도커 실행 시 넣어줘야 한대서 도커 실행 할 때 환경변수로 따로 넣어줬구요Docs, Stackoverflow, ChatGPT 등 여러 방면으로 찾아봤는데 해결이 안되더라구요..강의하고는 별개 내용이긴 한데 더이상 물어볼 데가 없어서 강사님께 여쭈어봅니다..
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
Github
터미널에 'git push origin master'를 입력하고 엔터를 누르면fatal: 'origin' does not appear to be a git repositoryfatal: Could not read from remote repository.Please make sure you have the correct access rightsand the repository exists. 이렇게 나와고 있어요. 어디서 실수했어요?
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
여러 컨테이너에서 동일 컨테이너를 공유할땐 어떻게 구성해야하나요?
안녕하세요. 여러 마이크로서비스에서 동일한 db를 공유할 경우는 어떻게 구성하는지 궁금합니다.일단 동일 network로 db컨테이너와 마이크로서비스 컨테이너를 run하고 실행한 컨테이너명으로 요청하도록은 알겠는대 docker compose를 이용해서 여러 마이크로서비스가 같은 db 컨테이너를 어떻게 참조할 수 있는지 궁금합니다.
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
노드 IP접근 관련 문의 (2.2 강의 관련)
2.2.파드를 외부에서도 접속하게 하는 서비스(Service)강의에서 궁금한 사항이 있습니다.해당 강의에서 nginx는 w3-k8s 노드(103)에만 생성이 되어 있는데요. service 테스트는 w1-k8s의 IP(101)로 테스트 하는것을 보았습니다. 다른 노드에서도 해당 IP로 접근이 가능한 건가요?
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
simple-jwt Refresh Token 사용 노하우
안녕하세요. 진석님!강의에서 알려주신 drf-jwt 말고, 다른 수강생분이 문의한 글에서 보니 simple-jwt도 있다고 하셔서 doc 읽어보면서 토큰 적용해보고 있는데요. 로그인 성공하면 access / refresh 토큰 발행되고, access 토큰이 만료되면 refresh 토큰으로 access 토큰을 재발행해야 한다고 이해했습니다. (refresh 토큰 만료기한도 장고 설정값 있는 것 확인했구요!) 궁금한점은.. access 토큰을 갱신하는 방향이 크게 두 가지 일 것 같은데, 어떤식으로 가야하는 걸까요?1) useEffect 훅 안에서 setInterval로 주기적 갱신2) 강의에서 만들어주신 useAppContext 안에서 토큰 만료여부 확인 후 명시적 갱신 3) 다른방법
-
미해결AWS 배포 완벽가이드 (feat. Lightsail, Docker, ECS)
Workflow 작성시 npm install 문제
name : SSH and deployrun : | ssh ...run 스크립트 안의 npm install 실행시 command not found 라고 뜹니다. 근데 LightSail SSH 접속해서 다 확인해봤을 때, npm, npx 모두다 정상적으로 설치가 되어있는데 혹시 다른 문제가 있는걸까요?