실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요! 강의는 다 들었는데 JPA 공부를 하다가 궁금한점이 있어서 질문을 남겨봅니다. 현재 User 와 UserLoanHistory 는 1:N 관계이고, User쪽에 cascade 옵션이 걸려 있는데요. 그러면 User 가 삭제되면 UserLoanHistory 가 삭제될 때 User 와 연관관계가 있는 히스토리의 개수만큼 delete 쿼리가 나갈거 같은데요. 뭔가 비효율적인거 같다는 생각이 들어서 찾아보니 1:N 에서 N 쪽에 @OnDelete(action = OnDeleteAction.CASCADE) 옵션을 주어서 디비단에서 해결하는 방법이 있는거 같긴한데 이걸 쓰는게 맞을지 고민이 되서 질문드립니다. 이 옵션은 왠지 위험해 보이는데... 그럼 cascade 옵션을 안쓰고 respository 에서 deleteAllInBatch 로 N 쪽을 지우고 1을 따로 지우는게 나을지... 질문을 정리해보자면 1:N 관계에서 1을 삭제시 delete 쿼리가 N개 만큼 나가서 비효율적일거 같음 N쪽에 @OnDelete 옵션을 줘서 디비에 외래키 cascade delete 옵션을 주는게 나을지? 수동으로 N쪽을 삭제하고 1 을 삭제하는게 나을지? 어떤쪽이 더 좋은 선택인지 고민인데 좋은 의견 주시면 감사하겠습니다.
안녕하세요? ssh 서버 실행 시 Conflict, The container name "/docker-server" is already in use by container "4a08bbeafb65" 라고 에러가 나오네요. 명령어는 아래와 같이 입력했고 docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgorup:/sys/fs/cgroup edowon0623/docker:latest /usr/sbin/init docker ps 라고 입력 시 아무것도 안나오는데 docker ps -a 입력하면 위의 4a08bbeafb65 가 Created 상태입니다. 인터넷 찾아보니 삭제하고 해보라고 해서 해 봐도 안되네요. 윈도우 10 사용자입니다. 위 그림은 실행 상황입니다. 두 번째 그림은 docker desktop 에서 실행하려고 할 때도 같은 메시지가 나옵니다.
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요. 코팩님! [고급 캐시관리] 파트의 PaginationListView와 PaginationWidgetBuilder에서 제네릭을 처리하는 부분에 있어 타입 추론이 명확하게 되지 않는 부분이 있습니다. class PaginationListView<T extends IModelWithId> extends ConsumerStatefulWidget { final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider; final PaginationWidgetBuilder<T> itemBuilder; ... @override ConsumerState<PaginationListView> createState() => _PaginationListViewState<T>(); } class _PaginationListViewState<T extends IModelWithId> extends ConsumerState<PaginationListView> { ... 여기서 _PaginationListViewState 클래스는 ConsumerState<PaginationListView>를 상속 받으면서 정확하게는 ConsumerState<PaginationListView<dynamic>>을 상속하게 됩니다. 이로 인해 State클래스 내부에서 호출하는 itemBuilder는 PaginationWidgetBuilder<dynamic>으로 동작하여 실제 사용하는 코드 부분에서 itemBuilder 파라미터에 빌더 작성시 일반적으로는 아래와 같은 에러가 발생합니다. type '(BuildContext, int, RestaurantModel) => Widget' is not a subtype of type '(BuildContext, int, IModelWithId) => Widget' 이에 builder Function 앞에 강의 내용처럼<RestaurantModel>을 선언하여 에러를 회피할 수 있지만, 이럴 경우 빌더에 전달되는 파라미터는 전부 dynamic으로 추론되는 것을 확인했습니다. 그리고, 새로운 익명함수를 정의하는 형태라 그런지 앞에 <RestaurantModel>가 아닌 아무 의미 없이 <ABC>를 적어도 빌드나 실제 앱 동작에 아무런 문제가 없습니다. 그래서 빌더 함수 내부에서 model. 을 입력하더라도 dynamic 이기 때문에 실제로 목표로 하는 모델의 속성들이 자동완성 제안이 되지 않고 런타임에서 대입됩니다. class _PaginationListViewState<T extends IModelWithId> extends ConsumerState<PaginationListView<T>> { ... 위와 같이 State 클래스에서 선언한 제네릭 T를 이용해서 PaginationListView<T>의 ConsumerState 임을 명시했을 때, State클래스 내부의 itemBuilder가 PaginationWidgetBuilder<T>로 잘 동작했습니다. 타입이 명확하므로 builder Function에 <RestaurantModel>을 쓰지 않아도 정확한 타입을 전달해줬습니다. 마찬가지로 final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider; 이 부분도 제네릭을 명시해야 실제 해당 뷰의 모델에 맞는 프로바이더만 주입 가능하기 때문에 더 나을 것 같습니다. dynamic이 넘어오는게 의아해서, 혼자 이리저리 해보면서 궁금증을 해결했는데 강의에 괜찮은 피드백이 될까 싶어서 글 남깁니다 :) 좋은 강의 감사드립니다. 내용이 좋아서 시간 가는 줄 모르고 꾸준히 듣고 있네요!
안녕하세요. 해당 강의 들은 이후 제가 이해한 바로는 git main브랜치가 변경 된다면 action이 발동되어서 푸시한 내용이 자동으로 홈페이지에 적용되는것으로 이해했는데요. 코드를 수정 후 푸시를 해보았을때 자동으로 ec2코드에서 변경이 되지 않습니다. 이건 private repo라서 그러는 것일까요 ?
설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
안녕하십니까? BRAM 영역에 DPRAM을 구현하고, DPRAM의 왼쪽은 FPGA 외부와 인터페이스를 하고, 오른쪽은 FPGA 내부 PS영역에 연결하고 싶습니다. 이를 위한 PIN MAPPING 방법에 대해서 알고 싶습니다. 지금 영상을 보면서, DPRAM 구성을 해 보고 있는 상태입니다.
db.sequelize.sync() .then(() => { console.log('db 연결성공') }) .catch(console.error) 선생님 여기서 비동기처리하는 async가 아닌 동기 sync를 사용하 그후에 then을 사용하는 이유가 있을까요 보통 async하고 나서 then 처리하는 방식은 많이 봤는데요 문득 강의 진행중 궁금해서 질문드립니다. 선생님 추가로 회원가입 완료되면 초기화면 으로 돌아가는 로직 구현하는곳에서 문제가 있는데 useEffect(() => { if (signUpDone) { Router.push('/') } }, [signUpDone]) 회원가입 완료되면 signUpDone 이 ture로 변해서 이제 다시 회원가입 화면으로 접근이 안되는데 따로 또 액션 만들어 주어야하는건가요 선생님이 만드신 사이트는 정상 작동하던데 어떤 방식으로 구현하셨는지 궁금합니다. 아니면 강의 후반에 이 로직문제 해결하는게 나오나요?
전투 공식에 대한 설명 중 방어력을 구하는 과정에서 [2번 스텝] 피해 받는 비율 = {(방어력 + 방어상수)/(방어력 + 방어상수)}-{방어력/ (방어력+방어상수)} 에서 [3번 스텝] 피해 받는 비율 = 방어상수/방어력+방어상수 으로 된다고 설명해주셨는데 괄호 순서대로 계산하면 수식을 풀기전인 1 - (피해흡수량) 과 같지 않나요? '피해 받는 비율 = 1 - (방어력 / (방어력+방어상수))' 에서 어떻게 '피해 받는 비율 = 방어상수/방어력+방어상수' 으로 계산되는지 구체적인 계산 과정이 궁금합니다.
안녕하세요 detach 관련 코드를 이리저리 수정해보던 중 @Test void batch() { Member test1 = new Member(10L, "test1"); Member test2 = new Member(20L, "test2"); em.persist(test1); em.persist(test2); em.detach(test1); em.detach(test2); test1.setName("test11"); test2.setName("test22"); em.flush(); } 와 같이 엔티티 두개를 모두 detach로 준영속 상태로 만들 경우 테스트가 정상적으로 살행이 됐으나 @Test void batch() { Member test1 = new Member(10L, "test1"); Member test2 = new Member(20L, "test2"); em.persist(test1); em.persist(test2); em.detach(test1); // em.detach(test2); test1.setName("test11"); test2.setName("test22"); em.flush(); } 처럼 하나만 detach를 했을 경우 처럼 non-threadsafe access 라는 에러가 뜨는데 구글링 해본 결과 영속성 컨텍스트의 thread-safe 관련 내용이 나오는데 혹시 이와 관련이 있어서 발생하는 현상인지 궁금합니다.