묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결노션(notion) 완벽 활용법
섹션이 workspace랑 private가 안뜨는데 어떻게만드나요
처음 회원가입하면 영상처럼 workspace랑 private 섹션이 안뜨는데 어떻게 만드나요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
roc_auc_score 오류multi_class must be in ('ovo', 'ovr') 해석 및 해결 방법 문의 드립니다
roc_auc_score 시 multi_class must be in ('ovo', 'ovr') 오류 해석 및 해결 방법 문의 드립니다..!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hello.html 오류
hello.html에서 thymeleaf 엔진을 받아오지 못하는 것 같은데 어디서 오류가 있는지 찾아주세요... 앞선 질문들에서 나왔던 8080포트의 중복인가 싶어 방법대로 8080 포트 프로세스 종료 후 재실행 & 다른 포트 번호로 접속. 두 가지 방법으로 다 해보았지만 계속 /hello에서 에러가 뜹니다 ㅠㅠ 도움 부탁드려요
-
미해결스프링 핵심 원리 - 기본편
DiscountPolicy 질문 있습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Member, Order와 다르게 왜 Discount만 Service 라는 명칭이 없는데요. 이 때 MemberService, OrderService 와 같은 Service 역할이지만 단순히 할인정책 이라는 설계 이름때문에 Service가 아닌 Policy로 붙인 건가요? 아니면 Discount 부분은 MemberService, OrderService와는 개념적으로 다른 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
@Compoent 사용시 순환 참조가 일어나지 않는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 순환 참조 문제가 발생하여 커뮤니티 글을 확인하고 해결하였는데요, 해당 링크를 참고해도 이해가 가지 않는 부분이 있어서 질문 남깁니다."@Around에서 자기 자신을 포함하고 있기 때문에 순환 참조가 발생한다" 라는 것은 이해를 했는데 "컴포넌트 스캔을 사용할 때는 AOP의 대상이 되는 이런 코드 자체가 없기 때문에 문제가 발생하지 않았습니다." 이 부분이 이해가 되지 않습니다. 컴포넌트 스캔을 사용해도 @Around에 명시한 경로에는 자기 자신인 TimeTraceAop 가 포함되는데 왜 이 경우에는 순환 참조가 일어나지 않는 것 인가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
nestjs google login (섹션30과제) 질문
선생님 안녕하세요.구글 소셜로그인 기능에 대해서 과제를 진행하고 있었는데요.과제 영상에 따라서 따라 내려가고있었는데 nestjs로 REST API를 생성하는데 있어서 refreshToken을 발급해줘야하는 단계에서 res가 에러가 발생합니다.IAuthServiceRefreshToken의 인터페이스에서 res가 없다는 것으로 확인이되는것 같은데요.이전에 context로 graphql의 인터페이스를 사용해주었었는데context를 없애고req로 변경하고 Express의 Response를 생성해주면 REST API가 되는걸까요?!이전까지 진행했을때는 Icontext를 생성해서 유저를 찾아내는 방식이었는데 강의내용에는 이런게 빠져있어서 어떻게 해나가야 하는지 좀 헷갈리는것 같습니다. 참고내용으로 이전에 사용했던 소스코드들을 공유드려봅니다.//auth.service.ts import { Injectable, UnprocessableEntityException } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import * as bcrypt from 'bcrypt'; import { JwtService } from '@nestjs/jwt'; import { IAuthServiceGetAccessToken, IAuthServiceLogin, IAuthServiceRestoreAccessToken, IAuthServiceSetRefreshToken, } from './interfaces/auth-service.interface'; @Injectable() export class AuthService { constructor( private readonly userService: UsersService, // private readonly jwtService: JwtService, ) {} async login({ email, password, context }: IAuthServiceLogin) { // 1. 이메일이 일치하는 유저를 DB에서 찾기 const user = await this.userService.findOneByEmail({ email }); // 2. 일치하는 유저가 없으면?! 에러 던지기!!! if (!user) throw new UnprocessableEntityException('존재하지 않는 이메일입니다.'); // 3. 일치하는 유저가 있지만, 비밀번호가 틀렸다면?! const isAuth = await bcrypt.compare(password, user.password); if (!isAuth) throw new UnprocessableEntityException('틀린 암호입니다.'); // 4. refreshToken(=JWT)을 만들어서 브라우저 쿠키에 저장해서 보내주기 this.setRefreshToken({ user, context }); // 5. 일치하는 유저도 있고, 비밀번호도 맞았다면?! // => accessToken(=JWT)을 만들어서 브라우저에 전달하기 return this.getAccessToken({ user }); } getAccessToken({ user }: IAuthServiceGetAccessToken): string { return this.jwtService.sign( { sub: user.id }, { secret: process.env.JWT_SECRET_KEY, expiresIn: process.env.JWT_ACCESS_TOKEN_EXPIRE, }, ); } setRefreshToken({ user, context }: IAuthServiceSetRefreshToken): void { const refreshToken = this.jwtService.sign( { sub: user.id }, { secret: process.env.JWT_REFRESH_SECRET_KEY, expiresIn: process.env.JWT_REFRESH_TOKEN_EXPIRE, }, ); //개발환경 context.res.setHeader( 'set-Cookie', `lovely soong=${refreshToken}; path=/;`, ); // 배포환경 // context.res.setHeader('set-Cookie', `refreshToken=${refreshToken}; path=/; domain=.mybacksite.com; SameSite=None; Secure; httpOnly`); // context.res.setHeader('Access-Control-Allow-Origin', 'https://myfrontsite.com'); } restoreAccessToken({ user }: IAuthServiceRestoreAccessToken): string { return this.getAccessToken({ user }); } } 확인부탁드리겠습니다 감사합니다.
-
미해결대세는 쿠버네티스 (초급~중급편)
강의 자료는 없을까요?
강의 자료는 없을까요?
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
링크에 있는 해결방법 대로 했는데 안됩니다..!
이렇게 설정되어있고 현재 버전은Android Studio Electric Eel | 2022.1.1 Patch 2 입니다..! 저렇게 해놔도 xml 파일에서 <card 할 시 자동완성이 되지 않습니다 ㅠㅠ
-
해결됨ElasticSearch Essential
rollover 설정 질문
안녕하세요 선생님, 질문 하나 드려도 될까요?? 다음과 같이 2개 조건이 만족하고싶습니다.hot 영역에 보관되면서도 primary shard size가 30기가 이상일 때 인덱스가 새로 생성인덱스가 hot 상태일 때는 만들어지고 30일 이후에 warm 영역으로 이동 ex) 오늘이 6.23일이면 logs-2023.06.23-000028 프라이머리샤드 30기가 이상 -> logs-2023.06.23-000029 생성(000028 도 여전히 hot 영역 왜냐면 생성되고 30일 이하)logs-2023.05.20-000001 샤드는 warm으로 이동 - 왜냐하면 30일 이후 그래서 아래와 같이 설정했는데, "hot" : { "min_age" : "0ms", "actions" : { "set_priority" : { "priority" : 100 }, "rollover" : { "max_primary_shard_size" : "30gb", "max_age" : "30d" } } }, 책에 rollover에서 둘중 하나 조건만 만족하면 된다라고 적혀있더라구요.그러면 위에와 같이 설정하면 primary 샤드가 30기가가 넘어갈때 인덱스가 새로 생성되면서 hot 상태가 아닌 warm 상태로 넘어가게 되는것같습니다. 저는 새로운 인덱스 생성 rollover는 프라이머리 샤드 30기가 이상, hot에서 warm으로 넘어가는 rollover는 30일 이렇게 설정하고 싶은데 어떻게 설정하면 되는걸까요??
-
해결됨입문자를 위한 게임 프로그래머 개론
공부 방향성에 대해 질문드립니다.
현재 일본에서 유학중인 대학교3학년이고 제 목표는 클라개발자로 회사에 취직한 이후에 조금씩 공부해서 서버쪽도 배워보고자하는 생각을 가지고있습니다.학교에서는 게임프로그래밍을 배우고있는데 학교에서는 1학년때 파이썬을 맛보기로만 배우고 이후에는 엔진사용법을 중점으로 수업을 해서 언리얼수업에서는 C++, 그리고 유니티수업에서는 C#을 가르쳐주지는않고 교수님 따라가는 느낌으로만 하고있고 C언어를 가르키는 수업도 없었고 제가 그동안 시험만 벼락치기로 겨우겨우 넘기면서 방치한 결과 대학교3학년생인데 프로그래밍 기초적인 부분도 모르고있는게 현 상황입니다. 그러던 와중 최근 갑자기 지금이라도 정신차리고 빨리 공부해아겠다는 생각이들어 요즘 이것저것 찾아보고있는데 어떻게 공부해라! 같은 내용의 자료가 너무 많다보니 오히려 고민이 되기시작했습니다. 서론이 엄청 길어졌는데일단 스스로 생각해본 계획은 C++로 시작해서 3~4개월공부하고 이후 언리얼엔진을 공부하면서 익숙해지면 C++과 병행을 하며 공부하고 이후에 c#과 유니티엔진을 공부하려고 생각을 했습니다.그런데 최근 C언어 기초 문법, 자료구조, 코딩 테스트, C언어 심화 및 시스템 프로그래밍, C++, 디자인 패턴, 소켓 프로그래밍, C# 그리고 나서 엔진 사용방법 순으로 기초부터 탄탄하게 공부하라는 조언을 들었고 좋은방향이라고 생각은 했지만 이분은 게임개발 분야는 아니시기도하고 저도 이렇게 하면 좋겠다는 생각을 하긴했지만 벌써 대학교3학년 절반이 지났기도했고 이제 4학년부터는 취업활동도 시작해야하는데(일본의 경우 대부분 대학교 졸업후 취직이 아니라 3~4학년부터 수업과 취업활동을 병행하고 취직에 성공하면 대학교를 졸업한 이후 바로 출근하는 형식입니다.) 시간이 촉박하지않을까 C언어부터 기초를 쌓고 C++을 공부하고 C#은 당장은 건너뛰고 언리얼엔진을 공부하더라도 포트폴리오도 필요하니 작품도 여러개 만들어야할텐데 과연 이게 다 소화할수있을까도 걱정입니다.그래서 제가 게임개발쪽 강의는 Rookiss님 강의만 구매하기도했고 가장 신뢰하고있어서Rookiss님의 의견을 묻고 그 의견을 바탕으로 방향을 잡아보려고합니다.제가 공부 방향성을 어떻게 잡으면 좋을까요..?어떻게 시작을 해야할까요?
-
미해결Selenium 기본 과정
맥에서 개발환경 설정하는 법
맥에서 가상환경 활성화 하는 방법을 알고싶습니다
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
메모리 오류 관련
안녕하세요작업형 2관련 마지막으로 시험환경으로 연습해보고 있는데 갑자기 'killed' 오류 메세지가 나면서 모델링이 되지 않습니다. 기존 코랩과 비슷하게 했는데 어떤 차이가 있을까요?? import pandas as pdX_test = pd.read_csv("data/X_test.csv")X_train = pd.read_csv("data/X_train.csv")y_train = pd.read_csv("data/y_train.csv")# 사용자 코딩pd.set_option('display.max_columns', None)pd.options.display.float_format = '{:.3f}'.formatX_train = X_train.drop('cust_id', axis = 1)cust_id = X_test.pop('cust_id')X_train = X_train.fillna(0)X_test = X_test.fillna(0)cols_n = ['총구매액', '최대구매액', '환불금액', '내점일수', '내점당구매건수', '주말방문비율', '구매주기']cols_c = ['주구매상품', '주구매지점']from sklearn.preprocessing import RobustScalerscaler = RobustScaler()X_train[cols_n] = scaler.fit_transform(X_train[cols_n])X_test[cols_n] = scaler.transform(X_test[cols_n])from sklearn.preprocessing import LabelEncoderfor col in cols_c: le = LabelEncoder() X_train[col] = le.fit_transform(X_train[col]) X_test[col] = le.transform(X_test[col])from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier(random_state = 38)model.fit(X_train, y_train)pred = model.predict_proba(X_test)
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
npm run dev를 하고 localhost로 들어가면 연결을 거부했다고 뜹니다
npm run dev를 하면 아래와 같은 오류 메세지가 뜹니다그리고 로컬호스트 들어가보면 사이트에 연결할 수 없음이 뜹니다.도와주세요 ㅠㅠ > react-nodebird-front@1.0.0 dev> nextBrowserslist: caniuse-lite is outdated. Please run:npx browserslist@latest --update-dbready - started server on http://localhost:3000node:internal/crypto/hash:71 this[kHandle] = new _Hash(algorithm, xofLen); ^Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19) at Object.createHash (node:crypto:133:10) at module.exports (/Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/webpack/lib/util/createHash.js:135:53) at NormalModule._initBuildHash (/Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:417:16) at handleParseError (/Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:471:10) at /Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:503:5 at /Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/webpack/lib/NormalModule.js:358:12 at /Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/loader-runner/lib/LoaderRunner.js:373:3 at iterateNormalLoaders (/Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/loader-runner/lib/LoaderRunner.js:214:10) at Array.<anonymous> (/Users/hyeonyeongjeong/Documents/2023project/nodebird/prepare/front/node_modules/loader-runner/lib/LoaderRunner.js:205:4) { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED'}Node.js v18.16.1
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
spring.profiles.active=test 의 필요성
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]test 패키지의 application.properties에서 spring.profiles.active=test를 주석처리하고 실행해보았을때 아래와 같은 로그가 나옵니다. h.i.ItemServiceApplicationTests : No active profile set, falling back to 1 default profile: "default"test 패키지의 application.properties에 profile을 지정해주는 이유는 local 프로필로 인식되지않게하기 위함인데 위와 같은 결과가 나온다면 test 패키지의 application.properties에 profile을 따로 지정해줄 필요가 없지않을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Json으로 말아넣는다는 것 질문
자바 ORM 표준 JPA 프로그래밍 11분 부터 나오는 내용중 데이터의 양이 많아지면 테이블을 단순하게 유지한다면서Json으로 말아넣는다는데 이게 어떤 방식을 의미하는 것인가요?
-
미해결오토캐드 2022 기초를 탄탄하게 초급과 중급까지 (자막제공)
예제 문의
중급 7강 듣는데 초급 예제는 받았었는데, 중급 PPT 예제가 어디 있을까요...
-
미해결Vue.js + TypeScript 완벽 가이드
두번쨰 프로젝트 권한요청
죄송하지만 유효기간이 지나 한번만 다시 요청 드리겠습니다!weotjqw@naver.com
-
미해결Java/Spring 주니어 개발자를 위한 오답노트
Controller / application Service / Domain 의 역할 구분
안녕하세요 강의 잘 듣고 있습니다.헥사고날 아키텍쳐 부분 강의를 듣고, 궁금한 부분이 새겨서 질문 남깁니다!Application Service(이하 서비스) 에서 도메인부분을 분리 하여 객체의 상태 변화에 대한 부분을 처리하도록 하고, 서비스에선 Repository와 소통해서 필요한 객체나 컨트롤러에서 정보(예를 들어 수정 정보 등등) 등등을 얻어서 도메인 부분에 위임한다고 이해했습니다. 그렇게 도메인 영역을 분리하면 테스트에 용이하다는 것은 이해했습니다. 그런데 실제로 토이프로젝트에 적용해보려고 코드를 수정하는 중에 예를 들어 게시글을 수정하는 과정이라면 컨트롤러에서 처음 요청을 받을 때 postId, updateRequest를 받아서 서비스에 업데이트를 요청하고, 다시 서비스에선 아이디를 통해 Post를 찾고, PostDomainService(가칭)에 Post와서 updateRequest를 넘겨 수정한다면 거의 같은 내용의 파라미터를 굳이 2 계층을 건너 불필요한 위임이 반복 된다고 생각했습니다. 궁금한 것은 2가지 입니다.이런 경우엔 PostDomainService 클래스를 만들기보단 Post 객체 자체에서 업데이트를 처리하는 것이 맞을까요? - (1번 코드)도메인과 도메인 서비스의 차이는 객체의 상태(도메인)와 객체의 행동(도메인 서비스) 일까요? 엔티티와 도메인의 구분이 잘 이해가 되지 않습니다. //== 업데이트 로직 ==// public void updateInfo(PostUpdateReqDto updatePost) { this.title = updatePost.getTitle(); this.content = updatePost.getContent(); } // 기존 서비스에서의 로직 @Transactional public PostUpdateResDto updatePost(final Long postId, final PostUpdateReqDto postUpdateReqDto) { Post findPost = postRepository.findWithMemberByPostId(postId); Post updatedPost = postDomainService.updatePost(findPost, postUpdateReqDto); // 위 과정에 생기면 사라지는 메서드 // findPost.updateInfo(postUpdateReqDto); checkForbiddenWord(findPost); return new PostUpdateResDto(findPost); }
-
해결됨[2025 리뉴얼] 스스로 구축하는 AWS 클라우드 인프라 - 기본편
로컬에서 rds 접속
안녕하세요, 좋은 강의 감사합니다. 로컬에서 rds를 연결하고 싶은데 궁금한 것이 생겨서 질문을 남기게 되었습니다. 현재 private subnet에 rds를 생성한 상태에서 제 로컬 컴퓨터에 스프링을 사용해서 rds에 접근하려고 하는데 vpc가 달라서 접속이 되지 않습니다. 이를 해결하기 위해서 스택오버플로우를 참고하니 로컬 컴퓨터의 ip 주소를 rds 인바운드 규칙에 넣어서 하면 된다고 하길래 적용해봤더니 잘 되지 않습니다.보통 어떤 식으로 로컬에서 rds로 접근하는 것인가요?배스천을 사용해서 rds mysql workbranch에는 접근이 가능하도록 설정을 했습니다. 질문 읽어주셔서 감사합니다.
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
4-8. 지표 정의 연습 문제
안녕하세요 카일님!문제 정의처럼 본질적인 걸 설명해주시는데도 활용도가 높아서 매 챕터마다 놀람을 금치 못하면서, 강의 너무x100 잘 듣고 있습니다 ㅎㅎ배운 부분들을 활용하면서 지표 정의 연습 문제를 풀어봤습니다.피드백 부탁드려요 :) #1. 기능이 잘 작동하는지 확인하려면?1-1. 문제 정의 프로세스Q. 기능이 잘 동작한다면 어떤 현상이 발생하고 있을까? A. 해당 기능을 클릭한다.Q. 위 현상이 왜 발생했을까? A. 고객이 원하는 정보를 빠르게 제공했기 때문이다.Q. 고객은 이런 상황에 어떻게 할까? A. 해당 페이지에서 버튼 클릭, 다음 스크린 이동 등 특정 이벤트를 수행한다.1-2. 핵심 지표 & 보조 지표 정의핵심 지표는 무엇인가?기능별 CTR (click / view)보조 지표는 무엇인가?클릭한 신규 유저의 해당 세션 내 홈화면 Duration Time → 빠르게 정보를 찾을 수 있었는지 확인기존 유저의 경우 이미 페이지 레이아웃을 알고 있으므로 신규 유저만 따로 구분해서 보고자 함다음 페이지에서의 이벤트 발생 여부 → 원하는 정보를 찾았는지 확인ex. 최상단의 배너 컴포넌트를 클릭한 후 ‘할인 쿠폰 받기’ 버튼을 클릭했는지만약 아무 이벤트가 발생하지 안혹 다시 홈화면으로 이탈한다면, 기능을 클릭했다고 하더라도 원하는 정보를 제공했다고 보기 어려움1-3. 멘탈 시뮬레이션핵심 지표(CTR)을 어떻게 올릴 수 있을까? input 지표는 무엇일까?신규 유저를 대상으로 온보딩 프로세스 진행해 더 빠르게 정보를 제공 ⇒ ab 테스트로 온보딩 제공(실험군), 미제공(대조군) 유저의 한 세션 내 duration time 비교서브 타이틀을 추가해 클릭 시 표시될 정보에 대한 힌트 제공ex. ‘이런 음식 어때요’ 타이틀 하단에 “지금 다른 사람들이 많이 주문하고 있어요!” 텍스트 추가 / ‘동네 맛집’ 타이틀 하단에 “지금 이웃들이 가장 많이 찾는 맛집” 텍스트 추가 #2. 검색 만족도 지표2-1. 문제 정의 프로세스Q. 검색 기능에 만족한다면 어떤 현상이 발생하고 있을까?A. 검색 결과를 클릭한다.Q. 위 현상이 왜 발생했을까? A. 검색을 통해 찾고자 했던 정보가 표시됐기 때문이다.Q. 고객은 이런 상황에 어떻게 할까? A. 검색 기능을 다음 앱 방문 때도 사용한다.2-2. 핵심 지표 & 보조 지표 정의핵심 지표는 무엇인가?search, search_result 페이지별 검색 결과 CTR (click / view)검색 기능 사용 주차별 리텐션율 (전주 대비 이번 주 search, search_result 페이지 vIew 수)꼭 매번 앱을 사용할 때마다 검색 기능을 사용하지는 않을 수 있기 때문에 한 주로 기간을 정의함보조 지표는 무엇인가?검색 결과를 클릭한 유저의 결제 전환율 (결제를 진행한 유저 수 / search OR search_result 페이지에서 검색 결과를 클릭한 유저 수)실제로 매출로까지 이어졌는지 파악하고자 함2-3. 멘탈 시뮬레이션만약 검색 결과에 만족하지 않았다면 유저는 어떻게 행동할까?홈 화면으로 이탈한다. (search ⇒ home)재검색을 해본다 (search ⇒ search_result ⇒ search ⇒ search_result) #3. 검색 필터 기능의 활성화 지표3-1. 문제 정의 프로세스Q. 필터 기능이 잘 사용되고 있다다면 어떤 현상이 발생하고 있을까? A. 검색 필터 결과를 클릭한다.Q. 위 현상이 왜 발생했을까? A. 원하는 조건을 적용해 많은 검색 결과 중 본인에게 필요한 정보만 볼 수 있었기 때문이다.Q. 고객은 이런 상황에 어떻게 행동할까? A. 필터 기능을 다시 사용한다.3-2. 핵심 지표 & 보조 지표 정의핵심 지표는 무엇인가?검색 필터 결과 CTR활성화를 ‘본인에게 필요한 정보를 찾는 것’으로 정의 → 필요한 정보를 찾았다면 검색 결과를 클릭했을 것보조 지표는 무엇인가?검색 필터 기능 주차별 리텐션율필터 기능을 통한 검색 프로세스가 만족스러웠다면 다시 사용했을 것검색 필터 사용 ↔ 미사용 유저의 결제 전환율 편차일종의 가드레일 지표로 사용. 퍼널 전체에 영향을 얼마나 미치는지 확인3-3. 멘탈 시뮬레이션핵심 지표를 어떻게 개선할 수 있을까? input 지표는 무엇일까?‘필요한 정보’를 더 쪼개서 생각해보면 아래 2가지로 나눌 수 있음A) 구매하고자 하는 상품군이 뚜렷하여 해당 정보를 찾는 것 (ex. 운동할 때 입을 반바지를 사기 위해 카테고리 필터에서 ‘트레이닝 복’을 선택)B) 아직 구매하고자 하는 바가 뚜렷하지 않아 필요 없는 정보는 제외하는 것 (ex. 10만원 이상은 지불할 의사가 없어 가격 필터를 10만원 이하로 설정)A를 원하는 유저에게는 더 상세하게 필터에서 선택할 수 있는 값을 제공B를 원하는 유저에게는 직접 값을 입력하는 방식으로 드래그 형식으로 범위를 지정할 수 있도록 UX 제공필터 기능에서 유저가 아하 모먼트를 느끼지 못 했다면 어떻게 행동할까?필터 기능이 복잡하다고 느껴서 이탈할 수도 있을 듯 → 검색 페이지에서 홈 화면으로의 이탈율을 파악#4. 배달 서비스에서 가장 중요한 지표는?4-1. 핵심 지표 정의주차별 리텐션율일반적인 배달 비즈니스의 모델은 매출원을 ‘수수료’, ‘광고 및 프로모션’, ‘파트너사 수수료’, ‘기타 수익원’ 총 4가지로 나눌 수 있음또한 수수료가 가장 큰 수입원인 경우가 많음수수료의 선행 지표로는 아래 3가지가 있음A. 주문 건수를 늘리거나B. 객단가를 높이거나C. 더 자주 주문을 하게 만들거나A는 프로모션을 통해 일시적으로 증가시킬 수 있지만 지속 가능한 방안이 아님.또한 유저의 관점에서 생각해보면 옷은 하루에도 5벌, 100벌도 살 수 있지만 음식은 하루에 5끼, 10끼 먹으라 할 수 없음 (허헣)B는 3-side market인 배달 비즈니스 모델을 고려했을 때 가맹점들에게 강제할 수 없으므로 어려움C는 가맹점, 라이더와 별개적으로 관리할 수 있는 지표로, 플랫폼의 편의성을 높이는 등의 액션으로 통제가 가능함따라서 주차별 리텐션율을 핵심 지표로 설정함4-2. Action Item 도출서비스를 다시 사용하는 유저에 대한 가설은 아래와 같음배달 앱이 편리하다배달 앱이 경쟁사에 비해 혜택을 많이 준다입점된 가게가 많다리뷰가 많다부가적인 서비스를 제공한다 (ex. 쿠팡이츠 - 쿠팡플레이)데이터를 확인할 수 없으므로 개인의 경험을 토대로 생각했을 때 4번 이유가 가장 클 것으로 예상유저에게 리뷰 작성을 유도하거나, 리뷰를 보기 편리하도록 기능을 개선한다면 주차별 리텐션율도 높아질 것으로 예상됨#5. 추천 알고리즘의 성능 지표5-1. 문제 정의 프로세스Q. 유저가 추천에 만족했다면 어떤 현상이 발생할까? A. 추천 알고리즘으로 표시된 제품에 관심을 가진다Q. 위 현상이 왜 발생했을까? A’. 구매를 하려고 했던 제품을 표시해줬다A.’’ 살 생각은 없었으나 마음에 드는 제품을 추천해줬다Q. 어떤 행동을 할까? A’. 추천 상품을 클릭한다A’’. 상세페이지에서 구매를 한다5-2. 핵심 지표 & 보조 지표 정의핵심 지표는 무엇인가?추천 상품 CTR보조 지표는 무엇인가?추천 상품 CVR5-3. 멘탈 시뮬레이션어떻게 하면 핵심 지표를 높일 수 있을까? Input 지표는 무엇일까?유저를 세그먼트로 나눠 NDCG를 측정(관련도 값을 활용할 수 있기 때문에 평가 지표로 NDCG를 선정함)하고 각 세그먼트 별로 추천 알고리즘을 다르게 적용 → NDCG가 Input 지표로 적용될 수 있음#6. 자주 사용하는 서비스의 지표6-0. 가장 자주 사용하는 서비스배달의 민족 내 배민스토어 서비스6-1. 제일 중요한 지표는 무엇인가?배달의 민족 유저 중 배민스토어 사용 이력 있는 유저의 비율 (배민스토어 MAU / 배달의 민족 MAU)6-2. 왜 해당 지표가 가장 중요한가?현 배민스토어 비즈니스 상황을 고려했을 때, AARRR 퍼널 중 Acquisition을 개선했을 때 가장 비즈니스 임팩트가 클 것으로 예상되기 때문배달의 민족은 MAU가 약 2천만에 달하지만 그 중 배민스토어를 사용해본 유저는 3.4%에 불과(오픈서베이 리포트 참고)또한 이미 회원가입이 되어 있는 유저를 배민스토어로 유입시키기만 하면 되기 때문에 퍼널 개선의 난이도가 낮음워낙 배민 유저가 많아 임팩트가 뒷단의 퍼널을 개선했을 때보다 임팩트가 큼6-3. 이외에 확인해야 하는 지표 2개는?배민스토어 홈 화면 컴포넌트별 클릭률아직 사업 초기이기 때문에 유저를 온보딩하는 기능이 중요 → 해당 역할을 얼마나 잘 하고 있는지 클릭률을 통해 확인장바구니 → 결제 페이지 전환율최소주문금액이 1만~3만 원 정도로 형성되어 있는데, ‘즉시성’이라는 요인(ex. 갑자기 수건이 없어서 다음 날 도착하는 쿠팡이나 네이버가 아닌 1~3시간 내 도착하는 배민스토어를 통해 주문)을 고려했을 때 최소주문금액을 채우지 못하는 유저가 많을 것으로 생각됨#7. 가입 퍼널 개선 프로젝트7-1. 핵심 지표는 무엇인가?온보딩 도입 이전 대비 가입률 증감률온보딩 도입 이전 대비 핵심 기능 사용 비율 비교온보딩은 서비스의 아하 모먼트를 미리 알려주려고 하는 기능도 있음. 만약 가입을 한다고 해도, 서비스의 아하 모먼트를 파악하지 못하면 리텐션율이 떨어질 것이기 때문. +) 연습 문제를 풀면서 느낀 점MECE하게 문제를 나눌 때 어떤 기준으로 로직 트리를 그려 나가냐에 따라 액션 아이템도 완전히 달라진다이 업무. 문제 정의가 99%다. 어렵지만 그만큼 중요하니 앞으로도 꾸준히 연습을 해봐야겠다 ++) 어려웠던 부분 & 궁금한 부분문제 정의 프로세스에서 '어떤 현상이 발생할까?'와 '고객은 이런 상황에 어떻게 행동할까?'에 같은 답변을 하게 되는 경우가 많았습니다. 또는 순서의 개념으로 작성을 하게 되는데(ex. 검색 기능을 클릭한다 -> 검색 기능을 다시 사용한다) 제가 제대로 프로세스를 짜고 있는 게 맞을까요?팀원들에게 문제 정의를 설명할 때 어떻게 하면 제가 만든 MECE+Logic Tree를 전달할 수 있을까요? (특히 상사에게 보고할 때 도식화를 그대로 보여줄 수는 없으니...) 혹시 카일 님만의 팁이 있는지 궁금합니다! 감사합니다!