[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 이 코드는 batch가 잘 적용되는데 dto로 다음과 같이 조회하게 되면 batch가 적용되지 않습니다. 원래 dto로 o를 조회하게 되면 배치가 적용되지 않나요?
저도 직전 강의에서 "이 hashCode() 메서드는 굳이 멀티 스레드를 걱정하지 않아도 될 것 같은데?" 라고 생각하면서 좀 자세히 보고 생각해 보게 되었습니다. 책에서 해시를 캐싱할 때 지연 초기화를 하려면 스레드 안전하게 만들도록 신경 써야 한다고 쓰여져 있기에 이 문장에 대한 제 생각을 공유하고자 글 남깁니다! 기선님께서도 말씀하셨듯이 강의 초반에 나오는 hashCode() 메서드는 여러 스레드가 동시에 계산을 하더라도 문제는 없어 보입니다. result라는 로컬 변수에 계산을 하기 때문이죠(로컬 변수는 스레드마다 고유하므로). 계산 결과에는 문제가 없으나, 계산을 동시에 한다는 점에 고민을 해보게 되었습니다. 책에서 설명하는 해시를 캐싱하는 전제조건은 불변 객체이면서 해시코드를 계산하는 비용이 클 때입니다. 즉, 불변 객체이기에 해시 코드를 여러 번 계산할 필요가 없고 처음 한 번만 계산한 후 계속 가져다 사용하는 방식인거죠. 스레드에 안전하지 않게 설계하면 여러 스레드가 동시에 해당 인스턴스의 해시를 계산할 수 있기에(크게 문제가 되지 않다고 생각할 수 있으나 해시코드를 계산하는 비용이 크다고 가정했으므로 중복 계산은 성능 저하로 이어진다고 생각합니다) 스레드 안전에 신경 써야 한다고 쓴 것 같습니다. 그러나 역시 결과에는 문제가 없기에 책에서도 "반드시 스레드에 안전해야 한다!"가 아닌 "스레드 안전하게 만들도록 신경 써야 한다"라고 기술되어 있는 것이라고 생각합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 잘 따라하고 있다가 orderV6 부분에서 갑자기 오류가 나옵니다 왜이럴까요ㅠㅠ? 셋팅이 바뀐 부분은 따로 없는 거 같습니다. yml부분데 h2.driver 부분이 오류가 나오네요ㅠㅠ java.lang.ClassNotFoundException: org.h2.Driver at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass (BuiltinClassLoader.java:64 1) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass (ClassLoaders.java:18 8) at java.base/java.lang.ClassLoader.loadClass (ClassLoader.java:52 0) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName (Class.java:46 7) at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass (RestartClassLoader.java:12 1) at java.base/java.lang.ClassLoader.loadClass (ClassLoader.java:52 0) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName (Class.java:46 7) at org.springframework.util.ClassUtils.forName (ClassUtils.java:30 4) at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.driverClassIsLoadable (DataSourceProperties.java:19 4) at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName (DataSourceProperties.java:17 5) at org.springframework.boot.autoconfigure.jdbc.PropertiesJdbcConnectionDetails.getDriverClassName (PropertiesJdbcConnectionDetails.java:4 9) at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource (DataSourceConfiguration.java:5 5) at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource (DataSourceConfiguration.java:11 7) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:7 7) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:4 3) at java.base/java.lang.reflect.Method.invoke (Method.java:56 8) at org.springframework.beans.factory.suppor t.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:14 0) at org.springframework.beans.factory.suppor t.ConstructorResolver.instantiate (ConstructorResolver.java:64 7) at org.springframework.beans.factory.suppor t.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:63 9) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:133 4) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:116 4) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:56 1) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:52 1) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:32 5) at org.springframework.beans.factory.suppor t.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:23 4) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:32 3) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.getBean (AbstractBeanFactory.java:19 9) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:25 4) at org.springframework.beans.factory.suppor t.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:144 3) at org.springframework.beans.factory.suppor t.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:135 3) at org.springframework.beans.factory.suppor t.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:90 7) at org.springframework.beans.factory.suppor t.ConstructorResolver.createArgumentArray (ConstructorResolver.java:78 5) at org.springframework.beans.factory.suppor t.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:54 2) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod (AbstractAutowireCapableBeanFactory.java:133 4) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:116 4) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:56 1) at org.springframework.beans.factory.suppor t.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:52 1) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:32 5) at org.springframework.beans.factory.suppor t.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:23 4) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:32 3) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.getBean (AbstractBeanFactory.java:19 9) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:31 2) at org.springframework.beans.factory.suppor t.AbstractBeanFactory.getBean (AbstractBeanFactory.java:19 9) at org.springframework.context.suppor t.AbstractApplicationContext.getBean (AbstractApplicationContext.java:123 1) at org.springframework.context.suppor t.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:94 9) at org.springframework.context.suppor t.AbstractApplicationContext.refresh (AbstractApplicationContext.java:62 4) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:14 6) at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:75 4) at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:45 6) at org.springframework.boot.SpringApplication.ru n (SpringApplication.java:33 4) at org.springframework.boot.SpringApplication.ru n (SpringApplication.java:135 4) at org.springframework.boot.SpringApplication.ru n (SpringApplication.java:134 3) at jpabook.jpashop.JpashopApplication.main (JpashopApplication.java:1 4) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:7 7) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:4 3) at java.base/java.lang.reflect.Method.invoke (Method.java:56 8) at org.springframework.boot.devtools.restart.RestartLauncher.ru n (RestartLauncher.java:5 0)
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요. 오늘 처음 안드로이드 스튜디오 다운받았고, 처음으로 플러터 sdk 다운받았습니다. 그런데 에뮬레이터를 실행하고 test_proj를 실행하는 과정에서 아래와 같은 오류가 발생합니다. ㅠ.. 어떻게 해결해야 하나요? 4번째 Warning 부분이 빨간색으로 나오네요. Launching lib\main.dart on sdk gphone64 x86 64 in debug mode... Running Gradle task 'assembleDebug'... Warning: This version only understands SDK XML versions up to 3 but an SDK XML file of version 4 was encountered. This can happen if you use versions of Android Studio and the command-line tools that were released at different times. Checking the license for package Android SDK Tools in C:\Users\suhol\AppData\Local\Android\sdk\licenses License for package Android SDK Tools accepted. Preparing "Install Android SDK Tools (revision: 26.1.1)". "Install Android SDK Tools (revision: 26.1.1)" ready. Installing Android SDK Tools in C:\Users\suhol\AppData\Local\Android\sdk\tools "Install Android SDK Tools (revision: 26.1.1)" complete. "Install Android SDK Tools (revision: 26.1.1)" finished. Checking the license for package Android SDK Build-Tools 30.0.3 in C:\Users\suhol\AppData\Local\Android\sdk\licenses License for package Android SDK Build-Tools 30.0.3 accepted. Preparing "Install Android SDK Build-Tools 30.0.3 (revision: 30.0.3)". "Install Android SDK Build-Tools 30.0.3 (revision: 30.0.3)" ready. Installing Android SDK Build-Tools 30.0.3 in C:\Users\suhol\AppData\Local\Android\sdk\build-tools\30.0.3 "Install Android SDK Build-Tools 30.0.3 (revision: 30.0.3)" complete. "Install Android SDK Build-Tools 30.0.3 (revision: 30.0.3)" finished. √ Built build\app\outputs\flutter-apk\app-debug.apk Installing build\app\outputs\flutter-apk\app-debug.apk... Debug service listening on ws://127.0.0.1:50981/764n9IlfL4k=/ws Syncing files to device sdk gphone64 x86 64... Lost connection to device. adb.exe: device offline
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 수업내용 글들은 어디서 확인 할수있나여?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 총 4개의 Order가 있고, 다음과 같이 xToOne연관관계를 가진 Member와 Delivery까지 페치조인해서 가져온 상황입니다. 여기서 Batchsize가 2라고 가정하고, Order를 순차적으로 돌아가면서 OrderItems에 접근하게 된다면, 다음 그림과 같이 orderItems가 로딩이 되는 것인가요? order.stream ().forEach(o -> o.getOrderItems().getPrice()) (첫 번째) Batchsize가 2이므로 첫 두 Order에 대한 orderItems 로딩 (두 번째) Batchsize가 2이므로 그 다음 두 개의 Order에 대한 orderItems 로딩
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] HashSet의 코드를 보니 HashMap을 사용하여 구현이 되어있는데 실제 구현도 결국에는 강의 내용처럼 배열안에 LinkedList 나 TreeSet으로 구현과 최적화가 되는건가요?
현재 리액트부분을 시작했는데 리액트를 설치할때 yarn add next@12.1.0 react@17.0.2 react-dom@17.0.2 --exact 이러한 명령어를 사용하는데 이렇게 설치하고 나니 제가 알고있는 폴더들이나 내용이 좀 다르더라구요. 제가 알고있는 건 npx create-react-app ./ 이러한 명령어로 리액트를 설치했는데 이거와 전혀 다른 명령어 인가요?
안녕하세요. 터미널에서 h2.sh이 안됩니다. h2 w.bat을 직접 열어서 연결을 누르면 이런 화면이 나오긴 합니다. java --version 화면입니다. H2환경 별수 설정 화면입니다. h2.sh 를 폴더에서 더블클릭해서 실행시키면 명령프롬프트 창이 뜨면서 Error: Could not find or load main class org.h2.tools .Console Caused by: java.lang.ClassNotFoundException: org.h2.tools.Console 라고 잠깐 뜨고 창이 닫힙니다. 홈에는 test.mv .db파일 있습니다. 어떻게 하면 될까요?
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
동영상 플레이어를 제작하는 중입니다. 영상을 에뮬레이터에 넣고 영상 선택까지도 됩니다. 그런데 초록 화면조차 안 나오고 재생이 안 됩니다. 플러터앱이 아니라 기본 앱을 통해 재생하려고 해도 재생이 안 되네요. 영상 파일 자체에는 이상이 없습니다. 윈도우 플레이어로 재생하면 잘 나오거든요. 에뮬레이터와 앱을 몇 번 재실행해도 안 되네요. 제 컴퓨터가 자원이 충분하지 않은가 싶어서 참고 수강하다가 아무래도 그런 문제는 아닐 것 같아서 문의드립니다.
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요. 강의를 들으며 ratingState 를 print 해보니 Instance of '_RestaurantRatingRepository' 결과가 나왔습니다. 이제보니 dio 요청 자체도 가지 않은 상태입니다. pagination_provider.dart를 적용한 후 Restaurant와 RestaurantDetail은 잘 실행되는데, Rating 만 dio 요청 자체가 가지 않습니다. 저 아래의 Instance of '_RestaurantRatingRepository' 가 ratingState 입니다. 디버깅을 통해서 dio를 제대로 받아온 것은 확인했는데, pagination 내부의 print는 restaurant만 먹히고, restaurantdetail과 rating은 print되지 않아 어떻게 해결해야할지, 어떻게 해결 방법을 찾아야 할지 갈피도 못 잡겠습니다. 프로젝트의 repository를 첨부합니다. https://github.com/jungeyo3/codefactory-flutter-lv2-study 버전은 아래와 같습니다. 감사합니다.
안녕하세요 강사님! 이번학기에 갑자기 웹 개발을 하게 되어 부랴부랴 프론트 강의 챙겨보는중인데 정말 도움이 많이 돼 우선 감사의 말씀 먼저 드립니다. ㅜㅜ 다름이 아니라 제가 본 영상 강의를 보고 학교 과제를 수행하다가 (투두 리스트를 참고하여 만들었습니다. 참고로 과제는 이슈관리 시스템입니다.) 이러한 메인 화면을 구현하였는데, 각 프로젝트 이름을 누르면 그 프로젝트의 상세 페이지로 연결 시키고 싶은데, 라우터 기능을 사용하여 링크는 제대로 바뀌는데 화면 전환이 되지 않습니다. ㅜㅜ 코드를 여러번 봐도 무엇이 문제인지 감이 안 잡혀 질문 드리게 되었습니다. 코드 첨부 하겠습니다. ! import "./App.css"; import { Routes, Route, Link, useNavigate } from "react-router-dom"; import { useRef, useState } from "react"; import Header from "./components/Header"; import List from "./components/List"; import ProjectDetail from "./pages/ProjectDetail"; //임시데이터 const mokdata = [ { p_id: 0, p_name: "회원가입 프로젝트", date: new Date().getTime(), }, { p_id: 1, p_name: "온라인 테트리스 게임 프로젝트", date: new Date().getTime(), }, { p_id: 2, p_name: "윷놀이 프로젝트", date: new Date().getTime(), }, { p_id: 3, p_name: "온라인 채팅 앱 개발 프로젝트", date: new Date().getTime(), }, { p_id: 4, p_name: "회원 관리 시스템 프로젝트", date: new Date().getTime(), }, { p_id: 5, p_name: "이슈 관리 시스템 프로젝트", date: new Date().getTime(), }, ]; function App() { const [projects, setProjects] = useState(mokdata); const onDelete = (targetId) => { //배열에서 targetId와 일치하는 id를 갖는 요소만 삭제한 새로운 배열 setProjects(projects.filter((project) => project.p_id !== targetId)); }; return ( <> <div className="App"> <Header /> <List projects={projects} onDelete={onDelete} /> </div> <Routes> <Route path="/ProjectDetail:p_id" element={<ProjectDetail projects={projects} />} /> </Routes> </> ); } export default App; 위는 App.jsx 코드 이고 아래는 ProjectDetail 코드 입니다. ! import { useParams } from "react-router-dom"; const ProjectDetail = ({ projects }) => { const { p_id } = useParams(); const project = projects.find((project) => project.p_id === parseInt(p_id)); return ( <div> <h1>프로젝트 상세내용</h1> <h2>{project.p_name}</h2> </div> ); }; export default ProjectDetail;
리액트에서는 onClick으로 이벤트를 등록하면 Root에 모이게 된다고 하셨는데 제가 이 부분을 정확히 이해했는지 알고싶어서 질문 드립니다! 보통은 자바스크립트에서는 각 요소마다 addEventListener 를 여러 번 호출하면 메모리 측면에서 비효율적이고 성능이 떨어질 수 있다고 알고 있습니다. 그래서 이벤트 위임을 사용하는 것으로 이해했습니다. 현재 강의에서는 각 요소마다 onclick 이벤트를 등록하셨는데 리액트에서는 Root에서 중앙통제하기 때문에 상관없다는 것으로 인지했습니다. 제가 알기로는 이벤트들을 모아다가 root에 addEventListener를 하는 것으로 알고 있는데 이게 맞을까요? 그러면 리액트에서는 굳이 이벤트 위임을 사용할 필요가 없을까요? 예를 들어 onClick을 여러 요소에 등록하지 않고 상위 요소 하나에만 등록하는 것처럼 말이죠..!