묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
SpringBoot + Kotlin에서 Redis 캐싱 사용 관련되서 여쭤봐도 될까요?
강사님 안녕하세요.강의 목차에는 없지만 SpringBoot + Kotlin 환경에서 Redis 캐싱 사용 관련되서도 여쭤봐도 될까요? Kotlin에선 직렬화 + 역직렬화 관련해서 자바 + lombok를 사용했던 방법과 살짝쿵 다르게 써야하더라구요.. 여러 방안을 생각중인데 어떤 방법이 Best Practice인지 궁금해서욥감사합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
HotArticle 관련 테스트 중에 질문드립니다.(verify, handle 관련)
안녕하세요. 강의 열심히 듣고 있습니다.Hot-article 관련 테스트 코드 중, verify 메소드에 대해 잘 몰라서 하는 질문일수도 있겠으나 헷갈리어 질문 드립니다.HotArticleServiceTest.java 코드를 작성중에@Test void handleEventIfScoreUpdatableEventTest() { // given Event event = mock(Event.class); given(event.getType()).willReturn(mock(EventType.class)); EventHandler eventHandler = mock(EventHandler.class); given(eventHandler.supports(event)).willReturn(true); given(eventHandlers.stream()).willReturn(Stream.of(eventHandler)); // when hotArticleService.handleEvent(event); // then verify(eventHandler, never()).handle(event); verify(hotArticleScoreUpdater).update(event, eventHandler); }위의 코드에서, verify(eventHanler, never()).handle(event); 로 검증하는 부분이 왜 never()가 되는걸까요?강의중에 eventHandler가 바로 불리지 않는다고 말씀하시긴 하셨는데, HotArticleService.java의 handleEvent() 메소드 안에서 hotArticleScoreUpdater.update(event, eventHandler) 를 호출하면 update()에서 전달한 eventHandler 의 handle()메소드를 결국에는 사용하게 되지 않나요?verify가 외부클래스인 HotArticleScoreUpdater의 메소드에서 사용하는거까지는 검지하지 못하기 때문일까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
OFFSET 기반 페이지네이션에서 인덱스를 활용한 성능 최적화 방식과 실제 테이블 접근 시점이 궁금합니다
안녕하세요 좋은 강의 감사드립니다~게시글 목록 조회시 select * from article where board_id = 1order by article_id desc limit 30 offset 1499970;1.여기 쿼리문에서 where 절이 먼저 실행되어 (board_id, article_id) 생성된 secondary Index 에서 board_id = 1 인 데이터들을 찾아서2.어차피 article_id 도 정렬이 되어 있으니 이 부분에서 offset 을 순차적으로 skip 하면서 결국에 마지막에3.select * 문을 수행하는게 아닌가요?2번 과정에서 order by article_id 를 위해 clusterd Index 에서 데이터를 조회하는 과정이 추가되나요? > 게시글 목록 API - 페이지 번호 기반 - N번 페이지, M개 게시글 - 설계 > 20:07마지막에 최종적으로 select * 문을 조회할때만 clusterd Index 에서 데이터를 조회하는거 아닌가요? 왜냐하면 이미 secondary Index 에서 article_id 가 정렬되어 있기 때문에 그냥 skip 하고 마지막에만 clusterd Index 에서 데이터를 조회할 것 같습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
mysql 데드락 발생
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 강의 재밌게 잘 듣고 있는 취준생입니다!테스트 실행 도중에 데드락이 발생하여 이에 관해 여쭤보고자 합니다. 구체적으로인 상황은article_view_count 테이블에 존재하지 않는 레코드를 삽입AND어플리케이션 실행 후, 첫 테스트 코드 실행 을 만족하는 상황에서 DeadLock 에러가 발생합니다. 아마 Lock 획득실패로 인한 에러가 표출되는것으로 보이며 에러 로그는 하단에 첨부했습니다. 제가 생각한 원인은 다음과 같습니다.UPDATE문임에 따라 해당 레코드에 X-Lock이 걸리며, 100개의 요청마다 UPDATE쿼리가 날라가지만, 첫 INSERT 요청의 트랜잭션이 완료되지 않아 이후의 트랜잭션이 잠금 대기롤백 첫 INSERT 요청이 오래 걸리는 이유를 알고 싶습니다.양질의 강의 제공해주셔서 감사합니다!2025-05-01T19:46:27.647+09:00 WARN 27109 --- [kuke-board-view-service] [io-9003-exec-63] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1213, SQLState: 400012025-05-01T19:46:27.647+09:00 ERROR 27109 --- [kuke-board-view-service] [io-9003-exec-63] o.h.engine.jdbc.spi.SqlExceptionHelper : Deadlock found when trying to get lock; try restarting transactionHibernate: update article_view_count set view_count = ? where article_id = ? and view_count < ?2025-05-01T19:46:27.653+09:00 ERROR 27109 --- [kuke-board-view-service] [io-9003-exec-63] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.CannotAcquireLockException: could not execute statement [Deadlock found when trying to get lock; try restarting transaction] [insert into article_view_count (view_count,article_id) values (?,?)]; SQL [insert into article_view_count (view_count,article_id) values (?,?)]] with root causecom.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
페이징 방식의 readAll에서 count 쿼리 변경?
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.[댓글 수 구현] 강의의 마지막에서 페이징 방식 readAll() 메소드에서 commentRepository.count(~)를이번에 ArticleCommentCount를 활용하여 구현한 count(articleid)로 바꿔도 된다고 말씀하셨는데, 둘이 엄밀히 다르지 않나요?? 기존에 구현한 commentRepository.count(~)는 게시글별 댓글수를 조회하지만 limit가 있고,이번에 구현한 count(articleId)를 limit 없이 그냥 게시글에 대한 댓글 수를 모두 조회하니 의미가 다르지 않나 싶어서 질문드려봅니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
프론트단에 대해
안녕하세요. 궁금한 점이 있어 질문드립니다.추후 스프링 클라우드로 msa 팀프로젝트 만들려고합니다. 프론트단을 만들려고 하면 공통 레이아웃 및 기능화면을 따로 공통 서비스 예를 들면 ui-service를 만들고 이 서비스의 yml에서 게이트웨이를 작성한다고 들었습니다. 이게 제일 효율적인 방법인지 아니면 다른 방법으로 프론트단 구현법이 있는지 알고 싶습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
버전 업데이트 질문
새롭게 마지막 섹션에 updated 된것은 어떻게 봐야하나요 ? 커리큘럼 중간에 deprecated 된것도 있는데, 건너뛰면 되는지 기존에 이것 대신에 updated 된곳에 어떤걸 봐라 라고 설명좀 해주실 수 있나요 ?
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
entity 객체 생성을 data class 로 하신 이유가 있을까요?
안녕하세요 강사님!강의 잘보고있습니다 아직 초반이긴한데...entity 클래스 생성하실 때 data class 로 정의하신 이유가 있을까요?
-
미해결카프카 완벽 가이드 - 코어편
강의 설명 및 코드 정리
안녕하세요 강의 잘 듣고 있습니다. 다름이 아니라 제 상업적 목적이 아닌 제 개인 github에 정리 하려하는데 소스코드라던지 강의의 전반적인 설명을 정리해서 기록해도 될까요? 만약 특수 목적으로 사용한다면 구직 활동에 사용할 예정이며 출처도 남길 예정입니다.
-
해결됨커머스 서비스로 배우는 NestJS 실전 개발 (w. Prisma, Docker, Redis, Kafka)
Module '"@prisma/client"' has no exported member 'cart'. 에러
안녕하세요. 프리즈마에서 정의한 모델타입을 import 할 때 강의랑 동일하게 아래처럼 입력하면 Module '"@prisma/client"' has no exported member 'cart'. 에러가 발생합니다. schema.ts 파일에는 model cart 로 정의되어있고 npx prisma generate 명령어를 통해 클라이언트 생성도 잘 되었습니다. 서칭해보니 Prisma는 모델 이름을 PascalCase로 자동 변환한다는데 그래서 그런건가요? 강의와는 버전차이인걸까요?import { cart } from '@prisma/client';
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
auto.commit.interval.ms 옵션 관련 질문 드립니다.
auto.commit.interval.ms 옵션의 시간이 길게 설정된 경우 강제로 서버가 종료되는 문제 발생 시 commit 누락으로 인한 중복 처리 문제가 발생할 수 있을까요?
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
return@logFor을 사용한 이유가 궁금합니다.
return@logFor ResponseProvider.success("SUCCESS") return @logFor ResponseProvider.success("SUCCESS")BankService.kt 의 메서드에서 return @logFor을 사용하는 이유를 잘 모르겠습니다 ㅠㅠ Logging.logFor이란 람다가 끝났다는 걸 바깥함수에 알려주고 이후 로직이 있다면 해당 로직들도 실행하기 위해서일까요? 코알못이라 흙흙
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
@Transactional.kt에 대한 효용성 질문
강사님 안녕하세요.코틀린을 자바처럼 쓴 제 자신을 혼내면서(?) 열심히 청강 중입니다. 강의에서 작성하신 Transactional.kt 코드를 보면스프링의 TransactionTemplate을 활용한 명시적 트랜잭션 제어 방식과 큰 차이점이 없어 보입니다. 코틀린 래핑방식으로 사용했을때 어떤 장점이 있는걸까요?제가 생각한 래핑 방식의 장점은 다음과 같습니다.코드 스타일, 네이밍, optional 옵션 추가 등에서 약간 더 자유로움예를 들어 여러 종류의 트랜잭션 처리 규칙(특정 로그, 메트릭, 롤백 조건 등)을한곳에 구현해서 공용유틸로 쓰기 좋고,내부 구현을 추후 TransactionTemplate, PlatformTransactionManager 등 다양한 방식으로 손쉽게 변경 가능 트랜잭션 코드에 특별히 넣어야 할 커스텀 공통로직"이 없다면, 웬만하면 @Transactional / TransactionTemplate만으로 충분하다는 생각입니다. 정답은 없고 팀의 규칙마다 다를것 같아요. 강사님 팀에서는 어떤 방식으로 사용중이신가요? 강의 찍어주셔서 감사합니다앗~!(개인적인 사견인데 말씀하시는 중에 '죄송합니다'는 안하셔도 될것 같아요~!)
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
@Transactional.kt에 대한 효용성 질문
강사님 안녕하세요.코틀린을 자바처럼 쓴 제 자신을 혼내면서(?) 열심히 청강 중입니다. 강의에서 작성하신 Transactional.kt 코드를 보면스프링의 TransactionTemplate을 활용한 명시적 트랜잭션 제어 방식과 큰 차이점이 없어 보입니다. 코틀린 래핑방식으로 사용했을때 어떤 장점이 있는걸까요?제가 생각한 래핑 방식의 장점은 다음과 같습니다.코드 스타일, 네이밍, optional 옵션 추가 등에서 약간 더 자유로움예를 들어 여러 종류의 트랜잭션 처리 규칙(특정 로그, 메트릭, 롤백 조건 등)을한곳에 구현해서 공용유틸로 쓰기 좋고,내부 구현을 추후 TransactionTemplate, PlatformTransactionManager 등 다양한 방식으로 손쉽게 변경 가능 트랜잭션 코드에 특별히 넣어야 할 커스텀 공통로직"이 없다면, 웬만하면 @Transactional / TransactionTemplate만으로 충분하다는 생각입니다. 정답은 없고 팀의 규칙마다 다를것 같아요. 강사님 팀에서는 어떤 방식으로 사용중이신가요? 강의 찍어주셔서 감사합니다앗~!(개인적인 사견인데 말씀하시는 중에 '죄송합니다'는 안하셔도 될것 같아요~!)
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
설정이 헷갈립니다.
영상에서 가정하는게 앱이 여러개이고 DB가 1개인 경우가 맞나요? 만약 앱이 2개이고 DB가 2개인 경우는 어떻게 작동하나요??
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
두 쿼리문의 차이
안녕하세요, 쿠케님 강의 만족스럽게 수강하고 있는 수강생입니다.아래 2개의 쿼리문에 대해 첫번째 쿼리문에 where article_id = 1 이라는 조건문이 있고(비록 index를 생성한 컬럼이지만), 두번째 쿼리문에서는 where article_id가 빠진 상태인데도 첫번째 쿼리문의 속도가 더 빨랐습니다. explain 해보니,두번째 쿼리문에 Using filesort가 존재하는데,order by path로 인해 저희가 지정한 index의 컬럼인데도 불구하고 왜 Using filesort가 되고, 속도가 첫번째 쿼리문에 비해 조건이 없는데도 더 느린지 잘 이해가 안됩니다. mysql> explain select path from comment_v2 where article_id = 1 order by path desc limit 10; +----+-------------+------------+------------+------+---------------------+---------------------+---------+-------+---------+----------+----------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+------+---------------------+---------------------+---------+-------+---------+----------+----------------------------------+ | 1 | SIMPLE | comment_v2 | NULL | ref | idx_article_id_path | idx_article_id_path | 8 | const | 4990965 | 100.00 | Backward index scan; Using index | +----+-------------+------------+------------+------+---------------------+---------------------+---------+-------+---------+----------+----------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> explain select path from comment_v2 order by path desc limit 10; +----+-------------+------------+------------+-------+---------------+---------------------+---------+------+---------+----------+-----------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------+------------+-------+---------------+---------------------+---------+------+---------+----------+-----------------------------+ | 1 | SIMPLE | comment_v2 | NULL | index | NULL | idx_article_id_path | 110 | NULL | 9981930 | 100.00 | Using index; Using filesort | +----+-------------+------------+------------+-------+---------------+---------------------+---------+------+---------+----------+-----------------------------+ 1 row in set, 1 warning (0.00 sec)
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
트랜잭션 레벨에 대해 궁금합니다!
안녕하세요. 쿠케님 강의가 너무 유익해서 잘듣고있습니다!강의를 진행하면서 문득 생각이 든건데 실무에서 트랜잭션 레벨을 조절을 하기도 하나요???기본 트랜잭션은 REPEATABLE_READ인데 갭락이 걸릴것을 우려해서 COMMITED_READ로 바꾼다거나 이런식으로 트랜잭션 레벨을 조절하는 경우가 있나요???
-
미해결카프카 완벽 가이드 - 코어편
실습 코드는 어디서 받나요.. 아무리 찾아도 엄네요..
실습 코드는 어디서 받나요.. 아무리 찾아도 엄네요..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
멀티모듈 질문
혹시 강의에 멀티모듈구조 설정하는 방법이 있을까요 ? 하나의 프로젝트에서 무듈별로 나누는 방법은 제공하지 않겠죠 ?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
무한 depth 구현 설계에서 질문이 있습니다.
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.00a0z의 prefix(parentPath)를 가지고 모든 자손 댓글에서, 가장 큰 path(descendantsTopPath)를 찾는 과정인데요. 현재 childrenTopPath가 00a0z 00002 이지만 해당 댓글에 대댓글이 없고 00a0z 00001의 대댓글만 있는 상황에서는 00a0z 00002 자기 자신이 childrenTopPath 이자 descendantsTopPath가 되는걸까요? 00a0z 00002 와 00a0z 00001 00000 을 비교했을때 앞의 것이 더 큰 path라고 판단하면 되는걸까요?