묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
대규모 트래픽 환경에서는 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를 생성해서 넘깁니다. 제가 생각한게 맞는지 답변 부탁드립니다~ (강의 최고입니다. 저만 듣고 싶어요 흙흙)
-
미해결실습으로 배우는 선착순 이벤트 시스템
카프카를 도입하고 난 뒤 로그로 보여지는 장점을 발견하지 못하고 있습니다.
안녕하세요 강사님. 강의 마지막에 API서브모듈에서 직접 MySQL로 여러 쓰레드가 JPA save를 통해 INSERT하는 과부하가 발생하던 것을 카프카를 통해서 처리량을 조절할 수 있다고 말씀하셨습니다. 카프카를 사용하는 것만으로도 처리량이 조절된다는 뜻이 잘 이해가 가지 않습니다. 특히 컨슈머서브모듈에서 보여지는 로그를 확인해보면 여전히 단 건으로 SQL들이 전송되는 것을 확인할 수 있었는데요. 배치방식으로 여러 SQL을 한데 모아 한번에 SQL횟수를 줄여주는 것을 기대했으나 그렇지 않아 어떤 원리로 처리량이 줄어드는 것인지 이해를 못했습니다ㅠㅠ
-
미해결실습으로 배우는 선착순 이벤트 시스템
키생성 방식에 따른 성능
안녕하세요.문제점 해결하기 강의에서 실습을 잘 진행했습니다.실험을 하며 결과를 관측하던 중,@NoArgsConstructor(access = AccessLevel.PROTECTED) @RequiredArgsConstructor @Entity public class Coupon { @Id @GeneratedValue private Long id; }위와 같이 @GeneratedValue를 적용하면로그패턴도 달라지고 성능이 급격하게 나빠지더라고요 @Id @GeneratedValue(strategy = GenerationType.IDENTITY)로 지정하면 실습이 잘 진행됩니다.왜 이런차이가 발생하는지 알 수 있을까요?strategy를 선택하지 않으면 AUTO이며 이는 mysql에서 IDENTITY를 선택한 것과 같게 나와야하는데 예상과 달라 질문드려봅니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
조회수 어뷰징 방지 부분에서 질문이 있습니다.
안녕하세요."조회수 어뷰징 방지 정책 구현" 강의의 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
-
미해결15일간의 빅데이터 파일럿 프로젝트
가상환경 내보내기
파일만 가지고 가서 다른곳에서 실행하고 싶은데 ISO 이미지 포함이 안되도 되나요?? 위 설정대로 하면 가져오기만 해도 실행이 될까요? 초반에 .vbox 머신추가했던것 처럼 하고 싶습니다. 수업 듣는 내내 궁금했는데 저기가 원천으로 사용하는 5개 테이블의 create 문을 알고싶습니다. 어떤 컬럼이 있고 각 컬럼들은 무엇을 의미하는지는 강의나 교안에 잘 안나와 있어서 한눈에 안들어 올때가 있었습니다. 테이블정의서를 그려서 좀 보고 싶습니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
SpoolDIR 폴더로 옮기
mv를 했는데 파일이 사라지기만 하고 옮겨지지 않습니다
-
미해결15일간의 빅데이터 파일럿 프로젝트
cpu usage 에러
모니터링을 하고 싶은데 위 에러가 뜨더니 이후엔 Magnagement를 켜면 나머지 기능들에 에러가 나서 작동이 아예 안되는 수준입니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
쿼리 실행시 10000 에러
이런 에러가 자주 나는데 왜 나는 걸까요? 쿼리실행시 가끔 떠서 여쭤봅니다
-
미해결15일간의 빅데이터 파일럿 프로젝트
탐색 과정 중 주제2 진행중 발생 에러
ascii 관련 에러가 났는데 어느 부분에서 고쳐야하는지 모르겠어요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
댓글 테스트 작성 시 에러 발생
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 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
-
미해결15일간의 빅데이터 파일럿 프로젝트
Hue(휴) 설치중 에러
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
게시글 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까지 접근하는 걸까요??
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
soft Delete 시 index 설정
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 먼저 강의 들으면서 정말 많은 것을 배우고 있습니다. 감사합니다.아직 index나 쿼리에 대해 이해도가 많이 부족하다 보니 궁금한 점이 있는데요. 실제 게시글이나 댓글 삭제 시 물리적 삭제가 아닌 논리적 삭제(soft delete)를 구현하게 되는 경우가 많았는데요. 이때 isDeleted같은 필드를 두고 true, false 의 boolean 값으로 관리했습니다.이후 데이터를 조회할 때는 isDeleted가 false인 것들만 조회하는 방식이었는데, 이때도 isDeleted를 복합 index의 키값으로 넣어서 관리를 하는 경우가 많을까요? 성능 향상에 많은 도움이 될 지가 궁금하네요.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
논리적 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' 컬럼값을 추출해 분기 처리해서 특정 샤드 데이터베이스로 보내는지 궁금 합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
git에서 설정파일 읽어들일 때 윈도우의 경우 로컬위치가 name에 붙어 나오는 현상
저한테도 있어서 봤는데, 크게 신경 쓸 필요는 없을 것 같습니다.Appdata/local/temp 는 말 그대로 앱의 임시파일 저장하는 곳이고, config 서버 기동 시 git에서 해당 설정파일들을 읽어들여 저 위치에 저장하는 것으로 보입니다.근데 왜 윈도우만 저렇게 임시파일을 저장하고 그 위치의 주소를 붙여서 출력해주는지는 잘 모르겠네요. 맥OS는 그때그때 git에서 파일을 가져오는 것일까요? 제가 맥이 없어서 그걸 모르겠네요.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
좋아요 수 설계
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요!10:30초 쯤부터 설명해주시는 내용이 잘 이해가 안가서 질문드립니다.article 테이블에insert 문과 update 문을 동시에 실행한다고 하더라도 서로 다른 레코드에 대한 작업이어서 update문이 실행될 때 x-lock이 걸리는 레코드는 insert하는 레코드와 상관 없을 거라고 생각했는데게시글 쓰기와 좋아요 수 쓰기 작업을 할 때 어떻게 동일한 레코드에 락이 걸릴 수 있는지 상황이 잘 안그려지네요..게시글을 새로 작성하는 경우가 아니라 게시글 수정 - 좋아요 수 업데이트 간에 동일한 레코드에 대한 락이 잡힐 수 있는 상황을 말씀하신 건가요??