학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용]
안녕하세요 좋은강의 감사드립니다. 제 주변도 사서 듣는다고 합니다. 예전에 완강해놓고 관련프로젝트를 하다 궁금한점이 생겼습니다. 이런식으로 분리된 구조라면, 유저 정보는 어떻게 가져오는건가요?? 예를들어서 게시판이면, 거기에 들어가면 게시글들이나 댓글들 뿐만 아니라 유저의 닉네임이라던가, 유저가 설정한 대표이미지 라던가 등등 유저정보에 관한것들도 같이 뷰 렌더링을 위해선 필요한 정보들일텐데 유저와 관련된 서비스도 뭔가 따로 분리가 되어있을것 같은데 이때 유저 정보들은 어떻게 같이 가져오는지 궁금합니다. 디비도 다 따로 사용할텐데 연관관계매핑도 아닐테고...모르겠네요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] oracle openjdk 설치하려고 할 시 버전이 21은 선택이 안되고 24로 고정되어 선택되는데 vendor를 변경해도 될까요? 아니면 버전을 24로 해도 될지 궁금합니다.
출력값 3번째줄에 있는 Tesla Model 3 start는 eCar.start();에서 start가 부모 클래스안에 있으니까 거기에 입력하여 출력하고 eCar.stop();와 eCar.checkBattery();는 자식값에 재정의하였기에 재정의한 데에 넣어 출력하는 건가요?
Querydsl fetchResults(), fetchCount() Deprecated(향후 미지원) Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다. 안녕하세요 최근 강의를 구매하고 좋은 강의 잘 들었습니다. 하지만 querydsl은 향후 강의에 나와있는 방식으로는 page처리를 못하게 되는데 이에 맞는 강의도 올라가는 것인가요?
해결 ++ 아래 질문 내용을 글로벌 큐에서 추가로 처리해 주는 거였습니다. 삭제가 안되서 최상단에 남깁니다. 이것저것 건들면서 연습하다 보니 제 환경에서 글로벌 큐 호출을 안해서 문제였습니다. 안녕하세요? 루키스님 강의를 참고하여 더미 프로젝트 하는 중에 문제가 식별 되어 제가 분석한게 맞다면 강의 코드에 문제가 있어 제보 드려봅니다. 문제라고 생각되는 부분은 JobQueue 클래스인데요, 문제 상황은 부하가 있는 상황에서 '워커스레드를 2개 이상 돌릴 때, Execute()함수가 실행되지 않는' 점을 확인하였습니다. jobCount 관련 변수의 조건이 어디서 안 맞는 것 같아서 생각해보건데, 아래와 같은 경우라고 생각됩니다. // JobQueue.cpp void JobQueue::Execute() { ... if (_jobCount.fetch_sub(jobCount) == jobCount) { // 여기서 다른 워커 스레드의 _jobCount.fetch_add 발생?! LCurrentJobQueue = nullptr; return; } ... } } 그렇기 때문의 이후의 잡들이 처리되지 못하고 해당 부분에서 prevCount가 계속 쌓이고 있었습니다. // JobQueue.cpp void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 여기서 prevCount가 계속 쌓여 0이 아님 if (prevCount == 0) { //그러므로 이 부분의 Excute()도 실행되지 않음 ... } 아래는 해당 클래스 cpp 전문입니다. 귀한 시간 내시어 확인해주시면 감사하겠습니다! #include "pch.h" #include "JobQueue.h" #include "GlobalQueue.h" /*-------------- JobQueue ---------------*/ void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 첫번째 Job을 넣은 쓰레드가 실행까지 담당 if (prevCount == 0) { // 이미 실행중인 JobQueue가 없으면 실행 if (LCurrentJobQueue == nullptr && pushOnly == false) { Execute(); } else { // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); } } } // 1) 일감이 너~무 몰리면? void JobQueue::Execute() { LCurrentJobQueue = this; while (true) { vector<JobRef> jobs; _jobs.PopAll(OUT jobs); const int32 jobCount = static_cast<int32>(jobs.size()); for (int32 i = 0; i < jobCount; i++) jobs[i]->Execute(); // 남은 일감이 0개라면 종료 if (_jobCount.fetch_sub(jobCount) == jobCount) { LCurrentJobQueue = nullptr; return; } const uint64 now = ::GetTickCount64(); if (now >= LEndTickCount) { LCurrentJobQueue = nullptr; // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); break; } } }
안녕하세요? 루키스님 강의를 참고하여 더미 프로젝트 하는 중에 문제가 식별 되어 제가 분석한게 맞다면 강의 코드에 문제가 있어 제보 드려봅니다. 문제라고 생각되는 부분은 JobQueue 클래스인데요, 문제 상황은 '워커스레드를 2개 이상 돌릴 때, Execute()함수가 실행되지 않는' 점을 확인하였습니다. jobCount 관련 변수의 조건이 어디서 안 맞는 것 같아서 생각해보건데, 아래와 같은 경우라고 생각됩니다. // JobQueue.cpp void JobQueue::Execute() { ... if (_jobCount.fetch_sub(jobCount) == jobCount) { // 여기서 다른 워커 스레드의 _jobCount.fetch_add 발생?! LCurrentJobQueue = nullptr; return; } ... } } 그렇기 때문의 이후의 잡들이 처리되지 못하고 해당 부분에서 prevCount가 계속 쌓이고 있었습니다. // JobQueue.cpp void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 여기서 prevCount가 계속 쌓여 0이 아님 if (prevCount == 0) { //그러므로 이 부분의 Excute()도 실행되지 않음 ... } 아래는 해당 클래스 cpp 전문입니다. 귀한 시간 내시어 확인해주시면 감사하겠습니다! #include "pch.h" #include "JobQueue.h" #include "GlobalQueue.h" /*-------------- JobQueue ---------------*/ void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 첫번째 Job을 넣은 쓰레드가 실행까지 담당 if (prevCount == 0) { // 이미 실행중인 JobQueue가 없으면 실행 if (LCurrentJobQueue == nullptr && pushOnly == false) { Execute(); } else { // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); } } } // 1) 일감이 너~무 몰리면? void JobQueue::Execute() { LCurrentJobQueue = this; while (true) { vector<JobRef> jobs; _jobs.PopAll(OUT jobs); const int32 jobCount = static_cast<int32>(jobs.size()); for (int32 i = 0; i < jobCount; i++) jobs[i]->Execute(); // 남은 일감이 0개라면 종료 if (_jobCount.fetch_sub(jobCount) == jobCount) { LCurrentJobQueue = nullptr; return; } const uint64 now = ::GetTickCount64(); if (now >= LEndTickCount) { LCurrentJobQueue = nullptr; // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); break; } } }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 회원 등록 api 에서 아래 코드 처럼 saveMemberV1 메서드의 반환값은 new CreateMemberResponse(id)입니다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){ Long id = memberService.join(member); return new CreateMemberResponse(id); } 근데 MemberForm.java 에 id를 추가하고 이걸로 리턴받으면 안되나요? 왜 굳이 DTO 를 만들어서 리턴하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 환경설정 PDF 강의 자료에서는 검증용 Q 타입 생성 Gradle IntelliJ 사용법 Gradle -> Tasks -> build -> clean Gradle -> Tasks -> other -> compileQuerydsl 이라고 되어 있는데 부트 3.0 이후부터는 build.gradle에서 compileQuerydsl 부분이 빠져있기 때문에 'Gradle -> Tasks -> other -> compileQuerydsl' 문구가 다른 문구로 대체되어야 하지 않을까요? 저는 clean 클릭 후 Gradle -> Tasks -> build -> build 를 클릭해서 해결했지만 clean 클릭 후 더 나은 방법이 있지 않을까 싶어서 clean 후 어떤 버튼을 클릭해야 할지 문의드립니다.
안녕하세요 선생님 항상 강의 잘 듣고 있습니다. 문제를 푸는 중에 궁금했던 건데요. 이런 코드에서 어떨 때는 배열 내 위치를 하나 더 움직이고 어떨 때는 ASCII 코드의 그 다음 알파벳을 뱉는데 이게 너무 헷갈립니다..ㅠ 주소에서 연산을 하는 거면 배열에서 위치를 옮기고 값에서 연산을 하는거면 ASCII코드에서 다음 알파벳을 뱉으면 되는건가요..? 주석에 제가 이해하는 법을 적어놨는데 이렇게 이해하면 되는걸까요? 특히, printf("%s", a+2); 이런 부분 같은 경우에는 a+2에서 a는 시작주소를 뜻하니 a[0], 따라서 a[0]+2 --> a[0]은 값이니 h, h라는 값에서+2하니까 j 이런 사고 과정으로도 흘러가는 거 같아 헷갈립니다..ㅠㅠ 답변 주시면 감사하겠습니다! # include <stdio.h> int main() { char a[6] = "hello"; printf("%s", a+2); // a는 시작주소(=a[0])를 뜻하니 a[0]의 주소에서 2번 옮김? -> llo printf("%c", a[1]+2); //a[1]은 값으로 e를 뱉으니 ASCII? -> g printf("%c", *a+1); // *a는 a[0]의 값 h를 뱉으니 ASCII? -> i printf("%c", *(a+1)); //(a+1)은 a[0]에서 하나를 더 움직인 주소 ->의 값 = e printf("%c", a[1]); // a[1] = e return 0; } 출력값 : llogiee
가장 쉽고 깊게 알려주는 MongoDB 완벽 가이드 [ By. 비전공자 & Kakao 개발자 ]
MongoDB 설명에서 "BSON(Binary JSON)이라 효율적이고 더 많은 데이터 타입을 지원한다" 고 언급하신 부분에 대해 질문드립니다. 결국 Redis나 MySQL 같은 RDB도 내부적으로는 데이터를 바이너리 형태로 저장하지 않나요? 모두 바이너리로 저장하는데, 왜 MongoDB만 특별히 "바이너리라서 효율적이고 타입을 많이 지원한다"고 강조하는지 잘 이해가 안 됩니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요, 강의 수강 잘 하던 도중 질문이 생겨 여쭤봅니다. 강의에서는 Service 계층에서만 테스트를 하고 있고 Repository 계층에서는 따로 진행하지 않고 있습니다. 실무에서도 어차피 Service 계층이 Repository 계층을 당겨서 사용하는 것이기에 Service 계층에 대해서만 테스트 케이스를 작성하면 충분할까요 ? 그리고 강의에서 Member의 Name을 unique로 잡으라고 말씀하시고 있는데, 실무에서는 id로 검증하는 것이 올바른 방법이겠죠 ?
I mean that protobuff need serialization, and its not zero copy so it introduce latency to communication. Is it suitable for game servers with 1-5k players? Or its better to use instead https://flatbuffers.dev/quick_start/ ?