묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자도 이해할 수 있는 CI/CD 입문·실전
failed to connect to your instance
안녕하세요 강사님,현재 강의를 참고하여 팀원끼리 클론 코딩 프로젝트를 하기위해 EC2에서 Spring Boot + MySQL 서비스를 Docker Compose로 구성하여 배포 중입니다. GitHub Actions를 통해 ECR에 푸시한 Spring Boot 이미지를 EC2에서 pull 받아서 docker-compose로 실행하는 파이프라인을 구축했습니다.현재까지 진행한 작업에 대해 말씀드리겠습니다. Spring Boot 애플리케이션을 Dockerfile로 빌드해 Amazon ECR에 업로드 EC2에 MySQL과 Spring Boot를 각각 컨테이너로 구성 (docker-compose.yml 사용) GitHub Actions에서 EC2로 SSH 접속 후 .env 생성 및 docker-compose up -d 자동 실행 설정현재 EC2 인스턴스(t2.micro)에 연결이 실패하고있습니다. ssh -v -i를 통해 로그를 확인 해본 결과 연결은 성공하지만 인증 전 또는 핸드쉐이크 중에 connection reset이 발생하였다고 합니다.현재 인스턴스 유형은 t2.micro이며, Docker로 2개 컨테이너가 실행 중이었습니다.CPU/RAM 자원이 부족해 SSH 연결도 거부되는 것 아닌가 의심됩니다. 혹시 이 경우 인스턴스 유형을 업그레이드를 하는게 해결방법일지 혹은 다른 방법이 있을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
강의 14분쯤 Exception 질문
[질문 내용]안녕하세요. 강의 14분쯤에,@Test 부분에서 .isInstanceOf(SQLException.class)를 했을 때, 테스트가 성공하는 이유가 궁금합니다.저는 ConnectException과 SQLException이 서로 관련이 없는 Exception이기 때문에 테스트가 실패해야 한다고 생각했습니다.혹시 Service의 logic()에서 repository.call()이 호출 될 때 SQLException이 터지고, 그로 인해서 networkClient.call()은 실행되지 않고 끝나기 때문에 테스트가 성공하는건가요?
-
해결됨[입문] 인디해커를 위한 루비온레일즈 8 입문 강의
강의 자료 다운로드 문의
강의에서 사용된 프리젠테이션을 pdf 등으로 다운받을 수 있는지 문의 드립니다.
-
해결됨핵심만 쏙쏙 Jira&Confluence
스프린트 완료 후 재수정 방법
JIRA 툴 연습을 하는 중에 스프린트 완료 버튼을 눌렀습니다.해당 스프린트를 다시 되돌리고 싶은데 방법이 있을까요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
C언어 질문입니다
강의: 배열과 문자열 시간 : 7:20 선생님0부터 5까지 반복하는 반복문이라고 하셨는데Size=5이면intArray[4] 까지이면0~4까지 아닌가요? 이유가 궁금합니다
-
해결됨[말 한마디로 뚝딱!] AI와 함께 나만의 수익화 웹사이트를 만드는 법
ai툴 유료버전사용?
혹시 커서와 챗지피티 전부 유료버전 끊어서 사용하고 계신가요?
-
미해결디지털포렌식전문가 2급 필기 핵심 요약집[전자책]
기출문제
전자책 잘 보고 있습니다.디지털포렌식 2급 필기 기출문제집을 구하고 싶은데 절판이 되어서...구할 수 있는 곳이 없을까요?
-
해결됨실리콘밸리 빅테크 29개의 실습으로 배우는 시스템 디자인 설계
채팅을 영속할 DB로 RDB를 선택한 이유도 궁금합니다
채팅은 강결합할 트랜잭션이 불필요해보이는데 nosql을 사용 하지않는 이유는 뭘까요?
-
해결됨Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)
예전코드도 배워야 할까요?
안녕하세요, 강의를 듣다가 궁금한점 생겨 문의드리려 합니다.2023년 후로 대거 전체적으로 바뀌었다고 강의에서 배웠는데요.그러면 취업해서 유지보수도 필요하다고 하면 예전 코드도 전체적으로 마스터 해야 취업하는데 큰 도움이 되거나 또는 필수적으로 해야할까요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
wait notify 락 획득 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. notify 로부터 깨어난 스레드와 synchronized 메서드를 호출한 스레드 중 누가 락을 획득한다에 대한 우선권이 있나요?만약 모든 스레드가 wait 을 하고 있는 상태라면 누군가가 notify를 호출해줘야만 하는 건가요
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
4-8. 지표 정의 연습 문제
안녕하세요. 4-8 지표 연습 문제 공유합니다. 이렇게 적어보니 도움이 많이 되는 것 같습니다. 아직 많이 부족해서, 피드백 주시면 감사하겠습니다.#1. 기능이 잘 동작하고 있는지 확인하려면?1) ‘기능이 잘 동작한다’는 의미를 먼저 정의- 기능이 잘 동작한다 = 유저가 관심을 가진다 = 해당 페이지에 접속한 유저가 해당 컴포넌트를 클릭한다2) 지표 1: CTR- CTR = 컴포넌트를 클릭한 수 / Page View - 관심을 가진다는 건 한 명의 유저가 여러번 클릭하는 것도 의미가 있다고 생각하기에, Unique View 보다는 Page View 선택- 배달 서비스의 특성상 아침, 점심, 저녁으로 앱에 접속할 수도 있기 때문에 일별 기준으로 데이터 확인- CTR이 올라가면, 즉 Page View 대비 컴포넌트를 클릭한 수가 증가하면 기능이 잘 동작한다고 유추할 수 있음#2. 검색 만족도 지표1) ‘검색 기능에 만족한다’는 의미를 먼저 정의- 검색을 한다는 건 유저가 무엇을 원하는지 알고 있거나, 탐색을 하고 싶은 상태일 수 있음 => 따라서 검색 기능에 만족하려면 유저가 원하는 결과를 찾아야 함- 검색 기능에 만족한다 = 원하는 메뉴를 고른다 = 구매까지 연결된다2) 지표 1: CVR- CVR = 배달 주문 수 / 검색을 한 수- 검색을 한 유저 중 몇 명이 배달 주문까지 연결되었는지에 대한 지표를 통해 ‘원하는 메뉴를 검색해서 주문까지 완료했는지’ 확인3) 또한, 서브로 검색 페이지에 들어간 순간부터 앱을 이탈하기까지의 Session 지표 확인- 유저 당 몇 번의 검색 후 결제로 연결되었는지, 검색을 한 후 결과 페이지에 얼마나 머물렀는지 등 구매 유저 행동에 패턴이 있는지 살펴보기 위한 목적#3. 검색 필터 기능의 활성화 지표1) ‘검색 필터 기능을 잘 사용하고 있다’는 의미를 먼저 정의- 검색 필터 기능을 잘 사용하고 있다 = 원하는 필터를 선택한 후 원하는 결과를 찾았다 = 결과 리스트 중 원하는 메뉴를 클릭한다2) 지표 1: 필터 기능을 사용한 유저 기준 CTR- CTR = 결과 리스트의 컴포넌트를 클릭한 수 / 필터 기능을 사용한 사용자 수- CTR이 낮으면, 필터 기능을 사용한 사용자가 원하는 결과를 찾지 못한 것일 수 있으므로, 개선 방향에 대해 논의해볼 수 있음3) 지표 2: 검색 페이지의 Unique View 중 필터 기능을 사용한 사용자 수 확인- 검색 페이지에 들어온 유저 중 몇 명의 유저가 필터 기능을 사용하는지 확인하여, 실제로 유저들이 이 기능을 사용하는지 안 하는지 확인#4. 배달 서비스에서 가장 중요한 지표는?- 매출을 확인할 수 있는 Input Metric 중 한 가지의 지표만 봐야 한다면 가장 중요한 지표는 ‘상세페이지 → 장바구니 전환율’ (상세페이지에서 메뉴를 골라 장바구니에 담는 유저의 수)- 배달 서비스를 사용하는 유저의 목적을 ‘원하는 음식을 주문한다’고 정의하면, ‘장바구니에 메뉴를 넣는 행동’을 증가시켜야 하기 때문- 따라서, 장바구니 CVR을 늘리려면,앱에 유입되는 유저의 수가 증가해야 함다양한 카테고리와 선택 옵션이 존재해야 함앱에 유입되는 순간부터 결제까지의 UX가 편하고 쉬워야 함#5. 추천 알고리즘의 성능 지표CVR = 결제한 수 / 추천 제품 클릭 수- ‘추천 알고리즘을 클릭한 사람들이 얼마나 결제하는가’를 확인할 수 있는 CVR 지표 확인- 유저에게 추천 알고리즘을 보여주는 이유는, 유저의 히스토리 데이터를 기반으로 구매를 유도하기 위해서임. 따라서, 성능이 높다면 유저는 해당 제품을 클릭하고 결제까지 연결될 것임#6. 내가 자주 사용하는 서비스의 지표*지니뮤직- 지니뮤직에서 제일 중요한 지표는 Subscription의 Retention>> 음원 스트리밍 앱 유저의 특성 중 하나는 한번 구독하면 매달 꾸준히 결제를 한다는 것임>> ‘한번 구독한 유저가 이탈하지 않고 어떻게 계속 우리 서비스를 이용하게 만들 수 있을까’에 대한 질문에서 다양한 전략이 시작되기 때문에 가장 중요함- 추가 지표 1: 스트리밍 횟수>> 구독한 유저가 앱을 활발하게 사용하는지, 단순히 앱을 다운로드 받고 사용하지 않는지 확인할 수 있음>> 후자의 경우, retention rate을 줄일 수 있는 숨어있는 요인이 될 가능성이 있음>> 따라서, 유저가 활발하게 앱을 사용하도록 꾸준히 전략을 고민해야 함- 추가 지표 2: 신규 유저 수>> 이미 구독한 유저를 꾸준히 사용하게 만드는 것도 중요하지만, 매달 신규 유저가 유입이 되어 Active User 수와 매출이 꾸준히 증가할 수 있도록 하는 것도 중요함#7. 퍼널 개선 프로젝트- 회원가입 Acquisition => 온보딩 Activation으로 생각한다면, 온보딩 효과를 파악하기 위해서는 유저가 다시 앱을 사용하는지 ‘Retention’ 지표를 확인해야 함- 온보딩을 통해 고객이 서비스에 대한 좋은 첫 경험을 했다면, 추후에 다시 서비스를 사용하기 위해 방문할 것이라는 가정을 세울 수 있음- 서비스의 특성에 따라, 다음 날 리텐션, 1주 후 리텐션, 1달 후 리텐션 등을 확인해야 함- 온보딩 개선 전/후로 코호트 그룹을 나눠 가입한 후 언제까지 사이트에 남아있는지를 확인할 수 있음
-
해결됨Flutter 앱 개발 기초
vs code 자동 포맷팅
vs code에서자동 포맷팅 관련 문의입니다.속성이 3개 이상일 때는 저장하면, 자동으로 세로 3줄 정렬 되는데속성이 2개 일 때는 가로로 1줄로 정렬이 되네요?,콤마를 붙여서 저장을 하면 콤마가 사라지고 가로 정렬됩니다.자동정렬이 강의와 다르게 되나보니 강의에서 몇번째 줄을 수정하라고 할 때 제 vs code 창과 달라서 약간 불편하네요..그리고 강의자님께 문의할 수 있는 오픈 카카오톡 채널이 있나요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
자료 pptx가 아닌 pdf
안녕하세요! 자료를 pptx가 아닌 pdf 형식으로도 제공해주실 수 있을까요
-
해결됨38군데 합격 비법, 2025 코딩테스트 필수 알고리즘
스택 - 탑문제
1. 현재 학습 진도3-5 스택부분 수강 2. 어려움을 겪는 부분백준 탑 문제를 강사님께서 구현해주신 코드로 풀어보고 있는데 강사님 코드를 사용하면 시간초과가 나는 것 같습니다.3. 시도해보신 내용 N = int(input()) tops = list(map(int, input().split())) def top_stack(N): result = [0] * N while tops: cur_top = tops.pop() for i in range(len(tops) - 1, -1, -1): if cur_top <= tops[i]: result[len(tops)] = i + 1 break print(' '.join(map(str,result))) top_stack(N)강사님께서 구현해주신 코드에 입력값을 사용자가 지정하게만 바꿔서 백준문제를 풀어보려고 했는데, 시간초과가 납니다. 제가 혹시 코드에 실수한 부분이 있는지 궁금합니다.
-
미해결파이썬으로 쉽게 배우는 gRPC!
proto를 이용한 자동 생성 관련 명령어
python -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. {protoname}.proto강의에 명령어 띄어쓰기 잘 안보여서 기록해줌
-
미해결프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
개발환경에 대한 안내
강의를 이제 하나 들었는데요. 실행 하는 것이 순탄지 않습니다. 강의에 안내가 필요하지 않을까요? 이제 강의 시작하는데 신뢰 떨어집니다.노드 버전을 맞춰주지 않아서 빌드가 안됨포트를 바꿔줘야 server.js가 실행됨화면 띄웠는데 아이템 요청 실패해서 이미지 안보임추가적으로 다른 수강생들에게 "아이템에 관련된 이미지는 강의와 관련이 없으니 무시해도 된다" 그러면 혼동을 줄이기 위해 수정을 해야 하지 않을까요 선생님께서요. (공지를 영상에 추가한다던지) 강의 듣는데 관련없는 곳에 시간을 들이고 있는 것 같습니다.
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
완료된 소스 다운로드 받을수 없나요?
강의를 거의 다들어가서 해당강의를 Summary해놓을려고 하는데완료된 소스가 있었음 좋겠는데 따로 다운로드 받을수 없는지요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
C언어 디테일 잡기 - 함수와 재귀함수 v2 - 22분 40초 질문 있습니다.
화면에 나온 출력 값처럼 this is string 이 나오려면 printString 함수의 printf의 마지막에 str이 아니라 *str이어야 하는게 아닌지 여쭤보고 싶습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
댓글 수 구현에서 동시성 문제 해결 질문드립니다
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 댓글 수 구현 강의를 해보다가 동시성 문제를 해결해보고 싶어서 비관적 락 for update를 사용하는 방법으로 한번 코드를 짜보고 테스트를 해보고 있습니다.코드는 아래처럼 짜보았습니다@Table(name = "article_comment_count") @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @ToString public class ArticleCommentCount { @Id private Long articleId; private Long commentCount; public static ArticleCommentCount init(Long articleId, Long commentCount) { ArticleCommentCount articleCommentCount = new ArticleCommentCount(); articleCommentCount.articleId = articleId; articleCommentCount.commentCount = commentCount; return articleCommentCount; } public void increase() { this.commentCount++; } public void decrease() { this.commentCount--; } }public interface ArticleCommentCountRepository extends JpaRepository<ArticleCommentCount, Long> { @Lock(LockModeType.PESSIMISTIC_WRITE) Optional<ArticleCommentCount> findLockedByArticleId(Long articleId); }@Service @RequiredArgsConstructor public class CommentService { private final CommentRepository commentRepository; private final Snowflake snowflake = new Snowflake(); private final ArticleCommentCountRepository articleCommentCountRepository; @Transactional public CommentResponse create(CommentCreateRequest request) { Comment parent = findParent(request); Comment comment = commentRepository.save( Comment.create( snowflake.nextId(), request.getContent(), parent == null ? null : parent.getCommentId(), request.getArticleId(), request.getWriterId() ) ); ArticleCommentCount articleCommentCount = articleCommentCountRepository.findLockedByArticleId(request.getArticleId()) .orElseGet(() -> { ArticleCommentCount newCount = ArticleCommentCount.init(request.getArticleId(), 0L); articleCommentCountRepository.save(newCount); return newCount; }); articleCommentCount.increase(); articleCommentCountRepository.save(articleCommentCount); return CommentResponse.from(comment); } private Comment findParent(CommentCreateRequest request) { Long parentCommentId = request.getParentCommentId(); if (parentCommentId == null) { return null; } return commentRepository.findById(parentCommentId) .filter(not(Comment::getDeleted)) .filter(Comment::isRoot) .orElseThrow(); } public CommentResponse read(Long commentId) { return CommentResponse.from(commentRepository.findById(commentId).orElseThrow()); } @Transactional public void delete(Long commentId) { commentRepository.findById(commentId) .filter(not(Comment::getDeleted)) .ifPresent(comment -> { if (hasChildren(comment)) { comment.delete(); } else { delete(comment); } }); } private boolean hasChildren(Comment comment) { return commentRepository.countBy(comment.getArticleId(), comment.getCommentId(), 2L) == 2; } private void delete(Comment comment) { commentRepository.delete(comment); articleCommentCountRepository.findLockedByArticleId(comment.getArticleId()) .ifPresent(articleCommentCount -> { articleCommentCount.decrease(); articleCommentCountRepository.save(articleCommentCount); }); if(!comment.isRoot()) { commentRepository.findById(comment.getParentCommentId()) .filter(Comment::getDeleted) .filter(not(this::hasChildren)) .ifPresent(this::delete); } } public CommentPageResponse readAll(Long articleId, Long page, Long pageSize) { return CommentPageResponse.of( commentRepository.findAll(articleId, (page - 1) * pageSize, pageSize).stream() .map(CommentResponse::from) .toList(), commentRepository.count(articleId, PageLimitCalculator.calculatePageLimit(page, pageSize, 10L)) ); } // 무한 스크롤 public List<CommentResponse> readAll(Long articleId, Long lastParentCommentId, Long lastCommentId, Long limit) { List<Comment> comments = lastParentCommentId == null || lastCommentId == null ? commentRepository.findAllInfiniteScroll(articleId, limit) : commentRepository.findAllInfiniteScroll(articleId, lastParentCommentId, lastCommentId, limit); return comments.stream() .map(CommentResponse::from) .toList(); } public Long count(Long boardId) { return articleCommentCountRepository.findById(boardId) .map(ArticleCommentCount::getCommentCount) .orElse(0L); } }@Test void concurrencyCountTest() throws InterruptedException { Long articleId = 24L; int threadCount = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); CountDownLatch latch = new CountDownLatch(threadCount); for(int i = 0; i < threadCount; i++) { final Long writerId = (long) (1000 + i); executorService.execute(() -> { try { createComment(new CommentCreateRequest(articleId, "concurrency test", null, writerId)); } catch (Exception e) { System.err.println("Exception in thread: " + Thread.currentThread().getName() + " -> " + e.getMessage()); } finally { latch.countDown(); } }); } latch.await(); Long commentCount = restClient.get() .uri("/v1/comments/articles/{articleId}/count", articleId) .retrieve() .body(Long.class); System.out.println("최종 commentCount = " + commentCount); assertThat(commentCount).isEqualTo(threadCount); }그런데 이렇게 했을때맨 처음 실행을 하면 1개의 데이터만 삽입되고 나머지 9개는 소실이됩니다그리고 한번더 실행하면 11개의 데이터가 저장되는데 맨처음 저장된 1개의 데이터 + 10개의 스레드가 저장한 10개의 데이터가 되어 11개가 됩니다.여기서 문제가 article_comment_count 테이블에 데이터가 아예 없을때 10개의 스레드가 동시에 insert문을 날리려고해서 Duplicate entry '24' for key 'article_comment_count.PRIMARY' 이런 문제가 나오지 않나 생각이 듭니다만.. create 메서드에 @Transactional(isolation = Isolation.READ_COMMITTED)로 격리 수준을 높여봤지만 여전히 문제가 해결되지 않습니다.혹시 제가 잘못 이해한 부분이 있을까요? 그리고 동시성 문제를 해결하려면 어떻게 해야할까요? gpt에 물어보거나 구글링해서 찾아봐도 해결이 되지 않아서 질문드립니다!
-
해결됨[켠김에 출시까지] UE5 다크앤다커 스타일의 익스트랙션 RPG (D1)
Interaction #2 에셋 가져오기 질문 입니다.
첨부된 예습자료는 실행이 되지 않아 Migrate을 진행할 수 없습니다.강의 초반에 Interact와 Interactables를 복사하기로 가져오면 메시는 가져오지 못하는 것 같습니다.강의와 같이 B_Chest_002를 레벨에 배치하면 메시가 없는 상태 입니다. 강의에서 MIgrate 할 때 보면 다른 여러 파일들도 필요해 보입니다. 그렇다고 모두 복사하면 실행이 안되는 문제가 있습니다.