package extends1.ex; class ClassA { String value = "A"; } class ClassB extends ClassA { String value = "B"; void printValue() { System.out.println(this.value); // this는 new ClassC()에 의해 생성된 참조로 접근하니 C가 나와야하는거아닌가? } } class ClassC extends ClassB { String value = "C"; } public class Main { public static void main(String[] args) { ClassC obj = new ClassC(); obj.printValue(); // B System.out.println(obj.value); // C } } this 는 인스턴스 자기자신에 대한 참조입니다. 상속 관계에 있고 new ClassC() 로 생성하였으니 this 는 ClassC 에 대한 참조라고 생각했습니다. main() 의 obj.printValue() 는 ClassC 부터 탐색하여 ClassB 에서 발견되었습니다. 해당 메서드 안에서 this.value 가 있는데 이 때의 this 는 ClassC 에 대한 참조로 접근해야하는거아닌가요? ClassB 에 있는 value로 접근하는 이유가 궁금합니다.
안녕하세요 상용님 좋은 강의 너무 잘 듣고 있습니다. namedlock부분에서 테스트 코드를 돌리는데 connectiontimeout 이후 테스트가 실패하여 질문 드리려 합니다. 문제상황 maximum-pool-size를 40으로 설정 후 테스트를 돌리면 다음과 같은 에러가 터지면서 테스트가 실패합니다. 사진에서와 같이 40개 스레드가 락획득을 시도한 후, 30초 후 락획득 시도조차 하지못한 60개의 스레드에서 타임아웃이 납니다. 이후 락 획득을 기다리던 스레드하나가 타임아웃이 나고 나머지 스레드들이 39번의 재고 감소 로직을 실행합니다. 추측 제가 추측한 것은 다음과 같습니다. 1. 현재 transactional propagation requiresnew로 되어있기에 하나의 재고 감소 로직 당 2개의 connection을 필요로한다. 2. 처음 40개의 스레드가 순차적으로 lock획득을 시도하며 40개의 스레드를 점유한다. 3. requires new로 새로운 트랜잭션을 시작하기 위해 새 connection이 필요하지만, 여유분이 없어 기다린다.(이때 데드락 상황) 4. 30초 대기후 timeout이 나서 커넥션들이 순차적으로 반환된다. 5. 이때 락을 획득 시도한 스레드(커넥션 점유중)가 반환되면 6. 나머지 39개의 락획득 시도하던 스레드들이 실행된다. 그래서 실제로 maximum pool size를 101개로 올리니 잘 실행되었습니다. 그런데 선생님은 40개로도 실행이 되어서.. 의문이 남습니다. 질문 저의 추측이 맞을까요..? 틀리다면 어디가 틀린걸까요. 왜 선생님은 40으로만으로도 된것인가요? 이런 이유에서 강의 중에 datasource를 분리하라 하신걸까요? 혹시 몰라 코드 첨부합니다.!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 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도 답변을 영어로 하는 문제도 있습니다.)