inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

문제2 : PayService

미해결

김영한의 실전 자바 - 기본편

[질문 내용] 정답을 보기 전에 먼저 제가 스스로 리팩토링 하다가 PayService에 있는 processPay 메소드도 Pay 인터페이스에 넣어서 각각 KakaoPay, NaverPay에서 구현을 했는데 이렇게 해도 OCP 원칙을 따르면서 리팩토링 한건가요?

  • java
  • 객체지향
soojinkimss 댓글 2 좋아요 0 조회수 159

알맞은 버전 확인 방법

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

9분에서 Reference Doc 들어가서 hibernate 검색하면 스프링부트와의 알맞은 버전이 나온다고 하셨는데, 저는 안 나오네요. 지금은 방법이 바뀌었나요? 적합한 버전을 어떻게 찾나요?

  • java
  • jpa
ㅇㄱㅇㄱ 댓글 3 좋아요 0 조회수 591

[인프런 빅쿼리 빠짝스터디 4주차] 최종 과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

노션에서 진행했습니다. https://torch-cart-08d.notion.site/140701964d8c8087871bfdc7e3081241

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
양승엽 댓글 1 좋아요 0 조회수 114

왜 오류 인가요?

미해결

자바(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)); } } 이코드는 어디 부분에서 로직이 오류인가요?

  • java
  • 코딩-테스트
제비꼬리 댓글 0 좋아요 0 조회수 111

커밋 끊으면서 해주시는거 너무 좋네요.

해결됨

서버개발자 과제전형 완벽가이드 - 1편

강의를 커밋으로 끊으면서 만드신거 너무 좋습니다. 강의도 길어지지도 않고 깃 사용법도 좀 더 배울 수 있구요. 단지 커밋 메시지랑 브랜치명이 조금씩 안 맞는 부분은 있습니다. 😄

  • java
  • spring
  • spring-boot
  • database
아라레 댓글 2 좋아요 1 조회수 176

테스트 코드를 위한 @Builder, 생성자

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요 api 에서 request 를 받는 경우 getter 만 열어두고 사용하는 경우가 있는데요, 이런 경우엔 request dto에 테스트 코드를 위한 생성자나 builder를 추가해주는게 맞을까요? 테스트 코드를 짜기 위해 실제 코드를 수정하는 부분이 찝찝해 질문드립니다

  • java
  • spring
  • mvc
  • spring-boot
  • 테스트
  • 테스트코드
janhoy 댓글 2 좋아요 0 조회수 172

[빠짝스터디 3주차 과제] 리텐션 과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

Weekly Retention 구하기 # Weekly Retention을 구하는 쿼리 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" # 유저의 event_week, firts_week, diff_week 구하기 ), 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 ) # 유저별 event_week, first_week, diff_week 수 ), 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 ) # Weekly retention의 수와 비율 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. Retention User를 New +Current +Resurrected + Dormant User로 나누는 쿼리를 작성하기 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' # 1주 안에 사용한 유저 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 ; 어떤 사람들이 리텐션이 높은지 찾아보기 NEW(신규유저) : 신규 유저 10월 이후 하락 Current (활성화 유저) : 12월까지 상승세를 보이다가 1월에 다시 하락 Resurrected (복귀 유저) : 지속 상승 Dormant User (휴면 유저) : 지속 상승 ???: 왜 휴면유저와 복귀유저의 사용 비율이 비슷하게 나오는걸까..? 그래도 그나마 복귀유저가 리텐션이 더 높음 Core Event를 "click_payment"라고 설정하고 Weekly Retention을 구하기 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' -- Core Event 필터링 ), 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

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
김희은 댓글 1 좋아요 0 조회수 117

저는 왜 EOFException이 아니라 SocketException이 발생할까요 ?

미해결

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 강의를 쭉 들으면서 ServerV3, V4를 키고 ClientV3,4 를 강제 종료시키면 영한님은 EOF 오류가 뜨는데 저는 Socket 오류가 발생합니다. 제가 잘못한건지 아니면 상황에 따라 다른건지 궁금합니다.

  • java
  • 네트워크
  • 객체지향
ppj2130 댓글 2 좋아요 1 조회수 336

EX1번문제

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 영한쌤이랑 다르게 int sum= a + b + c; 을 생각못하고 리턴값으로 결과는 똑같이 얻었는데 영한쌤과 과정이 다르니 틀렸다고 봐야겠죠?.. 가능하다면 쌤이랑 다르게 int sum = a + b + c;를 작성하지 않은 것에 대한 단점도 알고 싶습니다ㅠㅠ 어렵네요..

  • java
  • 객체지향
