inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

쿠폰 생성 에러 처리에 관해서 질문이 있습니다.

미해결

실습으로 배우는 선착순 이벤트 시스템

안녕하세요 강사님 강의 잘 봤습니다. 덕분에 kafka와 redis를 어떤식으로 사용할 수 있는지 많은 걸 엿볼 수 있는 느낌이었습니다. 강의가 다 진행되고 난 후 궁금한 점이 하나 있습니다. 쿠폰 생성 에러 처리 관련되어서 질문이 있는데, 만약 메시지를 수신하는 쪽이 아니라 발송하는 쪽에서 문제가 생겼다면 어떻게 해야하나요? 예를들어 redis에서 increment로 수량에 대해서 가져왔지만, 만약 kafka에 메시지를 보내는 것이 실패 될 경우 reids에 있는 값을 다시 하나 줄여야할 것 같습니다. 이런 경우 try catch 블럭으로 처리를 하는 지? 아니면 다른 방식으로 예외처리 하는지 궁금합니다.

  • java
  • docker
  • spring-boot
  • kafka
  • redis
홍혁준 댓글 2 좋아요 0 조회수 253

String클래스 리터럴 방식 관련 질문

해결됨

김영한의 실전 자바 - 중급 1편

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. String 선언시 리터럴 방식으로하면 String Pool에 해당 문자열이 있는지 확인하고, 있다면 해당 문자열의 참조값을 사용하는 것으로 알고 있는데요. 반면 new 연산자를 이용하는 방식은 String Pool 을 거치지 않고 항상 새로운 String 객체를 생성하는걸로 알고있습니다. PDF 파일 2페이지에 이런 내용이 있는데요. 편의상 쌍따옴표로 문자열을 감싸면 자바 언어에서 new Stirng("hello") 와 같이 변경해준다. 리터럴 방식도 new 연산자를 이용하는 방식으로 자바가 변경해주는거라면 Heap 영역에 항상 새로운 String 객체를 생성하게 되는게 아닌지 궁금합니다. 감사합니다. 😃

  • java
  • 객체지향
  • string
pej4303 댓글 1 좋아요 0 조회수 155

[28000][1045] Access denied for user 'root'@'localhost' (using password: YES)

해결됨

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

인텔리제이 내에서 데이터베이스를 실행하려고 하면 [28000][1045] Access denied for user 'root'@' localhost ' (using password: YES) 이와 같은 경고문이 뜹니다. 해결방안을 알고 싶습니다!

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
kangaroo125 댓글 2 좋아요 0 조회수 278

문제풀이 질문입니다.

미해결

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

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 처음에 제가 풀 땐 이렇게 해서 풀었는데 nullPointException 에러가 터졌습니다. 이런 에러가 터진 이유와 그리고 제 생각이 왜 틀린건지 설명해주시면 감사하겠습니다.

  • java
  • 객체지향
성호 댓글 1 좋아요 0 조회수 123

영한 강사님! 타입 이레이저 방식의 한계 부분 질문

해결됨

김영한의 실전 자바 - 중급 2편

제네릭 타입 이레이저 PDF 기준 30p 부분인데 컴파일 이후에는 제네릭 타입 정보가 존재하지 않기 때문에 instanceof나 new를 허용하지 않는다는건 잘 이해를 했습니다. 근데 밑에 코드를 보면 public void create() 부분이 일단은 public void create() {return new T();} 이 부분이 public T create() {return new T();}로 되어야하는거 아닌가요?

  • java
  • 객체지향
  • 코딩-테스트
  • 알고리즘
조아름 댓글 2 좋아요 0 조회수 154

111번 문제가 다른 것 같아요

미해결

실습으로 손에 잡히는 SQLD(2과목)

2판 기준으로 COL1에는 1,1,1,1이 들어있습니다

  • sql
  • oracle
  • mssql
  • SQLD
dongyll777 댓글 2 좋아요 7 조회수 233

2-5 집계 23:42 GROUP BY 연습문제 질문 드려요

해결됨

초보자를 위한 BigQuery(SQL) 입문

포켓몬의 수를 타입 별 집계, 수가 10 이상인 타입만 남기는 쿼리 작성 연습문제에 대하여 질문 드려요. 작성 전에 고민했던 부분은 포켓몬 타입은 type 1, 2로 나뉘어 있다. type 2는 null 인 경우가 있다. => where 로 제외할 수 있을까? type 1, 2 을 포함해서 세야 할 것 같다. (총 포켓몬 수보다 합산 값이 클 수 있다) 였거든요. Group by 에서 type2를 빼면 통합되지 않았다는 오류가 발생해서 어쩔 수 없이 넣긴 했는데, 제가 원한 형태로 구현되지는 않았습니다. 어떻게 해야 null 을 제외한 type2 의 값까지 전부 셀 수 있을까요? WHERE TYPE2 IS NOT NULL 을 넣게 되면 1개 타입만 가진 개체의 경우 아예 집계를 하지 않는 것 같아서 그 부분도 뺄 수 밖에 없었어요. 최종적으로는 1열에 타입, 2열에 해당하는 개체 수가 나오게 구현하고 싶습니다. (바위, 불인 포켓몬의 경우 바위에 1개, 불에 1개 계산되도록이요. 바위, 불 포켓몬 + 바위 포켓몬 + 불 포켓몬 = 바위 2개체 불 2개체) SELECT type1, type2, COUNT(id) as cnt FROM `basic.pokemon` GROUP BY type1, type2

  • sql
  • bigquery
  • 데이터-리터러시
