묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Slack 클론 코딩[실시간 채팅 with React]
No overload matches this call 오류 해결방법 (redirect -> Navigate)
작성 이유--> loadable에서 코드 스플리트가 정상적으로 동작하는데, Channel과 Workspace 코드를 작성 시 Login/index.tsx가 오류가 생김--> 타입을 지정했어야 했나?(아니었음) 여러 고민하면서 시간을 보내 다른 분들도 참고하시라고 올리는 글 코드 오류가 나오는 곳--> pages/SignUp/index.tsx에 오류 없이 작성했으나 layouts/App.tsx에서 오류 나는 경우const LogIn = loadable(() => import('@pages/LogIn')); //import가 오류난다고 하는 경우 오류 코드Type 'Promise' is not assignable to type 'Promise>'.Type 'typeof import("C:/OneDrive/\uBC14\uD0D5 \uD654\uBA74/\uD070 \uD30C\uC77C\uB4E4/slack_react/sleact/alecture/pages/LogIn/index")' is not assignable to type 'DefaultComponent'.Type 'typeof import("C:/Users/131ji/OneDrive/\uBC14\uD0D5 오류 원인--> redirect를 제대로 인식하지 못함 if (data) { return redirect('/workspace/channel/'); } 오류 해결--> redirect 대신 Navigate를 사용해보세요Navigate 공식 문서import { Link, Navigate } from 'react-router-dom'; if (data) { return <Navigate to="/workspace/channel/" />; }
-
미해결[라즈베리파이] IoT 딥러닝 Computer Vision 실전 프로젝트
라즈베리파이 firebase 설치오류
강의랑 똑같이 했는데.. 무슨오류인지 모르겠습니다
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
DevTools 관련 질문
안녕하세요.Thymeleaf를 이용한 html 파일 수정 후 재시작하지 않고 반영된 내용을 곧바로 확인하기 위해 아래와 같이 구성했습니다.resources/application.yml spring: profiles: active: local devtools: restart: enabled: false thymeleaf: cache: falseIntellij 설정Run/Debug Configurations > Spring Boot > (구동중인 App)On 'Update' action/On frame deactivation > Update class and resources로 설정.Settings > Build, Execution, Deployment > Compiler에 "Build project automatically" 선택.Settings > Advanced Settings > "Allow auto-make to start even if developed application is currently running" 선택.위와 같이 구성해놓고 브라우저에서 화면을 띄우면 아래와 같이 간헐적으로 TemplateInputException이 나옵니다. resources/ 하위에 있는 앞단 코드를 수정한 후, 수정한 내역을 확인할 때도 간헐적으로 나옵니다.ERROR 9104 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause org.thymeleaf.exceptions.TemplateInputException: Error resolving template [index], template might not exist or might not be accessible by any of the configured Template Resolvers at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE] at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE]그리고 위에 기재한 설정에서 On frame deactivation 설정을 아예 지워버리면, 서버를 내렸다 올려야만 변경된 내용 확인이 가능한 상황입니다.어떠한 문제가 있는건지 전혀 감이 안오네요.어떠한 부분을 추가로 확인해봐야하나요??확인 후 알려주시면 감사하겠습니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
subs create페이지 api/me 인증처리 안됨
sub create페이지가 잘나오다가 api/me연결해주는 getServerSideProps 함수 코드를 써준 순간부터 create 페이지가 나오지 않고 계속 로딩만 됩니다 네트워크 탭을 확인해보았을 땐 create 페이지에서 status가 canceled 로만 뜹니다코드도 똑같이 썼고, 쿠키값도 잘 전달됐고,백엔드 프론트 둘다 로그를 찍어보았을 때 쿠키에 있는 토큰 값도 잘 나오는데 왜 페이지가 나오지 않는건지 어디서 오류가 난 것인지 궁금합니다client/pages/subs/create.tsx백엔드 routes/auth.ts 의 router 부분user , auth 미들웨어
-
해결됨스프링 핵심 원리 - 기본편
강의중에 스프링 프레임워크와 스프링 부트 차이점에 대해 질문이 있습니다.
비유적으로 이해를 해봤는데 스프링 프레임워크는 톱니바퀴 스프링 부트는 윤활유 느낌인걸까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
리소스, URI, HTTP메서드 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]항상 친절한 답변해주셔서 감사드립니다.1.URI, 리소스에대한 정의가 헷갈려서 강의를 계속 돌려봐도 이해가 되지를 않아 따로 정리해보았는데 이렇게 이해하면될까요?예를 들어 회원정보관리 API를 설계한다고 하면URI = /members (리소스에 접근할수있는 식별자)리소스 = 회원 또는 회원목록웹페이지행위 = 조회, 등록, 삭제, 변경HTTP메서드 = 리소스를 대상으로 행위를 함URI == 리소스이렇게 이해하면될까요 ? 2.추가적으로 URI와 리소스에대한 분명한 정의가 무엇인지 질문드립니다.URI는 path + query(ex. /member?q=hello&hl=ko)인가요 ? 그래서 예를들면 GET /search?q=hello&kl=ko HTTP/1.1 에서 /search?q=hello&kl=ko 이 부분이 URI인가요?그리고 리소스는 강의자료에는 리소스=회원이라고만되어있고 구글링을해서 찾아보면 리소스=자원이라고만 되어있는데, 리소스조회, 리소스등록과 같이 '리소스'에 대한 정의가 무엇인지 질문드립니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ddl-auto : none 옵션
조회용 샘플 데이터를 입력하면서 application.yml 파일의 ddl-auto : none 옵션으로 바꾸어주면, 실행 시에 데이터가 더이상 쌓이지 않아야 하는 것이 맞는지 궁금합니다. 저는, 실행할 때 마다 InitDb의 데이터가 쌓여서 저장이 되는데, 이게 맞는 건지 잘 모르겠습니다. 제가 생각한 바로는, 최초에 create 옵션일 때 데이터를 넣어두고, 이후에 none으로 바꾸게 되면 더 이상 데이터가 입력되지 않는 것이라고 생각했는데 혹시 제 생각이 맞다면, none 옵션 시에 insert 쿼리가 안나가게 하는 방법이 있을까요?참고로 제 스프링부트 버전은 2.7.1입니다.h2 데이터베이스는 2.1.214가 설치되어있음을 확인했습니다.
-
미해결AWS(Amazon Web Service) 중/상급자를 위한 강의
EB 질문
안녕하세요 ㅎㅎ 강의 잘 보고있습니다.강의를듣고 수업자료 말고 기존에 작성했었던 ,Django , python 을 배포하려고 하는데여강의에서 나오대로 했지만 심각이라는 메세지가 나오면서 502 에러가 발생했습니다.502 에러가 발생해서 아마 nginx 가 뜬거 같은데 서버가 안뜬게 아닌가 ?? 생각을 하고있는데여이럴때 어떻게 해야하면 될까요 ?및에 최근 이벤트를 보니 Environment health has transitioned from Degraded to Severe. 100.0 % of the requests are failing with HTTP 5xx. ELB processes are not healthy on all instances. Configuration update completed 74 seconds ago and took 75 seconds. ELB health is failing or not available for all instances. Impaired services on all instances.유형으로 이러한 에러가 발생하네여 현재검색하면서 이러한 자료를 보면서 해결해보려고 하고있습니다 ㅎㅎhttps://shinsunyoung.tistory.com/101찾아보면서 생각이 드는건데 환경 속성을 변경 한다던지.. 다른것을 편집하려고 할때 규칙이 따로 있을까요 ?? ㅎㅎ예를들어port 를 변경한다고 할때 이름을SERVER_PORT 로 적어야한다던지요 ㅎ
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
npm run build:prod 에러
ec2 instance connect 에서 npm run build:prod 시 에러가 뜹니다ubuntu@ip-172-31-7-125:~/raddit-clone-deploy/client$ npm run build:prod > client@0.1.0 build:prod > env-cmd -f .env.production next build info - Loaded env from /home/ubuntu/raddit-clone-deploy/client/.env.production Failed to compile. ./src/pages/_app.tsx 31:3 Error: Synchronous scripts should not be used. See: https://nextjs.org/docs/messages/no-sync-scripts @next/next/no-sync-scripts ./src/pages/index.tsx 42:5 Warning: React Hook useEffect has missing dependencies: 'observeElement' and 'observedPost'. Either include them or remove the dependency array. react-hooks/exhaustive-deps ./src/pages/r/[sub].tsx 28:7 Warning: React Hook useEffect has missing dependencies: 'authenticated' and 'user'. Either include them or remove the dependency array. react-hooks/exhaustive-deps info - Need to disable some ESLint rules? Learn more here: https://nextjs.org/docs/basic-features/eslint#disabling-rules info - Linting and checking validity of types .ubuntu@ip-172-31-7-125:~/raddit-clone-deploy/client$ ^C31:3 Error: Synchronous scripts should not be used. See: https://nextjs.org/docs/messages/no-sync-scripts 여기서 async 나 defer 추가하래서 client>src>pages>_app.tsx에서return <> <Head> <script defer src="https://kit.fontawesome.com/0d9816814b.js" crossOrigin="anonymous"></script> </Head> <SWRConfig value = {{ fetcher }}> <script defer src="https://kit.fontawesome.com/0d9816814b.js" crossOrigin="anonymous"></script>추가해보았지만 해결이 안되었습니다.선생님 소스코드 보니 integrity가 추가되었는데 이게 문제일까요? <script defer src="https://use.fontawesome.com/releases/v6.1.1/js/all.js" integrity="sha384-xBXmu0dk1bEoiwd71wOonQLyH+VpgR1XcDH3rtxrLww5ajNTuMvBdL5SOiFZnNdp" crossOrigin="anonymous"></script>
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의자료와 실제 생성 테이블이 다르고, Address가 값 객체일 수 없다고 생각합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 김영한님의 강의를 잘 보고 있습니다. 강의를 보던도중, 문득 의문점이 들어서 여쭤보고자 질문을 작성하게 되었습니다. 질문의 테마는 값 타입 컬렉션과 기본키라고 할 수 있겠네요.기본 지식테이블은 기본키가 있을수도, 없을수도 있다.제가 배운대로는, 테이블은 기본키가 존재할 수도 있고 존재하지 않을 수도 있다고 배웠습니다. 그리고 기본키를 두는 이유는 기본키가 겹치지 않도록 해서, 데이터 중복을 막고, 조회 시 효율 증가를 위해서라고 생각했습니다. 김영한님의 강의에서 말하는 값타입은 주소가 다르더라도 안에 있는 값이 모두 같다고 하신걸로 이해했습니다.그래서 자바 객체가 값타입으로 들어가는 경우에는 equals를 통해서 같은지를 비교한다는 것도요!! 김영한님의 강의 중 예제로 들어주셨던 Member의 favoriteFoods, addressHistory는 값 타입을 데이터베이스 테이블로 변환한 예시로 이해했습니다.그리고 강의 내용에서 JPA를 이용해서 Table 구조를 생성하는 걸로 이해했습니다. 여기까지가 제가 이해한 내용입니다. 저는 그래서 해당 구조로 데이터베이스를 만들어준다고 인지했고, FAVORITE_FOOD, ADDRESS는 각각 중복값이 들어갈 수없다고 생각했습니다. 문제상황하지만 테이블의 생성 내용을 보면, 기본키 설정 부분이 빠져 있습니다.외래키 매핑만 되어 있고 실제로 기본키 부분이 빠져있습니다.제가 만든, ADDRESS 테이블을 예시로 들면,이는, FAVORITE_FOOD 도 동일합니다. 정말 중복값이 들어갈 수 없는지 테스트해보았습니다.테스트를 위한 코드는 다음과 같습니다.Address address = new Address("newCity", "street", "10000"); Member member1 = new Member(); member1.setName("member1"); member1.setHomeAddress(address); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("피자"); member1.getFavoriteFoods().add("족발"); Address oldAddress = new Address("oldCity3", "street", "10000"); member1.getAddressList().add(new Address("oldCity", "street", "10000")); member1.getAddressList().add(new Address("oldCity2", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); em.persist(member1); 결과값은 다음과 같습니다.값을 보게되면, FAVORITE_FOOD의 경우는 Set 자료구조 사용으로 중복값이 들어갈 수 없는 것이고, ADDRESS의 경우는 중복값이 들어갈 수 있었습니다. 만약 값의 변경이 일어나는 경우에는 어떻게 될까? 하는 고민이 생겨, 중복으로 들어있는 내용의 값을 변경해보았습니다.Address address = new Address("newCity", "street", "10000"); Member member1 = new Member(); member1.setName("member1"); member1.setHomeAddress(address); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("피자"); member1.getFavoriteFoods().add("족발"); Address oldAddress = new Address("oldCity3", "street", "10000"); member1.getAddressList().add(new Address("oldCity", "street", "10000")); member1.getAddressList().add(new Address("oldCity2", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); em.persist(member1); em.flush(); em.clear(); Member findMember = em.find(Member.class, member1.getId()); System.out.println("================== Start 2 =================="); findMember.getAddressList().remove(oldAddress); findMember.getAddressList().add(new Address("newCity1", "street", "10000")); tx.commit(); 결과값은 다음과 같습니다.중복값을 한번에 지워준다면, 그래도 결과적으로는 ADDRESS값을 중복이 없는 값객체로 쓸 수 있겠다고 생각했지만, 모두 지우지 않고 중복값을 하나만 지웠습니다.물론 List의 특성 상 중복 값 한개만 지우는게 당연하지만요. 가설목표하던 테이블 구조로 실제로 만들어지지 않았다고 생각했습니다. -> 기본키가 없다.왜냐하면 생성하고자 하는 테이블 구조와 생성된 테이블 구조가 다르기 때문입니다.음식에서 중복이 생기지 않는 이유는 Set의 특성 때문이지 테이블 때문이 아니라고 생각이 들었습니다. 값 객체의 특성 상 중복을 허용하는 경우는 없다.좋아하는 음식의 경우 같은 음식이 두번 있을 이유는 없지만, 이전의 주소의 경우는 같은 주소에 두번 이사갈 수 있다.그렇다면 음식과 다르게 주소의 경우는 중복이 가능하고, 값을 추적할 수 있어야 하므로 Entity로 사용하는게 맞지 않을까요?이 부분은 김영한님깨서 설명해주신 부분과 일치하지만, 결론까지 도달한게 맞는지 궁금합니다. 두서 없이 길게 적은 것 같은데, 제가 생각한 가설이 맞는지가 궁금합니다. 그리고 나아가 가설까지 도달하는 방식에 문제가 있거나 고칠점이 있다고 피드백도 부탁드립니다. 읽어주셔서 감사합니다.
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
decrease 쪽 메서드 안타는 이유,,?
콘솔 찍어봐도.. 여기까지 오질 않는 이유가 궁금합니다.. 느낌상으론 executorService 쪽에서 뭔가.. 안되는 느낌인데 ㅠ 원인을 모르겠네요
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
실제 쇼핑몰 사이트 결과와 셀레니움으로 접속한 결과가 다릅니다.
직접 접속하는 경우 상품 목록 셀레니움으로 접속한 경우 상품 목록둘다 주소가 똑같지만 네트워크 목록도 다르고 상품 목록도 다르게 뜨네요.왜 이런 현상이 일어날까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
질문이요
[질문 내용]like문을 사용하는 방법이 인테넷에서 검색해보니 여러방법이 있더라고요 강의에서 사용한 가장위에있는mysql방법말고 다른방법을 사용해도 가능한가요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeorm 0.3버전에 아직 seed기능 안나온걸까요?
$ yarn run seed yarn run v1.22.17 $ ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts query: SELECT VERSION() AS `version` typeorm-extension seed Populate the database with an initial data set or generated data by a factory. Options: -h, --help Show help [boolean] -r, --root Path to the data-source / config file. [default: "/Users/teetee6/code_react/sleact/hback"] -c, --connection Name of the connection on which run a query. [deprecated] [default: "default"] -f, --config Name of the file with the data-source configuration. [deprecated] [default: "ormconfig"] -d, --dataSource Name of the file with the data-source. [default: "data-source"] -s, --seed Specify the seed class to run. -v, --version Show version number [boolean] TypeError: connection.createQueryBuilder is not a function at CreateInitialData.run (/Users/teetee6/code_react/sleact/hback/src/database/seeds/create-initial-data.ts:40:8) at /Users/teetee6/code_react/sleact/hback/node_modules/typeorm-extension/src/seeder/module.ts:125:18 at Generator.next (<anonymous>) at fulfilled (/Users/teetee6/code_react/sleact/hback/node_modules/typeorm-extension/dist/seeder/module.js:5:58) error Command failed with exit code 1.4달전 즈음의 공지사항에 typeorm 0.3버전이 Seeding이 아직 호환 안된다고 되있던데아직 안나온 거겟죠,, /database/seeds/create-initial-data.tsConnection이 deprecated되었다던데 제가 못찾은 새로운 seed방법이 나온걸까요 검색해봐도 안나오는데 아니면 없는걸까요export default class CreateInitialData implements Seeder { public async run(factory: Factory, connection: Connection): Promise<any> { await connection .createQueryBuilder() .insert() .into(Workspaces) .values([{ id: 1, name: 'Sleact', url: 'sleact' }]) .execute(); await connection .createQueryBuilder() .insert() .into(Channels) .values([{ id: 1, name: '일반', WorkspaceId: 1, private: false }]) .execute(); } }
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
ts(2657) JSX에는 부모 요소가 하나 있어야 합니다 오류
54분 16초페이지대로 하고 있는데 왜 오류가 나는지 잘 모르겠습니다!간단한 코드인데 어딘가 잘못되었나요?? 아니면 버전이 잘못된건가요.
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
jenkins에서 war 파일을 톰캣 배포 과정에서 connection timeout 발생 합니다.
안녕하세요. CI/CD 과정을 들으면서 막히는 부분이 있어서 문의드립니다. 환경OS: Mac OS (Intel)톰캣설치환경: local (9.0.70 버전)Jenkins 설치환경: Docker Container 저의 실습환경은 위와 같습니다.Jenkins에서 war 파일까지 빌드되고 실제 파일이 잘 떨어지는데 톰캣으로 배포하는 과정에서 네트워크 이슈인지 계속 connection timeout이 나와서 제 local ip 문제인지 실제로 브라우저에서 192.x.x.x:8088로 접속해보면 정상적으로 톰캣 화면이 나오긴 합니다.선생님이 말씀해주신대로 톰캣 url에서 제 이더넷 0번 아이피인 192.x.x.x로 기입해줬는데도 ㅠㅠ 계속 발생하네요 질문게시판에 혹시 저같은 케이스가 있는지 찾아보긴했는데 안보여서요
-
해결됨버그헌팅과 시나리오 모의해킹 전문가 되기
locate 명령어가 실행되지 않습니다
/var/lib/plocate/plocate.db: No such file or directorylocate 명령어 실행하면 위 에러 출력됩니다. 혹시 몰라서 mlocate 설치했는데도 동일한 에러가 출력됩니다. 어떻게 해결해야 하나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션(readOnly=true)와 스냅샷의 관계
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이번 질문 내용을 정리해보니 좀 길어서 미리 좀 죄송합니다.....질문은 1개입니다. 스냅샷과 @Transactional(readOnly=true)의 관계 질문입니다.질문 내용은 다음과 같습니다.스프링 트랜잭션 이해/트랜잭션 옵션 소개 11:04 쯤 보면JPA는 읽기 전용 트랜잭션(@Transactional(readOnly=true))일 경우커밋 시점에 플러시를 호출하지 않는다. ... 추가로 변경이 필요 없으니 변경 감지를 위한 스냅샷 객체도 생성하지 않는다.라고 들었는데 이때 갑자기 스냅샷의 관계에 대해 헷갈려 질문해봅니다.말 그대로MemberService.class 에 있는@Transactinal(readOnly=true)findMemberById()로 find 해왔는데 스냅샷이 생성이 안되면Member findMember = memberService.findMemberById(memberId);findMember.setUsername("변경된 username");의 코드가 동작했을 때 변경이 안된다는 건데그러면 되게 난감한 상황인 것 같아말이 안돼서 다시 생각해보았습니다. 그래서 제가 생각해보고 시도해봤는데,@Transactional(readOnly=true) findMember() 메서드 내에서는스냅샷이 생성이 안되고Member findMember = memberService.findMember(memberId); 에서findMember는 스냅샷 생성이 되어 있는 것이겠다가 결론입니다. 결론을 내보긴 했지만jpa를 배웠을 때find의 경우DB에서 조회해 오는 순간 스냅샷이 생성되어 있는 것으로 이해했어서왜 memberService.findMember() 에서의 트랜잭션이 commit 되고 나서스냅샷이 생성되는지는 모르겠네요.트랜잭션 readOnly=true일 경우 로직을 그렇게 작동하게 해놓은 건가.. 어쨌든.. 제 결론이 맞을까요 ? 아래는 실험해본 코드와생각해서 정리해본 1차캐시 이미지 입니다.find만 했을 경우 혹시 안에 변경감지가 되는지 보려고member.setUsername("1111"); 을 해봤습니다.지금 생각해보니(readOnly=true)라서 flush가 일어나지 않아 update 쿼리가 당연히 안 나가겠지만확인차 해봤다고 봐주시면 될 것 같습니다.// flush() 때문에 update 쿼리가 안 나가는 거면 내부에 스냅샷이 있을 수도 있겠네요. 어쨋든 이 결과 생각한 1차 캐시 및 스냅샷 이미지입니다.트랜잭션 시작, 종료 사이에 스냅샷이 비워져 있는지 확실하진 않아서저게 맞는 지가 핵심 질문입니다. 만약 비워져 있는 게 맞다면,부가적으로 따라오는 의문은 다음과 같습니다.changeMemberUsername() 메서드를 호출했을 때1차 캐시 및 스냅샷은 어떻게 동작하는가 입니다.일반적으로 find를 해온 후데이터를 변경하는 JPA이기 때문에@Transactional(readOnly=true) findMemberById() 로 들고온 결과는반드시 스냅샷이 있어야 된다는 게 제 생각이기 때문에다음과 같이 동작할 거라고 결론을 지어봤습니다.이렇게 스냅샷이 동작하는 게 맞을까요 ? 여기까지 읽어주셔서 정말 정말 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
카프카 sink connector 사용시 에러
안녕하세요. 카프카 관련 수업 듣는 중 오류가 발생하여 질문 드립니다.org.apache.kafka.connect.errors.ConnectException: Tolerance exceeded in error handler\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:206)\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:132)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:501)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:478)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:328)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:232)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:201)\n\tat org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:185)\n\tat org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:234)\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\nCaused by: org.apache.kafka.connect.errors.DataException: Converting byte[] to Kafka Connect data failed due to serialization error: \n\tat org.apache.kafka.connect.json.JsonConverter.toConnectData(JsonConverter.java:366)\n\tat org.apache.kafka.connect.storage.Converter.toConnectData(Converter.java:87)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.convertValue(WorkerSinkTask.java:545)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$1(WorkerSinkTask.java:501)\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:156)\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:190)\n\t... 13 more\nCaused by: org.apache.kafka.common.errors.SerializationException: com.fasterxml.jackson.core.JsonParseException: Unexpected character (':' (code 58)): was expecting comma to separate Object entries\n at [Source: (byte[])\"{\"schema\":{\"type\":\"struct\",\"fields\":[{\"type\":\"int32\",\"optional\":false,\"field\":\"id\"},{\"type\":\"string\",\"optional\":true,\"field\":\"user_id\"},{\"type\":\"string\",\"optional\":true,\"field\":\"pwd\"},{\"type\":\"string\",\"optional\":true,\"field\":\"name\"},{\"type\":\"int64\",\"optional\":true,\"name\":\"org.apache.kafka.connect.data.Timestamp\",\"version\":1,\"field\":\"created_at\"}],\"optional\":false,\"name\":\"users\"},\"payload\":{\"id”:4,”user_id\":\"user4”,”pwd\":\"1234\",\"name\":\"username4”,”created_at\":1671277849000}}\"; line: 1, column: 433]\nCaused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (':' (code 58)): was expecting comma to separate Object entries\n at [Source: (byte[])\"{\"schema\":{\"type\":\"struct\",\"fields\":[{\"type\":\"int32\",\"optional\":false,\"field\":\"id\"},{\"type\":\"string\",\"optional\":true,\"field\":\"user_id\"},{\"type\":\"string\",\"optional\":true,\"field\":\"pwd\"},{\"type\":\"string\",\"optional\":true,\"field\":\"name\"},{\"type\":\"int64\",\"optional\":true,\"name\":\"org.apache.kafka.connect.data.Timestamp\",\"version\":1,\"field\":\"created_at\"}],\"optional\":false,\"name\":\"users\"},\"payload\":{\"id”:4,”user_id\":\"user4”,”pwd\":\"1234\",\"name\":\"username4”,”created_at\":1671277849000}}\"; line: 1, column: 433]\n\tat com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1840)\n\tat com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:712)\n\tat com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:637)\n\tat com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1011)\n\tat com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:250)\n\tat com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:258)\n\tat com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:68)\n\tat com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:15)\n\tat com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4270)\n\tat com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2734)\n\tat org.apache.kafka.connect.json.JsonDeserializer.deserialize(JsonDeserializer.java:64)\n\tat org.apache.kafka.connect.json.JsonConverter.toConnectData(JsonConverter.java:364)\n\tat org.apache.kafka.connect.storage.Converter.toConnectData(Converter.java:87)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.convertValue(WorkerSinkTask.java:545)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$1(WorkerSinkTask.java:501)\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:156)\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:190)\n\tat org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:132)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:501)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:478)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:328)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:232)\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:201)\n\tat org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:185)\n\tat org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:234)\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\n발생 에러는 다음과 같은데,터미널에서 직접 produce 하는 도중 발생하였는데 payload 의 데이터가 잘못 전송 되어서 해당 오류가 발생 한 것 같아서 기존 users 테이블에 다시 insert 하는 방식으로 다시 사용했을 때 이전에 실패한 task 가 남아있어서 여전히 my_topic_users 테이블에 insert 되지 않았습니다.중간에 발생한 task 는 삭제하거나 임의로 건너 뛰거나 할 수 없는 것인가요?
-
미해결스프링 핵심 원리 - 기본편
@Autowired에서 에러 발생
package hello.core.scope; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class SingletonWithPrototypeTest1 { @Test void prototypeFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); prototypeBean1.addCount(); assertThat(prototypeBean1.getCount()).isEqualTo(1); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); prototypeBean2.addCount(); assertThat(prototypeBean2.getCount()).isEqualTo(1); } @Test public void singletonClientUsePrototype() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(2); } @Scope("singleton") static class ClientBean { private final PrototypeBean prototypeBean; @Autowired public ClientBean(PrototypeBean prototypeBean) { this.prototypeBean = prototypeBean; } public int logic() { prototypeBean.addCount(); return prototypeBean.getCount(); } } @Scope("prototype") static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init " + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } } 위 코드에서 @Autowired 부분에서 Error:(43, 10) Autowired members must be defined in valid Spring bean (@Component|@Service|...)에러가 발생합니다. 스프링 빈으로 등록되어 있지 않아서 발생하는 오류라고 생각됩니다. 하지만 강사님 코드에서는 발생하지 않아서 제가 뭘 빠뜨린 것 같은데 그게 무엇인지 모르겠습니다.테스트는 돌려보면 잘 작동하고 통과가 됩니다.