whydoubleon 댓글 1 좋아요 0 조회수 136

프로젝트 오픈 시

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 설명해주시는대로 따라서 받았는데 이렇게 받으니까 build.gradle이 없어서 그냥 프로젝트 오픈했거든요?? 이렇게 해도 되는건가요 ㅠㅠ?? 프로젝트 오픈해도 gradle같은건 없는데 ㅠㅠ

  • java
  • spring
  • mvc
  • spring-boot
soy 댓글 4 좋아요 0 조회수 316

26강 updateUser request id값이 안들어옵니다.

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

private final UserServiceV2 userService; jpa로 설정한 이후 putMapping에서 id값이 0으로만 들어옵니다. 코드는 json원시값보고싶어서 httpRequest 로 테스트한 상황입니다. (로그는 Raw JSON Body: {"id":0,"name":"333"}) db 데이터, 등록, 삭제 모두다 잘동작하고 id만 client에서 받아오질 못하는 것 같습니다. postman으로 json값 정상적으로 요청하면 작동도 잘되구요. UserServiceV1 인 jdbctemplate를 이용한 방식도 파라미터 정상적으로 넘어와서 잘동작합니다. 이유를 모르겠습니다.

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
wisdfire 댓글 3 좋아요 0 조회수 108

ppt 자료다운이 이상합니다.

미해결

2. 웹개발 코스 [JAVA 개발언어]

자료 다운받아 압축을 풀면 ppt가 아닌 이상한 파일들이 있습니다.

  • java
jinu0513 댓글 3 좋아요 0 조회수 136

[빠짝스터디 4주차 과제] 강의 6-1 최종과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

노션에 작성하였습니다. https://apple-baroness-590.notion.site/5-140acf7d68f68092ade2ce06dd76c781

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
  • 빠짝스터디
  • 빅쿼리
디디 댓글 1 좋아요 0 조회수 142

querydsl 처음 설정 후 테스트코드 돌려보는데 오류 원인을 모르겠어요

미해결

실전! Querydsl

JPAQueryFactory queryFactory = new JPAQueryFactory(em); 부분에서 Cannot resolve constructor 'JPAQueryFactory(EntityManager)' 오류가 생기는데 원인을 모르겠어요 아래는 현재 설정입니다. 스프링 생성 build.gradle 소스 plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'study' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } 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' //querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa' implementation 'mysql:mysql-connector-java:8.0.33' // MySQL 드라이버 최신 버전 사용 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' // 쿼리 파라미터 로그 표시 (성능에 영향을 줄 수 있음) // runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } //querydsl 추가 끝 테스트코드 package study.querydsl; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.querydsl.entity.Hello; @SpringBootTest @Transactional class QuerydslApplicationTests { @Autowired EntityManager em; @Test void contextLoads() { Hello hello = new Hello(); em.persist(hello); JPAQueryFactory queryFactory = new JPAQueryFactory(em); // QueryDSL 쿼리 테스트 } }

  • java
  • jpa
  • querydsl
  • spring
테렌 댓글 2 좋아요 0 조회수 758

[빠짝스터디 4주차 과제] 6-1의 최종과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

노션링크: https://polite-vinyl-a61.notion.site/4-Foodie-Express-1404994b207d80e5ab10f2e96cc0e82e?pvs=74

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
MS 댓글 1 좋아요 0 조회수 111

[빠짝스터디 4주차 과제] 강의 6-1의 최종과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

