안녕하세요 강사님, 좋은 강의 잘 듣고 있습니다. 바쁘실텐데도 불구하고 답변해주셔서 감사합니다. 질문은 크게 2가지 입니다. 유니크 제약 조건 위반시 예외처리방법 like() 로직에선 article_id와 user_id로 유니크 제약 조건을 걸어서 한 명의 사용자가 중복 생성하는 것을 막고 있습니다. 이 유니크 제약 조건을 위반하여 발생하는 에러는 @ControllerAdvice에서 @ExceptionHandler(DataIntegrityViolationException.class) 로 시작하는 핸들러를 통해서 처리하는 것이 일반적인가요? 2.unlike()에서 한 명의 사용자가 삭제 중복요청시 발생하는 동시성 문제 @Transactional public void unlikePessimisticLock2(Long articleId, Long userId) { articleLikeRepository.findByArticleIdAndUserId(articleId, userId) .ifPresent(articleLike -> { articleLikeRepository.delete(articleLike); ArticleLikeCount articleLikeCount = articleLikeCountRepository.findLockedByArticleId(articleId).orElseThrow(); articleLikeCount.decrease(); }); } 한 명의 사용자가 "좋아요" 중복 생성 요청하는 것을 방어하는 로직이 있으니 "좋아요 해제" 중복 요청에 대한 고려에 대해서 생각해봤습니다. 이 로직에선 findLockedByArticleId 에서 베타락을 걸게 되어서 하나의 article에 대한 여러 사용자의 "좋아요 해제" 요청시의 동시성 문제를 방어하고 있습니다. 그런데 한 명의 사용자가 "좋아요 해제" 중복 요청 시에 ifPresent 구문을 통과하게 되어 articleLikeRepository.delete(articleLike);를 여러번 수행하게 됩니다. 여기서 delete는 멱등성이 보장되니 큰 문제 없이 넘어가겠지만 그 아래 count감소 로직은 해당 트랜잭션들이 베타락을 획득할 때마다 계속 수행되는 것이 아닌지 궁금합니다. 일단 ifPresent 구문 안으로만 들어오면 count감소는 무조건 일어나게 되니 문제가 생기는게 아닐까요? 그래서 ifPresent구문 전에 락을 걸기 위해 findByArticleIdAndUserId() 여기서 락획득이 이루어져야 하는건 아닌지 궁금합니다. 작성하다 보니 질문이 길어져서 죄송합니다.
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 라이브러리 및 데이터불러오기 20분지점 주어진 데이터 분리하기 train= pd.read _csv("train.csv") test= pd.read _csv("test.csv") 가 주어졌습니다. 이게 어느 단계에서의 작업이며, 데이터를 왜 분리하는지, 어떤 데이터를 분리하는지에 대해 전반적인 설명이 없어서 지금의 학습과정을 이해할 수 없습니다. train과 test가 주어졌다면 타겟레이블을 생성하는 과정이 아닐까 추측해 봤지만, 여기서는 income을 삭제했는데 왜 삭제했는지 이해가 안 갑니다. 설명을 바랍니다.
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
안녕하세요. 강의와 관련 없는 질문 죄송합니다. 하지만 너무 불편한데다가 도저히 해결 방법을 찾을 수 없어서 여쭤봅니다. 주피터 노트북에서 화면을 밑으로 내리는데 위 영상과 같이 자꾸 위로 튀는(?) 현상이 나타납니다. 스크롤바로 화면을 내려도 같은 현상입니다. 캐시삭제, 재부팅 등 챗gpt가 알려준 조치를 했지만 개선되지 않아 여쭙니다..
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. [문의사항] 강사님의 코드 그대로 따라서 하나하나 작성하고, 모든 부분의 설정을 똑같이 했습니다. Comment 테스트 중에 <삭제할 댓글이 자식 있으면, 삭제 표시만 한다.> 는 성공이 되었습니다. 그러나 <하위 댓글이 삭제되고, 삭제되지 않은 부모면, 하위 댓글만 삭제한다.> 부분의 테스트를 그대로 따라했는데, mockito.exceptions.misusing.UnnecssaryStubbingException 오류가 납니다. 강의 자료로 올려주신 소스코드를 그대로 복사하여 붙여넣기 해도 같은 오류가 납니다. 소스코드와 에러메세지 작성드리며, 같은 환경에서 똑같은 소스코드를 작성했는데 어떻게 오류가 나는지 궁금합니다. 해결 부탁드립니다 ㅠㅠㅠ package kuke.board.comment.service; import kuke.board.comment.entity.Comment; import kuke.board.comment.repository.CommentRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class CommentServiceTest { @InjectMocks CommentService commentService; @Mock CommentRepository commentRepository; @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(); } @Test @DisplayName("하위 댓글이 삭제되고, 삭제되지 않은 부모면, 하위 댓글만 삭제한다.") void deleteShouldDeleteChildOnlyIfNotDeletedParent() { // given Long articleId = 1L; Long commentId = 2L; Long parentCommentId = 1L; Comment comment = createComment(articleId, commentId, parentCommentId); given(comment.isRoot()).willReturn(false); Comment parentComment = mock(Comment.class); given(parentComment.getDeleted()).willReturn(false); given(commentRepository.findById(commentId)) .willReturn(Optional.of(comment)); given(commentRepository.countBy(articleId, commentId, 2L)).willReturn(1L); given(commentRepository.findById(parentCommentId)) .willReturn(Optional.of(parentComment)); // when commentService.delete(commentId); // then verify(commentRepository).delete(comment); verify(commentRepository, never()).delete(parentComment); } private Comment createComment(Long articleId, Long commentId) { Comment comment = mock(Comment.class); given(comment.getArticleId()).willReturn(articleId); given(comment.getCommentId()).willReturn(commentId); return comment; } private Comment createComment(Long articleId, Long commentId, Long parentCommentId) { Comment comment = createComment(articleId, commentId); given(comment.getParentCommentId()).willReturn(parentCommentId); return comment; } }
1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2 어떤 알고리즘을 학습하고 계신가요? 여기까지 이해하신 내용은 무엇인가요? 2. 어려움을 겪는 부분 어느 부분에서 막히셨나요? W = "))()(" 케이스에 대해서, u와 v로 나누어야 하는데 u는 더이상 나눌 수 없는 균형잡힌 괄호 문자열이어야 된다고 했습니다, 하지만 해설로 제공해주신 풀이로 풀 때에는 W = "))()(" 가 애초에 균형잡힌 괄호 문자열이 아니기 때문에 u도 균형잡힌 괄호 문자열이 되지 않는다고 이해했습니다. (W의 문자열 길이가 홀수인 경우에는 )와 (가 모두 짝수 개수만큼 있을 수 없다고 생각했습니다.) 해당 문제의 원 링크에서 제공해주신 코드를 제출했을 땐 정답이 나오는데, 문제 설명 중에서 어떤 조건을 보고 W가 균형잡힌 문자열이 아닐 수도 있다는 것을 알수 있으며, u가 무조건 균형잡힌 문자열이 아니어도 된다는 것을 알 수 있는건가요? 코드의 어떤 로직이 이해가 안 되시나요? 어떤 개념이 헷갈리시나요? 3. 시도해보신 내용 문제 해결을 위해 어떤 시도를 해보셨나요? 제가 짠 코드와 제공해주신 해설 코드 중 차이점이 W를 u와 v로 나누는 부분에 있음을 알게되었고, 제 코드는 W가 무조건 균형잡힌 괄호 문자열인 경우에 대해서만 풀리게 되어있습니다. 에러가 발생했다면 어떤 에러인가요? from collections import deque def is_this_correct_parentheses(string): N = len(string) left_parentheses_num = 0 for s in string: if s == "(": left_parentheses_num += 1 if left_parentheses_num == N-left_parentheses_num: return 1 else: return 0 def is_this_balanced_parentheses(string): stack = [] stack.append(string[0]) string = string[1:] for s in string: tmp = s if len(stack) != 0 and stack[-1] == "(" and tmp == ")": stack.pop() else: stack.append(tmp) if len(stack) == 0: return 1 else: return 0 def u_string_processing(u): u = u[1:-1] tmp_u = "" for i in range(len(u)): if u[i] == "(": tmp_u += ")" else: tmp_u += "(" return tmp_u def get_correct_parentheses(balanced_parentheses_string): W = balanced_parentheses_string if W == "": return "" idx = 0 for i in range(1, len(W)): tmp_u = W[:i] if is_this_correct_parentheses(tmp_u) == 1: idx = i break if len(W) == 2: idx = 2 u = W[:idx] v = W[idx:] if is_this_balanced_parentheses(u) == 1: processed_v = get_correct_parentheses(v) return u+processed_v elif is_this_balanced_parentheses(u) == 0: tmp_string = "(" processed_v = get_correct_parentheses(v) tmp_string += (processed_v + ")") tmp_string += u_string_processing(u) return tmp_string return W 이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 작업형1 모의고사 풀어보기 6분 38초 지점 문의입니다. 위에서 2번의 a는 “data1-2.csv”를 저장하기 위해 생성한 아무 의미 없는 임시변수인지. 종전에 df로 저정하던 것을 a로 바꾼 이유가 있는지. 어떤 의미를 지니는지. 여기서는 (1)data1-2.csv의 데이터프레임을 의미한다고 보고 5번에 a는 “data1-2.csv”에서 임의로 선택한 ['s1','s2','s3','s4','s5','s6'] 컬럼명만 저장한 즉 (2)data1-2.csv에서 -> ['s1','s2','s3','s4','s5','s6'] 컬럼명만 남긴 결과값을 담은 임시변수명인지. 그럼 (1)과 (2)의 의미가 다른데 임시변수명 a로 동일하여 혼란스러워 가독성 문제도 야기되어 보입니다. 이어서 6번 (3)a=a[cols]에서 변수 a는 5번값 a['s1','s2','s3','s4','s5','s6'] 컬럼명을 담은 a와 무엇이 다른지? 같은 의미가 아닌지. 질문은 원데이터에서 1차 가공 후 2차 데이터를 뽑고 2차 데이터에서 3차 가공 후 3차 데이터를 뽑는다면 처음과 마지막에 저장하는 변수를 동일하게 할 것인가 달리 할 것인가. 무엇이 가독성이 좋은가에 관한 질문 같습니다. 일단 이러든 저러든 상관 없는 것이라면 무엇이 가독성이 좋은 변수 저장 방식인지 여쭤봅니다.
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 작업형1 모의고사 풀어보기 6분 지점에서 cols 변수에 대해서도 단순한 임시 변수가 아닌 일부 조건을 담은 변수인 경우에는 구분해서 설명이 되면 좋겠어요. 적어도 자신이 임의로 만든 변수와 외부에서 일정 조건을 포함한 변수를 가져다 쓰는 경우에는 이를 구분해줄 필요가 있습니다. 아니 구분해줘야 한다고 생각을 합니다. 이게 결과값을 저장하기 위해 임시로 폴더명을 정한 건지, 이미 고정된 의미를 가진 파일 명을 포함하고 있는건지 구분을 못하면 개념을 이해 못하고 있는 것이 됩니다. 전자에 해당한다고 판단하여 cols 라는 이름을 따라서 쓰지 않고 임의로 바꿀 경우에는 학습자가 혼란스러워지겠죠.
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 작업형1 모의고사 풀어보기 3분지점에서 cond를 설명하셨는데요 변수?라고 하면서 동시에 조건문?이라고도 하셨어요. 2가지 의미에 대한 정리된 개념을 듣지 못했습니다. cond라는 것이 변수고 함수( )는 아니지만 조건식을 만드는 함수의 성격도 동시에 지닌 것인지 여부가 궁금합니다. cond=a['target']==0 지점을 놓고 보면 cond는 위치상 결과값을 담기 위한 임시변수에 해당하지만 "설명"에서는 조건을 준다고~ 설명을 하여 이 코드를 작성하는 목적이 1) 저장하는 행위인지 2) 조건식을 부여하기 위한 것인지 3) 둘 다의 의미를 동시에 포함하고 있는지... 개념의 중첩현상으로 해석이 모호합니다. 뒤의 a[cond]와 a=a[cond]를 보면 cond가 임시변수임에는 맞는 것 같습니다. 정리를 부탁드립니다.
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 혼자 해결해 보려고 3일 동안 했는데 해결을 못해서 질문 드립니다. likeAndUnlikeTest() 실행하면 이런 오류가 발생합니다.. 디버깅 해보니 여기까지는 되는데 다음에 AopUtils로 넘어가서 구현체까지 넘어가는데 어디 문제인지 모르겠습니다!.. 이게 테스트 코드이고 DB까지 강의랑 똑같이 했습니다,,
안녕하세요! 해당 수업에서 django shell에서 update 부분 실습하다가 결과 값에 의문이 생겨 질문드립니다. 이 부분에서 auto_now=True 필드도 같이 bulk_update 함수의 인자인 fields 에 지정해야만 해당 필드도 같이 업데이트 된다고 하셨는데 제 코드에서는 updated_at 필드의 값이 업데이트 되지 않았습니다. 제가 나름대로 이해한 바로는 bulk_update 는 따로 save 를 호출하지 않기 때문에 updated_at 을 fields 인자에 추가해주더라도 변한 값이 없어서 업데이트가 되지 않는 걸까요? 그렇다면 제대로 updated_at 도 업데이트 되게끔 하기 위해서는 따로 post.updated_at = timezone.now() 를 title 수정할 때 해주어야 하는 걸까요?