묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결초보를 위한 도커 안내서
다중 컨테이너 실행 (APP)
안녕하세요 :) 이제 막 강의 보기 시작했는데 궁금한게 생겨 질문 드립니다.컨테이너 하나에 애플리케이션 한 개만 올릴 수 있는 건가요 ?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
프로젝트 환경 변수 설정 에서 복사 붙여넣기 application-docker.yml
application-default.ymlapplication-docker.yml프로젝트 환경 변수 설정 에서 복사 붙여넣기 할때 들여쓰기 적용이 안되어. 일일이 적용했습니다.-windows-그리고 아래와 같이 추가 설명을 달아주셨으면 좋겠네요spring: # Spring 프레임워크 설정 jpa: # JPA (Java Persistence API) 설정 database: h2 # 사용할 데이터베이스로 H2를 지정 open-in-view: false # "Open EntityManager in View" 패턴 비활성화 show-sql: true # SQL 쿼리를 콘솔에 출력 hibernate: # Hibernate 관련 설정 ddl-auto: create # 데이터베이스 스키마를 자동으로 생성 properties: # 추가적인 Hibernate 속성 설정 hibernate: format_sql: false # SQL 쿼리를 포맷하지 않음 # default_batch_fetch_size: 10 # 주석 처리된 설정, 배치로 가져올 때 한 번에 가져올 개수 (사용되지 않음) datasource: # 데이터 소스 설정 url: jdbc:h2:mem:portfolio # H2 메모리 데이터베이스의 JDBC URL username: sa # 데이터베이스 사용자 이름 password: # 데이터베이스 비밀번호 (빈 값) driver-class-name: org.h2.Driver # H2 데이터베이스 드라이버 클래스 이름 h2: # H2 데이터베이스 관련 추가 설정 console: # H2 콘솔 설정 enabled: true # H2 콘솔을 활성화 path: /h2-console # H2 콘솔에 접근할 경로
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
프로그램 수정해서 다시 docker에 이미지를 올릴땐 내용처럼 이렇게 하면되나요??
안녕하세요. 이젠 기본적인 spring 기능은 이 강의로 많이 알게 되었습니다.감사합니다. 빨리 강좌 하나 더 내주세요.... 코틀린 & spring 강좌가 너무 없어서 강의 찾아 다니느것도 일이네요 ...====================================Docker로 프로젝트 빌드 하기 . 강좌중에 만약 프로그램 수정하면 아래 처럼 하면 되나요?step 1) Gradle에서 jar 파일을 다시 만든다. ...참고 ) 빌드중에 에러가 없어야함... test 코드에서도 에러가 없어야함step2) docker-compose.yml 파일 새로고침 한다.step3) Dockerfile을 재 실행한다.step4) 도커가 잘 올라갔는지 확인한다.프로그램 수정후엔 위 4개의 절차대로 진행하면 되나요??이걸로 회사의 개인 서버를 가지고 있는곳에 도커 깔고 동작 하면 서버의 기능으로 완벽할꺼 같은데 ....그리고 구글 클라우드에도 프로그램 수정하면 도커에서 push up hub 를 누르고 docker-compose.yml 누르면 되나요??버전 수정 안해줘도 되나요?추가 질문) 이건 뭐 제가 잘 모르고 좀 시간을 두고 확인해봐야 하는거라서 질문드리기 어렵지만 그래도 아시면 답변 부탁 드려용 ^^)))테스트 코드 작성중 아래처럼 DSL로 작성하는 경우를 봤는데 꽤나 직관적이고 편리하게 되어 있더라구요...아래 같은 테스트 코드 많이 사용하나요??비동기 방식에서만 사용하나요??테스트 코드 작성하는 방법이 꽤나 많아서 이걸 다 익혀야하는 생기네요 ㅠ.ㅠ감사합니다. 다음 강의 꼭 내주세요. ^^
-
미해결그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
github에서 tabby config.yaml 위치가 어디일까요 ?
https://github.com/Eugeny/tabby/wiki/Config-file제가 못찾은건지 모르겠는데 이렇게만 있어서 config.yaml 위치가 어디인지 헷갈리네요 ㅠ
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
Mac M2에서 vagrant 설치 시 API 서버 문제
안녕하세요너무 좋은 강의 잘 듣고 있습니다원래 윈도우 환경에서 실습하다가 이번에 실리콘칩도 지원하는 환경이 나온다고 해서 맥북에 실습환경을 구축하고 있는데 계속 오류가 납니다.API server에서 오류가 난다고 하는데 해당 가상머신을 삭제하고 다시 진행해도 마찬가지이고 어떨때는 컨트롤플레인 노드에서조차 API server가 안뜰때도 있습니다. 이거땜에 밤을 새웠는데도 해결이 안되네요..정말 해결하고 싶습니다. 원인이 뭘까요?
-
해결됨실무에 바로 적용하는 AWS 배포
3.6 강의 내용 중 파이프라인 deploy단계에서 에러가 납니다.
Tags can not be empty.라는 에러가 발생합니다. taskdef.jsonappspec.yaml강의 내용대로 따라서 진행하였습니다, build까지는 성공 되었으나, deploy단에서 해당 에러가 발생합니다.혹시 몰라서, taskdef.json에 마지막 부분에 tag를 지워봐서 진행했을때는, deploy가 24분넘게 진행이 안되었습니다.혹시 다른 설정를 봐야하는곳이 있을까요??
-
미해결쥬쥬와 함께 하루만에 끝내는 스프링 테스트
Model 의존 java.lang, jakarta
좋은 강의 잘 듣고 있습니다.<의존성 검증: Controller는 Entity를 사용하고 있을까?> 강의에서요.11:40초 쯤에서 에러 로그들이 의미하는 것이 궁금합니다.Class <com.jyujyu.dayonetest.model.StudentFail> is annotated with <jakarta.persistence.Entity> Class <com.jyujyu.dayonetest.model.StudentPass> extends class <java.lang.Object>..위 같은 에러는 해당 모델들(StudentFail, StudentPass) 이 @Entity 로 정의되었으므로 jakarta.persistence.Entity, jakarta.persistence.Table> 에서 사용된 것은 알겠는데java.lang.Object 로 사용된 것은 어떻게 봐야 하나요?단순 Object 라면, 모든 클래스는 Object 를 의존하는 것 아닌가요?미리 답변 감사합니다!
-
해결됨DevOps를 위한 Docker 가상화 기술 (Private Harbor Registry)
catalog-service 이미지 에러
Muti Container 구성(2) 강의 edowon0623/catalog-service 이미지를 pull 해보니 위와 같은 에러가 발생했습니다.docker hub에서 검색해보니 해당 이미지가 공개되어 있지 않은 것 같습니다.
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
MacOS M2에서 vagrant up 진행 시 오류 발생
MacOS M2에서 설치 진행하다 vagrant up 진행 시 아래와 같은 오류가 발생합니다.box도 설치하고 했는데 여기서 막히네요. 확인 부탁 드립니다. Bringing machine 'cp-k8s-1.30.0' up with 'vmware_desktop' provider...Bringing machine 'w1-k8s-1.30.0' up with 'vmware_desktop' provider...Bringing machine 'w2-k8s-1.30.0' up with 'vmware_desktop' provider...Bringing machine 'w3-k8s-1.30.0' up with 'vmware_desktop' provider...==> cp-k8s-1.30.0: Box 'sysnet4admin/Ubuntu-k8s' could not be found. Attempting to find and install... cp-k8s-1.30.0: Box Provider: vmware_desktop, vmware_fusion, vmware_workstation cp-k8s-1.30.0: Box Version: >= 0==> cp-k8s-1.30.0: Loading metadata for box 'sysnet4admin/Ubuntu-k8s' cp-k8s-1.30.0: URL: https://vagrantcloud.com/api/v2/vagrant/sysnet4admin/Ubuntu-k8sThe box you're attempting to add doesn't support the provideryou requested. Please find an alternate box or use an alternateprovider. Double-check your requested provider to verify you didn'tsimply misspell it. If you're adding a box from HashiCorp's Vagrant Cloud, make sure the box isreleased. Name: sysnet4admin/Ubuntu-k8sAddress: https://vagrantcloud.com/api/v2/vagrant/sysnet4admin/Ubuntu-k8sRequested provider: vmware_desktop vmware_fusion vmware_workstation (amd64)
-
해결됨실무에 바로 적용하는 AWS 배포
2.3 elb <-> ec2 강의 중 5:29초에 매핑 선택 하는 부분에 대하여 질문
타켓이 된 해당 인스턴스 세부 정보에 있는 서브넷 id를 보고 똑같은 거를 선택하라고 하셨는데요.강의 중 내용에서는 `2b`로 되어있어서 2a,2c는 상관 없지만 ,2b는 무조건 골라야 한다고 하셨는데, 제가 강의를 보고 작성 해봤을 때 제 서브넷 ID는 `2a`로 되어있더라구요, 그럼 이때는 `2a`를 무조건 고르고, 2b, 2c는 상관 없다로 받아들여도 되는 걸 까요??
-
해결됨실무에 바로 적용하는 AWS 배포
강의 1.2, 1.3 영상이 보이지 않습니다.
강의 1.2, 1.3 영상이 보이지 않습니다처음에 주의사항이라 하셔서, 음성 강의로 들으려했으나, 스크립트를 확인해보니, 여기 확대, 화면의 대한 언급을 하셔서, 영상이 필요한 강의라고 확신하여 질문을 올렸습니다.. 이거 어떻게 해결이 안될까요??.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
선생님 근데 docker로 mysql 돌릴때 데이터는
데이터는 어디에 저장이될까요?도커컨테이너에 저장이되는걸까요?만약에 이 강의를 완강하고 제 컴퓨터로 서버를 만들어 돌린다고했을때 보통 데이터는 어디에 저장하는걸 추천하시나요?도커컨테이너에 저장하드디스크에 저장하고 주기적으로 aws s3에 업로더해준다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
el.createReadStream is not a function이라고나옵니다
graphql-upload 버전 13.0.0으로 강의와 똑같이 맞춰줬는데도 에러가납니다 ㅠ_ㅠ혹시 해결방안이있을까요?계속 검색중인데 힘드네유..혹시나 제가 해결했다면 해결했다고 댓글달겠습니다해결했다는 댓글이 없으면 계속해서 트라이중인거니 댓글로 도와주시면 너무 감사하겠습니다
-
해결됨개발자를 위한 쉬운 도커
이미지 레이어 관련 질문 드립니다.
우선 이런 강의를 올려주셔서 감사드립니다. 궁금한 점은 이미지는 레이어로 되어 있고, 이미 존재하는 레이어의 경우 추가로 다운로드 하지 않는다고 이해했습니다. 그리고 실제로 두 번째 이미지인 config-nginx 다운로드 받을 때도 이미 있는 레이어의 경우 Already exists 라고 다운로드 하지 않는 부분도 확인했습니다. 그런데 docker image ls 로 검색했을 때 나오는 size는 다 142M으로 동일하게 나오는 데 이미지 용량이 아닌건가요? 물리 용량이 아닌 논리 용량 일까요?
-
미해결비전공자도 이해할 수 있는 Docker 입문/실전
wsl 환경으로 작업중인데
docker run -e MYSQL_ROOT_PASSWORD=pwd1234 -d -p 3306:3306 -v /mnt/c/Users/SSAFY/desktop/docker/docker-mysql/mysql_data:/var/lib/mysql mysql 명령어 실행시 2024-07-03T08:05:15.221312Z 0 [ERROR] [MY-010295] [Server] Could not set file permission for ca.pem2024-07-03T08:05:15.221336Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.이런 오류가 발생합니다. 권한부여 등 여러 방법을 시도했지만 모두 실패했고 wsl이 아닌 그냥 윈도우 터미널로 실행했을때는 정상 작동 하엿습니다 어떻게 해결할까요??
-
미해결쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
2.3 강의 가상 시스템 다시 등록 후 명령어 에러
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://www.inflearn.com/blogs/1719)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://www.inflearn.com/questions/992407/comment/281901)[질문 하기]k run chk-info --image=sysnet4admin/chk-info 입력 후 서버에 접속할 수 없다는 메세지가 뜹니다.물론 k get po 를 입력해도 오류가 나네요
-
해결됨비전공자도 이해할 수 있는 CI/CD 입문·실전
docker compose 를 이용하는 방법?
프로젝트에서compose.yml 파일에 mysql과 redis를 적용 시켜놓은 상태입니다compose를 통해 명령 할려면 어떤 식으로 해야 되는지 감이 안잡혀서 여쭈어 봅니다
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
노션에 있는 피그마 링크를 눌러도 들어가지지 않아요.
시작은 프리캠프의 노션에서 내리다보면 피그마 바로가기가 있는데링크를 타고 들어가면 파일을 열 수 없다고만 나옵니다. 어떻게 해야하나요?
-
해결됨쉽게 시작하는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
보강 수업까지 수업 완료하고 그림으로 배우는 쿠버네티스로 넘어가면될까요?
보강수업이 버전차이가 조금 나는거 같아서 궁금해서 질문 드립니다.!
-
미해결실습으로 배우는 선착순 이벤트 시스템
Redis의 INCR 사용 해도 Race condition이 잡히지 않는 문제
안녕하세요! 강사님 덕분에 현재 진행중인 프로젝트 코드에 동시성 문제 잘 적용하고 있습니다. 다름이 아니라, 현재 MSA 프로젝트를 하고 있어 쿠폰 쪽 DB는 쿠폰만 쓰기 때문에 부하에 따른 걱정은 덜어도 될 것 같아 카프카가 아닌 Redis의 INCR 명령어를 통해서 선착순 쿠폰 로직의 Race condition 문제를 잡아보려고 하고 있는데요.질문에 앞서 프로젝트 환경을 말씀드리자면 강의와 동일하게 docker pull redis 해서 이미지로 다운받아 실행했고, 6380 포트로 연결해줘서 yml 설정과 Config 설정 또한 해줬습니다. INCR 키 값을 살짝 바꿔서 coupon_count:{couponId} 가 되도록 해줬습니다. 문제는 1000개의 쓰레드로 요청을 날렸을 때 여러번의 요청 테스트는 통과가 안된다는 점입니다.. 쿠폰 발급이 100개 되어야하는데 102, 103번 애매하게 되고 있습니다. (postman으로 API 요청 날릴 때마다 해당 키 값의 value가 1씩 잘 증가하는 것은 확인했습니다) RDB 상에서도 100개의 발급 내역이 잘 들어오고 있구요. (물론 테스트가 DB에 영향을 미치면 안되지만요ㅠㅠ)이런 경우는 왜 그런건가요?? 코드도 첨부 하겠습니다. 감사합니다!!/* * 선착순 쿠폰 발급 */ @Transactional public CouponIssuedResponseDto issueFirstComeCoupon(CouponIssuedRequestDto request) { // 쿠폰 ID로 쿠폰을 찾고, 존재하지 않으면 예외 처리 Coupon coupon = couponRepository.findById(request.couponId()) .orElseThrow(() -> new CustomException(ErrorCode.COUPON_NOT_FOUND)); // 발급 가능한 쿠폰 수량 확인 -> Redis Long currentCount = couponCountRepository.getCount(request.couponId()); if (currentCount > coupon.getMaxQuantity()) { throw new CustomException(ErrorCode.COUPON_ISSUE_LIMIT_EXCEEDED); } // 새로운 쿠폰 발급 -> Redis에서 수량 증가 Long newCount = couponCountRepository.increment(request.couponId()); if (newCount > coupon.getMaxQuantity()) { throw new CustomException(ErrorCode.COUPON_ISSUE_LIMIT_EXCEEDED); } CouponIssued issued = CouponIssued.builder() .coupon(coupon) .userId(request.userId()) .issuedAt(LocalDateTime.now()) .build(); CouponIssued saved = couponIssuedRepository.save(issued); return CouponIssuedResponseDto.fromEntity(saved); }@Repository public class CouponCountRepository { private final RedisTemplate<String, Long> redisTemplate; public CouponCountRepository(RedisTemplate<String, Long> redisTemplate) { this.redisTemplate = redisTemplate; } public Long increment(Long couponId) { String key = "coupon_count:" + couponId; return redisTemplate.opsForValue().increment(key, 1); } public Long getCount(Long couponId) { String key = "coupon_count:" + couponId; Long count = redisTemplate.opsForValue().get(key); return count != null ? count : 0L; } }@BeforeEach public void setUp() { // Redis 초기화 redisTemplate.opsForValue().set("coupon_count:10", 0L); } @AfterEach public void tearDown() { couponRepository.deleteAll(); couponIssuedRepository.deleteAll(); redisTemplate.delete("coupon_count:10"); // 테스트 끝난 후 Redis 데이터 삭제 } @Test public void multipleUserIssueCoupon() throws InterruptedException { // Given // 쿠폰을 생성 Coupon coupon = Coupon.builder() .name("Test Coupon") .couponCode("TEST100") .discountRate(10) .maxQuantity(100L) .issuedQuantity(0L) .expiresAt(LocalDateTime.now().plusDays(30)) .couponType(CouponTypeEnum.FIRST_COME) .build(); couponRepository.save(coupon); Long couponId = coupon.getCouponId(); // 고정된 couponId 사용 Long userId = 1L; // 고정된 userId 사용 // When int threadCount = 1000; ExecutorService executorService = Executors.newFixedThreadPool(50); CountDownLatch latch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { executorService.submit(() -> { try { CouponIssuedRequestDto request = new CouponIssuedRequestDto(10L, userId); couponIssuedService.issueFirstComeCoupon(request); } catch (CustomException e) { // Expected exception when limit is exceeded } finally { latch.countDown(); } }); } latch.await(20, TimeUnit.SECONDS); // Then Long count = redisTemplate.opsForValue().get("coupon_count:10"); System.out.println("coupon_count:10 = " + count); // 디버깅용 로그 추가 assertThat(count).isNotNull(); // count가 null이 아닌지 확인 assertThat(count).isEqualTo(100); // 발급된 쿠폰의 수를 확인 long issuedCount = couponIssuedRepository.count(); assertThat(issuedCount).isEqualTo(100); }