묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
'다대다' 속성 value 타입은 'Category'일 수 없습니다. 오류
안녕하세요 강의를 따라하던중 다음과 같은 오류가 발생합니다.교안과도 같은 코드이고 인텔리제이도 껐다 켰는데 왜 이런 문제가 발생하는지 모르겠습니다.
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
실습19) AWS EC2에 Jenkins 서버 설치하기 에서 maven 설치하는 부분
실행될 프로젝트가 maven 으로 만들어졌기 때문에 maven을 설치하는게 맞을까요? 만약 gradle로 만들어진 프로젝트를 배포하고 싶으면 maven 관련은 설치하지 않고 gradle 관련 패키지를 설치하면 될까요?
-
미해결
yoloV9, flask 연동 시 오류 발생
yoloV9과 flask 연동해서 웹 사이트에 객체 탐지한 결과를 출력하는 페이지를 만들고 있는데 결과 사진이 html에 뜨지 않고 새로운 창으로 뜨게 됩니다...ㅜㅜ 그리고 TypeError: 'NoneType' object is not iterable 이런 오류가 발생하는데 관련이 있을까요??? 해결해주시면 너무 감사할 것 같습니다! flaskApp.py#Import All the Required Libraries from flask import Flask, render_template, Response, jsonify, request, session from flask_wtf import FlaskForm from wtforms import FileField, SubmitField from werkzeug.utils import secure_filename from wtforms.validators import InputRequired from detection import objectDetection import os import cv2 #Initialize the Flask Application app = Flask(__name__) #Configure a secret key app.config['SECRET_KEY'] = 'muhammadmoin' #Store the input files uploaded in the application app.config['UPLOAD_FOLDER'] = 'static/files' #Use FlaskForm to get the input file form the user class UploadFileForm(FlaskForm): file = FileField('File', validators=[InputRequired()]) submit = SubmitField('Run') fpsCount = 0 frameSize = 0 detectedObjects = 0 def generate_frames(path): yolov9_output = objectDetection(path) for im0, frameRate, frameShape, totalDetection in yolov9_output: ret, buffer = cv2.imencode('.jpg', im0) global fpsCount fpsCount = str(frameRate) global frameSize frameSize = str(frameShape[0]) global detectedObjects detectedObjects = str(totalDetection) frame = buffer.tobytes() yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') @app.route('/', methods=['GET', 'POST']) def front(): form = UploadFileForm() if form.validate_on_submit(): file = form.file.data filename = secure_filename(file.filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) session['filePath'] = file_path return render_template('index.html', form = form, uploaded = True, filename = filename) return render_template('index.html', form = form, uploaded = False) @app.route('/detections', methods = ['GET', 'POST']) def detections(): file_path = session.get('filePath', None) if file_path: return Response(generate_frames(path=file_path), mimetype='multipart/x-mixed-replace; boundary=frame') else: return "No video uploaded" @app.route('/fps', methods = ['GET', 'POST']) def fps(): global fpsCount return jsonify(fpsresult=fpsCount) @app.route('/dcount', methods = ['GET']) def dcount(): global detectedObjects return jsonify(dcountresult=detectedObjects) @app.route('/fsize', methods = ['GET']) def fsize(): global frameSize return jsonify(fsizeresult=frameSize) if __name__ == "__main__": app.run(debug=True)index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width", initial-scale="1.0"> <title>스마트 건설환경 안전관리 시스템</title> <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel='stylesheet'> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet"> </head> <body> <!-- main page --> <div class="main-page"> <!-- side line --> <div class="side-line"></div> <!-- side bar --> <div class="side-bar"> <form id="upload-form" method="POST" enctype="multipart/form-data"> {{ form.hidden_tag() }} {{ form.file(id='file', style='display: none;') }} <span class="circle" id="upload-icon"><i class="material-icons" style="font-size: 36px; color: white;">file_upload</i></span> </form> <span class="circle blue-circle" id="detect-icon"><i class="material-icons" style="font-size: 36px; color: white;">play_arrow</i></span> <span class="circle" id="button-rgb-img"><i class="material-icons" style="font-size: 36px; color: white;">palette</i></span> <span class="circle" id="button-gray-scale"><i class="material-icons" style="font-size: 36px; color: white;">contrast</i></span> <span class="circle" id="button-blur"><i class="material-icons" style="font-size: 36px; color: white;">blur_on</i></span> <span class="circle" id="button-canny-image"><i class="material-icons" style="font-size: 36px; color: white;">grade</i></span> <span class="circle blue-circle"><i class="material-icons" style="font-size: 36px; color: white;">videocam</i></span> </div> <!-- right panel --> <div class="right-panel"> <!-- Header --> <div class="header"> <div class="empty-container"></div> <h1>스마트 건설환경 안전관리 시스템</h1> <!-- <div class="logo-container"><img src="{{ url_for('static', filename='logo.png') }}" width="90" height="30" alt=""></div>--> <!-- Tablet Container --> <div class="tablet-container"> <img id="tablet-image" src="{{ url_for('static', filename='tablet.png') }}" width="800" height="600" alt=""> <img id="image-main" src="{{ url_for('detections') }}" width="740" height="540" alt=""> <canvas id="main-canvas" width="740" height="540"> </canvas> </div> </div> </div> <script> document.getElementById('upload-icon').addEventListener('click', function () { document.getElementById('file').click(); }); document.getElementById('detect-icon').addEventListener('click', function () { document.getElementById('upload-form').submit() }); </script> </div> </body> </html>
-
미해결처음 만난 리액트(React)
npm start출력 시 미출력됩니다.
<Book.jsx><Library.jsx><index.js>입력 후 출력 시 오류값이 나오는데 설명부탁드립니다.
-
미해결견고한 결제 시스템 구축
완강!!!!!!!!!!!!!!
드디어 완강!! 🥳유익한 강의 잘들었습니다.감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
(공부 방법 관련) 모르겠으면 답을 보고 풀어도 되는걸까요ㅠㅠ
안녕하세요! 선생님 강의 잘 듣고있습니다 ㅎㅎ다름이 아니라,, 공부 방법에 대해 궁금한 점이 있어서요. 2주차까지는 제시해주신 문제 문제 대부분이 실버라서 답을 안 보고 풀고, 선생님 강의 보면서 더 나은 답을 배워가는 식으로 공부해왔는데,, 3주차 브루트포스부터는 골드가 대부분이라 자꾸 답에 도달하지 못하고 결국 강의 코드를 참고하게 됩니다ㅠㅠ (제가 아직 골드를 안 보고 풀 수 있는 실력이 아닌 것 같아요..)당연히 몇 시간 동안 저 스스로 풀려고 노력하는데, 늘 테케는 맞추더라도 히든테케를 틀리고ㅠㅠ 테케가 맞았으니까 어느정도 답에 근접하긴 했다고 생각했는데 막상 큰돌쌤 답을 보면 저랑 다르게 짧고 깔끔하게 구조화하셨더라구요. ㅠㅠ 예를 들면, 인구이동(boj 16234) 문제에서 인접 컴포넌트니까 dfs써야지! 하고 와다다닥 dfs를 써서 코드를 짜긴 짜는데 주어진 조건이 많아지니까 혼란스러워하면서 배열도 많이 만들고 flag도 많이 만들어서 덕지덕지 코드를 짜다가 포기하고 답을 보는.. 이런식이 반복됩니다.. 다음날 다시 풀어봐도 전날 푼걸 외워서 푸는 것 같고 제가 다른 문제가 나왔을 때 풀 수 있을거라는 자신이 안 들어요 이렇게 스스로 풀지 못 하는 문제가 거의 대부분이라도 이런식으로 계속 답을 보면서 공부하는게 맞는걸까요? 쌤 답을 보면서 공부를 해도 제 스스로 문제푸는 힘이 길러질까요?ㅠ.ㅠ 한탄 읽어주셔서 감사합니다..
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
자바 컴파일 실행이 안 되서 질문 드립니다..
같은 패키지 내부에 Test.java와 BusObject.java가 있습니다. Test에서 BusObject객체를 만들어서 사용하는 것을 테스트하고자 하는데 다음과 같이 에러가 나옵니다.javac BusObject.java Test.javajava BusObject.java Test.java (java BusObject Test 도 동일하게 안 됩니다ㅜㅜ)Error: Could not find or load main class week11.BusObjectCaused by: java.lang.ClassNotFoundException: week11.BusObject뭔가 문제인가요..?지금까지 컴파일할때 week11.하고 패키지도 붙여보고, -classpath . 도 해봤습니다...
-
미해결
디스코드 봇 만드는데 유튜브랑 똑같이하는데 왜 에러일까요
import discord, asyncio client = discord.Client() @client.event async def on_ready(): # 봇이 실행되면 한 번 실행됨 print("/n이세현따까리") await client.change_presence(status=discord.Status.online, activity=discord.Game("이세현따까리")) @client.event async def on_message(message): if message.content == "테스트": # 메세지 감지 await message.channel.send ("{} | {}, Hello".format(message.author, message.author.mention)) await message.author.send ("{} | {}, User, Hello".format(message.author, message.author.mention)) # 봇을 실행시키기 위한 토큰을 작성해주는 곳 client.run('discord token 이건 나중에 입력') 여기에 마지막 디스코드 토큰을 입력하면은 TypeError: Client.__init__() missing 1 required keyword-only argument: 'intents'이렇게 오류가 뜨는데 뭐가 문제일까요 ㅠㅠ
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
데디케이티드 서버 관련 질문
안녕하세요, 강의 관련 질문은 아니지만 궁금한 점이 생겨 질문 올립니다. 개인 프로젝트로 TPS 생존 게임을 제작하려 합니다. 한 경기에 10명 내외의 클라이언트가 접속할 예정입니다.언리얼 엔진에서 제공하는 리슨 서버와 데디케이티드 서버 중 어떤 방식이 알맞을까요?만약 데디케이티드 서버가 알맞다면 리슨 서버에서 구현했던 if(Hasauthority()) 등의 로직들은 제거해주면 되는 것인가요? 만약 데디케이티드 서버로 구성하면 어디서 클라이언트의 데이터 검증을 하게 되는지 등 리슨 서버와 어떻게 다르게 구성해야 하는지 잘 와닿지가 않습니다. characterplayer.cpp 등에 작성한 코드 자체가 서버 로직임과 동시에 클라이언트 로직인 것인지.. 인터넷에는 데디 서버를 구축하는 방법만 나와 있어서 여쭈어 봅니다. ++) 그리고 게임을 제작할 때 BP와 C++을 혼용해도 상관 없을까요? 강의는 전부 C++로 진행되어서 웬만하면 C++로 제작할 예정이지만, BP를 혼용하여 사용하는 것에 있어서 주의점 등이 있는지 궁금합니다.
-
미해결김영한의 실전 자바 - 중급 2편
섹션 10. Collections
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3, "ab", 4); 실행 결과 1번째 map = {a=1, b=2, c=3, ab=4} 2번째 map = {b=2, a=1, ab=4, c=3} 3번째 map = {ab=4, c=3, b=2, a=1} 4번째 map = {b=2, c=3, ab=4, a=1} 5번째 map = {b=2, a=1, ab=4, c=3}Map은 순서를 보장하지 않고, 중복을 허용하지 않습니다. HashMap에서는 key값을 가지고 hashCode를 구하고 hashIndex에 값을 보관하기에 입력한 순서대로 저장하는 것을 보장할 수 없습니다.그런데 map.of()로 생성을 했을 때는, 그 순서가 실행 할 때마다 달라져있습니다. 랜덤으로 돌린 것처럼...왜 매번 입력되는 값의 순서가 달라지는 건가요ㅠㅠ
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
장바구니 수량 변경 문의드립니다.
장바구니 수량 변경 및 커스텀 훅 강의에서 장바구니 수량 +,- 버튼 클릭하면 장바구니의 수량이 동적으로 변경되더라구요. 그런데 저는 화면에 수량이 변경되지않네요. ajax 로 정상 처리 되고 장바구니 데이터도 정상적으로 받아 와서 새로고침 하면 수량이 변경된것을 확인은 할 수 있어요. 소스코드:React CH11 에서 코드를 비교했는데 다르지 않았습니다. 확인부탁드릴게요~
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
공식예시문제 작업형2 에러코드
공식예시문제 작업형2 에러코드 문의 드립니다. [파일첨부]import pandas as pdtrain = pd.read_csv("data/customer_train.csv")test = pd.read_csv("data/customer_test.csv") train['환불금액'] = train['환불금액'].fillna(0)test['환불금액'] = test['환불금액'].fillna(0)# print(train.isnull().sum()) # 수치형 데이터 전처리cols = ['총구매액', '최대구매액', '환불금액', '방문일수', '방문당구매건수', '주말방문비율', '구매주기']from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()train[cols] = scaler.fit_transform(train[cols])test[cols] = scaler.fit(test[cols])# print(train.head()) # 오브젝트형 데이터 전처리cols = train.select_dtypes(include='O').columnstrain = pd.get_dummies(train, columns=cols)test = pd.get_dummies(test, columns=cols)print(train.head()) # 데이터 분리 from sklearn.model_selection import train_test_splitX_tr, X_val, y_tr, y_val = train_test_split(train.drop('성별', axis=1), train['성별'], test_size=0.2, random_state=2024) # 모델&평가from sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import roc_auc_scorerf = RandomForestClassifier(random_state=2024, max_depth=7, n_estimators=200)rf.fit(X_tr, y_tr)pred = rf.predict_proba(X_val)[:, 1]print(roc_auc_score(y_val, pred))# 0.6882619421394 여기까지는 에러없이 평가까지 잘되는데...#제출pred = rf.predict_proba(test)이걸 넣으면 아래처럼 에러가 떠요. 뭐가 문제일까요...ㅜ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
docker 실습중 에러가 발생햇습니다
> docker build .[+] Building 0.7s (2/2) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 931B 0.0s => ERROR [internal] load metadata for docker.io/library/node:14 0.7s------ > [internal] load metadata for docker.io/library/node:14:------Dockerfile:12-------------------- 10 | 11 | # 1. 운영체제 및 프로그램 설치(이미 리눅스, node, npm, yarn까지 모두 깔려있는 컴퓨터 다운로드 하는 방식) 12 | >>> FROM node:14 13 | 14 | # 2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사하기--------------------ERROR: failed to solve: node:14: failed to resolve source metadata for docker.io/library/node:14: error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/q6pcnbchjjksdmhtibwuxdqrk이런 에러가 뜨는데 어떻게 해결해야하나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
CreateMonster함수 질문
1.void CreatMonsters(Statinfo* monsters, int count)로 선언을 했는데 제가 여기서 monsters부분을 monsters[]로하니 오류가 나더군요 오류가 나는이유가 궁금합니다 Statinfo타입의 배열로 만들었는데 그러면 배열로 선언해줘야 하는거 아닌지 궁금합니다2. 1번과 연관된 질문입니다 void CreatMonsters(Statinfo* monsters, int count) 내부에서 랜덤밸류를 설정해서 몬스터의 i번쨰의 데이터를 집어넣는데 함수형식을 보면 Statinfo*라고해서 포인터로 선언했는데 내부 코드를보면 monster[i].hp를 사용하는데 배열관련된 부분은 .으로 접근해서 사용하는건 알겠는데 처음 함수를 선언할때 Statinfo*형식인데 ->로 접근해서 데이터를 변경하는게 맞는거아닌가요? 너무 헷갈립니다 3.EnterBattle(playerinfo,&monsters[index])을 실행할때 이런 모습인데 여기서 EnterBattle은 bool EnterBattle(Statinfo* playerinfo, Statinfo* monsterinfo);이런 모습인데 실행시킬때 &playerinfo가 아닌 그냥 playerinfo인 이유가 Entergame함수에서 인자로 받은 playerinfo가 애초에 주소값이기때문에 그냥 playerinfo로 넣는건가요? 그리고 또 monsters배열에는 &가 붙은이유는 &가없으면 주소값이아닌 그냥 값의 형태기때문에 &를 붙여 주소로 변경해주는건가요??
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
시간 계산...
안녕하세요. 저는 아래와 같이 interval 앞에 연산기호 '-' 를 넣고,left join 을 이용했는데요.self join 시에 이렇게 사용하면 오답처리될 확률이 높을까요? # Write your MySQL query statement below SELECT t.id as id FROM weather t LEFT JOIN weather y on t.recordDate - interval 1 day = y.recordDate WHERE T.temperature > y.temperature;
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
중간테이블에 대한 낙관적 락 적용법
현재 Member 테이블과 Appointment 테이블이 존재하는데, N:N 관계이기 때문에 아래와 같이 AppointmentUser라는 중간 테이블이 존재합니다.@Entity @Table(name = "appointment_and_user") public class AppointmentUser extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "apppointment_id", nullable = false) private Appointment appointment; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false) private Member member; @Enumerated(value = EnumType.STRING) @Column(name = "member_authority", nullable = false) private MemberAuthority memberAuthority; @Version private Long version;하나의 AppointmentUser 테이블은 약속과 멤버의 id를 하나씩 가집니다. 여기서 레포지토리의 코드는 이러합니다.public interface AppointmentUserRepository extends JpaRepository<AppointmentUser, Long> { ... @Lock(LockModeType.OPTIMISTIC) @Query("select au from AppointmentUser au where au.id = :id") AppointmentUser findByIdWithOptimisticLock(Long id);findByIdWithOptimistic 메서드를 통하여 특정 유저-약속 테이블의 데이터를 통해 AppointmentUser 객체를 반환합니다. 서비스 계층의 코드는 아래와 같습니다.@Transactional public void updateAuthority(Long appointmentId, Long loginMemberId, Long targetMemberId) { Member loginMember = memberRepository.getById(loginMemberId); Member targetMember = memberRepository.getById(targetMemberId); Appointment appointment = appointmentRepository.getById(appointmentId); AppointmentUser loginAppointmentUser = appointmentUserRepository.getByMemberAndAppointment(loginMember, appointment); AppointmentUser targetAppointmentUser = appointmentUserRepository.getByMemberAndAppointment(targetMember, appointment); appointment.changeTitle("asd"); validateIsAdminMember(loginAppointmentUser.getId()); MemberAuthority targetAuthority = targetAppointmentUser.getMemberAuthority(); targetAppointmentUser.updateAuthority(MemberAuthority.getAnotherAuthority(targetAuthority)); appointmentRepository.save(appointment); appointmentUserRepository.save(targetAppointmentUser); } private void validateIsAdminMember(Long loginAppointmentUserId) { if (appointmentRepository.findByIdWithOptimisticLock(loginAppointmentUserId).getMemberAuthority() != MemberAuthority.ADMIN) { throw new NotAdminMemberException(); } } <로직 설명>하나의 약속 내에 멤버 두명이 존재각 멤버들은 ADMIN or NORMAL 권한을 갖고 있음.두명 다 약속 내 에서 ADMIN 권한을 갖고 있다는 상황을 가정. (ADMIN은 AppointmentUser 엔티티의 MemberAuthority 라는 필드의 Enum 값입니다.)두명이 서로를 동시에 ADMIN에서 NORMAL로 권한을 박탈하는 경우, 하나의 약속 안에 ADMIN인 사람이 없어지는 예외적인 문제 상황이 발생함.그래서 @Version을 AppointmentUser 엔티티의 필드로 등록하여 해결하려고 했으나..사용자 A와 B가 있다고 할 때 service 코드 내의 validateIsAdminMember 메서드를 통해 상대방의 권한을 박탈하려는 유저(본인)가 ADMIN인지 검증하여 ADMIN이 맞다면 박탈하고, ADMIN이 아니라면, 예외를 던지게 끔 하는 로직에서,레포지토리 내의 findByIdWithOptimisticLock 메서드를 동시에 접근했을때 Version 필드를 통해 동시성 문제를 제어할 수 있다고 생각했으나..validateIsAdminMember로 검증하는 A와 B의 AppointmentUser 엔티티는 서로 다른 객체(데이터)이기 때문에 서로 다른 테이블의 Version 값을 변경하기 때문에 동시성 보장이 안됨..그래서 Appointment에 Version필드를 넣어주려 했지만, Version값은 해당 테이블에 변화가 생겨야 변한다.하지만 로직상, AppointmentUser(중간테이블)에 변화가 생기는게 맞다...위와 같은 중간 테이블 사용으로 인한 문제가 발생하였을 때 어떻게 강의자님이시라면 어떻게 해결하실지 궁금합니다!
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
커뮤니티를 올리고 난 후 404 page
커뮤니티 name을 Name1 이렇게 지었으면http://localhost:3000/r/Name1 이런식으로 바로 넘어가져서 404 page가 뜨는데요 이유가 create.tsx파일const handleSubmit = async (event: FormEvent) => { event.preventDefault(); try { const res = await axios.post("/subs", { name, title, description }); router.push(`/r/${res.data.name}`); } catch (error: any) { console.log(error); setErrors(error.response.data); } };여기서 router.push(`/r/${res.data.name}`);이 부분때문에 그런건가요? 원래 커뮤니티 등록하면 넘어가지는게 정상인가요? 강의에서는 안넘어가는걸로 보이는데...
-
미해결홍정모의 따라하며 배우는 C언어
exe 확장자
8.3 공부 중 교수님이 주신, 워크북 파일로 학습 중인데, exe파일이 없습니다. 저기 있는 exe.recipe로 cmd에 해봐도 되지 않습니다. 미리 답변 감사합니다.
-
미해결2시간으로 끝내는 프론트엔드 테스트 기본기
[공유] cy.visit() failed trying to load;
위 화면처럼 connect ECONNREFUSED::1:54382등 locahost에 접근할 수 없다고 나오면 cypress.config.ts에서 baseurl 설정해야합니다.(https://parkparkpark.tistory.com/186)import { defineConfig } from "cypress"; export default defineConfig({ e2e: { baseUrl: "http://localhost:3000", setupNodeEvents(on, config) { // implement node event listeners here }, }, });
-
해결됨야, 너도 AI 서비스 만들 수 있어. [이미지 AI 서비스 서버리스 풀스택]
도커 파일 빌드 오류 문의
도커 파일 빌드 오류 문의입니다.게시판을 보니 비슷한 오류가 있었던거 같네요맥에서도 해보고 윈도우에서도 해봤는데 동일하게 안되네요..오늘 하루종일 빌드만 했네요..어떤 부분을 잘못 하고 있는지 가이드 부탁합니다.. s3 에 사용할 iam 사용자 권한을 별도로 부여했는데요 . 새로 생성된 사용자의 권한 문제로 오류가 나는거 같네요.. 영상에서 한거와 같이 동일하게 했는데..오류가 나네요 혹시 다른 세팅이 있을까요?? => ERROR [11/18] RUN python3 download.py 11.1s------> [11/18] RUN python3 download.py:5.085 The cache for model files in Transformers v4.22.0 has been updated. Migrating your old cache. This is a one-time only operation. You can interrupt this and resume the migration later on by calling transformers.utils.move_cache().0it [00:00, ?it/s]9.892 downloading reg images...9.892 BUCKET_NAME:: dev-raymong-lecture-api-uploadsbucketc4b27cc7-547dbvnhp66w9.899 Traceback (most recent call last):9.899 File "download.py", line 64, in <module>9.899 download_model()9.899 File "download.py", line 20, in download_model9.899 download_reg_images()9.899 File "/s3_file_manager.py", line 20, in download_reg_images9.899 bucket.download_file(filepath, savepath)9.899 File "/opt/conda/lib/python3.8/site-packages/boto3/s3/inject.py", line 279, in bucket_download_file9.899 return self.meta.client.download_file(9.899 File "/opt/conda/lib/python3.8/site-packages/boto3/s3/inject.py", line 192, in download_file9.899 return transfer.download_file(9.899 File "/opt/conda/lib/python3.8/site-packages/boto3/s3/transfer.py", line 405, in download_file9.899 future.result()9.899 File "/opt/conda/lib/python3.8/site-packages/s3transfer/futures.py", line 103, in result9.899 return self._coordinator.result()9.899 File "/opt/conda/lib/python3.8/site-packages/s3transfer/futures.py", line 266, in result9.899 raise self._exception9.899 File "/opt/conda/lib/python3.8/site-packages/s3transfer/tasks.py", line 269, in _main9.899 self._submit(transfer_future=transfer_future, **kwargs)9.899 File "/opt/conda/lib/python3.8/site-packages/s3transfer/download.py", line 354, in _submit9.899 response = client.head_object(9.899 File "/opt/conda/lib/python3.8/site-packages/botocore/client.py", line 565, in apicall9.899 return self._make_api_call(operation_name, kwargs)9.899 File "/opt/conda/lib/python3.8/site-packages/botocore/client.py", line 1021, in makeapi_call9.899 raise error_class(parsed_response, operation_name)9.899 botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden------Dockerfile:32--------------------30 | ADD s3_file_manager.py .31 | ADD download.py .32 | >>> RUN python3 download.py33 |34 | ADD convert_diffusers_to_original_stable_diffusion.py .--------------------ERROR: failed to solve: process "/bin/sh -c python3 download.py" did not complete successfully: exit code: 1View build details: docker-desktop://dashboard/build/default/default/hu4bblbekud4p75go1rdofetm