[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 있긴한데 좀 다릅니다 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 연관관계 편의메서드와 관련된 질문입니다. public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } 공부하던 도중 일대다, 다대일, 일대일 연관관계 매서드가 모두 다른 것을 발견했습니다. 제 궁금증은 다대일에서는 왜 meber.getOrders().add(this)로 세팅하고 일대일이나 다대일에서는 orderItem.setOrder(this)로 세팅하는지 궁금한 것 입니다. 커뮤니티에 관련 질문을 찾던 도중 jpa 기본편을 보시라고 하셨는데 위치를 못 찾겠습니다. 알려주시면 감사하겠습니다. 추가로 제가 자바의 List의 메소드에 대한 이해가 부족해서 모르는가 싶기도 한데 그게 맞을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요?예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 내용과 그대로 세타조인을 따라 했는데 query나온 것을 보니 cross join이 없어요 그리고 left join도 처음 sql에서는 left join이 나오는데 번역된 sql에서는 left join이 생략되는데 jpa가 최적화를 한 것일까요?
이 부분이 생성메서드 부분인데요.. 대부분 setter를 사용하여 서비스계층에서 해야 할 로직을 엔터티 내에서 처리하고 있는데 영한 선생님께서 강조하시는 setter를 열어두지 않는다면(필요에 따라서는 열어두라고 하셧는데...) 어떤식으로 처리하는지 도저히 감이 잡히지 않네요..ㅜ 이 부분 설명해주시는 강의 챕터가 따로 있을까요?
안녕하세요, 이 코드에서 'a 2 3 '을 입력 후 'b 4 5'를 입력하면, 두번째 while문이 돌아갈때 입력버퍼에 남아있는 ' \nb 4 5' 중 ' '는 c로 들어가고, 다음 %d를 읽으려 할때 '\n' 와 %d가 매칭되지 않아 scanf가 종료되고, rows와 cols는 기존 2 와 3이 유지되어 하기와 같이 결과가 나오는 것을 이해를 했습니다. 핵심은 버퍼에 남아있는 ' \nb 4 5' 중 '\n'은 scanf가 읽다가 포기하고 버려졌다 라는 건데요,(이게 스트림이 옮겨졌다고 표현하는게 맞나요?) 이를 테스트하기 위해 하기와 같이 코드를 짜봤는데, 또 아닌 것 같아서요.. 만약 제가 깨달은게 사실이라면, 제가 예상한 결과 -> 이 코드를 실행시키고 입력창에 'hello'를 입력하고 엔터를 치는 순간 입력 버퍼에 'hello\n' 이 들어가게되고,첫번째 while문의 scanf() 가 실행될때 %d와 hello가 매칭되지 않으므로 scanf를 종료. scanf가 비정상적으로 종료되었으므로, 입력버퍼에 있는 'hello\n'에서 hello는 버려지고, \n으로 스트림이 옮겨짐. 두번째 while문 조건에서 c에는 \n이 저장되고, 조건문이 거짓이므로 바로 break;가 실행되어 종료됨. 실제 결과 -> 두번째 while문의 putchar까지 실행됨. 왜 차이가 발생한건지 궁금합니다.
헤더파일 안에서 static으로 변수를 선언해줘도 되는 이유는 C파일에서 그 헤더파일을 불러왔을 때 그 C파일의 파일 스코프에서 static으로 변수를 선언 해주는 것과 같아서인가요? 얘를 들어 #pragma once static const double PI = 3.141592; static const double gravity = 9.8; 이런 내용의 PIgravity.h라는 이름의 헤더 파일이 있고 main.c 파일에서 #include "PIgravity.h" 이렇게 해주면 main.c 파일의 파일 스코프에 static const double PI = 3.141592; static const double gravity = 9.8; 이렇게 선언된 것과 비슷한 거라서 가능한건가요?
int* ptr = NULL; ptr = (int*)calloc(n, sizeof(int)); // contiguous allocation if (!ptr) exit(1); for (int i = 0; i < n; ++i) printf("%d ", ptr[i]); printf("\n"); for (int i = 0; i < n; ++i) ptr[i] = i + 1; n = 20; int* ptr2 = NULL; ptr2 = (int*)realloc(ptr, n * sizeof(int)); realloc() 함수에서 메모리를 새로 할당 해줄 수 없을 경우 NULL 값을 반환해준다고 했는데 그 때 원래 있던 ptr은 어떻게 되는 건가요? 그대로 남아있는 건가요 아니면 free를 한 상태가 되는 것 인가요? realloc() 함수는 원래 있던 포인터에 대한 할당 받은 메모리 공간은 free를 한 상태로 바꿔준다고 했는데 이렇게 NULL 값을 반환해 줄 때도 원래 있던 메모리 공간을 free한 상태로 바꿔주는 건지 궁금해서요 항상 좋은 답변 감사합니다.
안녕하세요. OSIV 강의 후반부 내용에서 규모가 비교적 큰 프로젝트에서는 도메인 계층과 더불어 그 앞단에 애플리케이션 계층을 추가하는걸 고려해보라고 말씀주신 내용이 있었는데요. 이게 제가 찾고 있는 해답이 아닐까 싶어 조금 더 자세히 알고 싶어 질문 드립니다. 질문이 조금은 장황해도 너그러히 이해주시면 감사드리겠습니다. 최근에 개인 프로젝트를 수행해보면서 제가 학습해온 개념들(JPA, DDD, MSA)이 중점적으로 다루는 내용이 다르다보니 프로젝트 구성에서 혼란을 겪어오고 있습니다. 현재 개인 프로젝트 패키지 구조는 제가 느끼기에 가장 와닿았던 controller - application - domain - repository로 나뉘어 개발하고 있습니다. 이때 application 계층의 역할은 하나의 요구사항(가입, 해지 등)을 해결하기 위해 필요한 하위 계층의 애플리케이션 서비스들을 호출하는 facade를 구성합니다. 또, domain에서는 도메인 객체와 더불어 해당 도메인의 애플리케이션 서비스를 통해 비즈니스적 처리를 추상화하여 표현하고, 데이터 핵심 데이터 처리를 repository에 위임하도록 구성했습니다. 다만 이해가 안 갔던건 트랜잭션을 처리 계층에 대한 내용인데요. 제가 본 msa 도서에서는 facade에서 수행되는 애플리케이션 서비스 각각이 서로 다른 도메인 처리이므로 application 계층이 아닌, domain 메소드 단위로 트랜잭션이 구성되어야한다더라구요. 그런데 사실 제가 개발하고 있는 프로젝트는 MSA 구조가 아니고, 여러 에그리거트가 복합된 구조이기에 위 구조와 사상을 가지고 개발하기 어렵다는 생각이 들었습니다. 또한, 서로 다른 도메인의 애플리케이션 서비스간에 호출관계에서도 어려움을 겪었는데요. 예를 들어, 두 user가 하나의 group을 구성하는 서비스를 만들 때도 groupService라는 group에 종속된 애플리케이션 서비스에서 두 사용자 정보를 불러오는 userService 주입하자니, 서로 상이한 서비스간에 불필요한 의존성이 생기고, 같은 레벨의 서비스를 참조하는 것이 어색하다고 느껴졌습니다. 그래서 facade 계층에서 두 서비스를 주입하여 그룹생성 절차를 처리하자니 한 트랜잭션에 처리되어야한다고 생각하는 그룹 생성 처리 절차에서 회원, 그룹 서비스의 트랜잭션이 분리되니 이상하다고 생각했습니다. 드디어 본격적인 질문인데요. 혹시 영한님께서 말씀하신 애플리케이션 계층이 이렇게 도메인에 종속된 두 개 이상의 서비스가 함께 쓰여야 할 때 쓰이는 것이 맞을까요? 맞다면 controller - application - domain - repository 의 계층구조에서 facade가 들어가던 application에 해당 복합(?) 서비스를 구현하고, 해당 서비스에 대한 dto객체정도들만 구현하면 되는걸까요? 3. 굳이 어플리케이션 계층이 필요로 하지않은 하나의 도메인에만 종속된 기능들을 호출구조를 어떻게 가야할까요? 애플리케이션 계층을 도입한 상황에서 controller에서 domain 계층을 바로 호출하는 것은 일관성이 없어보이고, 또 일관성을 맞추기위해 application 계층에서 도메인 계층으로 BYPASS하는 객체를 만드는 것도 비효율적으로 보이긴합니다. 각각의 케이스에 어떻게 가는게 좋을까요?
안녕하세요 강의 재밌게 잘 보고있는 1인입니다~ 숙제 설명듣기전에 풀어봐야겠다고 해서 3시간 걸려 풀었습니다. 설명듣고나니 방법이 좀 다른거같은데, 의도에 좀 벗어난 것일까요? 또한 포문마다 조건이 달라 이해하기 더 어려운 코드가 된건 아닌지에 대해서도 널널한개발자님의 의견이 궁금합니다.
RemoveNode를 직접 먼저 구현한 후 강의를 듣게 되었는데요, 저는 RemoveNode 안에 Search하는 코드를 통합해서 짰는데 SearchToRemove가 RemoveNode를 실행시키기 위해서만 필요하다면 굳이 분리를 해야 할까 하는 의문이 들었습니다. 하나의 함수는 하나의 동작만 실행해야 해서 분리가 된 것일까요? 아니면 SearchToRemove가 나중에도 사용이 될 가능성이 있어서 분리된 것일까요? 제가 작성한 코드를 첨부합니다. void RemoveNode(const char* pszName) { USERDATA* pTmp = g_pHeadNode; USERDATA* previousNode = NULL; bool isFound = false; // 노드 찾기 while (pTmp != NULL) { if (strcmp(pTmp->name, pszName) == 0) { isFound = true; break; } previousNode = pTmp; pTmp = pTmp->pNext; } // 노드 찾기 실패 if (isFound == false) { printf("\"%s\" : Not Found, remove failed.\n", pszName); return; } // 헤드인 경우 if (g_pHeadNode == pTmp) { g_pHeadNode = pTmp->pNext; free(pTmp); printf("\"%s\" : Found, remove successed.\n", pszName); return; } // 헤드가 아닌경우 previousNode->pNext = pTmp->pNext; free(pTmp); printf("\"%s\" : Found, remove successed\n", pszName); }
C공부 시작하고 강의 정말 재밌게 듣고 있는 수강자입니다~ 영상 9분 34초입니다. 교차 예상 결과값 아래이지만 1 2 3 4 5 10 9 8 7 6 .... 강의에선 아래와 같이 값이 나왔습니다. 1 4 3 2 5 10 7 8 9 6 ... flag를 이중 반복문 안쪽에 기입해서 생긴 오류였던거 같습니다. 다른 분들 헷갈리지 않으시길 바라며 남겨봅니다. 오류가 맞나요? 아니면 제 오해인지요?확인해주시면 정말 감사하겠습니다~
9:57 보시면 51 라인 Account account = accountRepository.findByEmail(email); 이 순간 account 객체는 Persistent 상태이고, 이 코드 이후로 account 이건 다시 detach 상태가 되는데 63라인 accountService.completeSignUp(account); 이 코드로 인하여 다시 Persistent 로 상태가 만들어진다고 생각하면 될까요 ?? (왜냐하면 accountService.completeSignUp(account);에는 트랜잭션어노테이션이붙어있어서)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 소스코드가 포함된 강의 자료 다운받으려하는데 어디에 있나요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] HelloSpringApplication 실행 시 아래와 같은 입력 상자가 뜨는데 이유가 뭔가요?
안녕하세요, abc 입력하면 이렇게 a에서 깜박깜박 다음 신호 입력을 대기하는 상태가 되는데요, 그 이유를 추측해봤습니다. 1, _getche 는 엔터키를 만나면 '\r' 을 반환. getchar()는 '\n' 을 반환. 2, '\r' 는 carriage return, 캐리지 리턴이라고 해서 커서를 현재 줄의 맨 앞으로 이동시킴. '\n' 은 new lien, 이 문자는 커서를 다음 줄로 이동시킴. 3, 따라서 abc를 입력하고 엔터키를 누르는 순간 putchar('\n')가 아닌 putchar('\r') 가 실행되어 커서가 맨 앞으로 이동. 4, 종료조건인 ch != '\r' 에 해당되지도 않으므로 (ch는 '\t') while문이 종료되지 않고 다음 입력을 기다림. 맞나요?? 디버거 찍어보니까 ch가 '\r' 이더라구요 '\n'일줄 알았는데 -_-;; 시간 날린거같아서 짜증납니다ㅠ
안녕하세요. 선생님! 소스 보다가 하나 발견한 부분 공유드립니다. 프로젝트이름: 05_adtFileIO 소스파일: singleList.c 함수명: SearchListByName Q. 해당 함수는 Key값으로 조회하여 데이터를 로드하는 함수입니다. 현재는 파일에서 매번 로드하도록 되어있는데 캐싱된 데이터(pDataCache)가 있다면, 파일에서 읽어올 필요가 없을것 같아 문의드립니다. 추가로 테스트 해보니 Search(Kim) > Edit 0 > 수정완료 > Commit X > Search(Kim) 를 하면 Edit에서 수정했던 데이터가 없어지는 현상이 있습니다. 이미지의 흰 네모안의 로직(주석포함)은 추가해본 부분 입니다.