전성배 댓글 1 좋아요 0 조회수 131

final String과 int의 차이점

미해결

나도코딩의 자바 기본편 - 풀코스 (20시간)

13강 상수를 배우고 있는데요. final String KR_COUNTRY_CODE = "+82"; system.out.println(KR_COUNTRY_CODE); 에서 상수를 쓸건데 int가 아닌 final String 을 사용하는 이유는 + 82 때문에그러는걸까요? 숫자만 쓰는게 아니라 + 기호를 사용하기 때문에 문자열 String에 final을 붙여서 final String을 사용하는걸까요?

  • java
  • 객체지향
자두왕자 댓글 2 좋아요 0 조회수 178

JPA 연관관계 자체의 필요성에 대한 질문입니다.

해결됨

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

영한님 강의로 많은 도움 얻은 학습자입니다. 최근 커뮤니티나 기술 블로그에 종종 보이는 내용 중 하나가 "연관관계를 맺지 않고 그냥 쓰는 것" 에 대해 어떻게 생각하시는지 궁금합니다. @Entity class Member { .... // @ManyToOne @JoinColumn("team_id") // private Team team; private Long teamId; // 이런식으로 연관관계 없이 그냥 id 값 넣어 사용 } 위와 같은 형태로 Team 객체를 연관관계로 갖고있는게 아닌 id 값 타입 그대로를 가진 형태입니다. 토스 개발자로 계신 제미니님도 연관관계를 잘 맺지 않으신다는 의견을 갖고 계시고, (이유는 id 로만 맺었을 땐 그 다음 전략을 선택하기 쉽다 && 관계를 잘못되게 많이맺어놓으면 다음이 없다라고 하시더군요.) 신빙성 없는 블로그발 출처이긴 하지만 네이버, 카카오에서도 연관관계를 안맺고 쓴다라는 얘기가 있긴하더군요. ( https://velog.io/@ssuh0o0/BE-STUDY-%EC%97%B0%EA%B4%80%EB%A7%A4%ED%95%91%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%98%EB%9D%BC ) 당연히 답이 없는 문제이지만, 개인적인 생각으로는 현업에서 JPA 를 써본 결과 JPA 의 러닝커브 자체도 너무 높고, 이것저것 고려해야 될 것이 너무 많아진다 << 가 제 결론이긴 하거든요. 그 예로 n+1 문제부터 시작해서 양방향 연관관계일 경우 명시적으로 set, add 등을 해줘야하는 문제, 오래 전이라 정확히 기억은 나지 않지만 OneToOne 관계일때 발생했던 문제, A 테이블과 B 테이블 간 조인을 2개 컬럼으로 해야할 때 발생했던 문제, ddl-auto 실수할 여지 ... 등등 연관관계를 통해 객체 그래프를 쉽게 가져올 수 있다는 장점, sql 종속적이지 않은 장점 여러가지 제약사항이 많아 실수할 여지가 많다라는 단점 개인프로젝트라면 1번을 선택하겠지만 현업에서는 1 < 2 인것 같아 고민입니다. 강의 내에서도 그 뛰어난 배민 개발자들도 종종 실수 하신다고 하시기도 했구요. 배민에서는 적극적으로 활용 중인 것으로 알고 있는데, 배민을 제외한 다른 회사에서는 현업에서 어떻게 활용 중인지 또, 위 내용에 대한 의견이 어떠신지 궁금합니다.

  • java
  • jpa
cw k 댓글 2 좋아요 0 조회수 536

제네릭 타입 이레이저 오타인가요?

미해결

김영한의 실전 자바 - 중급 2편

제네릭 타입 이레이저 PDF 기준 30p 부분인데 컴파일 부분에서 제네릭 타입 정보가 존재하지 않기 때문에 instanceof나 new를 허용하지 않는다는건 잘 이해를 했습니다. 근데 밑에 코드를 보면 public void create() 부분이 일단은 public void <T> T create() {} 로 되어야하는게 아닌가요?

  • java
  • 객체지향
  • 코딩-테스트
  • 알고리즘
댓글 1 좋아요 0 조회수 122

섹션 4부터 너무 어렵고 자바의 람다식도 모른다면 자바부터 다시 공부하고 시작하는게 맞을까요? 스프링을 처음해보는데 넘 어렵네요,,

미해결

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

섹션 4부터 너무 어렵고 자바의 람다식도 모른다면 자바부터 다시 공부하고 시작하는게 맞을까요? 스프링을 처음해보는데 넘 어렵네요,,

  • java
  • spring
  • mvc
  • spring-boot
하민철(Mincheol) 댓글 1 좋아요 0 조회수 436

[3]_[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 과제와 추가 문제 풀이

미해결

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

추가 문제 1번 WITH transaction_data AS ( SELECT 111 AS user_id, 1001 AS item_id, 719200 AS actual_price, '01/08/2024 12:00:00' AS transaction_date UNION ALL SELECT 111, 2002, 89000, '01/10/2024 12:00:00' UNION ALL SELECT 189, 2002, 89000, '01/12/2024 12:00:00' UNION ALL SELECT 156, 3002, 459000, '01/15/2024 12:00:00' UNION ALL SELECT 121, 1001, 719200, '01/18/2024 12:00:00' UNION ALL SELECT 156, 2001, 90300, '01/25/2024 12:00:00' UNION ALL SELECT 145, 3001, 399000, '01/26/2024 12:00:00' UNION ALL SELECT 189, 1002, 607200, '01/28/2024 12:00:00' UNION ALL SELECT 111, 3001, 399000, '02/05/2024 12:00:00' UNION ALL SELECT 178, 1002, 759000, '02/07/2024 12:00:00' UNION ALL SELECT 121, 2002, 62300, '02/08/2024 12:00:00' UNION ALL SELECT 156, 1001, 899000, '02/10/2024 12:00:00' UNION ALL SELECT 190, 2001, 90300, '02/11/2024 12:00:00' UNION ALL SELECT 189, 2001, 90300, '02/14/2024 12:00:00' UNION ALL SELECT 111, 1002, 759000, '02/15/2024 12:00:00' UNION ALL SELECT 156, 3001, 299250, '02/20/2024 12:00:00' UNION ALL SELECT 189, 3002, 344250, '02/25/2024 12:00:00' UNION ALL SELECT 111, 2001, 90300, '02/28/2024 12:00:00' ), user_info AS ( SELECT 111 AS user_id, 'Seoul' AS city, 28 AS age, 'Female' AS gender UNION ALL SELECT 121, 'Busan', 35, 'Male' UNION ALL SELECT 145, 'Incheon', 42, 'Female' UNION ALL SELECT 156, 'Seoul', 31, 'Male' UNION ALL SELECT 178, 'Daegu', 25, 'Female' UNION ALL SELECT 189, 'Seoul', 39, 'Male' UNION ALL SELECT 190, 'Busan', 29, 'Female' ), item_info AS ( SELECT 1001 AS item_id, 'Electronics' AS category, 'Smartphone' AS item_name, 899000 AS list_price UNION ALL SELECT 1002 AS item_id, 'Electronics' AS category, 'Tablet' AS item_name, 759000 AS list_price UNION ALL SELECT 2001 AS item_id, 'Fashion' AS category, 'Sneakers' AS item_name, 129000 AS list_price UNION ALL SELECT 2002 AS item_id, 'Fashion' AS category, 'Backpack' AS item_name, 89000 AS list_price UNION ALL SELECT 3001 AS item_id, 'Home' AS category, 'Coffee Machine' AS item_name, 399000 AS list_price UNION ALL SELECT 3002 AS item_id, 'Home' AS category, 'Air Purifier' AS item_name, 459000 AS list_price ) # 1번 문제(15분) -- - 주차별 각 카테고리별 평균 할인율이 가장 높았던 기간과 할인율을 구하는 쿼리를 작성해주세요 -- - 단, 날짜 데이터를 YYYY-MM-DD 23:59:39 이런 형태로 변경해주세요 , real_base as ( select * from ( select *, avg(diff_price) as avg_price, from( SELECT transaction_date, category, list_price, (list_price - actual_price) as diff_price FROM item_info as item left join transaction_data trans_date on item.item_id = trans_date.item_id ) as base group by all ) as base2 ) ## 주차별 평균 할인율 가장 높은 기간 --> 2024-01-08 ~ 2024-01-18 -- select -- FORMAT_TIMESTAMP('%Y-%m-%d 23:59:39', PARSE_TIMESTAMP('%m/%d/%Y %H:%M:%S', transaction_date)) AS formatted_date, -- avg_price -- from real_base -- group by -- 1,2 -- order by -- 2 desc ## 카테고리별 평균 할인율이 가장 높았던 기간 select *, round((max_price / list_price) * 100, 2) as `할인율` from ( select distinct FORMAT_TIMESTAMP('%Y-%m-%d 23:59:39', PARSE_TIMESTAMP('%m/%d/%Y %H:%M:%S', transaction_date)) AS formatted_date, category, max(avg_price) as max_price, list_price from real_base group by all order by 3 desc ) as avg_price_table order by 5 desc ## 할인율이 가장 높았던 주차 -- 01/25/2024 -- 02/08/2024 -- 02/11/2024 -- 02/14/2024 -- 02/28/2024 -- select -- transaction_date, -- round((diff_price / list_price) * 100, 2) as `할인율` -- -- transaction_date, -- -- safe_divide(diff_price, list_price) -- from real_base -- group by -- 1,2 -- order by -- 2 desc ## 할인율이 높았던 카테고리 -- Fashion -- select -- category, -- round((diff_price / list_price) * 100, 2) as `할인율` -- -- transaction_date, -- -- safe_divide(diff_price, list_price) -- from real_base -- group by all -- order by -- 2 desc 2번 WITH transaction_data AS ( SELECT 111 AS user_id, 1001 AS item_id, 719200 AS actual_price, '01/08/2024 12:00:00' AS transaction_date UNION ALL SELECT 111, 2002, 89000, '01/10/2024 12:00:00' UNION ALL SELECT 189, 2002, 89000, '01/12/2024 12:00:00' UNION ALL SELECT 156, 3002, 459000, '01/15/2024 12:00:00' UNION ALL SELECT 121, 1001, 719200, '01/18/2024 12:00:00' UNION ALL SELECT 156, 2001, 90300, '01/25/2024 12:00:00' UNION ALL SELECT 145, 3001, 399000, '01/26/2024 12:00:00' UNION ALL SELECT 189, 1002, 607200, '01/28/2024 12:00:00' UNION ALL SELECT 111, 3001, 399000, '02/05/2024 12:00:00' UNION ALL SELECT 178, 1002, 759000, '02/07/2024 12:00:00' UNION ALL SELECT 121, 2002, 62300, '02/08/2024 12:00:00' UNION ALL SELECT 156, 1001, 899000, '02/10/2024 12:00:00' UNION ALL SELECT 190, 2001, 90300, '02/11/2024 12:00:00' UNION ALL SELECT 189, 2001, 90300, '02/14/2024 12:00:00' UNION ALL SELECT 111, 1002, 759000, '02/15/2024 12:00:00' UNION ALL SELECT 156, 3001, 299250, '02/20/2024 12:00:00' UNION ALL SELECT 189, 3002, 344250, '02/25/2024 12:00:00' UNION ALL SELECT 111, 2001, 90300, '02/28/2024 12:00:00' ), user_info AS ( SELECT 111 AS user_id, 'Seoul' AS city, 28 AS age, 'Female' AS gender UNION ALL SELECT 121, 'Busan', 35, 'Male' UNION ALL SELECT 145, 'Incheon', 42, 'Female' UNION ALL SELECT 156, 'Seoul', 31, 'Male' UNION ALL SELECT 178, 'Daegu', 25, 'Female' UNION ALL SELECT 189, 'Seoul', 39, 'Male' UNION ALL SELECT 190, 'Busan', 29, 'Female' ), item_info AS ( SELECT 1001 AS item_id, 'Electronics' AS category, 'Smartphone' AS item_name, 899000 AS list_price UNION ALL SELECT 1002 AS item_id, 'Electronics' AS category, 'Tablet' AS item_name, 759000 AS list_price UNION ALL SELECT 2001 AS item_id, 'Fashion' AS category, 'Sneakers' AS item_name, 129000 AS list_price UNION ALL SELECT 2002 AS item_id, 'Fashion' AS category, 'Backpack' AS item_name, 89000 AS list_price UNION ALL SELECT 3001 AS item_id, 'Home' AS category, 'Coffee Machine' AS item_name, 399000 AS list_price UNION ALL SELECT 3002 AS item_id, 'Home' AS category, 'Air Purifier' AS item_name, 459000 AS list_price ) # 2번 문제(10분) 1610 -- - 2024년 1월에 가장 많은 매출을 기록한 카테고리를 구하는 쿼리를 작성해주세요 -- 날짜 테이블 -- 아이템 테이블 활용 -- 기간에 필터링 걸기 -- 카테고리 -- 매출 -- 카테고리별 구매가 -- 구매가의 합 = 매출 ## 카테고리별 구매가 , category_price as ( select item_date.transaction_date, item.category, item_date.actual_price from item_info as item left join transaction_data as item_date on item.item_id = item_date.item_id group by all ) ## 매출 | 카테고리별 구매가의 합 , `매출_테이블` as ( select *, sum(actual_price) over(partition by category) as `매출` from category_price ) ## 카테고리별 매출에 1월 필터링 select * from `매출_테이블` where transaction_date between '01/08/2024' and '01/28/2024' 3번 WITH transaction_data AS ( SELECT 111 AS user_id, 1001 AS item_id, 719200 AS actual_price, '01/08/2024 12:00:00' AS transaction_date UNION ALL SELECT 111, 2002, 89000, '01/10/2024 12:00:00' UNION ALL SELECT 189, 2002, 89000, '01/12/2024 12:00:00' UNION ALL SELECT 156, 3002, 459000, '01/15/2024 12:00:00' UNION ALL SELECT 121, 1001, 719200, '01/18/2024 12:00:00' UNION ALL SELECT 156, 2001, 90300, '01/25/2024 12:00:00' UNION ALL SELECT 145, 3001, 399000, '01/26/2024 12:00:00' UNION ALL SELECT 189, 1002, 607200, '01/28/2024 12:00:00' UNION ALL SELECT 111, 3001, 399000, '02/05/2024 12:00:00' UNION ALL SELECT 178, 1002, 759000, '02/07/2024 12:00:00' UNION ALL SELECT 121, 2002, 62300, '02/08/2024 12:00:00' UNION ALL SELECT 156, 1001, 899000, '02/10/2024 12:00:00' UNION ALL SELECT 190, 2001, 90300, '02/11/2024 12:00:00' UNION ALL SELECT 189, 2001, 90300, '02/14/2024 12:00:00' UNION ALL SELECT 111, 1002, 759000, '02/15/2024 12:00:00' UNION ALL SELECT 156, 3001, 299250, '02/20/2024 12:00:00' UNION ALL SELECT 189, 3002, 344250, '02/25/2024 12:00:00' UNION ALL SELECT 111, 2001, 90300, '02/28/2024 12:00:00' ), user_info AS ( SELECT 111 AS user_id, 'Seoul' AS city, 28 AS age, 'Female' AS gender UNION ALL SELECT 121, 'Busan', 35, 'Male' UNION ALL SELECT 145, 'Incheon', 42, 'Female' UNION ALL SELECT 156, 'Seoul', 31, 'Male' UNION ALL SELECT 178, 'Daegu', 25, 'Female' UNION ALL SELECT 189, 'Seoul', 39, 'Male' UNION ALL SELECT 190, 'Busan', 29, 'Female' ), item_info AS ( SELECT 1001 AS item_id, 'Electronics' AS category, 'Smartphone' AS item_name, 899000 AS list_price UNION ALL SELECT 1002 AS item_id, 'Electronics' AS category, 'Tablet' AS item_name, 759000 AS list_price UNION ALL SELECT 2001 AS item_id, 'Fashion' AS category, 'Sneakers' AS item_name, 129000 AS list_price UNION ALL SELECT 2002 AS item_id, 'Fashion' AS category, 'Backpack' AS item_name, 89000 AS list_price UNION ALL SELECT 3001 AS item_id, 'Home' AS category, 'Coffee Machine' AS item_name, 399000 AS list_price UNION ALL SELECT 3002 AS item_id, 'Home' AS category, 'Air Purifier' AS item_name, 459000 AS list_price ) # 3번 문제(10분) 1646 -- - 유저별 총 구매 금액이 200만원 이상인 유저들이 가장 많이 구매한 카테고리를 찾는 쿼리를 작성해주세요 -- 유저별 총 구매 금액 -- 유저 | 총 구매금액 -- 유저별 | 구매금액 -- 구매금액 합산 = 총 구매금액 , `유저별_총구매금액` as ( select user_id, `총 구매금액` from ( select user_id, sum(actual_price) over(partition by user_id) as `총 구매금액` from ( SELECT user_id, actual_price, FROM transaction_data group by all ) as base1 ) base2 group by 1,2 ) -- 200만원 이상 필터링 , `200만원 이상 필터링` as ( select * from `유저별_총구매금액` where `총 구매금액` >= 2000000 ) ## 유저들이 가장 많이 구매한 카테고리 -- 유저 | 카테고리 | 구매 -- 구매가가 있는 카테고리 수를 세면 어떨까? -- 카테고리별 카운트? select category, `카테고리별카운트` from ( select *, sum(`카테고리수`) over(partition by category) as `카테고리별카운트` from ( select user_id, category, count(category) over(partition by user_id) as `카테고리수` from ( select td2.user_id, item2.category, td2.actual_price from transaction_data as td2 left join item_info as item2 on td2.item_id = item2.item_id ) b_base ) as b_base2 ) as b_base3 group by 1,2 order by 2 desc

  • sql
  • bigquery
  • 빅쿼리
  • 인프런
  • 빠짝스터디
레스 댓글 1 좋아요 0 조회수 136

[2]_[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 과제와 추가 문제 풀이

미해결

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

유저 상태 new user # User Status 정의 -- "우리 서비스를 이용하는 유저들의 주차별 상태가 어떻게 되나?" /* 1. New User: 해당 주차에 처음 방문한 유저 2. Current User: 지난주에도 방문했고 이번 주에도 방문한 유저 3. Resurrected User: 지난주에는 없었는데 이번주에 다시 방문한 유저 (첫 방문은 아님) 4. Dormant User: 지난주까지는 있었는데 이번주에 방문하지 않은 유저 */ # New User: 해당 주차에 처음 방문한 유저 -- '유저의 첫 방문 주'와 '유저별 이벤트 발생주'가 같은지 확인 -- 같으면, 1 -- 아니면 0 ## '유저의 첫 방문 주' with user_first_visit as ( select user_pseudo_id, date_trunc(min(event_date), week(monday)) as first_visit_date from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' group by 1 ) ## '유저의 모든 방문 주' , user_event_week as ( select distinct user_pseudo_id, date_trunc(event_date, week(monday)) as visit_date from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' ) ## 첫 방문 주와 모든 방문 주 중 같은 데이터가 있다면 '방문(=1)' , new_user_table as ( select ufv.user_pseudo_id, ufv.first_visit_date, uew.visit_date, if(ufv.first_visit_date = uew.visit_date, 1, 0) as new_user from user_first_visit as ufv inner join user_event_week as uew on ufv.user_pseudo_id = uew.user_pseudo_id group by 1,2,3 ) select first_visit_date as week, sum(new_user) as new_user_count from new_user_table group by 1 order by 1 current user # User Status 정의 -- "우리 서비스를 이용하는 유저들의 주차별 상태가 어떻게 되나?" /* 1. New User: 해당 주차에 처음 방문한 유저 2. Current User: 지난주에도 방문했고 이번 주에도 방문한 유저 3. Resurrected User: 지난주에는 없었는데 이번주에 다시 방문한 유저 (첫 방문은 아님) 4. Dormant User: 지난주까지는 있었는데 이번주에 방문하지 않은 유저 */ -- Current User: 지난주에도 방문했고 이번 주에도 방문한 유저 -- 유저별 모든 방문 주 구하기 -- 모든 방문주 - 전주 방문 데이터 = 1 --> current user ## 유저별 모든 방문 주 구하기 with user_visits as ( select user_pseudo_id, date_trunc((event_date), week(monday)) as visit_date from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' group by 1,2 ) ## 유저의 전주 방문 데이터 , prev_user_table as ( select user_pseudo_id, visit_date, lag(visit_date) over(partition by user_pseudo_id order by visit_date) as previous_visit_user from user_visits ) ## 모든 방문주 - 전주 방문 데이터 = 1 --> current user select visit_date as week, count(distinct user_pseudo_id) as current_user_cnt from( select distinct user_pseudo_id, visit_date, date_diff(visit_date, previous_visit_user, week) = 1 as current_user from prev_user_table ) as base where current_user is not null group by 1 order by 1 resurrected user # User Status 정의 -- "우리 서비스를 이용하는 유저들의 주차별 상태가 어떻게 되나?" /* 1. New User: 해당 주차에 처음 방문한 유저 2. Current User: 지난주에도 방문했고 이번 주에도 방문한 유저 3. Resurrected User: 지난주에는 없었는데 이번주에 다시 방문한 유저 (첫 방문은 아님) 4. Dormant User: 지난주까지는 있었는데 이번주에 방문하지 않은 유저 */ # Resurrected User: 지난주에는 없었는데 이번주에 다시 방문한 유저 (첫 방문은 아님) ## 유저별 모든 방문 주 구하기 with user_visits as ( select user_pseudo_id, date_trunc((event_date), week(monday)) as visit_date from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' group by 1,2 ) ## 유저의 전주 방문 데이터 , prev_user_table as ( select user_pseudo_id, visit_date, lag(visit_date) over(partition by user_pseudo_id order by visit_date) as previous_visit_user from user_visits ) ## (첫 방문이 아님) + (모든 방문 주 데이터 - 이전 방문주 > 1) = Resurrected User -- 첫 방문이 아닌 유저 : 'previous_visit_user is not null' -- 첫 방문이었으면 previous_visit_user가 null이었을테니깐. select visit_date as week, count(user_status) as Resurrected_User from ( select user_pseudo_id, visit_date, previous_visit_user, case when previous_visit_user is not null and date_diff(visit_date, previous_visit_user, week) > 1 then 'Resurrected_User' else null end as user_status from prev_user_table ) as Resurrected_User where user_status is not null group by 1 order by 1 dormant user # User Status 정의 -- "우리 서비스를 이용하는 유저들의 주차별 상태가 어떻게 되나?" /* 1. New User: 해당 주차에 처음 방문한 유저 2. Current User: 지난주에도 방문했고 이번 주에도 방문한 유저 3. Resurrected User: 지난주에는 없었는데 이번주에 다시 방문한 유저 (첫 방문은 아님) 4. Dormant User: 지난주까지는 있었는데 이번주에 방문하지 않은 유저 */ # Dormant User: 지난주까지는 있었는데 이번주에 방문하지 않은 유저 ## 모든 방문 데이터 with base as ( select user_pseudo_id, date_trunc((event_date), week(monday)) as visit_date from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' group by 1,2 ) ## 유저의 다음 방문주 데이터= , next_visit_date_table as ( select *, lead(visit_date) over(partition by user_pseudo_id order by visit_date) as next_visit_date from base ) ## Dormant User -- Dormant User? -- 다음주 방문 데이터가 null 이거나, -- next_visit_date > 1 week가 아닌 유저 , Dormant_User_table as ( select *, case when next_visit_date is null or date_diff(next_visit_date, visit_date, week) > 1 then 'Dormant_User' else null end as Dormant_User_data from next_visit_date_table ) select visit_date as week, count(Dormant_User_data) as Dormant_User_data_cnt from Dormant_User_table group by 1 order by 1

  • sql
  • bigquery
  • 빅쿼리
  • 빠짝스터디
  • 인프런
레스 댓글 1 좋아요 0 조회수 123

[1]_[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 과제와 추가 문제 풀이

미해결

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

[종합 느낀점] 1. 날짜 데이터 변환 함수, 날짜 데이터로 추출 하는 함수 등 문제 풀 때 사용하는 함수를 까먹어 애를 먹었습니다. 2. 테이블 조인시 첫 테이블을 잘못 선택하면, 쿼리가 길어지고 꼬인다는 것을 느꼈습니다. 3. 지표가 어떤 지표느냐에 따라 해석 방법이 달라진 점도 알게 됐습니다. [문제 풀이 소요 시간] 1번 문제 : 30분 2번 문제 : 12분 3번 문제 : 12분 정답이면서도 확장성 있는 쿼리를 작성하다가는 영원히 못풀겠더라고요.. 그래서 최대한 쿼리 작성을 마무리 짓는데 초점을 뒀습니다.. ㅠㅠ [new_users] 위와 같은 시각화 결과가 나왔습니다. 눈에 띄는 데이터로는 두 가지가 있습니다: 1. 10월 new users 상승 상승 추정 이유: 1. 새로운 마케팅 전략 시행(시기가 추석 근처이니깐 추석을 기념해서 배달앱 쿠폰 지급?) 2. 12월 new users 하락 하락 추정 이유: 1. 연말 모임으로 인한 배달 수요 감소 (사실 감소세는 10월달에 고점을 찍은 이후 쭉 하락세이지만, 그 이유를 단정짓지는 못하겠습니다..) [Current User] 위와 같은 시각화 결과가 나왔습니다. 눈에 띄는 데이터로는 세가지가 있습니다: 1. 9월 중순 이후 Current User 상승 상승 추정 이유: 1. 새로운 마케팅 전략 시행(시기가 추석 근처이니깐 추석을 기념해서 배달앱 쿠폰 지급?) 2. 12월까지 꾸준한 상승 상승 추정 이유: 1. 기존 유저의 긍정적인 경험이 이어져서 서비스에 잔류 2. 마케팅으로 유입된 신규 유저도 긍정적인 경험을 해서 서비스에 잔류 3. 12월 Current User 하락 하락 추정 이유: 1. 연말 모임으로 인한 배달 수요 감소 [Resurrected User] 'Current User' 해석과 비슷할 거 같습니다. [Dormant User] 1. 9월 -> 10월 급격한 상승 상승 추정 이유: 1. 앞선 이유과 같음. 추석 관련 이벤트 실시. 2. 그러나 계속 상승이 이어지지 않은 점을 고민해 봐야 함. 2. 10월 -> 11월 말 유지 유지 추정 이유: 1. 마케팅으로 긍정적인 경험을 한 기존·신규 유저 잔류 2. 하지만 입소문이 나서 계속 상승하지는 않음. 3. 일부 유저만 잔류하고, 나머지 신규 유입 유저는 이벤트만 맛보고 이탈. 3. 12월 급격한 상승 상승 추정 이유: 1. 연말에 배달 수요가 감소할 것을 예측해 새로운 마케팅 전략 실시 주차별 리텐션 # 리텐션 정의 -- "우리 서비스를 이용한 사람들이 현재는 얼마큼 이용하고 있을까?" /* 1. 무슨 데이터가 필요할까? - 유저 - 날짜 왜 이런 데이터가 필요할까? 이에 대한 답변: '사람들'이니깐, '유저'를 인식할 수 있는 데이터가 필요하다. '현재'이니깐, '시간'을 인식할 수 있는 데이터가 필요하다. ## 1. 유저별 첫 방문 주 구하기*/ with first_visit_table as ( select user_pseudo_id, date_trunc(min(event_date), week(monday)) as first_visit_date from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' group by 1 ) /*2. 처음 이벤트를 발생 시킨 주는? - 무슨 데이터가 필요할까? 1. 첫 이벤트 발생 날짜 2. 유저 - 왜 이런 데이터가 필요할까? 이에 대한 답변: '이벤트'는 주체가 있어야 발동 되는 거니깐 '유저' 데이터가 필요하다. 또 이벤트 발생이란 결과에는 '날짜'라는 개념도 포함 되어 있기 때문에, '날짜' 데이터가 필요하다. 그중에서도 '처음 이벤트를 발생한 주'의 데이터가 필요하다. 3. 유저가 이벤트를 실행한 주는? - 무슨 데이터가 필요할까? 1. 유저 2. 이벤트 이름(선택) 3. 이벤트 발생 날짜 + 중복제거 왜? 목적이 모든 유저의 리텐션이기 때문에. 중복 제거를 하지 않으면, 모든 유저가 발생시킨 모든 이벤트가 보이기 때문에 가독성이 안 좋기 때문에. - 왜 이런 데이터가 필요할까? 이에 대한 답변: 처음 이벤트를 발생시킨 날짜와 비교하기 위해서 ## 2. 유저별 이벤트 발생 주 구하기*/ , user_event as ( select distinct user_pseudo_id, date_trunc(event_date, week(monday)) as user_event_week from `advanced.app_logs` where event_date between '2022-08-01' and '2022-12-31' ) /*4. '유저가 이벤트 실행한 주 - 유저가 처음 방문한 주' - 무슨 데이터가 필요할까? 1. 유저 2. 첫 이벤트 발생 날짜 3. 이벤트 발생 날짜 4. (이벤트 발생 날짜 - 첫 이벤트 발생 날짜) - 왜 이런 데이터가 필요할까? 이에 대한 답변: 처음 이벤트를 발생시킨 날짜와 비교하기 위해서 ## 3. 유저별 이벤트 발생주와 첫 방문주 차이 구하기*/ , diff_week_table as ( select fvt.user_pseudo_id, fvt.first_visit_date, ue.user_event_week, date_diff(ue.user_event_week, fvt.first_visit_date, week(monday)) as diff_week from first_visit_table as fvt left join user_event as ue on fvt.user_pseudo_id = ue.user_pseudo_id order by 2, 4 ) /*5. 주차별 유저수 구하기 - 왜 위와 같은 생각을 했는가? 이에 대한 답변: 주차수에 따른 유저수를 알아야만 첫 주차에 비해 얼마큼 유저가 이벤트를 발생시키지 않았는지 알 수 있으니깐. - 무슨 데이터가 필요한가? 이에 대한 답변: 1. 이벤트 발생 차이 주 2. 중복 없는 유저 수 ## 4. 주차별 유저수 구하기*/ , unique_user_cnt_table as ( select diff_week, count(distinct user_pseudo_id) as unique_user_cnt from diff_week_table group by 1 order by 1 ) /*6. 모든 행에 첫 주 유저수 적용하기 - 왜 위와 같은 생각을 했는가? 이에 대한 답변: 첫 주 유저수로 주차마다 달라지는 유저수를 나누면, 리텐션을 구할 수 있기 때문에. - 무슨 데이터가 필요한가? 이에 대한 답변: 1. 이벤트 발생 차이주 2. 주차별 중복 없는 유저수 3. 모든 행에 적용하는 첫 주 유저수 ## 5. 모든 행에 첫 주 유저수 적용하기*/ , first_visit_week_data_table as ( select *, first_value(unique_user_cnt) over(order by unique_user_cnt desc) AS first_visit_week_data from unique_user_cnt_table order by 1 ) ## 6. 리텐션 구하기 | 주차별 유저수 / 첫 주 유저수 select *, round(safe_divide(unique_user_cnt, first_visit_week_data), 2) as retention_rate from first_visit_week_data_table

  • bigquery
  • 빅쿼리
  • sql
  • 빠짝스터디
  • 인프런
레스 댓글 1 좋아요 0 조회수 174

1. 클래스와 데이터 ppt 26p 오타인가요?

미해결

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

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 1. 클래스와 데이터 26p 최상단 Student students = new Student[2]이 옳바른 문장인것인가요? 강의 내용처럼 객체로 배열을 만드는 상황이라면 Student[] students = new Student[2] 이렇게 바꿔야되는 것이 아닌지 궁금합니다.

  • java
  • 객체지향
정의석 댓글 2 좋아요 0 조회수 136

탐색 순서 질문

미해결

Do it! 알고리즘 코딩테스트 with JAVA

영상에서 탐색 순서가 1 > 3 > 4 > 6 > 2 > 5 로 되어있는데 왜 5 > 2 가 아닌 2 > 5가 되는지 궁금합니다. 진행 되는 순서가 노드를 넣고 > 노드를 꺼내고 가 맞지 않나요? 아님 2 > 5로 되어도 상관 없는건가요?

  • java
  • 코딩-테스트
  • 알고리즘
겁많은 김앙리 댓글 1 좋아요 0 조회수 167

쿼리 로그 출력 관련 질문

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] MemberApiController.java MemberService.java 쿼리 실행이 select - update - select가 로그에 출력될꺼라고 예상 했는데 실제 로그는 select - update 까지만 출력되는데 이유를 알 수 있을까요?

  • java
  • spring
  • spring-boot
  • jpa
Jhs 댓글 1 좋아요 0 조회수 93

1-2 환경설정에서 마지막 실습 구문이 작동이 안돼요.

해결됨

초보자를 위한 BigQuery(SQL) 입문

강의 내용 따라서 테이블 생성에는 문제가 없었어요. 새 쿼리 탭에서 select * (쿼리에선 탭 1회) from 'basic.pokemon' order by id 로 작성하였는데 구문 오류라고 뜹니다. 데이터셋 이름도 basic이고 테이블도 pokemon으로 해두었는데 왜 이러는 걸까요? 혹시나 싶어 'bigquery101-441101.basic.pokemon' 으로도 시도해 보았는데 마찬가지로 구문 오류가 떴습니다. 데이터셋이나 테이블 이름에 space가 들어갔나 싶어, 테이블셋 세부 정보에서 테이블 ID 복사 기능으로 붙여넣어도 작동이 안되는 상황입니다.

  • sql
  • bigquery
  • 데이터-리터러시
전성배 댓글 2 좋아요 0 조회수 156

영상 문의

미해결

FastAPI 완벽 가이드

'FastAPI에서 StaticFiles 클래스를 이용한 정적 파일 다루기' 수업 끝에 url_for 다음시간에 알려주신다고 영상이 끝나는데, 해당 강의영상은 어디에서 볼 수 있을까요? ps. 수업 너무 알차게 잘 듣고 있습니다 :)

  • python
  • sql
  • sqlalchemy
  • FastAPI
백승민 댓글 2 좋아요 0 조회수 153

인기 태그

인프런 TOP Writers

주간 인기글