묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
NPM 의 Certificates 작업 재질문
안녕하세요 Certifictes 진행에 위와 같은 error 메세지가 뜹니다. 도움을 좀 받을 수 있을까요?도메인 관리페이지에서 서브도메인 생성하였고 NPM Proxy Hosts에서 서브도메인 등록하였습니다. 다음 단계인 인증서 생성후 SSL 항목에서 선택 저장으로 이해했는데 인증서 생성이 안되는 것 같습니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
ApplyService와 Consumer서비스의 db공유?
안녕하세요 강의 잘 듣고 있습니다.ApplyService와 Consumer서비스의 db관련 질문을 하려 합니다.9:30분쯤부터 ApplyService와 컨슈머서비스를 분리해서 테스트를 진행하는데 AppliServiceTest를 보면 자신의 CouponRepository에서 count개수가 100개인지 체크하는것 같습니다. 저는 쿠폰생성 및 저장 로직을 전부 컨슈머서비스로 옮겨서 여기서 쿠폰테이블을 관리한다고 생각했는데 어떻게 ApplyService가 자신이 이전에 사용하던 CouponRepository에서 count 체크가 가능한건지 궁금합니다. 혹시 두 서비스가 하나의 db를 공유하는건가요?
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
Nginx Proxy Manager 의 Certificates 문제
아래 다른 분이 올려주신 것과 동일하게 저도 알려주신 것과 다르게 Create"도메인" 이 안뜨네요.energynex.kr 도메인이고 알려주신 호스팅.kr 에서 구매했습니다. 위 단계 전까지는 누락사항 없어 교육 내용과 똑같이 따라왔는데 아래 분도 뽀족한 방안이 없는 것 같은데 가능하다면 어찌할지 도움 주시면 감사하겠습니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
SSH 에서 비밀번호 입력할떄 어떤 비밀번호를 입력하나요?
도메인제공 호스팅KR 웹 로그인 비번을 입력했는데 첨부와 같이 access denied 라고 나오네요 도움 부탁드립니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
npm 접속 관련,,
남박사님 안녕하세요.알려주신 강의대로 따라해서.kr 주소로 처음부터 실행해서 완성했는데요!영문블로그 해보려고,.com 도메인을 새로 구매해서 다시하는 중인데,npm이ip로는 접속이되는데 ( ip:81 )도메인 주소로는 접속이 안됩니다. ㅠ.ㅠ (.com:81) 제가 완전 컴맹이라,처음부터 따라할때는 됐는데, 다만들어진거 다시하려니까 막히네요 ㅜㅜ흑흑뭘 만져야 할지 알려주시면 감사드리겠습니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
19강 아웃풋 결과가 좀 이상하네요.
html maker 노드로 글을 출력해서 메모장에 저장 후 크롬으로 보니까 저렇게 보이는데요. 제미나이 3.0 pro로 했습니다. 왜 저럴까요?
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
Python runner unavailable 오류
12강의 20분쯤 부터 code 노드를 추가해서 파이썬 코드를 넣는 부분에서 첨부한 사진과 같은 에러가 뜹니다. 에러 메세지를 보니 서버에 파이썬 설치가 안된 것 같은데, 그동안 그대로 강의를 따라왔는데 어느 단계에서 파이썬 설치를 놓친건지 모르겠어서 질문을 드립니다.
-
미해결대세는 쿠버네티스 (초급~중급편)
7강 마지막 대시 보드 출력에 관한 문제
실습 자료실에 신규 반영된 대로 Kubernetes Cluster 설치 - Windows 를 진행했습니다. vagrant up 도 문제없이 진행되고 token 으로 join 도 문제 없이 진행되어kubectl get pod -A, kubectl get nodes로 결과가 정상 출력되는 걸 확인했습니다만 마지막 대시보드에서 pods is forbidden: User "system:bootstrap:0f4qfi" cannot list resource "pods" in API group "" in the namespace "default"namespaces is forbidden: User "system:bootstrap:0f4qfi" cannot list resource "namespaces" in API group "" at the cluster scope cronjobs.batch is forbidden: User "system:bootstrap:0f4qfi" cannot list resource "cronjobs" in API group "batch" in the namespace "default" 등의 에러로 대시 보드에서 자원들이 출력되지 않고 있습니다. 혹시 원인이 무엇인지 알려주실 수 있으실까요?
-
해결됨비전공자도 이해할 수 있는 Docker 입문/실전
mysql_data 폴더 내부에 다른 파일이 있는데도 잘 되는 경우
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql 이 명령을 하기 전에 mysql_data 폴더는 만들어 놔도 되지만, 폴더 내부에 다른 파일이 있으면 안 된다고 이해했습니다. 그런데 바로 이전 '[실습] Docker로 MySQL 실행시켜보기 - 3 강의' https://jscode.notion.site/Docker-MySQL-3-f07a2d5a24d24bf184e78622e55a6d8c에서 비밀번호 바꿔 보는 테스트를 할 때, password123으로 컨테이너를 실행한 뒤, 컨테이너를 삭제한 후 mysql_data 폴더는 따로 삭제하지 않아서 mysql_data 내부엔 파일들이 있었을 텐데, 그 이후에 pwd1234로 바꿔서 컨테이너를 다시 생성할 때 오류가 안 났던 이유는 뭔가요?
-
해결됨비전공자도 이해할 수 있는 Docker 입문/실전
도커 허브에서 postgres 버전 확인하는 법
도커 허브에 있는 postgres:latest인데https://hub.docker.com/layers/library/postgres/latest/images/sha256-c84595a367a3fe5a4d9dce011490da38c462190e6ac7afb7d2a4c49436c80656 이건 postgres 몇 버전인가요? 다른 Q&A 보니 postgres 버전 관련 얘기가 있어서 최신 postgres가 18버전인지, 그 이상이 나왔는지 보고 싶었는데 저 링크를 들어가도 어디서 확인해야 하는지 모르겠습니다. 그리고 newest는https://hub.docker.com/layers/library/postgres/14.20-alpine3.23/images/sha256-df852d122662b3a4ef0662daf3572ec3f6251924fbd2e44bc5d9d8ed252ae767 postgres:14.20-alpine3.23인데, 이건 14 버전인가요? postgres 18버전도 나온 거로 알아서 14라는 게 버전은 아닌 거 같은데, 어디서 버전을 확인할 수 있는지 궁금합니다.
-
해결됨비전공자도 이해할 수 있는 Docker 입문/실전
보충 자료와도 관련된 추가 내용
"[보충 자료] Docker로 PostgreSQL 실행시켜보기"에 관련 내용이 있기는 한데, 제가 이걸 못 보고 /var/lib/postgresql/data라고 썼다가 제대로 작동이 안 돼서 GPT에 물어보면서 해결했습니다. /var/lib/postgresql/data를 /var/lib/postgresql 이렇게만 바꿔도 오류는 발생하지 않는 것 같습니다. 보충 자료에 나온 것처럼 /var/lib/postgresql/<버전>/docker로 쓰는 거랑 완전히 같은 게 맞는지 확신은 안 되지만 강의 따라하면서 문제는 없었습니다. docker run -d -e POSTGRES_PASSWORD=password123 -p 5432:5432 -v D:\docker-postgresql/postgresql_data:/var/lib/postgresql postgres 위 명령어를 입력하면, 데이터들이 있는 호스트 디렉터리 주소는 아래와 같은 구조가 됩니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
블로그 강의 두번 듣고 드디어 완성^^
https://goagent.kr"은퇴준비" "재테크"를 주제로 만들어 봤습니다.부족한 부분이 있지만 앞으로 조금씩 수정해 나가겠습니다..저는 50대 이구요^^강의 듣는 모든분들 힘내세요^^박사님의 친절하고, 자세한 강의 내용에 따라 하다보니 이렇게 만들게 되네요!!(강의 내용이 좋아, 다른 강의도 모두 신청해서 듣고 있습니다^^)좋은 강의 해주신, 박사님께 다시 한번 감사드립니다.^^
-
미해결대세는 쿠버네티스 (초급~중급편)
Could not resolve host: externalname1; Unknown error
안녕하세요endpoint를 통해서 외부로 curl을 날리는것은 성공을 했는데 externalname으로 curl 하면 아래 사진처럼 오류가 나고있습니다.0curl: (6) Could not resolve host: externalname1; Unknown error 서비스도 잘만었고 externalName만 문제가 되고있습니다. 한번만 봐주세요ㅠㅠ
-
해결됨eks를 활용한 spring 운영서버 배포(feat. devops의 모든것)
openjdk:17-jdk-alpine이 docker hub에서 삭제된 거 같습니다.
ERROR: failed to build: failed to solve: openjdk:17-jdk-alpine: failed to resolve source metadata for docker.io/library/openjdk:17-jdk-alpine: docker.io/library/openjdk:17-jdk-alpine: not found FROM eclipse-temurin:17-jdk-alpine AS stage1 <- eclipse jdk로 수정 후 정상 작동하였습니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
10강 29분 45초 부분에서 오류납니다...
여기서 이런 오류가 떠서 url을 들어가보니까 이런식으로 뜹니다... gpt에게 물어보니 -----지금 무슨 상태냐http://api.ownstory.kr/ → 301로 https로 잘 리다이렉트됨✅ 도메인/DNS/가상호스트 매칭은 정상https://api.ownstory.kr/ → HEAD(= -I)도 500✅ “POST 바디 처리 문제”가 아니라, 요청을 받는 순간 공통으로 500을 내고 있음→ OpenResty/Nginx 레벨 공통 로직(특히 Lua/인증/프록시) 문제 가능성 ↑https://82.208.22.139/ -H "Host: api.ownstory.kr" → TLS handshake 실패이건 이상해 보이지만, 윈도우 curl(schannel) + IP로 SNI 없이 접속할 때 흔히 깨져.즉 이 실패는 “서버가 고장”의 결정적 증거가 아니라, SNI/인증서 설정 때문에 IP 직결이 막힌 케이스로 보는 게 맞아.(도메인으로 접속하면 TLS는 정상인데, IP로 바로 때리면 인증서 선택이 안 맞아서 실패하는 경우가 흔함)결론 한 줄✅API 자체(백엔드) 라우트 문제가 아니라, OpenResty가 전역적으로 500을 내는 상태야.→ 서버 로그 없이는 100% 확정은 못 해도, 원인 범위는 거의 이 두 개로 수렴해:가장 유력OpenResty 설정/스크립트(Lua)에서 런타임 에러(예: access_by_lua에서 인증 토큰 체크하다 nil 참조, 파일 경로 오류, env 누락 등)리버스프록시 업스트림 설정이 잘못되어 OpenResty가 내부적으로 500 처리(보통은 502가 많지만, Lua/커스텀 에러 핸들링이 있으면 500으로 뿜기도 함)이렇게 이야기를 해주는데... 지금 무슨 상태냐http://api.ownstory.kr/ → 301로 https로 잘 리다이렉트됨✅ 도메인/DNS/가상호스트 매칭은 정상https://api.ownstory.kr/ → HEAD(= -I)도 500✅ “POST 바디 처리 문제”가 아니라, 요청을 받는 순간 공통으로 500을 내고 있음→ OpenResty/Nginx 레벨 공통 로직(특히 Lua/인증/프록시) 문제 가능성 ↑https://82.208.22.139/ -H "Host: api.ownstory.kr" → TLS handshake 실패이건 이상해 보이지만, 윈도우 curl(schannel) + IP로 SNI 없이 접속할 때 흔히 깨져.즉 이 실패는 “서버가 고장”의 결정적 증거가 아니라, SNI/인증서 설정 때문에 IP 직결이 막힌 케이스로 보는 게 맞아.(도메인으로 접속하면 TLS는 정상인데, IP로 바로 때리면 인증서 선택이 안 맞아서 실패하는 경우가 흔함)결론 한 줄✅API 자체(백엔드) 라우트 문제가 아니라, OpenResty가 전역적으로 500을 내는 상태야.→ 서버 로그 없이는 100% 확정은 못 해도, 원인 범위는 거의 이 두 개로 수렴해:가장 유력OpenResty 설정/스크립트(Lua)에서 런타임 에러(예: access_by_lua에서 인증 토큰 체크하다 nil 참조, 파일 경로 오류, env 누락 등)리버스프록시 업스트림 설정이 잘못되어 OpenResty가 내부적으로 500 처리(보통은 502가 많지만, Lua/커스텀 에러 핸들링이 있으면 500으로 뿜기도 함) 이렇게 얘기하는데 어떻게 해결해야되는건지 모르겠습니다 ㅠㅠ
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
워드프레스 관련
워드프레스 접속하면 아래와 같은 문구가 상단에 뜹니다Deprecated: 함수 WP_Dependencies->add_data()이(가) 6.9.0 버전 이후로 폐기예정인 인수로 호출됐습니다. IE 조건부 주석은 지원되는 모든 브라우저에서 무시됩니다. in /var/www/html/wp-includes/functions.php on line 6131이건 어떻게 해야 하나요?
-
해결됨비전공자도 이해할 수 있는 Docker 입문/실전
현업에서 MySQL은 RDS와 도커 볼륨 중 어떤 걸 사용하나요?
아니면 MySQL을 사용할 때 도커와 RDS를 조합해서 사용할 수도 있나요? 현업에서 어떤 식으로 사용하는지 궁금합니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
14강 아웃풋 질문
보시는 것처럼 아웃풋이 나왔는데 마지막에 끝마무리가 안난 상태에서 잘려서 나오는데. 글자수 제한이 있나요? 참고로 클로드로 진행한 결과구요.제미나이 2.5pro로 하니까 아웃풋이 아예 아무것도 안나오네요.
-
해결됨토스 개발자와 함께하는 Data Workflow Management 기반의 대용량 데이터 처리 설계 패턴
강의에서사용하신 root.py 파일이 안보여서 실습하면서 만든 텍스트 공유 드려요
dynamicDagfrom datetime import datetime, timedelta from airflow import DAG from airflow.operators.python import PythonOperator from db_utils import execute_query import logging def log_task_start(message): logging.info(f"[START] {message}") def log_task_end(message): logging.info(f"[END] {message}") # 분석할 주식 종목 리스트 (설정으로 관리) STOCK_SYMBOLS = ['AAPL','GOOGL','MSFT','AMZN','TSLA'] default_args = { 'owner': 'data-team', 'depends_on_past': False, 'start_date': datetime(2024, 1, 1), 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, 'retry_delay': timedelta(minutes=5), } def analyze_stock_data(symbol, **context): """주식 종목에 대해서, 최근 30일간의 주식 데이터를 분석""" log_task_start(f"주식 분석 - {symbol}") query = """ SELECT symbol, AVG(price) as avg_price, MAX(price) as max_price, MIN(price) as min_price, SUM(volume) as total_volume, COUNT(*) as trading_days FROM stock_prices WHERE symbol = %s AND trade_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) GROUP BY symbol """ result = execute_query(query, [symbol]) if result: data = result[0] print(f"{symbol} 분석 결과:") print(f" 평균 가격: ${data[1]:.2f}") print(f" 최고 가격: ${data[2]:.2f}") print(f" 최저 가격: ${data[3]:.2f}") print(f" 총 거래량: {data[4]:,}") print(f" 거래일수: {data[5]}일") log_task_end(f"주식 분석 - {symbol}") return result def create_stock_dag(symbol): """개별 주식에 대한 DAG 생성 함수""" dag_id = f'stock_analysis_{symbol.lower()}' dag = DAG( dag_id, default_args=default_args, description=f'{symbol} 주식 데이터 분석 DAG', schedule='@daily', catchup=False, tags=['dynamic', 'stock', 'analysis', symbol] ) # 데이터 품질 체크 태스크 def check_data_quality(**context): query = """ SELECT COUNT(*) as count FROM stock_prices WHERE symbol = %s AND trade_date = CURDATE() - INTERVAL 1 DAY """ result = execute_query(query, [symbol]) logging.info(f"{symbol} 데이터 품질 체크: {result[0][0] if result else 0}") return result data_quality_check = PythonOperator( task_id=f'check_data_quality_{symbol.lower()}', python_callable=check_data_quality, dag=dag ) # 주식 분석 태스크 analyze_task = PythonOperator( task_id=f'analyze_{symbol.lower()}', python_callable=analyze_stock_data, op_kwargs={'symbol': symbol}, dag=dag ) # 결과 저장 태스크 def save_results(**context): query = """ INSERT INTO daily_stats (symbol, summary_date, avg_price, total_volume, trade_count) SELECT %s, CURDATE() - INTERVAL 1 DAY, AVG(price), SUM(volume), COUNT(*) FROM stock_prices WHERE symbol = %s AND trade_date = CURDATE() - INTERVAL 1 DAY ON DUPLICATE KEY UPDATE avg_price = VALUES(avg_price), total_volume = VALUES(total_volume), trade_count = VALUES(trade_count) """ result = execute_query(query, [symbol, symbol]) logging.info(f"{symbol} 분석 결과 저장 완료") return result save_results = PythonOperator( task_id=f'save_analysis_{symbol.lower()}', python_callable=save_results, dag=dag ) # 태스크 의존성 설정 data_quality_check >> analyze_task >> save_results return dag # Dynamic DAG 생성 # 각 주식 종목에 대해 별도의 DAG 생성 for symbol in STOCK_SYMBOLS: dag_id = f'stock_analysis_{symbol.lower()}' globals()[dag_id] = create_stock_dag(symbol)CrossDag (트리거 센서)from datetime import datetime, timedelta from airflow import DAG, Dataset from airflow.operators.python import PythonOperator from airflow.operators.trigger_dagrun import TriggerDagRunOperator from airflow.sensors.external_task import ExternalTaskSensor from db_utils import execute_query import logging #기본 설정 default_args = { 'owner': 'data-team', 'start_date': datetime(2024, 1, 1), 'retries': 1, 'retry_delay': timedelta(minutes=2), } # ======================================================== # TriggerDagRunOperator # ======================================================== def process_data(**context): """간단한 데이터 처리""" logging.info("데이터 처리 시작") query = "SELECT COUNT(*) FROM stock_prices" result = execute_query(query) count = result[0][0] if result else 0 logging.info(f"처리된 레코드 수 : ${count}") return {"record_count": count} trigger_dag = DAG( 'trigger_example_dag', default_args=default_args, description='TriggerDagRunOperator 예제', schedule='@daily', catchup=False, tags=['cross-dag', 'trigger'] ) process_task = PythonOperator( task_id='process_data', python_callable=process_data, dag=trigger_dag ) #다른 DAG를 트리거 (가장 기본적인 사용법) trigger_next_dag = TriggerDagRunOperator( task_id='trigger_sensor_dag', trigger_dag_id='sensor_example_dag', wait_for_completion=False, # 완료를 기다리지 않음 dag=trigger_dag ) process_task >> trigger_next_dag # ======================================================== # ExternalTaskSensor # ======================================================== # 두 번째 DAG: 외부 태스크 대기 def analyze_triggered_data(**context): """트리거된 후 분석 작업""" logging.info("외부 태스크 완료 후 분석 시작") # 간단한분석로직 analysis_result = {"status": "completed", "timestamp": str(datetime.now())} logging.info(f"분석 완료: {analysis_result}") return analysis_result sensor_dag = DAG( 'sensor_example_dag', default_args=default_args, description='ExternalTaskSensor 예제', schedule=None, # 트리거로만 실행됨 catchup=False, tags=['cross-dag', 'sensor'] ) # 외부 DAG의 태스크 완료를 기다림 def get_most_recent_dag_run(dt): """가장 최근의 DAG 실행을 찾는 함수""" from airflow.models import DagRun from airflow.utils.session import provide_session @provide_session def get_recent_run(session=None): recent_run = session.query(DagRun).filter( DagRun.dag_id == 'trigger_example_dag', DagRun.state == 'success' ).order_by(DagRun.execution_date.desc()).first() if recent_run: return recent_run.execution_date return dt return get_recent_run() wait_for_external_task = ExternalTaskSensor( task_id='wait_for_process_data', external_dag_id='trigger_example_dag', # 기다릴 DAG external_task_id='process_data', # 기다릴 태스크 execution_date_fn=get_most_recent_dag_run, #최근성공한 실행 DAG timeout=60, # 1분 타임아웃 poke_interval=5, # 5초마다 확인 allowed_states=['success'], #성공 상태만 기다림 dag=sensor_dag ) analyze_task = PythonOperator( task_id='analyze_triggered_data', python_callable=analyze_triggered_data, dag=sensor_dag ) wait_for_external_task >> analyze_task # ======================================================== # Dataset Denpendencies # ======================================================== # Dataset 정의 (Dataset Dependencies 용) market_data_dataset = Dataset("market_data") analysis_dataset = Dataset("analysis_result") def create_market_data(**context): """마켓 데이터를 생성하고 Dataset을 업데이트""" logging.info("마켓 데이터 생성 시작") # 실제 데이터 생성 로직 query = """ SELECT symbol, AVG(price) as avg_price FROM stock_prices WHERE trade_date = CURDATE() - INTERVAL 1 DAY GROUP BY symbol LIMIT 3 """ result = execute_query(query) market_data = [] if result: for row in result: market_data.append({"symbol": row[0], "avg_price": float(row[1])}) logging.info(f"생성된 마켓 데이터: {market_data}") return market_data dataset_producer_dag = DAG( 'dataset_producer_dag', default_args=default_args, description='Dataset Dependencies - 생산자', schedule='@daily', catchup=False, tags=['cross-dag', 'dataset', 'producer'] ) create_data_task = PythonOperator( task_id='create_market_data', python_callable=create_market_data, outlets=[market_data_dataset], # Dataset 업데이트 알림 dag=dataset_producer_dag ) # Consumer def consume_market_data(**context): """생성된 마켓 데이터를 소비하여 분석""" logging.info("마켓 데이터 소비 및 분석 시작") # Dataset이 업데이트되면 자동으로 실행됨 query = "SELECT COUNT(DISTINCT symbol) FROM stock_prices" result = execute_query(query) symbol_count = result[0][0] if result else 0 analysis = { "total_symbols": symbol_count, "analysis_time": str(datetime.now()), "status": "Dataset 기반 분석 완료" } logging.info(f"Dataset 기반 분석 결과: {analysis}") return analysis def generate_final_report(**context): """최종 리포트 생성""" logging.info("최종 리포트 생성") ti = context['ti'] analysis = ti.xcom_pull(task_ids='consume_market_data') report = f"Dataset 기반 리포트: {analysis.get('total_symbols', 0)}개 심볼 분석 완료" logging.info(report) return report dataset_consumer_dag = DAG( 'dataset_consumer_dag', default_args=default_args, description='Dataset Dependencies - 소비자', schedule=[market_data_dataset], # Dataset이 업데이트되면 실행 catchup=False, tags=['cross-dag', 'dataset', 'consumer'] ) consume_task = PythonOperator( task_id='consume_market_data', python_callable=consume_market_data, outlets=[analysis_dataset], # 다음 Dataset 업데이트 dag=dataset_consumer_dag ) report_task = PythonOperator( task_id='generate_final_report', python_callable=generate_final_report, dag=dataset_consumer_dag ) consume_task >> report_task
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
12강 클러스터 에이전트
클러스터링 에이전트까지 진행을 했는데요. 익스큐트 시키면 클러스터링에서 멈추지 않고 계속 돌아가네요. 하도 오래동안 돌아가서 멈췄더니 저렇게 숫자가 보이구요. 혹시나해서 다시 진행해봐도 또 계속 클러스터링에서 돌아갑니다. 뭐가 문제일까요?