앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
안녕하세요. 앨런님. 테이블 뷰를 사용하던 중 고민이있어 질문드립니다. 현재 테이블 뷰의 높이를 정적으로 선언하는 방식이 아닌, 테이블 뷰의 셀의 수와 높이를 계산하여 동적으로 내부 컨텐츠 사이즈에 따른 테이블 뷰의 높이를 설정하고 싶습니다. 우선 저의 코드에서는 뷰의 계층 구조는 최상위부터 스크롤뷰 -> 스택뷰 -> 테이블 뷰 로 스크롤이 가능하게 구성을 했습니다. 스택뷰의 높이를 내부 컨텐츠 크기에 자동으로 맞추고, 스택뷰의 바텀 제약에 맞춰 스크롤 뷰의 사이즈가 정해지는 방식입니다. 더 좋은 방식이 있다면 조언 부탁드립니다. 감사합니다 추가. 테이블 뷰 셀의 수에 맞춰서 테이블 뷰의 높이를 지정하는 것 까지 해결했습니다. 하지만 테이블 뷰 셀의 크기를 UITableView.automaticDimension로 했을 경우 셀의 크기가 잘리는 현상이 발생합니다.
안녕하세요, 수업 중 이해가 되지 않는 부분이 있어 질문 드립니다. 훈훈한 JS>섹션7>함수,변수의 호이스팅 강의에서 17:43에서 newLi에 complete 클래스를 추가해주는 기능을 설명에 이해가 되지 않습니다. 위에 content는 부분에서는 전체 todoInput.value를 가져와서 덮어씌우는 것으로 이해했는데, 아래 클래스를 추가하는 부분에 정의된 newLi는 엔터로 인해 함수 실행될 때마다 새로운 createElment("li") 값을 가진 변수인데, 여기에 어떻게 이전의 데이터를 가진 특정 배열에만 complete를 넣어줄 수 있는걸까요?
안녕하세요 토비님 😄 강의 맛있게 잘 보고 있습니다. 마이너 한 질문인데, 테스트에 Clock 을 이용한 테스트에서 6.50 초 쯔음 아래 와 같은 fixed <- 의 유형 ? 을 정적 팩토리 메서드라고 하셨는데 객체를 반환하기 위해 static 키워드를 사용해야 정적팩토리 메서드가 아닌지 여쭤봅니다 @Bean public Clock clock() { return Clock.fixed(Instant.now(), ZoneId.systemDefault()); }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이렇게 했습니다.
[질문 내용] Drug DrugNutrient Nutrient(Enum) 타입 이렇게 다대다 관계입니다. (DrugNutrient) @Query("select d from Drug d join d.drugNutrientList dn where dn.standardNutrient IN :standardNutrients group by d,dn " + "order by count(dn) desc") List<Drug> findProperDrug(@Param("standardNutrients") List<StandardNutrient> standardNutrients); 저는 이 쿼리를 실행하면 mysql 은 SELECT d.* FROM drug d JOIN drug_nutrient dn ON d.drug_id = dn.drug_id WHERE dn.standard_nutrient IN ('CARBON_HYDRATE','PROTEIN','CALCIUM') GROUP BY d.drug_id, dn.drug_nutrient_id ORDER BY COUNT(dn.drug_id) DESC; 이렇게 쿼리가 나갈 것이라고 예상했습니다. 따라서 그렇기 때문에 당연히 drug_id 가 중복해서 나올 것이라고 예상했습니다. 실제로도 mysql 에서 중복되게 나오고요! 그러나 JPQL 을 통하면 drug_id 1이 중복해서 나오지 않습니다. 제가 쿼리를 잘 못 이해하고 있을까요? group by 에 무언가 있을 것 같긴 한데 놓친 내용이 있을 까요??? 실제 쿼리는 이렇게 나갑니다. select d1_0.drug_id, d1_0.drug_img_path, d1_0.english_name, d1_0.name, d1_0.url, d1_0.vendor from drug d1_0 join drug_nutrient dnl1_0 on d1_0.drug_id=dnl1_0.drug_id where dnl1_0.standard_nutrient in (?, ?, ?) group by d1_0.drug_id, dnl1_0.drug_nutrient_id order by count(dnl1_0.drug_nutrient_id) desc 그리고 여담인데 group by 를 통하면 default batch fetch size 가 적용이 안되나요? 1쪽에서 다쪽을 get 해서 사용했을 때 쿼리가 나가면서 Where 쪽에 In 쿼리가 바바박 나오던 걸로 기억합니다. List<Drug> findMoreSuitableDrugList = drugRepository.findProperDrug(standardNutrients); return findMoreSuitableDrugList.stream().map(drug -> DrugResponseDto.of(drug,drug.getDrugNutrientList().stream().map(drugNutrient -> { return drugNutrient.getStandardNutrient().getName(); }).collect(Collectors.toList()))).collect(Collectors.toList()); 원래 안된다면 성능 1대다 상황에서 성능 최적화는 어떻게 진행하는지 궁금하네요!
// 1번 - A 컴포넌트 useQuery({ queryKey: ['user'], queryFn: () => getUser(user), staleTime: 6000 }) // 2번 - B 컴포넌트 useQuery({ queryKey: ['user'], queryFn: () => getUser(user), }) StaleTime 덮어 써지는지 질문 1번이 A 컴포넌트에서 실행되고, 1분이 지나기전에 B 컴포넌트에 선언한 2번이 실행 될 경우 1번에 선언한 키값이 같기 때문에 1분이 지나지 않았다면 실제 fetching 없이 캐싱된 데이터를 가져온다 키가 같더라도 useQuery로 선언했기 때문에 fetch되고 1번에 선언한 staleTime은 2번으로 덮어써져서 추후 무시된다 1번이 A 컴포넌트에서 실행되고, 1분이 지난 후 B 컴포넌트에 선언한 2번이 실행 될 경우 1분이 지났기 때문에 다시 2번에서 fetching이 일어나고 1번에 선언한 staleTime은 유지된다 1분이 지났기 때문에 다시 fetching이 일어나고 2번으로 덮어써져서 추후 staleTime은 2번에 정의된 대로 없어진다(기본값 0으로 세팅된다) getQueryData 정확하게 사용 하는 방법 // 1번 - A 컴포넌트 useQuery({ queryKey: ['user'], queryFn: () => getUser(user), staleTime: 6000 }) // 2번 - B 컴포넌트 const data = queryClient.getQueryData(['user']) 위 처럼 선언했을 경우 A 컴포넌트 -> B 컴포넌트가 순차 실행되면 getQueryData를 잘 가져 오겠지만 만약 B 컴포넌트가 먼저 실행될 경우 어떻게 해야 할까요? 있는지 검사하고 없으면 1번처럼 다시 선언해야 할까요? 순차 보장이 안된다면 B컴포넌트도 동일하게 useQuery로 staleTime 동일하게 작성해야 할까요?
서버의 동작이 아래와 같은지, 혹은 잘못 이해한 부분이 있는지 여쭤봅니다. 1단계)서버의 process 가 통신하기 위한 [연결 대기용 socket] 이 생성 [Listen] 2단계) 클라이언트가 서버로 요청 보냄 3단계 ) 서버의 process 는 연결대기용 socket 을 통해 클라이언트의 연결 요청을 받음, 4단계 ) [연결 대기용 socket] 과 동일한 port번호를 가지는 새로운 socket 이 생성되어, 요청한 클라이언트와의 통신은 새로운 socket 이 담당하고, 추후 다른 클라이언트의 연결 요청을 처리하기 위해, 기존의 [연결 대기용 socket] 은 그대로 존재하게 됨
안녕하세요 좋은 강의 감사합니다.다름이 아니오라 VARCHAR 타입의 경우 자리수가 변경되면 이를 저장하기 위한 여유 데이터 블록(페이지)을 찾고 거기로 이동한다고 하셨는데요Innodb 같은 경우 클러스터드 인덱스다 보니 물리적 블록도 인덱스 기준으로 차곡차곡 쌓이는 것으로 이해하고 있습니다. 그런데 VARCHAR 자리수 변경으로 물리적 블록의 이동이 생긴다면 클러스터드 인덱스 구조를 유지하기 어려워 보이는데 어떻게 유지를 할 수 있는 것인지 혹은 위에 서술한 부분에 잘못 이해한 부분이 있는건지 문의드립니다.
29-Jun-2024 16:47:09.258 INFO [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 불허되는 접근: 이 웹 애플리케이션 인스턴스는 이미 중지되었습니다. []을(를) 로드할 수 없습니다. 디버그 목적 및 불허되는 접근을 발생시킨 해당 쓰레드를 종료시키기 위한 시도로서, 다음 스택 트레이스가 생성됩니다. java.lang.IllegalStateException: 불허되는 접근: 이 웹 애플리케이션 인스턴스는 이미 중지되었습니다. []을(를) 로드할 수 없습니다. 디버그 목적 및 불허되는 접근을 발생시킨 해당 쓰레드를 종료시키기 위한 시도로서, 다음 스택 트레이스가 생성됩니다. at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading( WebappClassLoaderBase.java:1328 ) at org.apache.catalina.loader.WebappClassLoaderBase.getResource( WebappClassLoaderBase.java:960 ) at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader( AbandonedConnectionCleanupThread.java:123 ) at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run ( AbandonedConnectionCleanupThread.java:90 ) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1136 ) at java.base/java.util.concurrent.ThreadPoolExecutor$ Worker.run ( ThreadPoolExecutor.java:635 ) at java.base/ java.lang.Thread.run ( Thread.java:833 ) 이런 메시지가 나오면서 404 에러가 뜹니다.
안녕하세요. 박우빈 강사님. 강의 너무 잘 듣고 있습니다 ㅎㅎㅎ 강의를 보고 생각을 하다가 의아하다고 느낀 점이 있어서 질문드립니다. 이전에 만든 Controller 테스트와 이번 강의에서 만들었던 DocsTest가 결국 controller를 테스트한다는 점은 동일하고, 문서를 만든다는 개념만 다를 뿐인데, 기능의 중복으로 보이는데 서로 따로 만드는 이유가 있을까요?? 기존에 Controller 테스트에서 @WebMvcTest를 삭제하고, 필요한 클래스와 mock을 정의한 뒤, API당 하나의 테스트 메서드에만 .andDo(document()를 작성하면 controller 테스트도 수행할 뿐더러 REST Docs를 출력까지 하니 더 좋지 않나 라는 생각이 들었습니다. @WebMvcTest와 이번 강의에서 작성한 DocsTest코드가 .andDo(document()를 이용한 테스트코드내용 출력 기능을 제외하고는 결국 중복된 코드로 보이는데, 기존에 controller test와 DocsTest를 하나로 합쳐서 관리해도 되는 것일까요? 요약 : 이번 강의에서 만든 DocsTest로 이전에 만들었던 Controller 테스트를 대체할 수 있을 것으로 보입니다. 실무환경에서는 어떻게 관리되는지 궁금하고, 만약 두개의 테스트코드로 나눠서 관리된다면 굳이 왜 나눴는지가 궁금합니다!!!! 우빈 강사님. 강의에서 정말 많이 배워갑니다 감사합니다!!! ㅎㅎㅎㅎ
초보자를 위한 ChatGPT API 활용법 - API 기본 문법부터 12가지 프로그램 제작 배포까지
response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Tell me how to make a pizza"}]) --------------------------------------------------------------------------- APIRemovedInV1 Traceback (most recent call last) Cell In[16], line 1 ----> 1 response = openai.ChatCompletion.create( 2 model ="gpt-3.5-turbo", 3 messages =[{"role": "user", "content": "Tell me how to make a pizza"}]) File /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/openai/lib/_old_api.py:39 , in APIRemovedInV1Proxy.__call__ (self, args, * kwargs) 38 def call (self, args: Any, * kwargs: Any) -> Any: ---> 39 raise APIRemovedInV1(symbol=self._symbol) APIRemovedInV1 : You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API. You can run openai migrate to automatically upgrade your codebase to use the 1.0.0 interface. Alternatively, you can pin your installation to the old version, e.g. pip install openai==0.28 A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742