완료된 소스 다운로드 받을수 없나요?
해결됨
한 입 크기로 잘라먹는 Next.js
강의를 거의 다들어가서 해당강의를 Summary해놓을려고 하는데 완료된 소스가 있었음 좋겠는데 따로 다운로드 받을수 없는지요?
- react
- typescript
- next.js
172만명의 커뮤니티!! 함께 토론해봐요.
해결됨
한 입 크기로 잘라먹는 Next.js
강의를 거의 다들어가서 해당강의를 Summary해놓을려고 하는데 완료된 소스가 있었음 좋겠는데 따로 다운로드 받을수 없는지요?
해결됨
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 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에 물어보거나 구글링해서 찾아봐도 해결이 되지 않아서 질문드립니다!
미해결
코드로 배우는 React 19 with 스프링부트 API서버
vscode를 통해 npm start를 한 후, todo/read/숫자를 입력하니까 404에러가 발생했습니다. 그런데 vscode에서 컨트롤S를 눌렀더니 화면이 떴는데 익스플로러 상에서 새로고침을 하니까 다시 404에러가 발생하는데 이유를 모르겠습니다. 이미지를 첨부할 테니 혹시 더 필요하신 게 있으시면 답변해 주시면 감사드리겠습니다.
미해결
[React / VanillaJS] UI 요소 직접 만들기 Part 1
AccordionItem에 작성하신 코드를 그대로 따라쳤다고 생각했습니다. 닫힌 상태에서 문자열은 찾아지는데 자동으로 아코디언이 열리진 않습니다ㅠ 추가적으로 css코드를 넣어야할까요? 알려주신 링크를 들어가서 봤는데 setOpen을 useEffect 맨 위에 넣는걸 보고 새로운 상태를 넣어야하는건가 했습니다.
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
capitalize()는 문자열의 첫 글자를 대문자로 변환한다고 되어있는데, 예시 결과값이 왜 'Hello, world!'인가요? s는 애초에 첫 글자가 대문자니깐 s값 그대로 'Hello, World!'이 맞지 않나요?
해결됨
[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
플레이그라운드 쓸때 저 상자가 계속 유지되고 없어지지 않습니다 ㅠㅠ 방법있나요?
해결됨
실무에 바로 적용하는 스토리북과 UI 테스트
테일윈드를 안쓰고 스타일 컴포넌트만 사용하는 환경에서는요? 테일윈드로 환경셋팅을 하는게 맞을까요??
미해결
프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
강의자료 아래 메일로 부탁드려요 yungki.lee@gmail.com 감사합니다.
해결됨
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
안녕하세요. 쿠케님 강의 너무나 잘 보고 있습니다. 쿠케님 질의응답 게시글 정독하고 있는데 1:1 멘토링 부럽지 않을만큼의 고퀄리티 답변 언제나 감사드립니다. (갬동갬동) 현재 회사에서 조회수를 RDB에만 저장하고 있습니다. 이를 강의 내용처럼 'Redis 이전 & MySql 백업'을 적용 하고 싶은데 아래 흐름대로 적용 하면 될까요? 1⃣ (개발) redis 저장 및 조회, mysql 백업 코드 작성 2⃣ (개발) 기존 MySQL 데이터를 Redis에 저장하는 마이그레이션 코드 작성 => 이렇게 일회성 마이그레이션 같은 경우 테스트 코드로 한번만 돌리는데 쿠케님은 어떤 방식으로 하시나요? 3⃣ (배포 전) 1번 코드 배포 직전에 2번 로직 실행 4⃣ (배포) 1번 코드 배포 위 방식에서 발생할 수 있는 문제점 1. 3번(마이그레이션)과 4번(배포) 사이에 조회수가 누락될 가능성 - 마이그레이션 실행 후 MySQL에는 새로운 조회수가 계속 업데이트 되지만, Redis는 아직 트래픽을 받지 않음. - 즉, 마이그레이션 실행 이후 MySQL에 새로 기록된 조회수는 Redis에 반영되지 않음 → 데이터 불일치 발생 가능. 2. 처음 Redis로 전환할 때, Redis에 캐싱되지 않은 일부 조회수가 MySQL에 계속 쿼리될 가능성이 있음. - 처음 Redis로 전환할 때, Redis에 캐싱되지 않은 일부 조회수가 MySQL에 계속 쿼리될 가능성이 있음. - 특정 조회수가 빠르게 증가하면 Hot Key 이슈 발생 가능. 조회수 누락을 최소화 하는 방법 1⃣ (개발) redis 저장 및 조회, mysql 백업 코드 작성 2⃣ (개발) 기존 MySQL 데이터를 Redis에 저장하는 마이그레이션 코드 작성 및 실행 3⃣ (1번 코드 배포 전) 더블 라이트(Double Write) 모드 개발하여 운영에 적용 4⃣ (배포) 기존 MySQL 기반 조회수 코드 제거, Redis 기반으로 전환 5⃣ (배포 후) MySQL 백업 로직 실행 및 기존 MySQL 조회 로직 완전히 제거 제가 혹여나 놓친게 있거나 더 좋은 방법이 있으면 천천히 답변 부탁드립니닷! 출처: 내 뇌 + GPT 센세
해결됨
아바타 커뮤니티앱 만들기 (React Native Expo)
강의 내용은 아니고 지금 실제 앱을 만들고 있는데 거의 다 만들었는데 adMob 적용해서 막혔습니다. 아무리 해결하려고 해도 해결이 안되는데 혹시나 조언을 구할수 있을까 여쭤봅니다 expo 앱에 google admob을 추가할 때 expo-ads-admob 라이브러리를 사용하려 했지만, Expo SDK 46을 기준으로 더 이상 지원하지 않는 것 같습니다. https://docs.page/invertase/react-native-google-mobile-ads 이걸 사용해 넣으려고 했지만 계속 어떤 방법을 해도 해결이 되지 않아서 구글링도 했고 혹시 이게 해결가능한 문제인데 제가 못하는건지 아니면 이 플러그인을 사용하기가 어려운건지expo에서 궁금합니다...!
미해결
실리콘밸리 데이터 리더가 알려주는 Airflow 기초
명령어: docker compose -f docker-compose.yaml up 에러 메세지: ERROR! Maximum number of retries (20) reached. 사용 환경 windows 11 Home 어떤 부분 때문에 계속 오류가 발생하는걸까요?
해결됨
커머스 서비스로 배우는 NestJS 실전 개발 (w. Prisma, Docker, Redis, Kafka)
안녕하세요 좋은 강의 감사합니다! 혹시 강의 코드를 확인할 수 있는 깃허브 URL을 따로 제공받을 수 있는지 궁금합니다!!
해결됨
아바타 커뮤니티앱 만들기 (React Native Expo)
개발을 진행하면서 ios, 안드로이드 휴대폰크기로는 확인을 하면서 진행했는데 테블릿 크기에서 확인해보니 많이 작아지는 현상이 있습니다. 혹시 현업에서는 이런 처리를 어떻게 고려하시는지 궁금합니다 !
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
n이 0일때 if(n==0)를 타고 return 값이 0에서 끝나는거 아닌가요? return값으로 0이 아닌return res가 출력이되는지 궁금합니다
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
24년 1회 C언어 19분 38초 시저암호 문제 정답: Nd sc 1 <--이라고 적혀있는데? 변환된 문자열: Nd sc 1 <--이게 정답 아닌가요?
해결됨
한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
(사진)
미해결
React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
안녕하세요 강의 너무 잘 듣고 있습니다 공부를 하다가 map메소드에 대해 궁금한점이 있습니다. 예를 들어 items.map((item) => ) 여기서 어떨때에는 items.map((item) => () ) 화살표 다음에 ()가 오고 또 어떤 상황에는 items.map((item) => {}) 이렇게 {} 가 작성되는데 어떤 차이점이 있는지 궁금합니다.
해결됨
코딩테스트 [ ALL IN ONE ]
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 코테 적용 문제들은 교재에 따로 없이 강의 아래의 리트코드 주소를 통해서 확인하고 푸는 거 맞나요?? 영어로 되어있어서 질문 올려봅니다.
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
0:10 강사님~ 혹시 연산자 우선순위 표 자료를 학습자료로 올려주실 수 있으신가요? 시간날때마다 보고 어느 정도 외우려고 하는데, 영상화면이 캡처가 되지 않아서 보기가 어렵습니다 ㅠ
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
안녕하세요. 제가 예제 볼 때 온라인 컴파일러 사이트로 직접 작성해보면서 공부를 하는 중인데요 파이썬 if문 lst 예제를 그대로 사이트에 입력하면 ========================= lst = [1, 2, 3] if lst: print("리스트는 비어있지 않습니다.") else: print("비어있지 않습니다.") ===================== else가 예제처럼 if와 같은 열에 있지 않게 되고, 에러가 뜨더라구요. 저기서 else문 지우면 "리스트는 비어있지 않습니다." 정상으로 출력 되구요. 혹시 문법은 문제 없는데 파이썬이 버전마다 다른지 궁금합니다 https://www.tutorialspoint.com/online-programming-compilers.htm 사이트는 여기 이용 중입니다!