내용이 많아 notion에 대신 작성했습니다. [Foodie Express 분석 보고서]( https://www.notion.so/claire1125/Foodie-Express-14110fb577ad8074b8d5ce0c58609bc2?pvs=4 )

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
sjb2774 댓글 2 좋아요 0 조회수 143

[빠짝스터디 4주차 과제] 강의 6-1 최종과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

제품 자체는 앱의 기본 flow만 갖춰진 상태다. 앱 스플래시 - 로그인 - 홈 진입 후 검색 / 즐겨찾기 / 주문내역 / 카테고리 페이지를 볼 수 있고 restaurant -> food_detail -> cart -> payment -> order_success로 이어지는 funnel을 갖고있다. WITH login_data AS ( SELECT DISTINCT user_pseudo_id, FORMAT_DATE('%Y-%m-01', event_date) AS login_month FROM advanced.app_logs WHERE event_date BETWEEN '2022-03-01' AND '2023-01-31' ) SELECT login_month, COUNT(DISTINCT user_pseudo_id) FROM login_data GROUP BY login_month ORDER BY login_month MAU를 계산해보면, 7,500에서 시작하여 23,373까지 성장했다. 23년 1월 데이터는 절반 정도까지만 있으므로, 지속적인 성장세를 보여주고 있다고 판단할 수는 있겠다. 하지만 런칭 후 +2달 이후로는 계속 진전 없는 모습을 보여준다. 배달 앱이기 때문에, 평일-주말에는 다른 접속률을 보여줄 것이다. 그러므로 weekly retention 지표를 활용한다. WITH base AS( SELECT DISTINCT user_id, event_name, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_date, user_pseudo_id FROM advanced.app_logs WHERE event_date BETWEEN '2022-08-01' AND '2022-11-03' AND event_name = 'click_payment' ) , dates AS( 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 ) , first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, week) AS diff_of_week FROM dates ) , 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 ORDER BY diff_of_week ) , first_week_user_count AS ( SELECT diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week) AS first_week_user_cnt FROM user_counts ) SELECT *, SAFE_DIVIDE(user_cnt, first_week_user_cnt) AS retain_rate FROM first_week_user_count weekly retention으로 살펴보면, 첫 주에 1%의 고객이 남고 그 후로는 어느정도 플래튜가 형성되는 모습이다. 따라서 아직은 PMF를 찾지 못했다고 할 수 있다. 그렇다면 재접속을 하는 유저는 그렇지 않은 유저와 어떻게 다를까? 총 기간동안의 퍼널 이벤트 수는 아래와 같다. WITH base AS ( SELECT event_date , event_timestamp , event_name , user_id , user_pseudo_id , platform , MAX(IF(event_param.key = 'firebase_screen', event_param.value.string_value, NULL)) AS firebase_screen , MAX(IF(event_param.key = 'session_id', event_param.value.string_value, NULL)) AS session_id FROM `advanced.app_logs` CROSS JOIN UNNEST(event_params) AS event_param WHERE event_date BETWEEN '2022-08-01' AND '2023-01-31' GROUP BY ALL ) , filter_event_and_concat_event_and_screen AS ( SELECT * EXCEPT(event_name, firebase_screen, event_timestamp) , DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime , CONCAT(event_name, '-', firebase_screen) AS event_name_with_screen FROM base WHERE event_name IN ('screen_view', 'click_payment') ) SELECT event_name_with_screen , CASE WHEN event_name_with_screen = 'screen_view-welcome' THEN 1 WHEN event_name_with_screen = 'screen_view-home' THEN 2 WHEN event_name_with_screen = 'screen_view-food_category' THEN 3 WHEN event_name_with_screen = 'screen_view-restaurant' THEN 4 WHEN event_name_with_screen = 'screen_view-cart' THEN 5 WHEN event_name_with_screen = 'click_payment-cart' THEN 6 ELSE NULL END AS STEP_NUMBER , COUNT(DISTINCT user_pseudo_id) AS cnt FROM filter_event_and_concat_event_and_screen GROUP BY ALL HAVING step_number IS NOT NULL ORDER BY step_number 홈에서 food category를 선택하는 유저의 비율은 65% 카테고리에서 식당을 고르는 유저의 비율은 91% 식당에서 장바구니에 담는 유저의 비율은 58% 장바구니로부터 결제하는 유저의 비율은 67% 정도이다. 일단 탐색을 시작하면 카테고리, 식당에 대해 잘 찾아보는 편이고, 장바구니에 담아 결제까지 하는 것에 대해서는 event 수가 급감한다. 재접속을 하는 유저들의 퍼널을 페이지 기준으로 나눠보았다. WITH base AS( SELECT DISTINCT user_id, event_name, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_date, user_pseudo_id FROM advanced.app_logs WHERE event_date BETWEEN '2022-08-01' AND '2023-01-31' ) , dates AS( 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 ) , first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, week) AS diff_of_week FROM dates ) , retain_user AS ( SELECT DISTINCT user_pseudo_id FROM first_week_and_diff WHERE diff_of_week >= 1 ) , base2 AS ( SELECT event_date , event_timestamp , event_name , user_id , user_pseudo_id , platform , MAX(IF(event_param.key = 'firebase_screen', event_param.value.string_value, NULL)) AS firebase_screen , MAX(IF(event_param.key = 'session_id', event_param.value.string_value, NULL)) AS session_id FROM `advanced.app_logs` CROSS JOIN UNNEST(event_params) AS event_param WHERE event_date BETWEEN '2022-08-01' AND '2023-01-31' AND user_pseudo_id IN ( SELECT user_pseudo_id FROM retain_user ) GROUP BY ALL ) , filter_event_and_concat_event_and_screen AS ( SELECT * EXCEPT(event_name, firebase_screen, event_timestamp) , DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime , CONCAT(event_name, '-', firebase_screen) AS event_name_with_screen FROM base2 WHERE event_name IN ('screen_view', 'click_payment') ) SELECT event_name_with_screen , CASE WHEN event_name_with_screen = 'screen_view-welcome' THEN 1 WHEN event_name_with_screen = 'screen_view-home' THEN 2 WHEN event_name_with_screen = 'screen_view-food_category' THEN 3 WHEN event_name_with_screen = 'screen_view-restaurant' THEN 4 WHEN event_name_with_screen = 'screen_view-cart' THEN 5 WHEN event_name_with_screen = 'click_payment-cart' THEN 6 ELSE NULL END AS STEP_NUMBER , COUNT(DISTINCT user_pseudo_id) AS cnt FROM filter_event_and_concat_event_and_screen GROUP BY ALL HAVING step_number IS NOT NULL ORDER BY STEP_NUMBER 한번이라도 재접속한 사람들은 웰컴 -> 홈을 넘어가는 비율이 거의 100%에 가깝다. 아무래도 login이란 허들때문일 것이다. 그렇다면, login 허들을 좀 더 잘 넘기 위해 제품 온보딩을 잘 해줘야하지 않을까? 확실히 프로덕트에 대한 차별점 설명이 부족하므로, 이 부분을 강화하여 '어떤 core value를 가진 배달앱'인지를 어필할 필요가 있겠다. 그리고 홈에서 카테고리로 넘어가는 비율이 73%, 카테고리에서 식당 페이지로 92%, 식당 페이지에서 장바구니로는 55% 장바구니로부터 결제까지 이어지는 비율은 67%이다. 재접속한 유저들은 홈에서 food category를 선택하는 데에 좀 더 높은 전환율을 보였다. 그렇다면 이들이 다른 유저들 대비하여 추가적으로 느낀 이점은 무엇일지 고민할 필요가 있을 것이다. 재접속 기준만으로는 차이가 별로 없어서 click payment 경험이 있고 재접속을 한 유저들의 퍼널을 구해봤다. 비교적 매우 높은 전환율을 보여준다. 특히 카테고리를 굳이 선택하지 않고 바로 식당을 선택하는데, 카테고리가 비교적 메리트있게 설계되지 않아서 그런 것인지? 라는 생각이 든다. 이벤트 데이터가 더 있었다면, 식당으로 전환되는 페이지들의 비율을 살펴보면서 홈의 비중이 높지 않을까 하고 보겠지만, 지금은 그냥 그렇지 않을까 하고 추측해본다. 확실히 구매를 했고, 2번 이상 접속한 유저들의 퍼널 전환율은 매우 좋다. 해당 제품이 직접 보기에는 배달 주문에 필수적인 기능들만 있지만, 해당 1만 4천명 정도의 유저들이 느끼는 분명한 메리트가 있을 것이다. 그 메리트로부터 core value를 찾고, 고객들이 좋아하는 기능 중심으로 발전시켜 나가야할 것이다.

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
Min Choi 댓글 1 좋아요 0 조회수 171

[빠짝스터디 4주차] 6-1의 최종 과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

과제 관련 노션 링크 첨부합니다! https://www.notion.so/4-6-1-1419f4b04d5380308bbdf4a19394e924?pvs=4

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
o0long 댓글 2 좋아요 0 조회수 148

[빠짝스터디 4주차 과제] 강의 6-1. 최종과제

해결됨

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

4주차 최종과제 노션 링크입니다:) https://salt-baron-5c5.notion.site/4-Foodie-Express-13ea734e64b8801595f8c8c3467d9bc5?pvs=4

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
JYP 댓글 1 좋아요 0 조회수 139

인기 태그

인프런 TOP Writers

주간 인기글