1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] synchronized를 사용하면 사용되는 스레드 대기 집합과 기존 멀티스레드 환경에서 사용되는 스케쥴링큐는 다른건가요?
function counter(state,action){ if(typeof state ==="undefined"){ return 0; } switch (action.type){ case "INCREMENT" return state +1; case "DECREMENT" return state -1; default : return state; } } var store = Redux.createStore(counter); var calueELem = document.getElementById("value") function render(){ valueElem.innerHTML = store.getState().toString() } render(); store.subscribe(render); 여기 코드에서 궁금한 부분이 있어서 질문드립니다! 처음에 상태를 설정하지 않았는데 강사님은 왜 초기 상태 count 가 0이라고 하신건가요?
1) main, Thread-A, Thread-B 3개의 스레드를 만들고 실행시킨 후 main 스레드에서 의도적으로 exception을 발생시켜도 main 스레드만 종료되고 Thread-A, Thread-B는 돌아가는데 이 때 자바 자체를 중지하려면 Thread-A와 B를 Daemon으로 생성하는 방법 밖에 없을까요? 2) 궁금증이 발생했는데 main 스레드를 Daemon으로 선언할 수 있나요?
우선 책과 카테고리 관계는 다대다 매핑이니 중간테이블로 책카테고리라는 엔티티를 뒀습니다. Ex) 연관관계 예시 [책] : "해리포터" <-> [카테고리] : sf, 소설 [책] : "아이언맨", "해리포터" <-> [카테고리] : sf public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private Long id; private String title; } public class BookCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_category_id") private Long id; @ManyToOne @JoinColumn(name = "book_id") private Book book; @ManyToOne @JoinColumn(name = "category_id") private Category category; public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Long id; private String categoryName; @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true) private List<BookCategory> bookCategories = new ArrayList<>(); } @Transactional public void createBook(BookDto dto) { Book book = new Book(); book.setTitle(dto.getTitle()); bookRepository.save(book); List<Category> categories = dto.getCategories(); for (Category category : categories) { BookCategory bookCategory = new BookCategory(); bookCategory.setBook(book); bookCategory.setCategory(category); category.getBookCategories().add(bookCategory); categoryRepository.save(category); } } 테스트 해 본 결과, 원하는 대로 나오는 거 같은데 CategoryRepository에는 id name 1 소설 2 Sf 3 소설 이런 식으로 저장되더라구요... 이러면 CategoryRepository에 의미없는 데이터만 저장되는 거 같은데 잘 짠 거 맞나요?
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이것 저것 찾아봤는데, 같은 에러가 반복적으로 발생하네요. 무엇이 문제인지 모르겠습니다 ㅠㅠ 회원 가입 부분을 Run 할때 발생하고있네요.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 영한님처럼 클래스 생성시 Exception이 따로 안떠서 어떻게 하면 Exception도 클래스나 인터페이스처럼 바로 생성하는 기능을 추가할 수 있는지, 단순 버전 차이인지 궁금합니다. (2번째 사진은 제가 클래스 생성할 시 뜨는 창입니다.)
MyReact.useRef관련하여 질문드립니다 const ref2 = MyReact.useRef(); <input ref={ref}/> 이렇게 사용하면 input태그에 접근할 수 있는데 정확히 어떤 원리로 접근 가능한건가요?? ref2는 원래 undefined값이 아닌가요?
안녕하세요! 이번에 정처기 문제에서 타입 이레이저 관련 문제가 나왔는데, 궁금한 점이 생겨서 질문 올려봅니다. class Printer { void print(Integer a) { System.out.print("A" + a); } void print(Object a) { System.out.print("B" + a); } void print(Number a) { System.out.print("C" + a); } } public class Gisafirst { public static void main(String[] args) { new Container<>(0).print(); } public static class Container<T> { T value; public Container(T t) { value = t; } public void print() { new Printer().print(value); } } } 제가 이해한 바로는, 강의에서 설명해주신대로 new Container<>(0) 에서 public static class Container<Integer> { Integer value; public Container(Integer t) { value = t; } public void print() { new Printer().print(value); } } 컴파일러가 컴파일 시점에 이렇게 이해하고 나서 컴파일 종료 후, 타입 소거가 일어나서, Object로 변환한다고 이해했습니다. 그래서 print 메서드를 호출할 때 value는 Object 타입이므로 B0가 출력되는 것이죠. 여기서 궁금한 점은 바로 print의 오버로딩 메서드 선택 시점입니다. 제가 찾아본 바로는 오버로딩 메서드 선택시점은 컴파일 단계에서 이루어진다로 알고있습니다. 그렇다면 동작방식이 컴파일 종료 후 타입 소거가 일어나는게 아니라, 정확히는 "컴파일 시작 - 타입 소거 - 오버로딩 메서드 선택 - 컴파일 종료 - 런타임" 이런식으로 일어나는건가용? 아니면 어디서 오해하고 있는지 궁금합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 패키지 정리 영상부터 다음 영상 모두가 재생이 안됩니다
[1~2번]윈도우 함수(탐색 함수) 연습 문제 1번 select *, lead(visit_month, 1) over(partition by user_id order by visit_month) as next_visit_month, lead(visit_month, 2) over(partition by user_id order by visit_month) as two_next_visit_month from `advanced.analytics_function_01 2번 select *, lead(visit_month, 1) over(partition by user_id order by visit_month) as next_visit_month, lead(visit_month, 2) over(partition by user_id order by visit_month) as two_next_visit_month, lag(visit_month, 1) over(partition by user_id order by visit_month) as before_visit_month from `advanced.analytics_function_01` [1~4번] 윈도우 함수 Frame 연습 문제 1번 /* 전체 계산 할 때 왜 over()를 써야 하는지 몰랐습니다. 그러나 일반 집계 함수의 방식과 비교해보니, 사용 이유를 알게 됐습니다. 집계함수를 사용할 때 over()를 사용했다는 건 '윈도우 함수가 적용된 결과값(각 행마다 결과 값이 반환 되는 것)으로 보겠다'는 의미인 걸 알게 됐습니다. 같은 집계함수를 사용하더라도 '어떤 방식(결과를 1개 행으로만 받아볼지, 여러개 값으로 받아볼지)으로 결과 값을 받아 볼 지' 생각해 봐야 한다는 걸 알았습니다. */ select *, sum(amount) over() as amount_total from `advanced.orders` 2번 /* 처음에는 누적합을 구하는 건데 왜 over() 안에 order by를 써야하는지 이해하지 못했습니다. 그러나 누적합도 "어떤 방식으로 계산할지 '계산 방식'"을 지정해 줘야 한다는 걸 알게 됐습니다. /* select *, sum(amount) over(order by order_id) as cumulative_sum from `advanced.orders` 3번 select *, sum(amount) over(partition by user_id order by order_id) as cumulative_sum_by_user from `advanced.orders` 4번 /* over() 안에 사용하는 order by와 over() 밖에서 사용하는 order by를 명확히 이해했습니다. 윈도우 함수에서 사용하는 order by는 '계산 순서'를 정하는 것이고, 윈도우 함수 밖에서 사용한 order by는 '눈에 보이는 정렬'을 컨트롤 한다는 걸 이해했습니다. 이해할 때 '쿼리 작동 순서'를 생각했더니, 큰 도움이 됐습니다. */ select *, avg(amount) over(order by order_id rows between 5 preceding and 1 preceding) as last_5_orders_avg_amount from `advanced.orders` order by order_id [1~7번] 윈도우 함수 연습 문제 1번 select *, count(user) over(partition by user) as total_query_cnt from `advanced.query_logs` order by query_date 2번 /* - date 형식 데이터를 extract()로 주 형식으로 바꾸는 걸 알게 됐습니다 - partition by 내에 2개 이상 컬럼을 넣어도 된다는 걸 알게 됐습니다. */ with user_query_cnt as ( select extract(week from query_date) as week_number, team, user, count(user) as query_cnt from `advanced.query_logs` group by all ) select *, rank() over(partition by week_number, team order by query_cnt desc) as team_rank from user_query_cnt qualify team_rank = 1 order by 1,2 3번 /* - lag()와 함께 쓰는 over() 사용법이 헷갈렸는데, 실행 후 수정하는 방향으로 쿼리를 작성해 보라고 하신 점이 인상 깊게 와닿았습니다. */ with base as ( select user, team, extract(week FROM query_date) as week_number, count(user) as query_count from advanced.query_logs group by all ) select *, lag(query_count, 1) over(partition by user order by week_number) as pre_query_cnt from base 4번 /* qualify cumulative_query_cnt != cumulative_query_cnt2 위 쿼리로 정합성을 체크하는 방식을 배우게 됐습니다. */ ## 4번 with query_cnt as ( select *, count(user) as query_count from advanced.query_logs group by all ) select *, sum(query_count) over(partition by user order by query_date) as cumulative_query_cnt, sum(query_count) over(partition by user order by query_date rows between unbounded preceding and current row) as cumulative_query_cnt2 from query_cnt -- qualify cumulative_query_cnt != cumulative_query_cnt2 5번 /* - 4번에서 배운 정합성 체크하는 쿼리를 이용해서 컬럼 내 값이 있는지 테스트 해봤습니다. */ ## 정합성 테스트 -- select -- * -- from ( -- select -- *, -- last_value(number_of_orders) over(order by date) as last_values_order -- from raw_data -- ) as test1 -- where -- number_of_orders != last_values_order select *, last_value(number_of_orders ignore nulls) over(order by date) as last_values_order from raw_data 6번 /* 처음에는 1. 평균을 구하고 2. 해당 테이블을 서브쿼리로 두고, lag(컬럼, 2)를 해야 하는줄 알았습니다. 그러나 Frame 사용 방법이 생각났고, 조건에 맞게 범위를 설정해서 문제를 해결했습니다. */ ## 6번 , base2 as ( select *, last_value(number_of_orders ignore nulls) over(order by date) as last_values_order, from raw_data ) select *, avg(last_values_order) over(order by date rows between 2 preceding and current row) as moving_avg from base2 7번 /* - 타임스탬프 데이터를 다루는 다양한 방법을 알게 됐습니다. - 실무에서는 세션 기준과 보고 싶은 유저 혹은 이벤트를 지정해서 사용해도 된다는 걸 알게 됐습니다. */ with base as ( select event_date, event_timestamp, datetime(timestamp_micros(event_timestamp), 'Asia/Seoul') as event_datetime, event_name, user_id, user_pseudo_id from `advanced.app_logs` where event_date = '2022-08-18' and user_pseudo_id = '1997494153.8491999091' ) select *, sum(session_start) over(order by event_datetime) as session_id from ( select *, case when second_diff >= 20 then 1 when second_diff is null then 1 else 0 end session_start from ( select *, timestamp_diff(event_datetime, before_event_datetime, second) as second_diff from ( select *, lag(event_datetime, 1) over(partition by user_pseudo_id order by event_datetime) as before_event_datetime from base ) as base2 ) as base3 ) as base4
윈도우 함수 (탐색 함수) 연습 문제 1번 SELECT user_id, visit_month, lead(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_1month, lead(visit_month, 2) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_2month, FROM advanced.analytics_function_01 ORDER BY 1,2; 2번 SELECT user_id, visit_month, lead(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_1month, lead(visit_month, 2) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_2month, lag(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS pre_1month FROM advanced.analytics_function_01 ORDER BY 1,2; 윈도우 함수 연습 문제 1번 SELECT user, team, query_date, count(user) over(PARTITION BY user) AS total_query_cnt FROM advanced.query_logs ORDER BY query_date, user 2번 WITH base AS ( SELECT EXTRACT(week FROM query_date) AS week_number, team, user, count(user) AS query_cnt FROM advanced.query_logs GROUP BY 1,2,3 ) SELECT *, rank() OVER(PARTITION BY week_number, team ORDER BY query_cnt desc) AS team_rank FROM base QUALIFY team_rank = 1 ORDER BY week_number, query_cnt desc; 3번 WITH base AS ( SELECT EXTRACT(week FROM query_date) AS week_number, team, user, count(user) AS query_cnt FROM advanced.query_logs GROUP BY 1,2,3 ) SELECT *, lag(query_cnt) OVER(PARTITION BY team, user ORDER BY week_number asc) AS prev_week_query_cnt FROM base ORDER BY team, user, week_number; 4번 WITH base AS ( SELECT user, team, query_date, COUNT(user) as query_count FROM advanced.query_logs GROUP BY 1,2,3 ) SELECT user, team, query_date, query_count, SUM(query_count) OVER(PARTITION BY team, user ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_query_count FROM base ORDER BY team, user, query_date; 5번 WITH raw_data AS( SELECT DATE'2024-05-01'AS date,15 AS number_of_orders UNION ALL SELECT DATE'2024-05-02',13 UNION ALL SELECT DATE'2024-05-03',NULL UNION ALL SELECT DATE'2024-05-04',16 UNION ALL SELECT DATE'2024-05-05',NULL UNION ALL SELECT DATE'2024-05-06',18 UNION ALL SELECT DATE'2024-05-07',20 UNION ALL SELECT DATE'2024-05-08',NULL UNION ALL SELECT DATE'2024-05-09',13 UNION ALL SELECT DATE'2024-05-10',14 UNION ALL SELECT DATE'2024-05-11',NULL UNION ALL SELECT DATE'2024-05-12',NULL ) SELECT date, IF(number_of_orders is null , last_value(number_of_orders IGNORE NULLS) OVER(ORDER BY date asc), number_of_orders) AS number_of_orders_not_null FROM raw_data; 6번 WITH raw_data AS( SELECT DATE'2024-05-01'AS date,15 AS number_of_orders UNION ALL SELECT DATE'2024-05-02',13 UNION ALL SELECT DATE'2024-05-03',NULL UNION ALL SELECT DATE'2024-05-04',16 UNION ALL SELECT DATE'2024-05-05',NULL UNION ALL SELECT DATE'2024-05-06',18 UNION ALL SELECT DATE'2024-05-07',20 UNION ALL SELECT DATE'2024-05-08',NULL UNION ALL SELECT DATE'2024-05-09',13 UNION ALL SELECT DATE'2024-05-10',14 UNION ALL SELECT DATE'2024-05-11',NULL UNION ALL SELECT DATE'2024-05-12',NULL ), fill_null AS ( SELECT date, IF(number_of_orders is null , last_value(number_of_orders IGNORE NULLS) OVER(ORDER BY date asc), number_of_orders) AS number_of_orders_not_null FROM raw_data ) SELECT date, number_of_orders_not_null, avg(number_of_orders_not_null) OVER(ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg FROM fill_null; 7번 WITH base AS ( SELECT event_date, event_timestamp, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, event_name, user_id, user_pseudo_id FROM advanced.app_logs WHERE event_date = '2022-08-18' ), diff_date AS ( SELECT *, DATETIME_DIFF(event_datetime, pre_event_time, second) AS date_diff_sec FROM ( SELECT *, LAG(event_datetime, 1) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime asc) AS pre_event_time FROM base ) ), session_start AS ( SELECT *, CASE WHEN pre_event_time IS NULL THEN 1 WHEN date_diff_sec >= 20 THEN 1 END AS start_session FROM diff_date ) SELECT event_date, event_datetime, event_name, user_id, user_pseudo_id, date_diff_sec, SUM(start_session) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS session_id FROM session_start ORDER BY user_pseudo_id, event_datetime;
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 궁금증이 생겨서 질문을 올립니다. 해시 리스트? 를 만들고, 데이터를 넣다 보면 어쩔 수 없이 해시 충돌이 일어날 수 밖에 없을것 같은데요. 여기서 질문이 생깁니다. 영한님이 쓰신 대로 링크드 리스트를 이용해서, 해시 리스트를 만들었다고 치고 데이터를 넣다 보니, 해시 충돌이 여러 번 일어나는 경우가 생겼습니다. 여기서 해시 충돌이 몇번 일어 나는게, 최악의 상황인가요? 캐파시티를 40개 로 해 놓고, for문으로 8만개의 숫자를 넣어보니 사진처럼 나오던데요. (제컴 기준 i3, 렘16기가) 즉 질문은 해시 충돌을 계속 일으켜야 하는 상황 이라면, 해시 충돌을 몇 번 일으 키는게 메모리 상? 안전한가요? 답변 부탁 드립니다.
안녕하세요!! service 메소드 호출 파라미터 관련 질문드립니다 saveMemberV2()에서 request.getName()으로 받은 이름을 member객체에 set 해주고, 이 member를 memberService.join()에 파라미터로 넘겨주는 방식인 것 같은데, memberService.join에 request를 통으로 넘겨서 , 이후 join 메소드에서 member.setName(request.getName()) 후 처리하는 방식 은 사용하면 안되는 것인가요? 후자를 이용한다면 memberSerive.join의 파라미터도 Member 타입에서 CreateMemberRequest로 바꾸고요...!!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 송아지 찾기 ch = new int[10001]; 10001 로 선언하는 이유가 확실히 이해가 가지 않아요... 범위가 1부터 10000인데 왜 ch 배열의 크기는 10001로 설정하셨나요...?ㅠㅠ 감사합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의 내용 14분 대에서 하신 것처럼 localhost:8080으로 들어갔는데, 에러메시지는 제대로 뜨지만 팝잇콘이 강사님의 말씀처럼 뜨지 않습니다 ㅜㅠㅜㅜ 뭐가 잘못된 걸까요?
안녕하세요, 토비님. 저는 Spring 과 Java로 개발을 했었으나 좀 까먹은 상태고, 이번에 하면서 스프링에서 말하는 DI, AOP, Spring Application Context 등 여러 개념을 한번에 이해하고 넘어가고 싶습니다. 업무에 사용할 예정은 Spring 3.X 대의 최신 버전입니다. 이런 상태에서 토비의 스프링 부트와 토비의 스프링 6이 둘 다 있는데 어떤 것부터 들으면 좋을까요?
안녕하세요 nextjs를 활용해서 프로젝트를 진행하는 중에 해결되지 않는 문제가 발생하여 질문 드립니다. 현재 도커를 활용해서 nextjs를 배포하고 있는데 middleware에서 request.nextUrl.origin값이 https://localhost:3000이 들어가고 있습니다. x-forwarded-host를 찍었을때는 제가 사용하는 https://test.domain.com이 들어가는데 request.nextUrl.origin에 x-forwared-host와 같은 값이 들어가도록 설정하기 위한 방법이 있는지 알 수 있을까요??