안녕하세요. @Transactional 테스트 케이스안에 query 및 transaction 작동방법이 이해가 안되서 문의드립니다. 일단 @Transactional을 테스트 케이스 붙이면 모든 change들이 테스트 완료후 롤백되는걸로 알고있습니다. 근데 제 update 메소드는 queryFactory.update() 메소드를 사용하고 있고 구글링 & chatgpt를 해본 결과 queryFactory.update()는 transaction을 커밋한다고 나왔습니다. 근데 제가 statsRepository.update() 시점 전과 후에 디버깅을 해보고 DB를 봤는데 값이 아직도 9로 나옵니다. transactional를 테스트 케이스에 안붙이면 메소드 후에 DB값이 10으로 관찰되고요. queryfactory.update()를 통해 transaction을 커밋했으면 DB에 값이 10으로 적용 된 다음에 테스트 끝난 시점에 다시 9로 롤백되는거 아닌가요? 아니면 커밋을 안하나요? 좀 했갈려서 도와주셨으면 감사하겠습니다. @Test @Transactional void updateIfMatch(){ //given String Url = “bla” String createdAt = LocalDateTime.now() //when statsRepository.update(url, createdAt) Statistics stats = statsRepository.findById(8L).get() //then assertThat(stats.getRelaySuccessCount()).isEqualTo(10) } //statsRepository @Transactional public void update(String url, LocalDateTime createdAt){ queryFactory .update(statistics) .where(whereClause) .execute(); JPQLQuery<Long> subquery = JPAExpressions.select //etc etc //조인 테이블 쿼리 BooleanExpression whereClause = statistics.id.in(subquery); }
안녕 하세요? 이미지 파일 또는 pdf 파일등과 같이 디지털 제품을 판매하려고 할때 결제후 각 구매 제품을 다운로드하게 처리 하려면 어떻게 하는것이 좋을까요? 1. 모델에 file 추가 2.order_detail 뷰에 추가 별도 처리 하면 되는지요? 좋은 의견이나 참조 문서가 있으시면 알려주시면 대단히 감사 하겠습니다
function solution(target, arr) { let start = 0; let end = arr.legnth-1; let mid = Number.parseInt((start+end)/2); arr.sort((a,b)=>a-b); while(arr[mid]!==target){ if(arr[mid] > target) end = mid-1; else start = mid+1; mid = Number.parseInt((start+end)/2); } return mid+1; } 안녕하세요 강사님 이분검색 문제 풀이 방법에 대해 궁금증이 생겨 질문 남깁니다. 문제 설명만 보고 혼자 풀어본건데 혹시 반례가 있을까요..? 이렇게 풀어도 괜찮을까요? 감사합니다.
A/B Test 는 가설검정이 중요하다고 생각합니다. 강의 내용에서는 간략히 설명된다 하더라도 본래의 통계 기법 (예를 들어 모수의 표준편차를 알고 / 모름에 따른 Z분포 / T분포를 사용한다던가, 혹은 평균이 차이를 검증하는지, 표준편차의 차이를 확인하는지에 따라 Z분포 / F 분포 를 사용한다던가) 을 따라야 한다고 생각합니다. 그런데 강의 내용 중 나오는 A/B Testguide 에서는 그러한 입력이나 설정(평균 및 표준편차 기입)이 없이 바로 결과가 나오는 것 같아서요. 이러한 A/B test가 실제 옳은것인지 궁금합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요?예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예/ 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 여기에 질문 내용을 남겨주세요. <스프링 인터셉터 - 인증 체크> 강의 수강 중 의문이 생겨 질문드립니다. 다중 인터셉터의 경우 ( 편의 상 1, 2 로 표기할게요) 구글링해보니까 pre 1 -> pre 2 -> 컨트롤러 호출 -> post 2 -> post 1 -> 요청 처리완료 -> after2 -> after 1 이 순으로 호출된다고 하는데 맞을까요? 그리고, 미인증상태로 items/add 를 들어갔을 때 pre2 까지 수행 후 리다이렉트 + return false; 니까 다음 인터셉터는 수행되지 않는다 생각해서 after1 도 수행되지 않을 거라 생각했는데 로그에는 수행이 되더라구요. 컨트롤러에서 예외가 발생한게 아니라, preHandle 에서 false를 반환하는 경우에도 afterCompletion은 수행되는건가요? 아니면 두번째 인터셉터의 preHandle이 false를 반환한거라 두번째 인터셉터만 건너뛰는거고 첫 번째 인터셉터랑은 무관해서 수행된걸까요? 2023-05-09 13:56:35.412 INFO 32688 --- [nio-8080-exec-7] h.login.web.interceptor.Loginterceptor : REQUEST [14810694-f53d-4526-9a1f-5b95b3c0c010] [/items/add] [hello.login.web.item.ItemController#addForm(Model)] 2023-05-09 13:56:35.419 INFO 32688 --- [nio-8080-exec-7] h.l.w.interceptor.LoginCheckInterceptor : 인증 체크 인터셉터 실행 /items/add 2023-05-09 13:56:35.427 INFO 32688 --- [nio-8080-exec-7] h.l.w.interceptor.LoginCheckInterceptor : 미인증 사용자 요청 2023-05-09 13:56:35.432 INFO 32688 --- [nio-8080-exec-7] h.login.web.interceptor.Loginterceptor : RESPONSE [14810694-f53d-4526-9a1f-5b95b3c0c010][/items/add][hello.login.web.item.ItemController#addForm(Model)] 2023-05-09 13:56:35.468 INFO 32688 --- [nio-8080-exec-6] h.login.web.interceptor.Loginterceptor : REQUEST [5fb2bde4-eba5-4f97-b294-bad2597bd5f1] [/login] [hello.login.web.login.LoginController#loginForm(LoginForm)] 2023-05-09 13:56:35.495 INFO 32688 --- [nio-8080-exec-6] h.login.web.interceptor.Loginterceptor : postHandle [ModelAndView [view="login/loginForm"; model={loginForm=LoginForm(loginId=null, password=null), org.springframework.validation.BindingResult.loginForm=org.springframework.validation.BeanPropertyBindingResult: 0 errors}]] 2023-05-09 13:56:35.529 INFO 32688 --- [nio-8080-exec-6] h.login.web.interceptor.Loginterceptor : RESPONSE [5fb2bde4-eba5-4f97-b294-bad2597bd5f1][/login][hello.login.web.login.LoginController#loginForm(LoginForm)] 2023-05-09 13:56:35.699 INFO 32688 --- [nio-8080-exec-8] h.l.w.interceptor.LoginCheckInterceptor : 인증 체크 인터셉터 실행 /favicon.ico 2023-05-09 13:56:35.699 INFO 32688 --- [nio-8080-exec-8] h.l.w.interceptor.LoginCheckInterceptor : 미인증 사용자 요청 2023-05-09 13:56:35.709 INFO 32688 --- [nio-8080-exec-9] h.login.web.interceptor.Loginterceptor : REQUEST [5ad8ae3f-2e48-479e-8013-4ffc72ecaf06] [/login] [hello.login.web.login.LoginController#loginForm(LoginForm)] 2023-05-09 13:56:35.709 INFO 32688 --- [nio-8080-exec-9] h.login.web.interceptor.Loginterceptor : postHandle [ModelAndView [view="login/loginForm"; model={loginForm=LoginForm(loginId=null, password=null), org.springframework.validation.BindingResult.loginForm=org.springframework.validation.BeanPropertyBindingResult: 0 errors}]] 2023-05-09 13:56:35.719 INFO 32688 --- [nio-8080-exec-9] h.login.web.interceptor.Loginterceptor : RESPONSE [5ad8ae3f-2e48-479e-8013-4ffc72ecaf06][/login][hello.login.web.login.LoginController#loginForm(LoginForm)] 혹시 여기서 말하는 '나머지 인터셉터'가 다른 인터셉터의preHandle만 의미하는 건가요? 그래서 postHandle, afterCompletion 이랑은 별개인걸까요 아직 내용을 잘 숙지하지는 못한 상태라 질문이 매끄럽지 못한점 양해부탁드려요. 감사합니다.
#include <bits/stdc++.h> using namespace std; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; // bool m[3][3]; bool visited[3][3]; bool m[3][3] = { 1, 0, 1, 1, 0, 1, 0, 1, 1 }; // void visit(int x, int y) // { // cout << '(' << x << ", " << y << ')' << '\n'; // visited[x][y] = true; // for(int i = 0; i < 4; i++) // { // int nx = x + dx[i]; // int ny = y + dy[i]; // if(nx < 0 || nx >= 3 || ny < 0 || ny >= 3) // continue; // else // if(!visited[nx][ny] && m[nx][ny]) // visit(nx, ny); // } // } int main(void) { for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) for(int k = 0; k < 4; k++) { int nx = i + dx[k]; int ny = j + dy[k]; if(nx < 0 || nx >= 3 || ny <0 || ny >= 3) continue; else if(!visited[nx][ny] && m[nx][ny]) { cout << '(' << nx << ", " << ny << ')' << '\n'; visited[nx][ny] = true; } } // for(int i = 0; i < 3; i++) // for(int j = 0; j < 3; j++) // cin >> m[i][j]; // visit(0, 0); return 0; } 강의를 보고 제가 작성한 코드입니다. 강의 내 Q. 3 * 3 맵을 입력받아야 함. 이 맵은 1과 0으로 이루어져있고 {0, 0}은 무조건 1임을 보장한다. {0, 0}부터 4방향을 기준으로 한칸씩 탐색해나가며 방문한 정점은 다시 방문하지 않으며 방문하는 좌표를 출력하는 코드. 0은 갈 수 없는 지역. 1은 갈 수 있는 지역을 구현하시오. 라는 문제에 따라서 해당 코드로 구현했습니다. 해당 코드의 결과는 (1, 0) (0, 2) (0, 0) (1, 2) (2, 1) (2, 2) 정확한 의도와는 다르게 구현된 부분( (0, 0) 부터 가는게 아니라서 출력 순서가 바뀜) 이 있지만 문제에 맞게 작성을 했는데요. 강사님이 작성하신 코드를 그대로 복붙한 결과, 강사님이 작성하신 코드 참조해서 작성한 코드 결과가 모두 (0, 0) (1, 0) 이렇게 결과가 나왔는데 잘못된게 아닌가 싶어서 질문 드립니다. 혹시 제가 뭔가 빼먹었나요. 현재까지 본 영상으로 DFS, BFS 에서 사용되는 핵심 부분의 일부를 빌드업으로써 설명을 잘해주셔서 이해가 빨리 됩니다. 근데 아무래도 왜 저런 결과가 나오는지 이해가 잘 안됩니다. 재귀 호출로 인해서 분명 다 조회가 될텐데 말이죠. 강의 잘 듣고 있습니다.
안녕하세요 강의 너무 잘 듣고 있습니다! 다름이 아니라 섹션 6. 스프링 MVC - 기본 기능 부분을 듣다가 궁금한 점이 생겨서 질문 드립니다. 우선 제가 이해하기로는 ResponseEntity를 사용하는 이유는 데이터(객체)와 함께 HTTP 응답 코드를 같이 반환 할 수 있기 때문이다 물론 @ResponseBody와 @ResponseStatus를 같이 쓰면 데이터와 HTTP 응답 코드를 같이 보내줄 수 있지만, @ResponseStatus는 애노테이션이기에 동적으로 HTTP 응답 코드를 설정할 수 없기에 ResponseEntity를 사용하는게 더 효율적이다 이렇게 두 가지 정도로 알고 있습니다. 여기서 제가 궁금한 점은 반환 타입이 ResponseEntity인 경우 왜 @RestController를 사용하는지 입니다. 그 동안 저도 ResponseEntity를 반환하는 컨트롤러에 @RestController를 항상 붙여줬는데, 강의를 보다 보니 ResponseEntity를 반환할 때는 @ReponseBody가 필요하지 않아서 @RestController가 아닌 @Controller로도 동작하는데 문제가 없어 보이기에 혹시 다른 이유가 있는지 궁금합니다. 개인적으로 생각했을때 ResponseEntity를 반환하는 컨트롤러에 @RestController를 쓰는 이유는 중간중간 ResponseEntity가 아닌 String, Object 같은 데이터만 반환하는 메서드가 있을 수 있고, 그런 메서드 마다 @ResponseBody를 붙이는게 번거롭기 때문에 @RestController 적용시 스프링 컨테이너가 Bean Scope를 template 영역까지 고려하지 않아서 resource를 절약할 수 있기 때문에(?) 이 두가지 정도 떠오릅니다. 만약 추가적으로 ResponseEntity를 반환하는 컨트롤러에서 @RestController를 사용하는 이유가 있을까요? 그리고 두 번째 이유는 저도 정확히 아는게 아니라 주변에서 들었던 부분인데 이 이유도 해당된다면 조금 풀어서 설명해주실 수 있을까요? 감사합니다!
chat gpt api를 통해 챗봇을 테스트로 개발하려고 합니다. openai.ChatCompletion.create 사용하여 질문을 던지고 응답을 받은 후에 똑같은 함수로 다음 질문을 던졌을 때 맥락 공유가 안되어 질문드려요! 어떻게 작성해야 맥락 공유가 가능할까요..ㅜ? ------------------------- *코드 openai.api_key = "my_key" default_system_set = "You are the manager of a shared office" default_user_set = "현재 지점은 서울대 지점 빈방 2개 남아있어. 이 정보를 기반으로 상담해주면돼. 앞으로 하는 질문은 전부 입주자라 생각하고 대답해줘." # 매니저 설정 answer=openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": default_system_set}, {"role": "user", "content": default_user_set} ], max_tokens=50, ) def get_response(prompt: str): return openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": prompt} ], max_tokens=200, )
안녕하세요 강사님. 문제를 꾸준히는 아니더라도 가끔씩 계속해서 도전하고 있는데요. 지금 보면 문제가 많긴 하지만 더 추가하실 예정이 있는지 궁금합니다. 만약 있으시면 어디 파트가 추가될 예정인지 좀 알고 싶어요. 제 개인적인 희망은 구현 파트가 아주 많았으면 하는 것입니다.
안녕하세요! 덕분에 공부 잘 하고 있습니다! 다름이 아니라 작업형 2번 문제에 지도학습 중 분류와 회귀 위주로 기출이 나오고 강의를 해주시는데, 비지도 학습의 군집분석이나 연관분석 문제는 배제하고 공부를 해도 될런지요? 만약 공부를 해야 한다면 어디를 참조하여 공부를 하면 될까요? (예시문제 등)
안녕하세요 선생님! 질문 있어 글을 남깁니다. 프로세스가 data를 전송하기 위해 Socket을 통해 데이터를 전송한다고 이해했습니다. Socket은 커널 기능을 이용하기 위해, 더 자세하게는 TCP/IP 프로토콜을 이용할 수 있도록 해주는 인터페이스라고 이해했습니다. 지금까지 제가 이해한 부분은 맞는지 궁금합니다. 또 File은 mp3 파일, 문서 파일 등 우리가 생각하는 파일이고, Socket이 File의 일종이라고 설명해주셨는데 이 부분이 잘 와닿지 않습니다. 다른 질문글에서도 프로세스가 Socket을 open하고 각 Socket이 포트 번호를 부여받는다고 답변을 달아주신 것도 보았습니다. 이 설명을 보고나니까 File과 Socket이 무슨 연관성이 있길래 File의 일종이라고 설명해주시는지 더 와닿지 않는 것 같습니다... 정확히 잘 이해가 안됩니다. 좀 더 설명해주실 수 있을까요?