문제2 PayService
미해결
김영한의 실전 자바 - 기본편
[질문 내용] 김영한 강사님께서 영상 18분 33초쯤에 PayService에 만든 findPay메소드에서 결제 수단을 넣으면 PayService의 코드가 바뀐다는 말이 잘 이해가 안됩니다. 자세하게 설명해주실 수 있을까요?
- java
- 객체지향
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
김영한의 실전 자바 - 기본편
[질문 내용] 김영한 강사님께서 영상 18분 33초쯤에 PayService에 만든 findPay메소드에서 결제 수단을 넣으면 PayService의 코드가 바뀐다는 말이 잘 이해가 안됩니다. 자세하게 설명해주실 수 있을까요?
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1번 WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), first_week_and_diff AS ( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) AS diff_of_day DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT DISTINCT user_pseudo_id, -- DATE_TRUNC DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_counts AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 2) AS retention_rate FROM ( SELECT diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week ASC) AS first_week_user_cnt FROM user_counts ) 2번 WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, FROM advanced.app_logs) , weekly_user_active AS ( SELECT user_pseudo_id, DATE_TRUNC(event_date, WEEK) AS event_week, MIN(DATE_TRUNC(event_date, WEEK)) OVER (PARTITION BY user_pseudo_id) AS first_active_week, LAG(DATE_TRUNC(event_date, WEEK)) OVER (PARTITION BY user_pseudo_id ORDER BY DATE_TRUNC(event_date, WEEK)) AS pre_active_week FROM base ) , user_group AS ( SELECT user_pseudo_id, event_week, DATE_DIFF(event_week, pre_active_week, WEEK(MONDAY)) AS diff_prior_week, DATE_DIFF(event_week, first_active_week, WEEK(MONDAY)) AS diff_first_week, CASE WHEN event_week = first_active_week THEN 'NEW' WHEN DATE_DIFF(event_week, pre_active_week, WEEK) = 1 THEN 'Current' WHEN DATE_DIFF(event_week, pre_active_week, WEEK) > 1 THEN 'Resurrected' ELSE 'Dormant ' END AS user_seg FROM weekly_user_active ) SELECT event_week, user_seg, COUNT(DISTINCT user_pseudo_id) AS user_cnt, FROM user_group GROUP BY ALL ORDER BY 1 ; 4번 WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" AND event_name = 'click_payment' ), first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_counts AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ) SELECT diff_of_week AS week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week ASC) AS first_week_user_cnt, ROUND(SAFE_DIVIDE(user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week ASC)) * 100, 2) AS retention_rate FROM user_counts ORDER BY diff_of_week
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
개요 Domain : 배달음식 어플리케이션 Data set : app_logs 테이블 데이터기간: 2022.08~2022.12 목적: Foodie 현황 데이터분석 데이터분석 1. 월별 활성 사용자 수 목적: 월별 활성 고객 파악을 통해 서비스의 전반적인 흐름 파악 1-1 지표정의 MAU (Monthly Active Users) 한 달 동안 앱을 사용한 순수 고유 사용자 수 중복을 제거한(COUNT DISTINCT) user_id 기준으로 집계 서비스의 전반적인 성장과 규모를 보여주는 핵심 지표 Cart Users 한 달 동안 장바구니에 상품을 담은 순수 고유 사용자 수 event_name = 'click_cart'인 이벤트의 고유 사용자 수 실제 구매 의도를 가진 잠재 고객의 규모를 파악할 수 있는 지표 Payment Users 한 달 동안 실제 결제를 진행한 순수 고유 사용자 수 event_name = 'click_payment'인 이벤트의 고유 사용자 수 실제 매출 발생에 기여한 고객의 규모를 나타내는 지표 Cart to Payment Rate 장바구니 사용자 중 실제 결제로 이어진 비율 (%) (Payment Users / Cart Users) * 100으로 계산 주요 의미: 구매 전환율을 나타내는 핵심 지표 장바구니 단계에서의 이탈률 파악 가능 높을수록 구매 전환이 잘 이루어짐을 의미 쿼리 WITH base AS ( SELECT DISTINCT user_id, user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, event_params.key AS param_key, event_params.value.string_value AS string_value, event_params.value.int_value AS int_value FROM advanced.app_logs CROSS JOIN UNNEST(event_params) as event_params WHERE event_date BETWEEN "2022-01-01" AND "2022-12-31" ) # 월별 활성 사용자 분석 ,monthly_active AS ( SELECT FORMAT_DATE('%Y-%m', event_date) as year_month, COUNT(DISTINCT user_id) as MAU, COUNT(DISTINCT CASE WHEN event_name = 'click_cart' THEN user_id END) as cart_users, COUNT(DISTINCT CASE WHEN event_name = 'click_payment' THEN user_id END) as payment_users, ROUND(COUNT(DISTINCT CASE WHEN event_name = 'click_payment' THEN user_id END) * 100.0 / NULLIF(COUNT(DISTINCT CASE WHEN event_name = 'click_cart' THEN user_id END), 0), 2) as cart_to_payment_rate FROM base GROUP BY year_month ORDER BY year_month ) SELECT * FROM monthly_active 시각화 결론 8월~10월 사이 사용자 확대 특시 10월에 MAU가 증가하여 서비스의 성장 사용자 수가 크게 증가했음에도 구매전환율이 안정적으로 유지 MAU증가와 함께 실제 구매자 수도 증가 ⇒ 서비스가 8~10월 사이 급격한 성장세를 통해 사용자가 증가하였으며 일시적인 효과가 아닌 안정적으로 성장세에 맞는 고객을 확보하고 있는 중 Action Item MAU 증가 원인 파악하기 신규고객, 기존고객 중 어떤 고객이 활성화가 된건지 (신규, 기존에 따른 프로모션 등 확인하기) 신규고객이라면 어떤 채널로 유입이 된건지 유입 근거 찾아보기 기존고객이라면 기존고객 대상 프로모션을 한게 있는지, 특정페이지 개선이 되었거나, 변경사항이 있는지 확인해보기 2. Funnel 분석 쿼리 WITH base AS ( SELECT DISTINCT user_id, event_name, event_timestamp, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, user_pseudo_id FROM advanced.app_logs WHERE event_date BETWEEN "2022-01-01" AND "2022-12-31" ), user_journey AS ( SELECT user_id, event_date, event_name, event_datetime, -- 사용자별 이벤트 발생 순서 ROW_NUMBER() OVER (PARTITION BY user_id, event_date ORDER BY event_datetime) as event_sequence FROM base ), funnel_steps AS ( SELECT event_date, COUNT(DISTINCT CASE WHEN event_name = 'screen_view' THEN user_id END) as view_users, COUNT(DISTINCT CASE WHEN event_name = 'click_cart' THEN user_id END) as cart_users, COUNT(DISTINCT CASE WHEN event_name = 'click_payment' THEN user_id END) as payment_users FROM user_journey GROUP BY event_date ), funnel_rates AS ( SELECT event_date, view_users, cart_users, payment_users, ROUND(cart_users * 100.0 / NULLIF(view_users, 0), 2) as view_to_cart_rate, ROUND(payment_users * 100.0 / NULLIF(cart_users, 0), 2) as cart_to_payment_rate, ROUND(payment_users * 100.0 / NULLIF(view_users, 0), 2) as view_to_payment_rate FROM funnel_steps ) #SELECT * FROM funnel_rates #ORDER BY event_date SELECT event_date, view_users as view_users_count, cart_users as cart_users_count, payment_users as payment_users_count, ROUND((cart_users * 100.0 / view_users), 2) as view_to_cart_rate, ROUND((payment_users * 100.0 / cart_users), 2) as cart_to_payment_rate, ROUND((payment_users * 100.0 / view_users), 2) as total_conversion_rate FROM funnel_rates ORDER BY event_date 시각화 ⇒ 공휴일 등 특정 날짜에 고객 유입 변동이 큼 8월부터 10월까지 고객이 급격하게 늘었으나 이탈율은 9월에 높게 나타났음 그에 비해 10월은 고객이 크게 늘어났음에도 이탈율은 큰폭으로 보이지 않음 view > cart는 20% 수준의 이탈율이나, cart > payment가 60% 수준의 큰 이탈율 발생 ⇒ 구간별 고객수가 전체적으로 같이 확대되어 이탈율은 월별 특이점 없음 Action Item cart에서 payment 이탈 고객에게 쿠폰지급 프로모션 또는 결제단계 최소화를 통해 이탈율 개선 방법 모색 필요
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
노션으로 작성하였습니다. 링크공유합니다. https://canyon-king-6a2.notion.site/4-Foodie-Express-143e4e315127805faf7de0620e6ca51a?pvs=4
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
노션에 작성하였습니다 😃 https://www.notion.so/4-143a36e0ca1980d48477c45cb562019d?pvs=4
미해결
김영한의 실전 자바 - 중급 2편
직접 구현하는 연결 리스트1 강의중 영상과 자료에는 문제가 없는 것 같은데 저의 IDE에서는 캐스팅을 요청하길래 코드를 보니 참조값이 Object인데 반환 값은 Node라 상관이 없는 것을 알고 있지만 다운캐스팅을 하는 것이 올바른 것인지 문의드립니다 .
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
노션 링크를 첨부합니다. https://reinvented-friday-e96.notion.site/BigQuery-3-13dbfe02e9e7801d94b7dd06eb5bb1cc?pvs=4
미해결
실전! Querydsl
plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' } group = 'study' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta") annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } clean { delete file('src/main/generated') } tasks.named('test') { useJUnitPlatform() } 위와 같이 build.gradle 작성했고 clean 후 compile.Java ( compile.Querydsl이 없음) 했지만 아무것도 생기지 않습니다. 구글링 해서 다 적용해봐도 안되는데 어떻게들 하셨나요
미해결
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
안녕하세요 선생님 강의 열심히 듣고 있는 학생입니다. 제가 듣다 보면 문제를 보고 1시간 정도를 고민해도 풀 수가 없어서 결국 강의 풀이를 보며 이해하는 문제들이 많은데 이런식으로 공부해도 실력이 늘 수 있을지가 의문이고 고민입니다... 혼자 생각하고 풀지 못하고 결국 정답과 풀이를 보며 따라하는 상황이다 보니 혼자 힘으로는 풀지 못하는 문제만 늘어간다는 느낌을 받습니다. 이런식으로 공부해도 괜찮은 걸까요..?
해결됨
김영한의 실전 자바 - 중급 2편
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 문제 풀이7번 장바구니를 만들고 나서, 영상 및 pdf 랑 비교해보니, Cart 클래스의 add() 및 minus() 가 비슷하긴 한데, 다릅니다.(정답은 잘 나옵니다.) 이럴 때에는 영한님의 코드 방식을 익히고, 영한님 코드를 쓰는게 나을까요? 아니면 그대로 저의 코드로 하는 게 나을까요? (일단 코드도 올릴게요.) 추가1 이렇게 코드를 올리는 게 자만 인가요? 다른 분들은 코드를 올리지 않고 잘 진행하는데, 주구장창 식으로 올리는 듯해서요.(저번 글에 답변 해주신 David 님 말이 생각이 나서요.) 답변 부탁 드립니다.
해결됨
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
로그인 후 개발자 도구 쿠키에 x_auth 정상적으로 확인 DB에도 토큰 정상적으로 값 입력된 것 확인 로그아웃 버튼을 클릭 시 401 에러 발생, 토큰 삭제 x server/index.js app.post('/api/users/login', async (req, res) => { try { const user = await User.findOne({ email: req.body.email }); if (!user) { return res.json({ loginSuccess: false, message: "제공된 이메일에 해당하는 유저가 없습니다." }); } // 비밀번호가 일치하는지 확인한다. const isMatch = await user.comparePassword(req.body.password); if (!isMatch) { return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." }); } // 비밀번호가 일치하다면 토큰을 생성한다. const tokenUser = await user.generateToken(); res.cookie("x_auth", tokenUser.token) .status(200) .json({ loginSuccess: true, userId: user._id }); } catch (err) { return res.status(400).send(err); } }); app.post('/api/users/logout', auth, async(req, res) => { try { await User.findOneAndUpdate({ _id: req.user._id }, { token: "" }); res.clearCookie("x_auth"); return res.status(200).send({ logoutSuccess: true }); } catch (err) { return res.json({ logoutSuccess: false, message: err.message }); } }); User.js userSchema.methods.comparePassword = function(plainPassword, cb) { const user = this; return bcrypt.compare(plainPassword, user.password); }; userSchema.methods.generateToken = function() { var user = this; // jsonwebtoken을 이용해서 토큰을 생성한다. var token = jwt.sign(user._id.toJSON(), 'secretToken'); user.token = token; return user.save(); }; userSchema.statics.findByToken = async function(token) { const user = this; try { // 토큰을 decode합니다. const decoded = jwt.verify(token, 'secretToken'); // 디코딩된 정보를 이용해 유저를 찾습니다. const userData = await user.findOne({ "_id": decoded, "token": token }); return userData; } catch (err) { throw new Error("유효하지 않은 토큰입니다."); } }; auth.js const { User } = require("../models/User"); function auth(req, res, next) { // 인증 처리한다. // 클라이언트 쿠키에서 토큰을 가져온다. const token = req.cookies.x_auth; if (!token) { return res.status(401).json({ isAuth: false, message: "토큰이 제공되지 않았습니다." }); } // 토큰을 복호화한 후 유저를 찾는다. User.findByToken(token) .then((user) => { if (!user) { return res.status(401).json({ isAuth: false, message: "유효하지 않은 토큰입니다." }); } // 토큰과 유저정보를 다음 단계로 전달한다. req.token = token; req.user = user; next(); }) .catch((err) => { return res.status(401).json({ isAuth: false, message: err.message }); }) }; module.exports = { auth }; 서버의 경로를 절대 경로로 기입하지 않으면 404 에러 발생 5000 포트로 데이터 전송, cors로 3000 포트로 이동하도록 설정 const corsOptions = { origin: 'http://localhost:3000', // 클라이언트 주소 credentials: true // 쿠키를 포함하도록 }; app.use(cors(corsOptions));
미해결
김영한의 실전 자바 - 기본편
[질문 내용] payStore메소드를 정의할 때, 왜 static으로 한 것이고, 메소드 타입으로 왜 Pay 라고 한것인지 궁금합니다.
미해결
김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 아니오 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] java: cannot find symbol 'string' 이라는 에러가 발생합니다.. 구글에 검색을 해보니 jdk가 설정이 안된거라고 나오는데 저는 영상에서 나온대로 최신버전인 23을 설치한 상태입니다.. 뭐가 문제인지 알려주시면 감사하겟습니다ㅜㅜ
미해결
김영한의 실전 자바 - 기본편
[질문 내용] 정답을 보기 전에 먼저 제가 스스로 리팩토링 하다가 PayService에 있는 processPay 메소드도 Pay 인터페이스에 넣어서 각각 KakaoPay, NaverPay에서 구현을 했는데 이렇게 해도 OCP 원칙을 따르면서 리팩토링 한건가요?
해결됨
한 입 크기로 잘라먹는 Next.js
error.tsx를 app 폴더 바로 아래에 둬도 footer에서 발생하는 오류는 잡히지 않습니다. app layout에서 발생하는 에러는 error.tsx로 잡히지 않는걸까요?
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
9분에서 Reference Doc 들어가서 hibernate 검색하면 스프링부트와의 알맞은 버전이 나온다고 하셨는데, 저는 안 나오네요. 지금은 방법이 바뀌었나요? 적합한 버전을 어떻게 찾나요?
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
노션에서 진행했습니다. https://torch-cart-08d.notion.site/140701964d8c8087871bfdc7e3081241
미해결
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. package PR; import java.util.*; public class 보이는학생 { public int solution(int n, int[] arr){ int answer = 1; for(int i=0; i<arr.length-1; i++){ if( arr[i] < arr[i+1] ){ answer++; } } return answer; } public static void main(String[] args) { Algorithm.보이는학생 t = new Algorithm.보이는학생(); Scanner kb = new Scanner( System.in ); int n = kb.nextInt(); int[] arr = new int[n]; for(int i=0; i<n; i++){ arr[i] = kb.nextInt(); } System.out.println(t.solution(n, arr)); } } 이코드는 어디 부분에서 로직이 오류인가요?
해결됨
한 입 크기로 잘라먹는 Next.js
book type은 왜 지정하지 않는지 궁금합니다. 그리고 왜 book type은 지정하지않아도 typescript에서 체킹(?)을 하지 않는지도 궁금합니다. 항상 강의잘보고있습니다. 감사합니다. 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 질문 하시기 전에 꼭 확인해주세요 - 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다) - 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다) - 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 ) 질문 하실때 꼭 확인하세요 - 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X) - 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지) - 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우) - 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요 - 강의의 몇 분 몇 초 관련 질문인지 알려주세요! - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
미해결
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
뭔가 빠트렸나 했더니, isModified() 때문에 비밀번호 변경이 아닌 신규 데이터 저장시에는 next() 를 호출해버리네요 에러도 없어서 파악이 좀 오래걸렸네요 if(user.isModified("password") 부분을 !user.isModified("password") 로 수정하고 해결되었네요 ※ 같은 문제 겪으시는분 계시면 참고하세요!