묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
여러 테이블 조인시 where 절이 필요한가? 에 대해 질문있습니다.
강사님 안녕하세요! 프로젝트를 끝내고 리팩토링을 하고이 있는데요.inner join 으로 3~4 개 정도의 테이블을 조인할 때, where 절이 과연 필요한가? 라는 궁금증이 생겼습니다. 기존에는 무지성 inner join 으로 테이블을 다 합친 후, where 절에서 필터링을 하고있었습니다. 근데 생각을 해보니 조인하려는 첫 테이블에 on 절로 추가 조건들을 넣어준다면.. 후에 조인하는 테이블들의 row 수를 줄일 수 있어 훨씬 효율적인것 같은데 (물론 인덱스도 타고).. 강사님은 어떻게 생각하시는지 궁금합니다. 단순히 하나의 테이블에 대한 row 만 가져올때는 where 절을 사용하고, 나머지 경우에는 where 절을 사용하지 않는게 훨 효율적이지 않나? 라는 생각이 들어서 이렇게 질문드립니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
hot-article Test 진행 중 좋아요 수 문의
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. [인기글 Producer&Consumer 테스트] 강의 6분 30초에서 좋아요 수는userId는 유니크해야 좋아요 수가 중복없이 하나씩으로 집계된다고 말씀하셨습니다. 근데 비관적 락 방법 1과 2 그리고 낙관적 락 방법 모두 다 저희가 구현할 때,따로 userId에 대한 중복 처리는 하지 않았는데userId는 동일해도 상관 없지 않나 싶어서요. 비관적 락 방법 1 쿼리도 단순 where 조건은 articleId 뿐이라서 질문드려봅니다. 게시글 조회수는 redis로 key 생성할때, articleId와 userId를 활용해서 중복처리는 했는데,게시글 좋아요수는 redis를 활용하지 않아서요!
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
디비 오류
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. mysql 말고 마리아 디비로 진행하고 있는데 다음과 같은 오류가 납니다... java.sql.SQLException: (conn=47) Record has changed since last read in table 'article_like_count' 그래서 인지 count가 일정하지 않네요.. 이유가 있을까요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
restClinet retrieve() ignore문제
안녕하세요.강의 잘 듣고 있습니다! restClient 사용시에 retrieve ignore로 테스트가 계속 실패 되네요.void인 경우 body(Void.class)하면 됐었는데 likePerformance 하는 경우 실패가 계속 되버려서요. 500에러라면서.body를 제거하고 하면 test 실패이고 해결방법 있을까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
게시글 테스트 데이터 삽입 에서 SQL 최대 2만건 삽입 되는문제
게시글 데이터 삽입 부분에서요, 영상 강의에서는 데이터 1200만건 삽입 하는데 대략 13분 정도 걸리는걸 확인 햇는데, 저는 2초만에 끝나더니 삽입된 갯수 확인해보니까 2만건만 추가 되고 더 추가 안된거같은데 어떤 문제가 있을가요??아래는 코드랑 영상에서 설명한 sql 설정값 첨부 했습니다. @SpringBootTest public class DataInitializer { @PersistenceContext EntityManager entityManager; @Autowired TransactionTemplate transactionTemplate; Snowflake snowflake = new Snowflake(); CountDownLatch latch = new CountDownLatch(EXECUTE_COUNT); static final int BULK_INSERT_SIZE = 2000; static final int EXECUTE_COUNT = 6000; @Test void initialize() throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(10); for(int i = 0; i < EXECUTE_COUNT; i++) { executorService.submit(() -> { insert(); latch.countDown(); System.out.println("latch.getCount() = " + latch.getCount()); }); } latch.await(); executorService.shutdown(); } void insert() { transactionTemplate.executeWithoutResult(status -> { for(int i = 0; i < BULK_INSERT_SIZE; i++) { Article article = Article.create( snowflake.nextId(), "title" + i, "content" + i, 1L, 1L ); entityManager.persist(article); } }); } }
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
댓글 신규 path 동시성 이슈
댓글의 path를 설정하는 과정에서 public CommentPath createChildCommentPath(String descendantsTopPath) { if (descendantsTopPath == null) { return CommentPath.create(path + MIN_CHUNK); } String childrenTopPath = findChildrenTopPath(descendantsTopPath); return CommentPath.create(increase(childrenTopPath)); } 이런식으로 findChildrenTopPath를 설정하게 되는데 이 과정에서 동시성 이슈가 발생할 수 있을 것 같아 질문 드립니다. increase하는 함수에서도 동시성 제어를 하는 파트가 없어 동시에 같은 계층의 댓글이 생성되면 id가 겹칠 것 같습니다!
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
인기글 Consumer 구현 - 이벤트 핸들러 및 서비스 레이어 강의 질문
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.해당 강의 마지막 부분의 handleEventIfScoreUpdatedEventTest()에서given(event.getType()).willReturn(mock(EventType.class));위의 코드로 test하신 이유가 단순히 게시글 생성과 게시글 삭제만 아니면 되어서,그냥 아무 class로 테스트하신게 맞으실까요?? 아래 코드로도 가능하긴 하지만 그냥 게시글 생성과 게시글 삭제만 아니면, test 가능하니로 이해하면 될까요?given(event.getType()).willReturn(EventType.ARTICLE_UPDATED);
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
AWS 환경 인프라 도표에서 private 서브넷 질문 드립니다 !
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 2챕터/5강 수강중입니다. 여기까지 이해하신 내용은 무엇인가요? 도커와 모니터링에 대해 전반적인 틀을 이해했습니다.질문 설명에서는 private subnet2에 데이터 베이스 서버를 배포 한다고 하셨는데 아래 도표에서 public서브넷으로 표기 되어있어서 혼동이 있습니다 ! private 서브넷이 맞는건가요 ?
-
미해결6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
2주차 성능테스트 관련 질문입니다.
상황 :같은 테스트를 진행했는데 저는 성능이 너무 안나와서 고민입니다.문제 :이전 개인 프로젝트에서도 클라우드상에서 기본 API 응답 시간이 2초 가량 소요됐었는데, 그 때 당시에는 비지니스 로직이 무거워서 그랬나보나 싶었는데이번 실습에서도 이렇게나 느린 걸 보면 개인 PC의 성능이 안좋은 것 같습니다.(게임도 잘 돌아가고 네트워크도 절대 느린 편이 아닌데 말이죠...)질문 : 이력서에 성능 시간에 관해 쓸 때 잘 만들어진 코드임에도 이렇게 느리면 담당관 입장에서는 "이렇게 느린데 무슨 성능 향상을 했다는거야?" 하는 생각이 들 것 같습니다.실제로 http_reqs가 1.036077/s로 1초에 1명밖에 받지 못하고 있는데, 이 상태로는 이력서에 쓰는게 의미가 없을 거 같아서 어떤 식으로 테스트를 하는 게 좋을지 궁금합니다.아 참고로 이 테스트는 Bad Test 입니다.
-
미해결백엔드 개발자 성능 개선 초석 다지기
ngrinder 설치관련
안녕하세요 ngrinder 설치 할 때 window환경에서run_agent.bat 을 실행했는데 cmd창이 떴다고 바로 꺼지고 agentmanage에 아무것도 나오지 않습니다 제가 어떤 걸 놓쳤을까요??
-
해결됨[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
Interpolation & Server Tick Frequency
Hey,I have a question server in main loop dont limit execution time, everything happen withouth deltatime only base on JobSerializer Timer. So in the end we dont really know if server is working with 200 ticks per second or 15. Does this approach isnt affecting player objects latency? Does _lastSendTick = System.Environment.TickCount64; is enough to interpolate beetween player last postion and current? static void GameLogicTask() { while (true) { GameLogic.Instance.Update(); Thread.Sleep(0); } }
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Kafka Cluster 질문
Kafka Cluster 강의 약 11분 38초 쯤에서 Broker 2(topic 1, partition 2)에 장애가 발생하면, 다른 정상 Broker에서 Leader를 재선출 한다고 하셨는데, 그렇다면 해당 그림의 경우 Broker 1의 topic 1의 Leader가 partition 1에서 partition 2로 바뀌는 것인가요? 기존에 정상적으로 있던 Broker 1의 topic 1의 partition 1은 Leader의 자격을 잃는 것인가요?다시 말씀드리면, 정상 Broker에서 Leader를 재선출하면, 기존 토픽에 있는 Leader Partition이 어떻게 되는지 궁금합니다..!
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
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의 메소드에서 사용하는거까지는 검지하지 못하기 때문일까요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
해결 방법?에 대한 고민
안녕하세요! 3주차 강의 중 3-9까지 수강하던 중 궁금한 점이 생겨 질문드립니다. 강의에서는 새로운 테이블을 만들고 배치를 적용하여 쿼리 실행 속도를 향상시키는 방법을 설명해주셨는데, 제가 듣기로 이직 준비를 하면서 "A안과 B안이 있었는데, 그 중 B안이 더 적합한 이유는 ~였다"는 식으로 여러 해결책을 비교하고 선택한 근거를 설명하는 것이 좋다는 조언을 자주 접했습니다. 그런데 이외에도 쿼리 성능을 튜닝하는 방법은 더 많을 거 같은데, 실무에서 그 방법들을 모두 비교한 뒤 선택하는 것이 현실적으로 쉽지 않을 것 같다는 생각이 들어서요.. 정리하자면 면접 자리에서 "왜 다른 방법은 고려하지 않았나요?"라고 질문이 들어올 수 있는데 이를 어떻게 준비해야 할지 궁금합니다.실무나 면접에서 성능 개선 경험을 어필할 때, 모든 방안을 다 시도해본 것처럼 설명해야 할까요?아니면, 제가 시도한 A안 중심으로 왜 그 방식이 효과적이었는지를 설명하고, 다른 방식도 있었다는 정도만 언급해도 괜찮을까요? 앞으로 성능 개선을 학습하고 경험을 쌓아갈 때 어떤 관점에서 문제를 접근하고 정리하면 좋을지도 함께 조언 주시면 감사하겠습니다.
-
미해결데이터분석가 서류탈락? 알려드릴게요, 되는 포트폴리오
캐글 관련질문입니다.
캐글 이야기를 많이 하시고 저도 데이터 분석가라면 캐글에 친숙해지고 캐글 컴페티션을 잘해야 한다고 생각하는데요 캐글이 전부 영어로 되어있고 페이지 번역이 되긴하지만 실제 노트북에서 모델을 돌리는 과정이나 튜토리얼안의 스크립트나 코멘트들은 페이지번역도 안되는 문제가 있더라구요어떻게 공부 하셨는지가 궁금합니다.영어실력부터 쌓아야 하는건가요?데이콘이라는 한국 사이트가 있긴하지만 대부분 유료화 되어있고혹시 영어 원문 그대로 보셨는지 아니면 다른 방법이 있으셨는지도 궁금합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
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 없이 그냥 게시글에 대한 댓글 수를 모두 조회하니 의미가 다르지 않나 싶어서 질문드려봅니다!
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
entity 객체 생성을 data class 로 하신 이유가 있을까요?
안녕하세요 강사님!강의 잘보고있습니다 아직 초반이긴한데...entity 클래스 생성하실 때 data class 로 정의하신 이유가 있을까요?