묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
이미지 업로드와 관련하여 코드 변경해도 되는지
안녕하세요 선생님 이미지 업로드와 관련한 질문 사항인데요, 도메인 연결 후 이미지 업로드시 이미지가 화면에 안뜨고, 서버에서 아래와 같은 타입 에러가 발생해서 에러 원인을 검색해보았는데, 버전을 2에서 3으로 업그레이드 한 뒤 코드를 수정한 뒤 이미지는 화면에 떴는데, 게시글이 안올라가서 보니까 이미지 Url길이가 너무 길어서 발생한 문제인것 같아서 image테이블에 src컬럼 길이 1000으로 변경하니까 에러가 해결되긴 했는데, 이렇게 변경해도 될까욧?백엔드 에러로그)0|app | Please migrate your code to use AWS SDK for JavaScript (v3). 0|app | For more information, check the migration guide at https://a.co/7PzMCcy 0|app | (Use `node --trace-warnings ...` to show where the warning was created) 0|app | TypeError: this.client.send is not a function 0|app | at _Upload.__uploadUsingPut (/home/ubuntu/react_nodebird/back/node_modules/@aws-sdk/lib-storage/dist-cjs/index.js:217:53) 0|app | at _Upload.__doConcurrentUpload (/home/ubuntu/react_nodebird/back/node_modules/@aws-sdk/lib-storage/dist-cjs/index.js:280:29) 0|app | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) 0|app | at async Promise.all (index 0) 0|app | at async _Upload.__doMultipartUpload (/home/ubuntu/react_nodebird/back/node_modules/@aws-sdk/lib-storage/dist-cjs/index.js:366:5) 0|app | at async _Upload.done (/home/ubuntu/react_nodebird/back/node_modules/@aws-sdk/lib-storage/dist-cjs/index.js:190:12)문의1)back/package.json 버전 => aws-sdk 2버전에서 aws-sdk/client-s3 3버전으로 업그레이드{ "name": "react-nodebird-back", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "cross-env NODE_ENV=production pm2 start app.js" }, "author": "luckyhaejin", "license": "ISC", "dependencies": { "@aws-sdk/client-s3": "^3.496.0", "aws-sdk": "^2.1538.0", "bcrypt": "^5.1.1", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "cross-env": "^7.0.3", "dotenv": "^16.3.1", "express": "^4.18.2", "express-session": "^1.17.3", "helmet": "^7.1.0", "hpp": "^0.2.3", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "mysql2": "^3.6.5", "passport": "^0.7.0", "passport-local": "^1.0.0", "pm2": "^5.3.0", "sequelize": "^6.35.2", "sequelize-cli": "^6.6.2" }, "devDependencies": { "nodemon": "^2.0.22" } } 수정한 후 post.js 이미지 관련 코드const express = require('express'); const {Post, Image, Comment, User, Hashtag} = require('../models'); const {isLoggedIn} = require('./middlewares'); const router = express.Router(); const multer = require('multer'); const path = require('path'); const fs = require('fs'); const multerS3 = require('multer-s3'); // const AWS = require('aws-sdk'); try { fs.accessSync('uploads'); } catch(error) { console.error('uploads폴더가 없으므로 생성합니다.'); fs.mkdirSync('uploads'); } // AWS.config.update({ // accessKeyId: process.env.S3_ACCESS_KEY_ID, // secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, // region: 'ap-northeast-2', // }); const { S3Client } = require('@aws-sdk/client-s3'); const s3Client = new S3Client({ credentials: { accessKeyId: process.env.S3_ACCESS_KEY_ID, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, }, region: 'ap-northeast-2', }); const upload = multer({ storage: multerS3({ // s3: new AWS.S3(), s3: s3Client, bucket: 'react-saga-nodebird-s3', key(req, file, cb){ cb(null, `original/${Date.now()}_${path.basename(file.originalname)}`) } }), limits: {fileSize: 20 * 1024 * 1024} //20MB }); router.post('/images', isLoggedIn, upload.array('image'),(req, res, next) => { //POST /post/images res.json(req.files.map((v) => v.location)); }); 게시글 업로드시 에러 로그)Error 0|app | at Query.run (/home/ubuntu/react_nodebird/back/node_modules/sequelize/lib/dialects/mysql/query.js:52:25) 0|app | at /home/ubuntu/react_nodebird/back/node_modules/sequelize/lib/sequelize.js:315:28 0|app | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) 0|app | at async MySQLQueryInterface.insert (/home/ubuntu/react_nodebird/back/node_modules/sequelize/lib/dialects/abstract/query-interface.js:308:21) 0|app | at async Image.save (/home/ubuntu/react_nodebird/back/node_modules/sequelize/lib/model.js:2490:35) 0|app | at async Image.create (/home/ubuntu/react_nodebird/back/node_modules/sequelize/lib/model.js:1362:12) 0|app | at async /home/ubuntu/react_nodebird/back/routes/post.js:60:31 { 0|app | name: 'SequelizeDatabaseError', 0|app | parent: Error: Data too long for column 'src' at row 1 0|app | at Packet.asError (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/packets/packet.js:728:17) 0|app | at Execute.execute (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/commands/command.js:29:26) 0|app | at Connection.handlePacket (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/connection.js:481:34) 0|app | at PacketParser.onPacket (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/connection.js:97:12) 0|app | at PacketParser.executeStart (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/packet_parser.js:75:16) 0|app | at Socket.<anonymous> (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/connection.js:104:25) 0|app | at Socket.emit (node:events:518:28) 0|app | at addChunk (node:internal/streams/readable:559:12) 0|app | at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) 0|app | at Readable.push (node:internal/streams/readable:390:5) { 0|app | code: 'ER_DATA_TOO_LONG', 0|app | errno: 1406, 0|app | sqlState: '22001', 0|app | sqlMessage: "Data too long for column 'src' at row 1", 0|app | sql: 'INSERT INTO `images` (`id`,`src`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?);', 0|app | parameters: [ 0|app | 'https://react-saga-nodebird-s3.s3.ap-northeast-2.amazonaws.com/original/1705984124288_%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%8F%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%85%C3%A1%C2%85%C2%B5%C3%A1%C2%86%C2%AB%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%A3%C3%A1%C2%86%C2%BA%202024-01-23%20%C3%A1%C2%84%C2%8B%C3%A1%C2%85%C2%A9%C3%A1%C2%84%C2%92%C3%A1%C2%85%C2%AE%2012.20.36.png', 0|app | '2024-01-23 04:33:31', 0|app | '2024-01-23 04:33:31' 0|app | ] 0|app | }, 0|app | original: Error: Data too long for column 'src' at row 1 0|app | at Packet.asError (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/packets/packet.js:728:17) 0|app | at Execute.execute (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/commands/command.js:29:26) 0|app | at Connection.handlePacket (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/connection.js:481:34) 0|app | at PacketParser.onPacket (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/connection.js:97:12) 0|app | at PacketParser.executeStart (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/packet_parser.js:75:16) 0|app | at Socket.<anonymous> (/home/ubuntu/react_nodebird/back/node_modules/mysql2/lib/connection.js:104:25) 0|app | at Socket.emit (node:events:518:28) 0|app | at addChunk (node:internal/streams/readable:559:12) 0|app | at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) 0|app | at Readable.push (node:internal/streams/readable:390:5) { 0|app | code: 'ER_DATA_TOO_LONG', 0|app | errno: 1406, 0|app | sqlState: '22001', 0|app | sqlMessage: "Data too long for column 'src' at row 1", 0|app | sql: 'INSERT INTO `images` (`id`,`src`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?);', 0|app | parameters: [ 0|app | 'https://react-saga-nodebird-s3.s3.ap-northeast-2.amazonaws.com/original/1705984124288_%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%8F%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%85%C3%A1%C2%85%C2%B5%C3%A1%C2%86%C2%AB%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%A3%C3%A1%C2%86%C2%BA%202024-01-23%20%C3%A1%C2%84%C2%8B%C3%A1%C2%85%C2%A9%C3%A1%C2%84%C2%92%C3%A1%C2%85%C2%AE%2012.20.36.png', 0|app | '2024-01-23 04:33:31', 0|app | '2024-01-23 04:33:31' 0|app | ] 0|app | }, 0|app | sql: 'INSERT INTO `images` (`id`,`src`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?);', 0|app | parameters: [ 0|app | 'https://react-saga-nodebird-s3.s3.ap-northeast-2.amazonaws.com/original/1705984124288_%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%8F%C3%A1%C2%85%C2%B3%C3%A1%C2%84%C2%85%C3%A1%C2%85%C2%B5%C3%A1%C2%86%C2%AB%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%A3%C3%A1%C2%86%C2%BA%202024-01-23%20%C3%A1%C2%84%C2%8B%C3%A1%C2%85%C2%A9%C3%A1%C2%84%C2%92%C3%A1%C2%85%C2%AE%2012.20.36.png', 0|app | '2024-01-23 04:33:31', 0|app | '2024-01-23 04:33:31' 0|app | ] 0|app | } models/image -> src컬럼 길이 200에서 1000으로 변경 const DataTypes = require('sequelize'); const {Model} = DataTypes; module.exports = class Image extends Model { static init(sequelize) { return super.init({ //id가 기본적으로 들어있다 src: { type:DataTypes.STRING(1000), allowNull:false }, },{ modelName: 'Image', tableName: 'images', charset: 'utf8', collate: 'utf8_general_ci', sequelize }); } static associate(db) { db.Image.belongsTo(db.Post); } }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
5~6강 질문이요
post방식은 dto 객체 앞에 @RequestBody가 있는데 get방식은 왜 dto객체 앞에 @RequestParam을 안 써요? 맨 처음에 dto 객체 없었을 때 매개변수 이용하였을 때는 @RequestParam 썼던 것 같은데..
-
해결됨팝스타 공식 뮤비 제작 & 유튜브 2천만 뷰 크리에이터의 애니메이트 X 이모티콘 클래스
카카오에 psd 원본파일 제출시...
안녕하세요 선생님!강의 열심히 보면서 많이 배우고 있어요. 감사드립니다 ^^카톡 이모티콘 승인 후 최종파일 업로드시 psd 원본을 제출하여야 하는데요.애니메이트에서 psd 파일로 변환 할 수가 있는지요?아니면 png로 애니메이션을 내보낸 후 포토샵이나 클립스튜디오에서한땀한땀 타임라인을 정렬하여 psd 파일로 옮기는 수 밖에 없을까요?궁금합니다.
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
안녕하세요!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 강의 내용을 질문할 경우 몇분 몇초의 내용에 대한 것인지 반드시 기재 부탁드립니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요! 항상 좋은 강의 너무 감사합니다.강의 중 몇가지 질문이 있어 이렇게 남기게 되었습니다.Segmentation 시각화 강의 중 1. ploygon 좌표로 그린 mask 정보는 ground truth와는 다른 정보라고 이해했는데, 이부분이 맞는지 여쭤보고 싶습니다.2. 만약 한 이미지에 여러 동일한 물품이 분포되어 있고, mask rcnn 모델을 이용하여 각각의 객체를 인스턴화한 후에 불량과 양품을 분류하고 싶을 때, '데이터를 직접 수집할 경우' 라벨링을 양품과 불량품 이외에도 물품의 ground truth 정보를 같이 라벨링 해야하는지 궁금합니다.또한, 위에서 말씀드린 이미지를 개별 인스턴화를 통해 양품,불량품을 판별해기 위해 mask rcnn 모델이 적합한지 여쭤보고 싶습니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
질문)도메인 연결 후 주소에 추가된 물음표
안녕하세요 선생님 도메인 연결을 했는데, 처음에 Front 도메인을 입력한 뒤 ?가 붙는 원인을 어떻게 알 수 있는지 궁급합니다. 도메인 연결 후 login후 Network => Headers-> RequestURL, Access-Control-Allow-Orign, SetCookie, Application->Cookies에는 도메인주소와 쿠키가 있고, 백엔드 도메인 입력시에는 물음표 안생깁니다. 둘다 화면은 잘 나옵니다.백엔드 도메인 입력시)프론트 도메인 입력시)로그인시 network, application)
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
선생님 블로그 이미지들이 모두 undefined로 나옵니다 ㅠㅠ
학습을 하는 과정에서 제로초님 블로그를 자주 참고하는데학습에 도움되는 이미지들이 모두 undefined로 나오지 않습니다. 혹시 언제 해결 될까요?
-
미해결스프링 핵심 원리 - 기본편
스프링 빈 등록과 의존관계 설정
수동으로(AppConfig를 이용해서) 스프링 컨테이너에 빈을 등록하는 과정에서 만약 다른 빈이 필요하다면 해당 빈의 의존성이 주입 된다고 이해했는데 그렇다면 실제로 등록과 의존성 주입은 거의 동시에 일어나고 강의에서 이 두 과정을 분리해서 설명한 것은 이해를 돕기 위한 것인지 확인 차 질문 드립니다.
-
미해결다양한 사례로 익히는 SQL 데이터 분석
postgres 설치 오류
postgres가 설치가 되지 않고다음과 같은 메시지만 계속 뜹니다.삭제 후 다시 해봐도 똑같은데, 어쩌죠?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Unsupported java 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의를 잘 수강하고있는 한 수강생입니다 지금까지 오류가 발생하지 않다가 html 파일을 수정하고나서부터 다음과 같은 오류가 발생합니다 jvm과 sdk버전을 20으로 바꾸면 또 다음과 같이 오류가 발생하는데 해결방법이 있을까요?
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
실전문제풀이6-Q19 - DB 응답 속도 문의 드립니다.
안녕하세요. DB별 응답속도가 궁금합니다.Aurora, RDS는 밀리 초 단위 응답이 불가능하다고 알고 있는데요. 평균 응답시간이 어느 정도 될지 여쭤봅니다.다른 것들은 아래와 같이 정리했는데, 이 2개는 찾아봐도 잘 안나오네요.DynamoDB Accelerator (DAX): 마이크로 초ElastiCache: 1밀리초 미만Dynamo DB: 10밀리초 미만Aurora RDS보다 3~5배 빠름RDS 밀리초 단위 처리 불가
-
미해결[입문자를 위한 UE5] Part5. 언리얼 엔진 VR
위젯 인터렉션과 핸드 매쉬 방향 조절
안녕하세요.한 가지 질문이 있어 이렇게 글을 남깁니다.현재 핸드 매쉬와 위젯 인터랙션 방향이 모션컨트롤러 기준 위쪽을 향하고 있는데 이걸 정면을 향하도록 하는 방법이 있을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Servlet 클래스, super
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Servlet 클래스를 구현한 RequestHeaderServlet 에서 super.service(request, response); 생략하지 않으면 whitelabel error 가 나는 이유는 뭔가요?
-
미해결스프링 부트 - 핵심 원리와 활용
스프링부트 배포관련 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 강의 너무 잘 듣고 있습니다기초적인 질문드립니다^^;다수의 개발자가 하나의 웹 프로젝트를 진행하는데 스프링부트는 어떻게 배포해야되나요? 각각 jar 가 생성되니 jar별 port를 넣어서 띄워야 되는지? 아님 모든 개발자의 소스를 합쳐서 jar 를 생성해야되는지? 아님 다른 방식으로 하는지 궁금합니다너무 기초적인 질문이라 ^^;감사합니다
-
미해결[웹 개발 풀스택 코스] Vue.js 프로젝트 투입 일주일 전 - 기초에서 실무까지
데이터바인딩
데이터 바인딩을 듣고 있는데요.데이터바인딩리스트뷰 진도를 나가는데 윈도우에서 곱하기를 못해서 진도를 못나가고 있어요.shift 8눌러서 곱하기를 만들면 오류가 나네요.곱하기부붙을 어떻게 해야 오류가 나지 않을까요<tr :key="drink.drinkId" v-for="drink in drinkList"><td>{{ drink.drinkId }}</td><td>{{ drink.drinkName }}</td><td>{{ drink.prick }}</td><td><input type="number" name="" id="" v-model="drink.qty" /></td><td>{{ dirnk.price drink.qty }}</td> <--이부분이요 곱하기 해야하는데 윈도우에서 shift+8해서 곱하기를 만들면 오류가 나요 ㅠㅠㅠㅠㅠ
-
미해결이펙티브 자바 완벽 공략 1부
정적팩토리메소드와 ServiceLoader는 무슨 관계인가요?
ServiceLoader는 정적팩토리메소드를 사용하든 안하든 모든 구현체를 가져오는데 정적팩토리메소드 장점에서 나오는 이유를 잘모르겠습니다!
-
해결됨팀 개발을 위한 Git, GitHub 입문
강의자료(ppt) 요청
좋은 강의 감사합니다.강의자료 부탁드립니다. skyglory@gmail.com
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
thymeleaf 등과 같은 view와 프론트에서 그리는 화면의 관계
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]https://www.inflearn.com/questions/72824 질문을 읽어보았습니다.서버사이드 렌더링과 클라이언트 사이드 렌더링이 있고, 강의 예제에서 썼던 thymeleaf 같은 방법은 서버사이드 렌더링이라고 이해했습니다.그리고 실무에서는 서버사이드와 클라이언트 사이드를 둘 다 사용한다고 하셨는데, 둘 다 사용한다는 말의 의미가 1. 동일한 화면에 대해 서버사이드와 클라이언트 사이드가 공존한다는 건가요?만약 맞다면, 2. 실제 사용자가 보는 화면은 둘 중 어떤 걸로 선택되나요?그리고 3. 서버사이드 렌더링을 사용하는 이유와 용도가 궁금합니다. 저 혼자서 데이터를 대강 화면에 뿌려보면서 백엔드 개발이 잘 되었는지를 확인하는 용도로 쓰는건가? 라는 생각을 했어서... 정확히 실무에서 어떤 용도로 쓰는건지 궁금합니다.질문이 너무 많아서 죄송합니다ㅠㅠ 상세한 답변이 어려우시다면 참고할만한 레퍼런스나 검색 키워드를 추천해주셔도 좋습니다.
-
해결됨빠르게 git - 핵심만 골라 배우는 Git/Github
Section 2 / 4강 / 3:23초 질문
master에서 test2.txt가 있었고 my_branch로 새로운 브랜치를 만든 경우 master에 있는 text2.txt가 my_branch로도 자동추가되나요? 섹션2의 4강 3:23 초에서 my_branch 2개의 커밋과 2개의 txt파일이 들어있는 걸 보고 질문드립니다 !
-
해결됨
앱 프로젝트 기획자, 디자이너, 프런트 개발자 팀원 모집합니다!
프로젝트 주제 : 현재는 외국인을 대상으로 하는 국내 여행 가이드 앱을 생각하고 있는데 팀원 모집 이후에 변경될 수도 있습니다. 프로젝트 목표 : 이번 프로젝트를 통해 디자이너, 프런트, 백엔드, 기획자 인원들과 함께 완성도 높은 프로젝트를 진행해 보고 싶습니다. 열심히 참여하실 분만 신청해 주세요! 예상 프로젝트 일정(횟수) : 2월 초에 시작하여 3개월 안으로 끝낼 예정입니다. 예상 모집인원 : 디자이너 1 기획자 1 프런트 (총 3명)현재 인원 : 프런트1, 백엔드3 프로젝트 소개와 개설 이유 : 포트폴리오, 서비스 배포, 운영 경험 프로젝트 주의사항 : 열심히 참여할 분만 신청해주세요! 프로젝트에 지원할 수 있는 방법을 남겨주세요. : https://open.kakao.com/o/stbMvh5f
-
해결됨Flutter 앱 개발 실전
추가되었으면 하는 사항과 조언 요청
안녕하세요. riverpod 기반으로 BaseView, BaseViewModel, BaseViewState 를 구현해주셔서 이를 활용하여 로그인 예제 샘플코드에 적용하여 잘 동작되는 걸 확인했습니다.다시 한번 감사드립니다. 섹터2 상태관리 동영상이 도움 되지만 기회가 되신다면 Riverpod 구현 코드 변경 부분 관련으로 동영상 강의 추가해주시면 수강자 및 수강신청 예정자에게 큰 도움이 될 거 같습니다. 좀 더 추가되면 좋을 사항도 적어봅니다.로그인 예제, Retrofit 활용한 JSON 데이터 처리 과정, LogInterceptor 활용한 JWT 인증처리 또는 Session 처리 BaseView 구현하는 역량을 향상시키기 위해서 어떤 과정을 수강(학습)하면 도움이 될지 조언해주시면 큰 도움이 될 거 같습니다. 언어 상관없이 어떤 과정을 배우면 도움될런지요?