묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
소스코드 컴파일 오류
컴파일시 오류가 발생합니다.포트가 사용되고 있다고 하면서 웹서버 구동이 안되는데 포트를 바꿔봐도 오류가 발생합니다.깃허브에서 소스코드는 받았습니다.해결방법 좀 부탁드립니다. AI 답변이 달렸길래 추가 내용을 적습니다. 포트도 변경해봤고, 사용중인 포트가 없는것도 확인했습니다. 오류 코드는 다음과 같습니다.***************************APPLICATION FAILED TO START***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.Process finished with exit code 1
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
세션5 상품 목록 컴포넌트 처리
import axios from "axios" import { API_SERVER_HOST } from "./todoApi" // api server host const host = `${API_SERVER_HOST}/api/products` // 외부 보낼것 만들기 비동기 통신 export const postAdd = async (product) => { // 객체지정 const header = {headers: {'Content-Type':'multipart/form-data'}} // product와 header 같이 보내기 const res = await axios.post(`${host}/`, product, header) return res.data } export const getList = async (pageParam) => { try{ const {page, size} = pageParam const res = await axios.get(`${host}/list`, {params: {page:page, size:size}}) return res.data } catch (error) { console.error('Error in getList:', error); throw error; } }productsApi.js 위 코드이고 import React, { useState, useEffect } from 'react'; import useCustomMove from '../../hooks/useCustomMove'; import { API_SERVER_HOST } from '../../api/todoApi'; import { getList } from '../../api/productsApi'; const initState = { dtoList: [], pageNumList: [], pageRequestDTO: null, prev: false, next: false, prevPage: 0, nextPage: 0, current: 0 } // 서버에 주소가 바뀌면 상수값만 바꿔줄려고 선언한것 const host = API_SERVER_HOST function ListComponent(props) { // 커스텀 훅 사용해서 이동 refresh: 갱신 const {moveToList, moveToRead, page, size, refresh} = useCustomMove() // 목록 데이터 가져오기 const [serverData, setServerData] = useState(initState) // 데이터 가져오기 const [fetching, setFetching] = useState(false) useEffect(() => { setFetching(true) // 데이터 가져오는 중 자동으로 처리되기 때문에 // 서버데이터가 처리가 되면 getList({page,size}).then(data => { console.log("data>>>>>>>", data); setFetching(false) setServerData(data) }) }, [page,size,refresh]); return ( <div className="border-2 border-blue-100 mt-10 mr-2 ml-2"> {/* fetching일때는 FetchingModal 호출하고 그렇지 않으면 아무것도 안보여준다. */} {fetching? <FetchingModal/> :<></>} <div className="flex flex-wrap mx-auto p-6"> {serverData.dtoList.map(product => <div key= {product.pno} className="w-1/2 p-1 rounded shadow-md border-2" onClick={() => moveToRead(product.pno)} /* 링크 만들어주고 썸네일 이미지 만들어서 보여주는 기능 */ > <div className="flex flex-col h-full"> <div className="font-extrabold text-2xl p-2 w-full ">{product.pno}</div> <div className="text-1xl m-1 p-2 w-full flex flex-col"> <div className="w-full overflow-hidden "> <img alt="product" className="m-auto rounded-md w-60" src={`${host}/api/products/view/s_${product.uploadFileNames[0]}`} /> </div> <div className="bottom-0 font-extrabold bg-white"> <div className="text-center p-1"> 이름: {product.pname} </div> <div className="text-center p-1"> 가격: {product.price} </div> </div> </div> </div> </div> )} </div> </div> ); } export default ListComponent;ListComponent.js 파일인데 import React from 'react'; import ListComponent from '../../components/products/ListComponent'; function ListPage(props) { return ( <div className="p-4 w-full bg-white"> <div className="text-3xl font-extrabold"> Products List Page </div> <ListComponent/> </div> ); } export default ListPage;ListPage.js 파일입니다 터미널에 에러도 뜨지 않고 서버에서 데이터를 못가져오는데 postman으로 서버 테스트를 했을때는 잘 되는데요 서버에서 클라이언트로 연동되는 부분에서 문제가 생긴건지 list를 가져오지를 못하고 있습니다 ㅠ 왜 그런건지 알 수 있을까요 ㅠ 오타도 아닌거 같고..
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
기출 3회 작업형 2 수치형/범주형 분리
기출 3회 작업형 2에서 피처엔지니어링 전 df.select_dtypes(exclude = "o").copy() .... 로 트레인 데이터와 테스트 데이터를 수치와 범주형으로 나눈 후수치형 MinMaxScaler범주형 원핫인코딩으로 각각 피처링을 하셨는데이때 수치형을 보면 cols = ["A", "B"...]로 오브젝트형을 지정하셨더라구요. 피처엔지니어링때 cols =[ ] 를 별도 지정하더라도 위 데이터를 나누는 과정이 필수일까요?? 아래처럼 해도 되면 concat도 필요없을거 같아서요.예) df.select_dtypes(exclude = "o").copy() << 이과정없이from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()cols = ['Age', 'FamilyMembers']train[cols] = scaler.fit_transform(train[cols])test[cols] = scaler.transform(test[cols]) from sklearn.preprocessing import LabelEncodercols = ['Nationality']for col in cols:le = LabelEncoder()train[col] = le.fit_transform(train[col])test[col] = le.transfrom(test[col])
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DI 와 전반적인 구조 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]1. 회원 서비스를 테스트할 때, DI를 하는 이유를 저는 아래처럼 이해했는데 이것이 맞는 이해인지 궁금합니다. MemberService() 를 실행하는 순간 MemoryMemberRepository가 new로 생성되고, 그 다음줄에서 MemoryMemberRepository를 새롭개 new로 생성한다.현재의 코드에서는 Store가 static하게 선언되었으므로 그런 문제가 발생하지 않겠지만, 그렇지 않다면 MemberService와 MemoryMemberRepository가 서로 다른 레포지토리 인스턴스를 가지게된다. 위 내용이 맞다면, 모듈 테스트를 하지 않는다는 가정하에 해당 부분 뒤에 나오는 스프링 통합 테스트를 할 때는 이미 스프링 컨테이너에 레포지토리가 등록되어 있으므로 생성자를 활용한 의존성 주입이 필요없는 것이 맞나요? 아래 그림은 최종적으로 제가 구조를 이해한 것을 구조화 한 것인데 혹시 틀린 부분이 있는지 궁금합니다.
-
미해결비트코인 선물거래 자동매매 시스템(저자직강)
수업질문
안녕하세요 혹시 파이참이랑 주피터 말고 아나콘다로 vs 코드 실행하여 수업을 들어도 무방한가요 ?
-
해결됨독하게 C를 배운 사람을 위한 선형 자료구조
ADT강의 관련 질문 있습니다.
항상감사합니다.ADT강의 보고 코드 확인하는 중 질문이 생겨 글 올립니다. 1.동적바인딩과 다형성 등 사용성 증가를 위해 구체 자료를 가리키는 추상화 자료노드를 구성하여 함수로 그 추상화자료노드에 일차적으로 접근하는 개념이 ADT라고 파악되는 데 여기에 함수 포인터를 구조체 맴버로 포함시킨 이유가 궁금합니다. 그냥 구조체 외부에 선언된 getkey 함수를 사용해서 sorting을 해도 기능상 차이는 없을 것 같은데 포함시키신 이유는 객체지향개념을 적용하기 위함인지 아니면 구조체 안의 함수포인터 변수로 실현된 getkey 함수가 외부에 선언된 getkey함수를 사용할 때와 비교해서 실제 기능상 차이가 있는지 궁금합니다. 2.함수포인터는 함수를 가리키는 포인터 변수로 함수의 이름과 같으면 안되는 것으로 알고 있는데 이 예제의 경우 컴파일 되는 것은 구조체 안의 포인터 변수라서 그런 것인지. 궁금합니다. 3.강의에서 언급해 주신 구조체 안의 함수포인터 개념을 너무 흥미있게 들었습니다. 그렇다면 그 개념의 연장선이 객체지향 클래스 개념이라고 보는데 결국 c언어는 절차지향. c++은 객체지향으로 단편적으로 구분되는 것이 아니라 c언어 프로그래밍시 하나의 기능단위 캡슐화를 시도하는 프로그래밍 기법이 객체지향이 아닌지. 그리고 그것을 구현하기 쉽게 만든 것이 c++같은 객체지향 프로그래밍 언어가 아닌가 하는 궁금증이 생겼습니다. 이런 관점에서 보자면 함수포인터는 결국 c언어 안에서 이미 함수형프로그래밍의 개념으로 접근할 수 있는 수단이 아닌지 하는 생각도 듭니다. 이러한 접근이 맞는 것인지 여쭤봅니다. 4.getkey함수가 name 이나 phone을 반환하는데 호출함수이름이 SortListByKey()가 적절하지 않나 궁금합니다. 5.기타 질문으로 lineardatastructure.c 파일 안의 한글이 깨져 보이는 문제가 있는데 비쥬얼 스튜디오 및 윈도우에서 utf-8으로 환경설정을 전부 변경해도 여전히 깨져 보입니다. 다른 해결방법이 있는지 궁금합니다. 감사합니다.
-
미해결[리뉴얼] 처음하는 파이썬 백엔드와 웹기술 입문 (파이썬 중급, flask[플라스크] 로 이해하는 백엔드 및 웹기술 기본) [풀스택 Part1-1]
brew로 mysql 설치 후 서버 실행할 때, 터미널에서 anaconda bin 참조하는 문제
터미널에서 conda activate가 되어 있는 경우에는 conda 설치 위치의 bin을 참조하게 되더라구요. 그래서 강의를 따라서 설치 후 서버를 실행하면 /USERS/{유저}/opt/ananconda3/~~ 를 계속 참조해서 오류가 발생합니다. 이런 경우엔 conda 가상환경을 꺼주시면 정상적으로 동작합니다.conda deactivatemysql.server start
-
미해결AWS 배포 완벽가이드 (feat. Lightsail, Docker, ECS)
deploy.yml github action 성공 , 하지만 AWS
deploy.yml github action 성공 했습니다, 그리고 main branch에 merge까지 완료했습니다 , 그리고 곧 바로 static ip : 4000 번 해서 들어가려 하면 들어가지지 않네요, AWS 들어가서 SSH키고 npm run start를 쳐야지 접속이 됩니다 , 이거 문제 있는거 맞죠 ? , 이러면 자동배포가 아니지 않나요 ?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형 2 베이스라인/라벨인코딩/원핫인코딩 질문
강의를 보니 베이스라인의 경우 object칼럼을 날리고 수치형으로만 했음에도 정확도가 높은 결과가 나왔습니다그런데 실제 시험에서도 저렇게 임의로 칼럼을 날리면서 진행해도 큰 문제가 없을까요?
-
미해결[구버전] 웹 애플리케이션 개발을 위한 IntelliJ IDEA 설정 (2020 ver.)
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하세요, 선생님. 선생님께 메시지를 드리기 위해 일단 무료강의를 수강하였습니다. 양해부탁드릴께요.다름이 아니라 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의를 듣고 싶은데 최신순으로 나열하니 현재 버전과 맞지 않는 부분들이 많아서 강의를 수월하게 따라가기 힘들다는 평들이 많이 보였습니다. 현재 현행화중이라고 하셨는데 언제쯤 현행화가 완료될 예정인지 궁금합니다. 현행화되면 기존 수강신청자도 혜택을 받을 수 있는건지 궁금합니다. 그럼 답변 좀 부탁드리겠습니다.
-
미해결웹 애니메이션의 새로운 표준, Web Animations API
Vue.js 적용 방법
안녕하세요. 강의 정말 재밌게 보았습니다 :)강의를 듣고 Vue2에 적용하려 하니 해당 에러가 발생합니다.js를 import해서 사용하는 것 만으로는 제약이 있는 것인가요..?😥😥
-
미해결처음하는 파이썬 백엔드 FastAPI 입문 (FastAPI부터 비동기 SQLAlchemy까지) [풀스택 Part1-2]
passlib 비활성화 해결방법
안녕하세요 passlib dp 노랑 불이 들어왔는데, 어떻게 해결하나요? 구글링 해도 안나오네요 ㅠㅠ
-
미해결웹디자인개발기능사 [2025년] 실기전체 (카톡질문가능)
css로 메뉴 만드는 부분
안녕하세요? 강사님. 공부 중에 혹시 css로 메뉴 만드는 거 말고jquery로 메뉴 만드는 것도 가르쳐주시면 안될까요?물론 css가 쉽고 간편하지만 jquery도 알고 싶어 문의글 남깁니다. 확인부탁드립니다. 감사합니다:)
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
이번 final 과제 피드백 부탁드립니다!
안녕하세요! 강의 잘 듣고 있습니다!이번 과제 코드 피드백 부탁드립니다!고맙습니다.<화면><html><!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>SignUp</title> <link rel="stylesheet" href="./final.css"> <script defer src="./final.js"></script> </head> <body> <div class="wrapper"> <div class="wrapper__header"> <span id="header__title">코드캠프 회원가입</span> </div> <div class="wrapper__body"> <div class="wrapper__text"> <input type="text" id="email" placeholder="이메일을 입력해 주세요."> <span class="errorMsg email">이메일이 올바르지 않습니다.</span> <input type="text" id="name" placeholder="이름을 입력해 주세요."> <span class="errorMsg name">이름이 올바르지 않습니다.</span> <input type="text" id="pw1" placeholder="비밀번호를 입력해 주세요."> <span class="errorMsg pw1">비밀번호를 입력해주세요.</span> <input type="text" id="pw2" placeholder="비밀번호를 다시 입력해 주세요."> <span class="errorMsg pw2">비밀번호를 입력해주세요.</span> </div> <div class="wrapper__phone" oninput="phone()"> <input type="text" id="num1" maxlength="3"> - <input type="text" id="num2" maxlength="4"> - <input type="text" id="num3" maxlength="4"> </div> <div class="wrapper__certification"> <div class="cert__number"> <span id="certNum">000000</span> <button class="chkBtn" disabled="true">인증번호 전송</button> </div> <div class="cert__time"> <span id="certTimer">3:00</span> <button class="chkBtn" disabled="true">인증완료</button> </div> </div> <div class="wrapper__select"> <div class="select__locale"> <select id="locale"> <option selected disabled>지역을 선택하세요</option> <option value="서울">서울</option> <option value="경기">경기</option> <option value="인천">인천</option> </select> <span class="errorMsg locale">지역을 선택해주세요.</span> </div> <div class="select__gender"> <label for="woman"> <input type="radio" name="gender" id="woman"> 여성 </label> <label for="man"> <input type="radio" name="gender" id="man"> 남성 </label> </div> <span class="errorMsg gender">성별을 선택해주세요.</span> </div> </div> <div class="divideLine"></div> <div class="wrapper__check"> <!-- <button class="submit" disabled="true">가입하기</button> --> <button class="submit">가입하기</button> </div> </div> </body> </html> <css>*{ box-sizing: border-box; margin: 0; } html, body{ width: 540px; } .chkBtn{ width: 120px; height: 40px; border: 1px solid #D2D2D2; border-radius: 7px; font-size: 16px; font-weight: 400; color: #0068FF; background-color: #FFF; cursor: pointer; } .chkBtn.active { width: 120px; height: 40px; border: 1px solid #D2D2D2; border-radius: 7px; font-size: 16px; font-weight: 400; background-color: #0068FF; color: #FFF; cursor: pointer; } .errorMsg{ width: 100%; color: red; font-size: 10px; display: flex; flex-direction: column; align-items: center; visibility: hidden; } .wrapper{ width: 100%; height: 100%; padding: 60px 80px; border: 1px solid #AACDFF; border-radius: 20px; box-shadow: 7px 7px 39px rgba(0, 104, 255, .25); } .wrapper__header{ width: 100%; font-size: 32px; font-weight: 700; color: #0068FF; padding-bottom: 60px; } .wrapper__body{ width: 100%; } .wrapper__text > input{ width: 100%; height: 60px; margin-top: 20px; font-size: 16px; font-weight: 400; border: 1px solid #D2D2D2; border-radius: 7px; padding: 18px; } .wrapper__phone{ width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 20px 0; } .wrapper__phone > input{ width: 100px; height: 40px; border: 1px solid #D2D2D2; border-radius: 7px; } .wrapper__certification { width: 100%; display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; } #certNum, #certTimer{ color: #0068FF; font-size: 18px; padding-right: 20px; } .cert__time{ padding: 20px 0; } .wrapper__select{ width: 100%; display: flex; flex-direction: column; align-items: center; } .select__locale{ width: 100%; display: flex; flex-direction: column; justify-content: center; } #locale{ width: 100%; height: 60px; border: 1px solid #D2D2D2; border-radius: 7px; color: #797979; font-size: 16px; font-weight: 400; padding: 18px; } .select__gender{ width: 140px; display: flex; justify-content: space-between; padding-top: 30px; } .divideLine{ width: 100%; border: 1px solid #E6E6E6; margin: 20px 0; } .wrapper__check{ width: 100%; display: flex; justify-content: center; } .submit { width: 100%; height: 60px; font-size: 18px; font-weight: 400; color: #0068FF; background-color: #FFF; border: 1px solid #0068FF; border-radius: 7px; } <js>const submit = document.querySelector('.submit'); // 가입하기 const numberChk = document.querySelector('.cert__number .chkBtn'); // 인증번호 전송 const timeChk = document.querySelector('.cert__time .chkBtn'); // 인증완료 let time = 180; // 180초, 인증 시간 let isStarted = false; // email const emailChk = () => { let email = document.getElementById('email').value; if(email.includes('@') === true){ let isEmail = email.split('@')[1].includes('.'); if(isEmail === false){ document.querySelector('.errorMsg.email').style.visibility = 'visible'; document.querySelector('.errorMsg.email').value = ''; return false; } else { document.querySelector('.errorMsg.email').style.visibility = 'hidden'; return true; } } else { document.querySelector('.errorMsg.email').style.visibility = 'visible'; document.getElementById('email').value = ''; return false; } } // name const nameChk = () => { let name = document.getElementById('name').value; if(name.length === 0){ document.querySelector('.errorMsg.name').style.visibility = 'visible'; return false; } else { document.querySelector('.errorMsg.name').style.visibility = 'hidden'; return true; } } // pw const pwChk = () => { let pw1 = document.getElementById('pw1').value; let pw2 = document.getElementById('pw2').value; if(pw1 && pw2){ if(pw1 === pw2){ document.querySelector('.errorMsg.pw1').style.visibility = 'hidden'; document.querySelector('.errorMsg.pw2').style.visibility = 'hidden'; return true; } else { document.querySelector('.errorMsg.pw1').style.visibility = 'visible'; document.querySelector('.errorMsg.pw2').style.visibility = 'visible'; document.querySelector('.errorMsg.pw1').innerHTML = '비밀번호가 일치하지 않습니다.' document.querySelector('.errorMsg.pw2').innerHTML = '비밀번호가 일치하지 않습니다.' return false; } } else { document.querySelector('.errorMsg.pw1').style.visibility = 'visible'; document.querySelector('.errorMsg.pw2').style.visibility = 'visible'; return false; } } // phone const phone = () => { let num1 = document.getElementById('num1').value; let num2 = document.getElementById('num2').value; let num3 = document.getElementById('num3').value; if(num1.length === 3) { document.getElementById('num2').focus(); if(num2.length === 4) { document.getElementById('num3').focus(); } } if(num1.length === 3 && num2.length === 4 && num3.length === 4){ numberChk.classList.add('active'); certification(); } } const certification = () => { // 인증번호 numberChk.disabled = false; numberChk.addEventListener('click', e => { let randomNumber = String(Math.trunc(Math.random() * 1000000)).padStart(6, '0') document.getElementById('certNum').innerText = randomNumber; // 타이머 if(isStarted === false){ isStarted = true; timeChk.disabled = false; let timer = setInterval(() => { if(time >= 0){ let min = Math.trunc(time / 60); let sec = String(time % 60).padStart(2,'0'); document.getElementById('certTimer').innerText = `${min}:${sec}`; time--; } else { clearTime(timer); } }, 100) timeChk.addEventListener('click', e => { if(time >= 0){ alert('인증이 완료 되었습니다.'); clearTime(timer); submit.disabled = false; } }) } }) } const clearTime = (timer) => { timeChk.classList.remove('active'); numberChk.classList.remove('active'); document.getElementById('certNum').innerText = '000000'; document.getElementById('certTimer').innerText = '0:00'; timeChk.disabled = true; numberChk.disabled = true; isStarted = false; clearInterval(timer); } const checkValidation = () => { emailChk(); nameChk(); pwChk(); if(emailChk() && nameChk() && pwChk()) { return true; } else { return false; } } // 검증 submit.addEventListener('click', e => { checkValidation(); if(checkValidation()){ alert('코드캠프 가입을 축하합니다.'); } });
-
미해결
재생 오류가 발생해요
안녕하세요. 강의 들을 때 6007,6008같은 재생오류가 발생하는데원인이 뭘까요? 크롬을 사용하고 있습니다. 감사합니다.
-
해결됨[C#/.NET 7.0]어서와, WPF는 처음이지?
도서추천
안녕하세요. 강의를 들으면서 추가로 참고할만한 책을 찾고 있는데요 혹시 추천해주실만한 책이 있을까요??(C#, MVVM 패턴, WPF 관련)
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
더 큰 숫자 찾기 문제 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]더 큰 숫자 찾기문제에 int max = (a > b) ? a : b;가 아닌 String status = (a > b) ? "10" : "20";는 틀린 답인가요? 이유도 궁금합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
마이크로소프트 제공 SList 는 use-after-free 에 대하여 안전한가요??
마이크로소프트 제공 SList 를 모방하는 과정에서SList 는 여전히 use-after-free 에 대하여 취약하다고 말씀하셨는데 마이크로소프트에서 제공하는 SList를 사용 할 때도일반적인 상황에서는 안전한 것인지 궁금합니다제 생각에는 수업의 경우 메모리 풀이라는 특수 상황에서는 free가 일어나지 않으니 일단 안전한다고 생각하는데 메모리 풀이라 안전한 것이지? 그렇지 않은 경우는 또 어떨지 궁금합니다.
-
미해결실무자를 위한 구글애널리틱스(GA4+GTM) 활용법(25년 Update)
옴니버그 툴 어느 강의에서 나오나요?
사정상 처음부터 듣지 않고 필요한 부분만 듣고 있는데 옴니버그 툴을 활용하신게 있던데 해당 부분 어느 강의에서 나오나요??
-
미해결스프링 핵심 원리 - 고급편
템플릿 메소드 패턴과 전략 패턴
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 템플릿 메소드의 경우에는 부모 클래스가 바뀌면 자식 클래스에 영향을 미치는 반면에, 전략 패턴의 경우엔 Context 코드가 변경되더라고 Strategy부분에 영향을 미치지 않는다고 설명하셨는데,,, 이 부분이 정학히 이해가 되지않습니다. 혹시 간단한 예시를 통해 이 둘의 차이를 알 수 있을까요ㅠ?