학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] LinkedList<Integer> bucket = buckets[hashIndex]; 으로 하셨는데 bukets[hashIndex].add(value); 로 하지 않은 이유가 있을까요? 참조값은 똑같은데 변수 선언을 한 이유가 궁금합니다
네이버 지식인 여러페이지 정적 크롤링은 강의에 있어서 따라하니 잘 되는데 동적 페이지 크롤링인 네이버 쇼핑은 for i in 코드를 넣으니 넘어가지지가 않네요 ㅜㅜ 동적 페이지 크롤링인 네이버 쇼핑 여러페이지 넘어갈때는 다른 코드를 작성해야하는걸까요? 네이버 지식인 여러페이지 크롤링 할 때처럼 하니 페이지가 안넘어가지네요...
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 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
[질문 내용] 강의 17:01, 메서드 오버라이딩은 인스턴스 메서드에 해당하는 내용으로 static 메서드는 해당하지 않는다고 하셨습니다. 별도로 예제를 작성해서 테스트해보았는데, 자식 클래스에서 부모 클래스의 클래스 메서드를 호출할 수 있었습니다. static 메서드 역시 상속은 되지만 오버라이딩 대상이 되지 않는다고 이해하면될까요? 감사합니다.
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 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'. 이렇게 에러가 발생합니다.
[질문 내용] 여기에 질문 내용을 남겨주세요. int 형과 String 형을 더하면 int 형이 자동으로 문자형으로 변하고 합쳐진다고 하셨는데 int 형이 영구적으로 문자형으로 변하는건가요? 아니면 그냥 임시로 바뀌는건가요? int num = 20; String str = "a + b = "; System.out.println(str + num); //num이 문자형으로 변환 System.out.println(num); // 변환된 후에 num은 계속 문자형인가요? 아니면 위에 초기화된 int 형인가요?
vscode (windows)사용 기존) mydjango02 폴더--> django 설치 --> startproject --> manage.py 생성 질문 1) mydjango 03 폴더 --> django 설치 --> django runserver가 돌아가지 않습니다. 질문 2) 이전에 따라하기에선 django runserver가 돌아갔었는데 디버그시 mydjango.py가 나타나지 않았습니다. 그래서 실습을 기존에 설치된 manage.py로 했는데 제가 어느 부분에서 실수 할 가능성이 있을까요?
일코님, 안녕하세요. 오랜만에 질문 올립니다. 여러 장이 있는 hwp파일의 첫 페이지부터 한 페이지 씩 1.hwp, 2.hwp, 3.hwp, ... 로 저장하는 코드를 작성해 보았는데요. 한 가지 문제점만 빼면 원하는 대로 작동합니다. 한 가지 문제점은, 코드 실행 후 저장된 1.hwp 파일 속에 1페이지가 아닌 전체 페이지가 들어가 있다는 점입니다. 그거 외에 다른 페이지는 문제 없이 작동되고 있습니다. 이거 왜 그럴까요? 코드를 반복해서 살펴봐도, 논리적으로는 저장되는 1.hwp 파일에는 원본파일의 첫 페이지만 들어가 있어야 할 거 같은데.. 그렇게 안되는 이유가 궁금합니다. 전체 코드는 아래와 같습니다. import os from pyhwpx import Hwp hwp = Hwp() target_dir = r"D:\magicfolder" os.chdir(target_dir) hwp.add_tab() hwp.switch_to(0) # 탭0: 카피해 올 원본 파일용 hwp.open("D:\magicfolder\페이지분할대상.hwp") hwp.switch_to(1) # 탭1: 한 페이지씩 붙여서 저장할 일종의 작업공간 hwp.open("D:\magicfolder\페이지분할대상.hwp") hwp.switch_to(0) for j in range(1, hwp.PageCount + 1): hwp.goto_page(j) hwp.CopyPage() hwp.switch_to(1) hwp.HAction.Run("SelectAll") hwp.HAction.Run("Delete") hwp.MoveDocBegin() hwp.PastePage() # 바로 위에서 hwp.PastePage()할 때 페이지가 넘어가서 붙으므로, 앞 페이지로 당겨 붙이기 위해서 맨 위 페이지로 커서 옮기고 Del 2번 해 준 것임. hwp.MoveDocBegin() hwp.HAction.Run("Delete") hwp.HAction.Run("Delete") hwp.save_as(target_dir + "\\" + str(j) + ".hwp") hwp.switch_to(0) hwp.Close() hwp.FileClose() 코드를 많이 짜봐야 늘텐데 정말 오랜만에 시도해 본 거 같습니다. ^^ㅋ
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 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까지 접근하는 걸까요??
안녕하세요 강사님 현관문 출입순서를 풀어보고 강사님 코드를 보면서 한 if문 조건이 불필요하다고 생각해서 질문드립니다. for(int t = 0, i = 0, cnt = 0; ; t++){ //아래 조건은 아직 현관문을 다 사용하지 않았다는 조건이다. if(enter.isEmpty() && exit.isEmpty() && i < n) { if(t < arrival[i]){ 이 부분에서 if(t < arrival[i]) 는 필요 없는 것 같아서요 혹시 이게 없다면 어떤 테스트 케이스에서 막히는지 알 수 있을까요? 코드 자체가 바로 아래에서 이미 시간을 건너뛰는 메커니즘 t = arrival[i] 을 갖추고 있어서 굳이 필요 없다고 느껴서요 알려주시면 감사하겠습니다 강의 잘 듣고 있습니다
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 먼저 강의 들으면서 정말 많은 것을 배우고 있습니다. 감사합니다. 아직 index나 쿼리에 대해 이해도가 많이 부족하다 보니 궁금한 점이 있는데요. 실제 게시글이나 댓글 삭제 시 물리적 삭제가 아닌 논리적 삭제(soft delete)를 구현하게 되는 경우가 많았는데요. 이때 isDeleted같은 필드를 두고 true, false 의 boolean 값으로 관리했습니다. 이후 데이터를 조회할 때는 isDeleted가 false인 것들만 조회하는 방식이었는데, 이때도 isDeleted를 복합 index의 키값으로 넣어서 관리를 하는 경우가 많을까요? 성능 향상에 많은 도움이 될 지가 궁금하네요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 회원 리포지토리 테스트 케이스 작성 8:48영상을 보았는데 Member result = repository.findByName("spring1").get(); 이렇게 코드를 치는걸로 나오는데 이런방식으로 하면 값이 있는지 여부를 파악 못하고 그냥 불안전하게 값을 가져오는 방식이라는걸로 예전에 다른 강의에서 말씀해주셨던 거 같은데 기억이 애매모호해서 질문드립니다. 테스트코드라서 이런방식을 택하신건지와 정석적으로 값을 체크하려면 아래방식으로 코드를 짜는지에 대해서 궁금합니다. Optional<Member> result = repository.findByName("spring1"); Assertions.assertThat(result) .isPresent() // Optional에 값이 있는지 확인 .get() // 값이 존재할 때만 안전하게 꺼냄 .isEqualTo(member1); 혹시 이 코드가 맞다면 Optional<Member> 대신에 Member 클래스를 넣으면 정석인 코드가 되는지 알고 싶습니다.
멀티체인 부분에서 chain1의 답변이.. 길게 나옵니다. 한 단어로 'future'라는 답변이 나와야 사실 chain2에 english_word라는 변수에 알맞는 값이 들어가는 걸텐데요. 문장으로 답이 나와서 이상한 상황입니다. 무슨 문제가 있어서 이렇게 invoke 결과값이 달라지는지 제가 뭘잘못했는지 모르겠습니다. 제 잘못이 아니라면 이게 무엇 때문인지, 어떻게 해결할 수 있을지 궁금합니다. (chain2도 답변을 영어로 하는 문제도 있습니다.)
오타 여부가 확실하지는 않지만, 제가 생각했을 때 오타가 아닌가 싶어서 제보합니다. 영상 위치 : 6분 11초 강의록 위치 : p.24 - 스레드 종료 규칙 오타 의심 내용 : 원본 : 예를 들어, thread.join() 호출 전에 thread의 모든 작업이 완료되어야 하며, ... 수정 : 예를 들어, thread.join() 리턴 전에 thread의 모든 작업이 완료되어야 하며, ... 의견 : thread.join()을 호출하면, thread가 모든 작업을 마친 후에 void로 리턴하고 난 뒤에야 thread.join() 다음에 있던 코드들을 수행하는 것이니까 리턴 이 적절한 단어 아닌가 싶습니다.
일단 해당 영상 강의에서 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' 컬럼값을 추출해 분기 처리해서 특정 샤드 데이터베이스로 보내는지 궁금 합니다!