묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판'soft Delete 시 index 설정' 답변한 내용에서 질문 있습니다.https://www.inflearn.com/community/questions/1516484해당 게시글의 답변중 아래 문장이 이해가 잘 안갑니다 ㅠ 물론, 삭제된 데이터가 극히 적다면, 위 비용은 딱히 문제가 안될 수도 있긴 합니다.삭제되지 않은 데이터가 훨씬 많다면, 조건에 일치(isDeleted=false)하는 데이터를 빠르게 찾을 수 있으므로, 스캔하는 범위는 어차피 적을테니깐요.하지만 삭제된 데이터가 많아질수록 조건에 일치하는 데이터를 찾기 위해 스캔하는 범위가 길어질 수 있으므로, 인덱스를 걸어둬야 빠르게 조회가 가능합니다!인덱스를 걸지 않았을때 삭제되지 않은 데이터(isDeleted = false)가 훨씬 많다면 스캔하는 범위가 적은 이유를 잘 모르겠습니다..인덱스가 없으면 삭제된 데이터가 많든, 많지 않든 무조껀 풀 스캔을 해서 스캔 범위는 똑같은게 아닌걸까요?또한, 데이터 연속성도 스캔할시 관련이 있는건지 궁금합니다.인덱스가 없을때 where isDeleted = false 쿼리 실행시 id가 4번까지만 스캔해서 스캔 범위가 적은걸까요?ㄸ직전 조건와 같을때 위와 같이 데이터가 흐트러져있다면 풀스캔을 하는 걸까요? 인덱스 공부좀 해야겠네요 흙흙 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판테스트 실행 시 "ClassNotFoundException" 에러테스트 실행 시 "ClassNotFoundException" 에러 나시는 분들은 https://bit.ly/4hIOchi 이 글 한번 참고해보세요. 이 글 보고 해결했습니다. 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판무한 스크롤 쿼리 질문 있습니다.학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요.select * from article where board_id = 1 order by article_id desc limit 30;해당 쿼리에서 강사님은 Extra에 null인데 제가 실행하면 using where가 나오네요.using filesort는 안나오는데 크게 상관 없는 부분일까요? 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판@Value 추가 시 에러 발생학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.좋아요 수 구현 부분 강의를 듣고 따라하던 도중 문제가 생겼습니다.ArticleLikeCount의 엔티티에서 version에 @Version을 붙이고 난 후, 테이블의 값을 모두 삭제하고 나서 테스트를 돌리면 에러가 발생합니다. 계속해서..Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):위 에러가 계속 발생하네요.테스트는 like 메서드를 실행했습니다.이상하게도 강사님 코드로는 정상 작동이 되어서, 그대로 복사해서 붙여넣기로 가져와서 돌려보면 안되네요.테이블에 데이터가 이미 존재하면 그때부터는 정상적으로 되는 것 같은데, 테이블이 비어있으면 에러가 발생합니다 ㅜㅜ혹시라도 확인하실 수 있도록 제 프로젝트 파일을 압축해서 올려놓은 링크 공유하겠습니다. ㅜㅜhttps://drive.google.com/file/d/1H9UR9UXZhgmBH-XrXoXPc2-dgrixF7b-/view?usp=drive_link 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판프론트에서 페이지네이션 count 계산법 질문드립니다!페이지 번호 공식은 다음 버튼 활성화 유무만 판단하는 거고 이전 버튼 유무는 프론트에서'만' 제어하는 걸까요? 프론트에서도 페이지 번호 공식을 알고 있는걸까요? 2:50초 11~20번 페이지에 있을때프론트에서 계산한값(601) == 백엔드에서 내려준 값(601)=> 같으므로 '다음' 버튼 활성화 프론트에서 계산한값(601) == 백엔드에서 내려준 값(500)=> 601 미만 이므로 '다음' 버튼 비활성화 (강의 넘 재밌어요. 게임 하는거 보다 재밌다..) 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판대규모 트래픽 환경에서는 Jpa 보단 서브쿼리를 활용하시나요?22:40에 서브 쿼리를 제시해주셨는데요.쿼리를 분리하여 애플리케이션 로직으로 풀수 없을때만 nativeQuery를 사용해서 서브쿼리를 즉시 적용하시는 걸까요? 아니면 서브쿼리를 적극적으로 사용하시는 걸까요? 대규모 트래픽 환경에서는 Jpa, Querydsl를 단순한 기능에 사용할때도 조심해서 써야할 것 같아요.. 팀 컨벤션이 도메인을 풍부하게 활용하는 거라면 nativeQuery는 지양해야 할것 같기두 하네요. 지식이 부족해서 가정만 하게 되네요 ㅠ.ㅠ답변 부탁드립니다~ (반복 학습 필수네요. 강의 1분 1초를 씹고 뜯고 맛보고 즐기면서 공부하겠습니닷!) 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판XxxResponse를 service 패키지에 두신 이유가 궁금합니다.XxxRequest / XxxResponse 클래스를 controller 패키지 하위가 아닌 Service 패키지 하위에 두신 이유가 궁금합니다. 의존성 방향을 Controller부터 단방향을 유지하기 위해 하신것으로 유추 하는 바입니다. 하지만 XxxRequest / XxxResponse가 service 패키지 클래스에 있는게 조금 어색해 보여서요. 저는 controller 하위 패키지에 requeset / response를 두고facade 혹은 service에 클래스로 묶어서 넘길경우 에는는 domain 계층에 만든 dto를 생성해서 넘깁니다. 제가 생각한게 맞는지 답변 부탁드립니다~ (강의 최고입니다. 저만 듣고 싶어요 흙흙) 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판조회수 어뷰징 방지 부분에서 질문이 있습니다.안녕하세요."조회수 어뷰징 방지 정책 구현" 강의의 ViewApiTest.viewTesst를 실행한 다음redis가 동작하는 docker에 접속해 redis-cli를 실행하고 "keys *" 명령어를 실행하면,distributed lock이나 조회수에 관련된 key를 찾을 수 없습니다.database 0~15를 돌며 "keys *"를 실행 했을 때 (empty array)를 응답 받고 있습니다.어떤 방법으로 결과를 확인할 수 있을까요? 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판댓글 api delete test 에러학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 댓글 최대 2 depth - CUD API 테스트 & 테스트 데이터 삽입 강의 시청 중 Test 코드에서 void delete()를 실행하면 이미지와 같이 테스트는 통과를 합니다그런데 mysql에서 명령어를 입력을 하면 deleted에는 그대로 0으로 되어 1로 변경되지 않는 문제가 있어 이전 영상을 다시 보며 모든 코드를 확인하였는데 코드는 동일하고 create, read test는 생성되고 조회되며 delete만 테스트만 실행되고 넘어가고 있습니다. 지금까지 작성한 코드 첨부합니다.https://drive.google.com/file/d/1O51-OdLHnOVnMoywcGP_h1aWoroFleF3/view?usp=drive_link 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판댓글 테스트 작성 시 에러 발생학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 강의를 따라가던 도중 테스트 코드에서 에러가 발생해 질문 드립니다.섹션 3. 댓글 최대 2depth - CUD API 구현 강의를 들으며void deleteShouldMarkDeletedIfHashChildren() 테스트에서 에러가 발생했습니다.에러 내용은 PotentialStubbingProblem 에 관련된 내용으로 org.mockito.exceptions.misusing.PotentialStubbingProblem: Strict stubbing argument mismatch. Please check: - this invocation of 'countBy' method: commentRepository.countBy(1L, 0L, 2L); -> at shoon.board.comment.service.CommentService.hasChildren(CommentService.java:70) - has following stubbing(s) with different arguments: 1. commentRepository.countBy(1L, 2L, 2L); 위와 같이 에러가 발생했습니다.이 내용을 토대로 살펴보았을 때, 강의에서 제공된 코드가 아래와 같은데 @Test @DisplayName("삭제할 댓글이 자식 있으면, 삭제 표시만 한다.") void deleteShouldMarkDeletedIfHasChildren() { // given Long articleId = 1L; Long commentId = 2L; Comment comment = createComment(articleId, commentId); given(commentRepository.findById(commentId)) .willReturn(Optional.of(comment)); given(commentRepository.countBy(articleId, commentId, 2L)).willReturn(2L); // //when commentService.delete(commentId); // // //then verify(comment).delete(); }이때 comment는 mock 객체로 articleId와 commentId만 가지고 있는 상황이며 getArticleId와 getCommentId만 mocking이 되어있는데, 실제 countBy 메서드가 서비스 객체에서 private boolean hasChildren(Comment comment) { return commentRepository.countBy(comment.getArticleId(), comment.getParentCommentId(), 2L) == 2; }위와 같이 호출이 되는데, 이때 getParentCommentId()의 값이 존재하지 않는데 테스트가 정상적으로 작동할 수 있나요? 테스트 코드에서는 countyBy(articleId(1), commentId(2), 2)로 고정해두었는데, 실제 호출은 이와 달라지기 때문에 에러가 발생한다고 생각이 들었는데 맞을까요? 강사님 코드에서는 정상 작동하고 제 코드는 작동이 에러가 나서 이유를 정확히 모르겠네요 ㅜㅜ혹시 제 코드가 필요하실 수도 있을까봐 구글 드라이브 링크로 제 코드 파일도 남기도록 하겠습니다.https://drive.google.com/file/d/1tqV1PkvwpnaRqI9msxEj4X_t7iqg_CFr/view?usp=drive_link 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판게시글 CRUD API 구현 부분에서 gradle 관련 에러가 발생합니다.학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.mysql:mysql-connector-j' implementation project(':common:snowflake') }이렇게 설정 하고 gradle 싱크를 맞췄을때 A problem occurred evaluating project ':service:article'.> Project with path ':common:snowflake' could not be found in project ':service:article'. 이렇게 에러가 발생합니다. 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판개인적인 궁금증입니다강사님께서는 실무에서 JPA를 잘 사용하지 않으신다고 하신 걸 댓글에서 봤습니다.그러면 MyBatis나 JDBC를 주로 사용하시는 건가요?아니면 JPA는 사용하시는데 쿼리 메소드 기능 대신 @Query로 직접 native query를 작성하시는 건가요? 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판무한 스크롤 쿼리와 페이지 번호 쿼리 질문 있습니다.학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 페이지 넘버 쿼리무한 스크롤 쿼리 안녕하세요위 두 쿼리 모두 (board_id, article_id)를 인덱스로 설정해놔서 secondary index만 접근해도 될 것 같은데 페이지 넘버 쿼리에서 clustered index도 접근하는 것은 offset의 특성(?) 때문일까요? 무한 스크롤 쿼리에서는 secondary index의 정보(board_id, article_id)만으로 기준점을 찾아내고, limit 개수만큼 clustered index에 접근하는 것 같아서페이지 넘버 쿼리에서도 secondary index의 정보(board_id, article_id)만으로도 offset의 위치를 찾을 수 있을 것 같은데 왜 clustered index까지 접근하는 걸까요?? 
- 
      
        
    미해결비전공자도 이해할 수 있는 DB 설계 입문/실전주문수량과 재고량 관련하여 테이블 분리시안녕하세요, 선생님.강의 감사히 잘 보고 있습니다. 주문수량에 따라 재고량 반영다는 기획일시 테이블 분리는 어떻게 할 수 있을까요?(다른 질문에 답변 올려주신 것 봤는데 직접 하려니 안되서요) 현업에서 일반적으로 매입도 존재할텐데 이 경우까지 포함한다면 재고에 대한 테이블 구성은 어떻게 되는지요? 감사합니다. 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판soft Delete 시 index 설정학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 먼저 강의 들으면서 정말 많은 것을 배우고 있습니다. 감사합니다.아직 index나 쿼리에 대해 이해도가 많이 부족하다 보니 궁금한 점이 있는데요. 실제 게시글이나 댓글 삭제 시 물리적 삭제가 아닌 논리적 삭제(soft delete)를 구현하게 되는 경우가 많았는데요. 이때 isDeleted같은 필드를 두고 true, false 의 boolean 값으로 관리했습니다.이후 데이터를 조회할 때는 isDeleted가 false인 것들만 조회하는 방식이었는데, 이때도 isDeleted를 복합 index의 키값으로 넣어서 관리를 하는 경우가 많을까요? 성능 향상에 많은 도움이 될 지가 궁금하네요. 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판강사님 쿼리 설명중에 로그시간 이라는 단어를 사용하시는데, 이 로그시간이라는 말의 의미를 알수 있을까요?안녕하세요. 강의 잘 보고 있습니다.강사님 쿼리 관련 설명에서, 로그시간이라는 단어를 사용하시는데, 이 로그시간이라는 것에 의미를 좀 알수 있을까요?ex: 정확한 데이터 기준점(board_id =1, article_id=5)이 있기 때문에, 인덱스에서 로그 시간에 기존점을 찾을 수 있다. 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판논리적 shard 통해 router 가 특정 shard로 라우팅 해줄때 질문 있습니다.일단 해당 영상 강의에서 article_like 이라는 독립 데이터베이스 기준으로 질문 드리도록 하겠습니다. 여기를 보면 강의 내용에서 각각 테이블 따라 샤드키 기준 컬럼이 다른것을 확인 되었습니다.예를들어서 'article_like' 테이블 경우 샤드키는 article_id 컬럼 으로 이용하고당연히 연관관계 테이블인 'article_like_count' 테이블 경우도 샤드키를 article_id 컬럼으로 하고 있습니다.그런데 outbox 테이블 경우는 'shard_key' 컬럼으로 해주고 있는데요. 여기서 질문은client (애플리케이션) 에서 일단 곧장 해당 특정 샤드 데이터베이스로 보내지 않고 router 를 이용해서 정해진 샤드키 통해 어디 샤드로 전송할지 역활을 할텐데요. router 역활의 개념을 이해가 되었지만 구체적으로 어떻게 구현되어 있는것인지 잘 몰라서 질문 드립니다.각각의 테이블 마다 샤드키에 해당되는 컬럼명이 다 다르기 때문에 이때 router 에서는 각각 어떻게 분기해서 알맞게 특정 샤드키에 해당되는 컬럼명을 추출해 특정 샤드 데이터베이스로 보내는지 궁금합니다. 그냥 무식하게 if else 조건문으로 'outbox' 테이블은 'shard_key' 컬럼값을 추출해 분기 처리하고'article_like' 테이블하고 'article_like_count' 테이블은 'article_id' 컬럼값을 추출해 분기 처리해서 특정 샤드 데이터베이스로 보내는지 궁금 합니다! 
