[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] Order <-> Member 는 N:1 Order <-> Delivery 는 1:1 관계이며, proxy 객체로 들고오는 것이 목적이 아니기 때문에 fetch join 을 이용하여 바로 데이터를 DB에서 들고 온 거고 OrderItems 는 조회문에서 뺀 다음 Order <-> OrderItmes 1:N Lazy 를 이용하여 proxy 상태로 들고 온 상태에서 .get() 과 같은 함수를 이용해서 그때 데이터를 채워놓은거라고 이해하면 될까요? OrderItems에 데이터가 DB데이터가 채워질 때 N+1 과 같은 문제가 발생하지 않은 건 hibernate.default_batch_fetch_size 또는 @BatchSize 이용하기에 그런 거구요. 그럼 만약에 Order 주문 조회 후 Controller 에서 해당 OrderItems 의 Class 를 확인하면 proxy로 나오게 되고, order.getOrderItems() 와 같이 호출을 하게 되면 OrderItems는 proxy 객체가 아닌 실제 DB조회데이터가 나오게 되는 걸까요??
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 (sklearn.metrics) 이 패키지에 RMSE, RMSLE, MAPE 등 다 추가 됐다고 말씀하셨던 것 같은데 작업형2 모의문제2 에서는 직접 수식을 계산해야 한다고하셔서 혹시 어떤게 맞는건가요? 패키지에 추가 됐긴했는데 시험장에선 업데이트가 안됐다고 이해하면 될까요??
다중분류 평가지표(f1_score) 에서 문자인 경우 pos_label = ' ' 을 적용해서 검증 자료에 대해 평가 결과를 확인하는데, 이후 test 자료를 저장할때는 문제에서 요구하는 히나의 값을 (A,B,C 중에서 B선택) 고르는게 아니라 pred로 왜 저장해야 하는지 긍금합니다~! 다중분류 평가지표(roc_auc) 에서 0,1,2 중에서 2를 선택해야 할 경우 pred_prob( , pred[ : ,2] ) 이렇게 2를 적용해야 되는것이 맞는지 문의드립니다~!
작업형1 모의문제3 문제7 [질문1] 풀이과정에서 2001행의 평균 조건을 cond로 사용하고 2003행의 평균 조건도 cond로 사용하셨는데, 왜 cond1, cond2 구분이 없어도 각각의 값이 출력이 되는건가용!?ㅠㅠ [질문2] df.head() df=df.T df.head() print('2001 평균:', df[2001].mean()) print('2003 평균:', df[2003].mean()) print('A :', sum(df[2001]>df[2001].mean())) print('B :', sum(df[2003]<df[2003].mean())) print('A+B :', sum(df[2001]>df[2001].mean()) + sum(df[2003]<df[2003].mean())) 혼자 먼저 풀어보는 과정을 해봤는데요 이전에 행/열 트랜스폼 하는 거 알려주셔서~! df.T로, 행/열 트랜스폼하구 mean()으로, 각 열(컬럼)에 대해 평균 구하고 sum으로, 크거나 작은 수의 개수를 구했는데.. 2001 평균: 100.735 2003 평균: 97.215 A : 100 B : 102 A+B : 202 요렇게 나왔어요.. loc로 풀은 내용과 왜 다를까요?ㅠ 꼭 loc써야 하는 문제였을까요?!ㅠㅠ
안녕하세요! JVM 파트를 복습하다가 궁금한 점이 생겨 질문드립니다. Young Generation(Eden → S0 ↔ S1) → Old Generation → Permanent 영역으로 객체가 이동하는 과정에서 객체의 age가 세대 간 이동(Eden → S0 ↔ S1 포함)을 거치며 증가한다고 설명해주셨습니다. 그런데 제가 알고 있기로 age는 Young Generation 내의 Survivor 영역(S0 ↔ S1)을 이동할 때에만 증가하는 것으로 알고 있습니다. age는 객체가 Minor GC를 거쳐 살아남은 횟수로 일반적으로 약 15회 생존하면 Old Generation으로 승격될 수 있는 조건이 되고, Old Generation으로 승격된 이후에는 더 이상 age가 증가하지 않는다고 알고 있습니다. 혹시 이 동작 방식이 JVM 구현체에 따라 달라질 수 있는 부분인지 아니면 제가 알고 있는 age는 다른 age인 것인지 궁금해서 질문드립니다:)
EDA 과정 중에 # 기초통계 train(object) train.describe(include='O') # 기초통계 test(object) test.describe(include='O') train과 test 데이터의 unique 값이 동일하다면 실제 카테고리 값 자체 비교 없이 바로 인코딩 해도 문제 없나요? 카테고리 값을 비교해서 안전하게 하고 싶지만, 굳이 안 그래도 되는 거면 안 하려고 합니다!!
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
안녕하십니까. 강의 잘 듣고 있습니다. 다름이 아니라 선생님의 풀이와 제 풀이의 답은 같으나 과정에서 약간의 차이가 있어 질문 드립니다. 우선 예제 2번의 경우 저는 import requests from bs4 import BeautifulSoup res=requests.get(' https://davelee-fun.github.io/ ') soup=BeautifulSoup(res.content, 'html.parser') items= soup.select _one('h1.sitetitle') print(items.get_text()) 이러한 풀이 방식을 썼습니다. 의도를 표현해보자면 'Teddy의 선물 블로그' 라는 단일 데이터 를 뽑아낼 것이므로 'select'가 아닌 특정 포인트만 뽑아 주는 'select_one'을 사용 했으며, 역시나 단일 데이터를 뽑아낼 것이므로 굳이 반복문인 'for ~ in ~'을 쓰지 않고 'print'만을 사용 했습니다. 이러한 저의 접근 방식이 오류가 없는지 궁금합니다. 아래의 풀이는 선생님께서 해주신 풀이 입니다. import requests from bs4 import BeautifulSoup url = ' https://davelee-fun.github.io/ ' res = requests.get(url) soup = BeautifulSoup(res.content, 'html.parser') items = soup.select ('h1.sitetitle') for item in items: print (item.get_text().strip()) 예제 4번 질문 입니다. 4번의 경우 저의 풀이는 import requests from bs4 import BeautifulSoup res=requests.get(' https://davelee-fun.github.io/ ') soup=BeautifulSoup(res.content, 'html.parser') items= soup.select ('section.featured-posts h4.card-text') for item in items: print(item.get_text().strip()) 이러한 풀이 방식을 썼습니다. 그 의도는 items= soup.select ('section.featured-posts h4.card-text')에서 보면 section 이라는 태그의 .featured-posts 이라는 클래스명 산하의 h4 이라는 태그의 .card-text 클래스명을 가진 것들의 데이터를 추출하고 싶다는 뜻 이였습니다. 저는 이것을 'section.featured-posts h4.card-text' 이라는 방식으로 띄워쓰기 를 이용하여 한 번에 표현해도 문제 없을 것이라고 판단했으나 선생님의 풀이를 보았을 때 import requests from bs4 import BeautifulSoup url = ' https://davelee-fun.github.io/ ' res = requests.get(url) soup = BeautifulSoup(res.content, 'html.parser') box = soup.select _one('section.featured-posts') items = box.select ('h4.card-text') for item in items: print (item.get_text().strip()) 라는 방식으로 어떻게 보면 두 번으로 나누어 표현했음을 이해했습니다. 단순 방식의 차이인지 제가 틀리게 표현 했는데 우연히 맞은 것인지 알고 싶습니다. 마지막으로 6번 예제 질문입니다. 6번의 경우 저의 풀이는 import requests from bs4 import BeautifulSoup res=requests.get(' https://davelee-fun.github.io/ ') soup=BeautifulSoup(res.content, 'html.parser') items= soup.select ('div.container.text-center > span') print(items.get_text().strip()) 이러합니다. 의도를 설명하지면 div 이라는 태그의 .container 와 .text-center 이라는 두 개의 클래스명을 지닌 것 바로 아래의 > span 라는 태그 내의 데이터를 추출하고 싶다는 의미였습니다. 이렇게 하면 'Never miss a story from us, subscribe to our newsletter' 라는 내용을 뽑아 낼 수 있을 것으로 보았으며, 'Never miss a story from us, subscribe to our newsletter' 라는 단일 데이터를 추출 하는 것이니 'select'를 썼더라도 굳이 반복문인 'for ~ in ~'을 사용하지 않아도 될 것 이라고 생각했지만 'AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?' 라는 오류가 떴습니다. 그래서 items= soup.select ('div.container.text-center > span') for item in items: print(item.get_text().strip()) 또는 items= soup.select _one('div.container.text-center > span') print(items.get_text().strip()) 라고 바꾸어 써보니 제대로 된 답이 출력 되었습니다. 저의 첫 오답의 경우 items= soup.select ('div.container.text-center > span') print(items.get_text().strip()) 이 구문은 items가 list 형식이며, 그래서 for 반복문을 사용하지 않고는 get_text()를 사용할 수 없다는 ai의 답변을 받았지만 뭔가 알듯 말 듯한 느낌이라 다시 설명을 듣고 싶습니다. 그리고 제대로 된 답이 도출 된 위 두 개의 경우의 차이를 알고 싶습니다. 긴 글 읽어주셔서 감사합니다. 좋은 하루 보내세요.^^
가설검정의 독립표본 검정과 카이제곱 적합도 검정을 서로 대체하여 사용할 수 있는지 문의드립니다! 독립표본도 서로 다른 2개의 집단 (표본)의 차이를 확인하는 것 처럼 카이제곱 적합도 또한 서로 다른 2개의 집단 (관측, 기대치)의 차이를 구하게 되는데, 그럼 이때 서로 대체하여 쓸 수 있는지 해서 여쭤봅니다! (물론 카이제곱 적합도 예제에서 독립표본 구하는 맨휘트니를 적용하니깐 값이 다르게 나오긴 합니다...^^)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 드디어 자바 완강을 했는데 중급 1~2 와 고급 1은 두번씩 들었고 고급2도 혼자서 채팅프로그램,네트워크 이런거 다 만들어보긴 했는데 이거 공부하는동안 또 기억이 잘 안나더라구요 ㅎㅎ.. 람다도 이제 어느정도 다 읽고 쓸줄은 아는데 자세한 메서드는 기억이 안나는 것도 많고, 다운 스트림 같은 경우에도 기억이 가물가물하고요.. 일주일에 한번씩 강의 마다 요약노트 작성한거 읽고 있긴한데 이대로 한번 쭉 읽고 스프링으로 넘어가는게 나을까요 아니면 자바를 좀 더 봐야할까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] package io.member.impl; import io.member.Member; import io.member.MemberRepository; import java.io .*; import java.util.ArrayList; import java.util.List; public class ObjectMemberRepository implements MemberRepository { private static final String FILE_PATH = "temp/members-obj.dat"; @Override public void add(Member member) { List<Member> members = findAll(); members.add(member); try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH))){ oos.writeObject(members); } catch (IOException e) { throw new RuntimeException(e); } } @Override public List<Member> findAll() { try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH))){ Object findObject = ois.readObject(); return (List<Member>) findObject; } catch (FileNotFoundException e) { return new ArrayList<>(); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } } } 코드 동일하게 작성했는데 콘솔 메인에서 마지막 나이를 작성하니 Exception in thread "main" java.lang.RuntimeException: java.io .NotSerializableException: io.member.Member at io.member.impl.ObjectMemberRepository.add(ObjectMemberRepository.java:22) at io.member.MemberConsoleMain.registerMember(MemberConsoleMain.java:52) at io.member.MemberConsoleMain.main(MemberConsoleMain.java:26) Caused by: java.io .NotSerializableException: io.member.Member at java.base/ java.io .ObjectOutputStream.writeObject0(ObjectOutputStream.java:1121) at java.base/ java.io .ObjectOutputStream.writeObject(ObjectOutputStream.java:336) at java.base/java.util.ArrayList.writeObject(ArrayList.java:949) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:565) at java.base/ java.io .ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:946) at java.base/ java.io .ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1431) at java.base/ java.io .ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1353) at java.base/ java.io .ObjectOutputStream.writeObject0(ObjectOutputStream.java:1115) at java.base/ java.io .ObjectOutputStream.writeObject(ObjectOutputStream.java:336) at io.member.impl.ObjectMemberRepository.add(ObjectMemberRepository.java:20) ... 2 more 이런 예외가 발생합니다
Elastic Cloud 에서 "Logs and metrics" 기능 활성화를 통해 나중에 문제 발생시 로그 및 매트릭 확인을 위해서 해당 기능을 활성화 하고자 하는데요. 이 기능은 좋은데 문제점이 너무 빠르게 용량을 잡아 먹는다는 것 입니다. 저 예산으로 가야 되는 상황이라 어쩔 수 없이 낮은 사양으로 할 수 밖에 없는 상황이지만 그렇다고 "Logs and metrics" 기능을 비활성화 하기에 나중에 문제 발생시 대처가 안 될 것 같아서 고민이 됩니다. 한번 여러 방면으로 대책법을 찾아보니 필수 로그 및 메트릭만 수집 (필터링) 수집 주기 조정 (Metrics 기준) 이렇게 대응 방법을 말해주고 있는데요. 지금부터 ChatGPT 가 답변해준 글을 공유 하도록 하겠습니다. ================================================== 💥 주요 성능 부하 원인 🔁 수집량 과다 수집 주기 짧음, 많은 필드 → 데이터 폭주 📥 Ingest Pipeline 부하 Elastic Agent가 사용하는 Ingest Pipeline이 CPU/RAM 자원 소비 💾 인덱싱 부하 많은 로그가 빠르게 들어오며 디스크 I/O 및 CPU 부하 증가 🔍 자동 매핑 확장 필드가 자동으로 확장되어 메모리, 클러스터 상태 불안정 🧠 ILM 미적용 / 장기 보존 오래된 데이터가 계속 쌓이며 성능 하락 및 디스크 압박 ✅ 해결책: 성능 최적화 전략 1. 필수 로그 및 메트릭만 수집 (필터링) 수집 대상 최소화: log.level: error , source: app-* 등 필요 데이터만 수집 예: Elastic Agent policy에서 수집 대상 제외 설정 processors: - drop_event: when: not: equals: log.level: "error" 2. 수집 주기 조정 (Metrics 기준) 리소스기본 주기추천 조정Metrics (System, Docker 등)10s~15s→ 30s~60s로 늘리기 Elastic Agent 정책에서 조정 가능 (Kibana → Fleet → Integration Policy → Advanced options) 3. ILM 수명주기 정책 설정 오래된 로그/메트릭 자동 삭제 또는 cold/warm tier로 이동 예: logs-* , metrics-* 인덱스 7일 후 삭제 📍 Elastic Agent Policy 설정 페이지 찾는 방법 🔹 경로: Kibana에 로그인 왼쪽 메뉴에서 "Management" → "Fleet" 클릭 → Fleet 은 Elastic Agent를 중앙에서 관리하는 UI입니다. 상단 탭에서 "Agents" 또는 "Agent policies" 클릭 원하는 정책 이름 클릭 (예: Agent policy 1 ) Integrations 리스트 가 보이면, 로그/메트릭 관련 항목 클릭 (예: System , NGINX , Kubernetes 등) Advanced Options 또는 Streams 탭에서 수집 조건/필터 조정 가능 🎯 필수 로그/메트릭만 수집하는 핵심 위치 Integrations 안의 Stream 설정 예: system.syslog → enabled ✅ / ❌ 메트릭 → 수집 주기(Collect every 10s 등) Advanced YAML (고급 설정) 예를 들어, error 레벨만 수집하도록 필터 추가: processors: - drop_event: when: not: equals: log.level: "error" 🧭 화면 예시 흐름 Kibana └─ Management └─ Fleet ├─ Agent Policies ← 여기서 정책 선택 │ └─ [Agent policy 1] │ └─ System integration 등 클릭 │ └─ Streams or Advanced options 설정 ================================================== 이렇게 필수로그 수집 기능 및 수집 주기 조정 기능으로 조금이나마 성능 부하를 줄이고자 할려고 하는데요. 말 그래도 키바나 접속 해서 Fleet 페이지로 가서 먼저 agent policy 등록를 하고 등록한 agent policy 접근 해서 system-1 클릭하면 Edit System integration 페이지 접근 할텐데요. 여기서 Collect metrics from System instances 에서 Change defaults 클릭 하고 여기서 원하는 Period 를 설정 하면 되는게 맞는 것인지 궁금 합니다... 혹시 또 추가적으로 설정 해야 하는 부분이 있을까요?
88. ArgoCD Image Updater를 이용한 이미지 자동배포 ( 💻 실습) 강의 실습 도중 발생한 문제와 해결 방법에 대해서 공유 드립니다. ArgoCD를 통해서 2232 Application을 배포할 때 values-dev.yaml 파일을 사용하여 helm chart 앱을 생성했습니다. 강사님께서 제공해주신 git 코드(fork한 코드 repo, 하기 코드 블록)를 통해서 application 생성 했을 때, 자연스럽게 1pro/api-tester:1.0.0 이미지를 가지고 와서 pod를 생성했습니다. 2232/deploy/helm/api-tester/values-dev.yaml image: repository: 1pro/api-tester pullPolicy: Always tag: 1.0.0 이후 Image-updater를 사용하여 image의 변경사항을 감지하려고 했으나 image-updater 파드에서는 감지되지 않았고, 당연히 argo cd에서도 sync 되지 않았습니다. 해당 문제를 찾아보니 regex 식의 규칙과 기존 이미지의 이미지명 형태가 동일해야 image updater가 인지를 하는 것 같아 하기 argo application과 연결된 git 디렉토리의 코드(2232/deploy/helm/api-tester/values-dev.yaml)를 같게 변경했더니 image-updater가 정상동작하면서 auto sync도 제대로 실행되었습니다. image: repository: alchdliodd/api-tester pullPolicy: Always tag: 1.1.1-250604.171111 강의 영상에서는 이렇게 맞추지 않아도 정상적으로 동작하는 것 같았는데, 이 현상이 argo image updater의 버그인지, 아니면 원래 해당 규칙을 맞추어야 하는 것인지 문의 드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 섹션 12 - HTTP 서버 만들기 강의자료 26페이지 HttpResponse코드에 setStatus() 메서드 이름이 setStatusCode()인 것 같은데 "Code"가 빠져있어요. 그래서 강의자료 30페이지에 있는 HttpRequestHandlerV4코드 notFound()메서드에서도 setStatusCode가 아닌 setStatus로 작성되어 있습니다!
(OrderSpecifier)관련 내용 어디있을가요 섹션7에서 스프링 데이터 JPA는 자신의 정렬(Sort)을 Querydsl의 정렬(OrderSpecifier)로 편리하게 변경하는 기능을 제공한 다. 이 부분은 뒤에 스프링 데이터 JPA가 제공하는 Querydsl 기능에서 살펴보겠다. 37. 스프링 데이터 페이징 활용3 - 컨트롤러 개발 -> 여기 챕터에서 뒤에 강의에서 설명하겠다하셨는데 어디 강의일까요.. 섹션8에 OrderSpecifier관련 내용은 없는거같은데요,,?
안녕하세요 ! 강의 5분에 hostPath, local 사용 목적에 관한 질문이 있어 글을 남기게 되었습니다. 사용 목적 2번에서 노드의 디스크 공간이 한정적이라 디스크 공간이 부족해져서 노드가 죽어버리면 그 노드 위에 다른 Pod들도 함께 죽는다고 말씀해주셨습니다. 여기서 생긴 의문은 hostPath로 node의 Volume을 사용하든 PVC/PV를 이용하여 Volume을 사용하든 특정 Pod에서 사용량이 많으면 어떤 경우든 죽어버릴 것 같다는 것입니다. 아니면, hostPath는 용량을 설정하지 않는데 비해, PVC/PV에서는 용량을 설정해주는 옵션이 있어 해당하는 Pod만 죽고 다른 Pod에는 영향이 없는 걸까요?
안녕하세요 섹션 18 - 82번 강의 : 배포 파이프라인 구축 후 마주하게 되는 고민들(실습) 수강 중 Jenkins 파일에 대한 질문이 있어 문의 드립니다. Jenkins 파일을 작성할 때, parameter로 PROFILE(배포환경선택)과 DOCKERHUB_USERNAME(도커허브유저명)을 설정하셨는데 하기 코드를 보시면 parameters { // 배포 환경 선택 choice(choices: ['dev', 'qa', 'prod'], name: 'PROFILE', description: '배포 환경 선택') // DockerHub 사용자명 입력 string(name: 'DOCKERHUB_USERNAME', defaultValue: '', description: 'DockerHub 사용자명을 입력하세요.') // GitHub 사용자명 입력 string(name: 'GITHUB_USERNAME', defaultValue: '', description: 'GitHub 사용자명을 입력하세요.') } stage('헬름 배포') { steps { // helm 명령 사용 - [1] 중요 데이터 암호화 관리 withCredentials([file(credentialsId: 'k8s_master_config', variable: 'KUBECONFIG')]) { sh "helm upgrade api-tester-${CLASS_NUM} ./${CLASS_NUM}/deploy/helm/api-tester -f ./${CLASS_NUM}/deploy/helm/api-tester/values-${params.PROFILE}.yaml" + " -n anotherclass-222-${params.PROFILE} --install --kubeconfig " + '${KUBECONFIG}' + // [5] Helm 부가기능 " --wait --timeout=10m" + // 최대 10분으로 설정 // [2] 잦은 배포 - versioning 무의미, 계획된 배포 - versioning 필수 " --set image.tag=${TAG}" + " --set image.repository=${DOCKERHUB_USERNAME}/api-tester" } } } PROFILE은 앞에 "params"가 붙어있고 (${params.PROFILE}), DOCKERHUB_USERNAME은 환경변수처럼 그냥 ${DOCKERHUB_USERNAME}로 사용하신 것을 볼 수 있습니다. 혹시 choice문을 사용하여 사용자가 선택하는 prarmeter의 경우 params를 붙인다던가 하는 규칙이 있는 걸까요? 위 두 개 사용 방법이 다른 것에 원인이 있는지 궁금합니다.