- 
      
        
    미해결실무 활용 SQL 데이터 분석: 효율적인 데이터 처리와 인사이트 도출12_5 질문33번 질문에서 1년 동안 완전히 이용 가능한 listings를 찾기 위해서 SELECT COUNT(DISTINCT id)FROM openairbnb.listings AS lWHERE l.availability_365 = 365;1년 이용가능한 날이 365일인 고유한 id를 추출하는 쿼리를 이용하면 왜 답이 다르게 나온건지 모르겠습니다. 
- 
      
        
    해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판좋아요 수 설계학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요!10:30초 쯤부터 설명해주시는 내용이 잘 이해가 안가서 질문드립니다.article 테이블에insert 문과 update 문을 동시에 실행한다고 하더라도 서로 다른 레코드에 대한 작업이어서 update문이 실행될 때 x-lock이 걸리는 레코드는 insert하는 레코드와 상관 없을 거라고 생각했는데게시글 쓰기와 좋아요 수 쓰기 작업을 할 때 어떻게 동일한 레코드에 락이 걸릴 수 있는지 상황이 잘 안그려지네요..게시글을 새로 작성하는 경우가 아니라 게시글 수정 - 좋아요 수 업데이트 간에 동일한 레코드에 대한 락이 잡힐 수 있는 상황을 말씀하신 건가요?? 
- 
      
        
    미해결실무 활용 SQL 데이터 분석: 효율적인 데이터 처리와 인사이트 도출12_6강 질문4번 문제를 혼자 먼저 풀어볼 때,SELECT COUNT(DISTINCT l.id)FROM openairbnb.listings AS lWHERE l.availability_365 = 0;이렇게 풀어서 같은 답이 나왔는데 해답에서는 서브쿼리를 이용하는 이유가 뭔지, 차이점이 있는지 궁금합니다. 
