묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결모르면 승진 안되는 시스템 디자인
수정사항 제보
안녕하세요. 강의 잘 보고 있습니다. 🙂 두 가지 정도 수정해주시면 좋을만한 내용이 보여서, 문의 남겨봅니다. 1. 속도 조절기 PDF 21페이지, 속도 조절기(Rate Limiter) 강의 영상 기준 18분 이후-> HTTP 420 -> HTTP 429가 좀 더 맞는 것 같습니다!물론 420을 쓰는 사례가 있다는 것도 알고 있습니다~ 2. 웹 크롤러(Web Crawler) 강의 중 9분 ~ 9분 40초 쯤-> 강의 영상에서 해당 부분은 편집해주시는 것이 조금 더 낫지 않을까 싶습니다 🙂 확인 부탁드려요!좋은 강의 만들어주셔서 감사합니다.
-
해결됨통계 분석 마스터 클래스
다중 선형회귀 분석 등
안녕하세요 해당 관련 강의를 듣고 있는 수강생입니다.수업을 듣고 있는 중에.. 엑셀로 회귀 분석을 진행하는데매크로를 사용해서 진행하는 것만 나오네요?각각의 분석값을 어떻게 계산하는지는 설명이 없는 거 같아서요.. 예를 들면 2차회귀에서의 결정계수, 상관계수, P값(분산분석)아니면 중회귀에서의 P값 등... 구하는 공식 등을 그냥 엑셀에서의 매크로를 통해 보여주기만 하네요.. 혹 이런 값들의 계산식들을 알 수가 있을까요?
-
미해결
그라디오 에러 도움 부탁드립니다.
안녕하세요! 열심히 수강중입니다. 다름이 아니고 멀티에이전트를 만드는 과정에서 분명히 체인이 잘 작동하는데 그라디오에서만 에러가 나고 있어요. 또한 처리 속도도 20초가 넘어가서 제가 어떤 부분을 실수하고 있는지 강사님의 조언이 필요합니다. 아래는 에러 화면과 코드입니다. import os from dotenv import load_dotenv load_dotenv() OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') TAVILY_API_KEY = os.getenv('TAVILY_API_KEY') from crewai import Agent, Task, Crew, Process from langchain_openai import ChatOpenAI from langchain_community.tools.tavily_search import TavilySearchResults from crewai_tools import WebsiteSearchTool import gradio as gr # LLM llm = ChatOpenAI(model='gpt-3.5-turbo', temperature=0, api_key=OPENAI_API_KEY) # Instantiate tools search_tool = TavilySearchResults(api_key=TAVILY_API_KEY) web_rag_tool = WebsiteSearchTool() def test_crew(topic): researcher = Agent( role='Market Research Analyst', goal=f'Provide up-to-date market analysis of AI video editing tool. Focus on the topic: {topic}', backstory='An expert analyst with a keen eye for AI video editing market trends.', tools=[search_tool, web_rag_tool], allow_delegation=False, verbose=True, llm=llm, max_iter=3, max_rpm=10, function_calling="ALWAYS" ) reporter = Agent( role='Content Writer', goal=f'Analyze AI video editing market data to extract actionable insights and business decision in developing AI video editing products. Focus on the topic: {topic}', backstory='A skilled writer with a passion for technology.', allow_delegation=False, llm=llm ) # Define tasks research = Task( description=f'Explore the internet to pinpoint emerging trends and potential AI video editing tool development opportunities. Focus on the topic: {topic}', expected_output='A summary of the top 3 key insights in developing competitive AI video editing tool. Make sure to add reference Webpages. Also name trending services', agent=researcher ) report = Task( description=f'Analyze AI video editing market data to extract actionable insights and business decision in developing AI video editing products based on the research of the previous agent. Plus name the current trending services.', expected_output=f'A 4-paragraph reports formatted in markdown with engaging, informative, and accessible content, avoiding complex jargon. Make sure to add reference Webpages and compile a concise report in Korean Hangul. Focus on the topic: {topic}', agent=reporter ) # Assemble a crew with planning enabled my_crew = Crew( agents=[researcher, reporter], tasks=[research, report], process=Process.sequential ) # Execute tasks result = my_crew.kickoff() return result def process_query(message, history): topic = "비디오 편집 트렌드" # 사용자 메시지 또는 컨텍스트에 따라 주제 정의 return test_crew(topic) if __name__ == '__main__': app = gr.ChatInterface( fn=process_query, title="AI 비디오 트랜드 봇", description="AI 비디오 편집 도구 트렌드를 파악하여 투자 인사이트를 제공합니다." ) app.launch()
-
미해결
Voyage à la découverte du mystère des signaux
À l'ère du numérique, le développement rapide de la technologie a rendu notre vie de plus en plus pratique. Par exemple, la navigation GPS est devenue un outil indispensable pour les voyages, et les télécommandes nous permettent également de contrôler facilement divers appareils à la maison. Cependant, aujourd'hui, nous allons parler de certaines technologies un peu mystérieuses - les brouilleurs, mais quelles histoires se cachent derrière elles ? Découvrons-le !Tout d'abord, parlons des brouilleur GPS. Le GPS (Global Positioning System) est une partie très importante de notre vie, qui nous aide à atteindre notre destination en douceur. Cependant, imaginez que dans certains cas, comme se perdre dans une région éloignée ou avoir besoin de protéger la vie privée dans un endroit spécifique, les brouilleurs GPS peuvent être particulièrement utiles.Parlons ensuite des brouilleurs de télécommande. De nombreuses personnes ont peut-être vu des appareils de télécommande magiques dans les télé-achats. Dans certains films, vous pouvez voir des personnages utiliser des brouilleurs de télécommande pour « tuer » une activité en cours. Quelle est la situation réelle ?Les brouilleurs de télécommande peuvent empêcher l'appareil brouillé (comme les drones, les voitures télécommandées, etc.) de recevoir des signaux de la télécommande. Cela signifie que si vous parvenez à trouver un brouilleurs de télécommande, vous pouvez temporairement « contrôler » ces appareils. Pour les passionnés, cela apporte des possibilités infinies et vous pouvez créer une variété d'expériences et d'expériences.Enfin, parlons des brouilleur d'onde. Son principe de fonctionnement est similaire aux deux précédents, mais son champ d'application est plus large. Les brouilleurs radio peuvent interférer avec les signaux radio dans une bande de fréquence spécifique, entravant la transmission d'informations.Par exemple, dans le domaine militaire, afin de protéger la confidentialité, les brouilleurs radio peuvent être utilisés pour interférer avec les communications ennemies afin de garantir que les informations ne soient pas écoutées. Dans certains lieux publics, tels que les aéroports et les gares, afin d'améliorer la sécurité, les brouilleurs radio sont également utilisés pour interdire l'utilisation de téléphones portables et d'autres équipements de communication afin de prévenir les activités terroristes.https://lalalisahhfr.pika.page/posts/quand-la-technologie-s-entremele-avec-la-vie-quotidienneDans le contexte actuel d'évolution rapide des technologies, nous devons utiliser ces outils avec prudence pour nous assurer que, tout en bénéficiant de la commodité, nous ne portons pas atteinte aux droits et intérêts légitimes d'autrui ni à l'harmonie sociale. Prêtons attention au développement positif de la science et de la technologie et à l'avenir de l'humanité !
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); 구문 질문입니다.
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); void AABCharacterPlayer::Move(const FInputActionValue& Value)의 몸체에 구현하신 구문 중 하나인데요, FRotationMatrix는 탬플릿 클래스가 맞나요? (챗gpt가 자꾸 아니라고 해서..ㅠ)f12로 추적해보면 template<typename T>struct TRotationMatrix : public TRotationTranslationMatrix<T>{ 가 떠서 탬플릿클래스가 맞는게 아닌가 싶어서 확인차 질문드립니다. 그리고 만약 탬플릿클래스가 맞다면, const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); 의 우측에 FRoataionMatrix 생성자를 호출할때 사이에 탬플릿 인자를 <타입> 으로 const FVector ForwardDirection = FRotationMatrix<float>(YawRotation).GetUnitAxis(EAxis::X);이런식으로 명시하지 않아도 컴파일이 가능한 이유가 무엇인지 궁금합니다.
-
미해결그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
동적 프로그래밍 메모리 낭비 질문
안녕하세요!동적 프로그래밍 방식을 사용하면 for 문 안에 table[i] = table[i-1] + table[i-2] 를 볼 수 있었습니다. int[] dp = new int[n + 1];이런식으로 객체를 계속 만들어서 이에 대한 메모리 낭비(?) 는같은 계산이 반복되어서 발생하는 낭비보다 훨씬 덜 한 것인가요 ? 또한 메모리제이션이랑 동적프로그래밍 알고리즘을 구현하는 것은 시간 복잡도를 줄이기 위함인가요? 아니면 메모리 낭비를 방지하기 위함인가요 ? 아니면 시간복잡도가 곧 메모리 낭비와 상당히 관련이 있기에 둘다 신경써준다고 봐야하나요 ?
-
미해결김영한의 실전 자바 - 기본편
java-basic 내용 연동했더니 package가 안 만들어져요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.java-basic 파일을 existing sources로 가져왔더니 벌써 다 입력값이 되어있네요 원래 이런가요?
-
미해결스프링 핵심 원리 - 고급편
예외 처리 부분 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]항상 강의 잘 보고 있습니다. 감사합니다.강사님 자료 중에 "throw e: 예외를 꼭 다시 던져주어야 한다. 그렇지 않으면 여기서 예외를 먹어버리고, 이후에 정상 흐름으로 동 작한다. 로그는 애플리케이션에 흐름에 영향을 주면 안된다. 로그 때문에 예외가 사라지면 안된다"라는 문장에서예외를 다시 던져준다와 예외를 먹어버린다 등의 표현이 잘 이해가 안되는데 설명 부탁드립니다. 감사합니다
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
NPC Stat 정보가 적용이 안됩니다
기믹에 스텟값은 잘 적용되고 변경도 되고 CurrentStage와 스텟 또한 잘 적용되어 있습니다. SetLevel 함수가 적용이 안되는건가 하는 생각이 있는대 이걸 확인하는방법이 있나요?? 아니면 다른 어떤 문제인지 감이 안와서 질문드립니다 추가적으로 건들다가 앤진을 재부팅하는 과정에서 아래와 같이 델리게이트가 인식이 안되는 문제가 발생했습니다 정상적으로 돌아가다가 재부팅후 인식을 못합니다. 이유를 할고계실까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.계속 빌드 오류가 뜹니다....자바 버전도 17 이상인데 뭐가 문제인걸까요...
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
HDL 2장 수업내용
안녕하세요 🙂HDL 2장 내용 확인차 질문을 하게 되었습니다.-Testbench는 디자인(module)에 대한 시뮬레이션을 실행하기 위한 환경으로 어떤방식, 어느 주기로 확인하는 과정을 어떻게 꾸밀지 정하며 크게 stimulus -> module -> checker로 구성되어 있다.-DUT는 설계한 logic으로 testbench에서 module에 들어가며 verilog, VHDL로 작성된 하드웨어 설계이다.-stimulus는 DUT의 input역할 -checker는 DUT의 output이 원하는 결과에 맞는지 check하는 모듈이다. 위와 같이 정리를 하였는데 시뮬레이션과 테스트벤치의 개념이 확실히 이해가되지 않아 작성하게 되었습니다.예를 들어 DUT가 단순히 and logic이라고 했을떄 시뮬레이션은 입력에 따라 and의 결과가 잘나오는지 확인하는 것이고 테스트벤치는 clock주기와 시뮬레이션을 모두 포함하는것이라고 생각하면 될까요?시뮬레이션은 단순히 and를 돌려보는 것이고 그것에 필요한 input,clk주기등은 테스트벤치에서 정하는것이라고 생각하면되나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-I 질문 있습니다.
저의 처음 접근방식은 아래와 같았습니다.공간 복잡도를 줄여야 하기 때문에 2차원 배열로 모든 것을 나타낼 수는 없다.동생의 위치는 점화식으로 표현할 수 있다. Bro(t) = Bro(t - 1) + t 0에서 출발해도 1000초 뒤면 500500에 도착하므로 배열의 크기는 1000이면 충분하다.수빈이가 특정 좌표에 도착한 시간을 기록해두고, 이 시간을 이용해 동생의 위치와 비교한다면 찾아낼 수 있지 않을까?그러나 이는 틀렸고, 강사님의 강의를 보고 수빈이가 먼저 도착한 경우를 빼먹었다는 걸 알았습니다. 그리고 이를 보완해 아래와 같은 코드를 작성하였습니다.http://boj.kr/9ca6697bc05c4e72b0e9a7cf5ef1a703하지만 여전히 틀렸더군요. 강사님의 강의를 마저 보고 풀긴 했습니다만, 제가 위 코드에서 빼먹은 부분이 무엇인지 감이 잡히지 않아 질문 드립니다. 🙏
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-A 질문 있습니다.
저도 min함수를 떠올려서 비교하기위해서는 result를 적당한 값으로 초기화를 해놔야된다고 생각하였는데 강사님께서는 987654321으로 초기화를 해두었던데 그렇게 하신 이유가 있으실까요?제가 문제를 풀다보니 초기값을 잘못 고르면 마이너스 값으로 출력되어버릴때도 있던데 어떻게 초기값 기준을 잡으면 되는지 잘 감이 잡히지 않습니다. 명확하게 딱 떨어지는 값도 이 문제에서는 없어 보이고요..
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7. Weekly 리텐션 쿼리 작성 및 질문
안녕하세요.Weekly로 리텐션 쿼리 아래와 같이 작성해 보았습니다.한가지 질문할 점은 event_week 기간 동안 한번 이상 접속을 한다고 하더라도 user_psuedo_id는 한번으로 집계되는지 궁금합니다!그리고 작성한 쿼리문을 좀 더 나은 방향으로 수정하면 좋은 방향이 있다면 언제든 말씀 부탁드릴께요! 강의 정말 잘 듣고 있습니다 :)===작성한 쿼리문===WITH base AS ( SELECT DISTINCT user_id, DATE(DATETIME(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" ), diff_of_week_data AS ( SELECT *, DATE_DIFF(event_week, first_week, week) AS diff_of_week FROM( SELECT DISTINCT user_pseudo_id, MIN (DATE_TRUNC(event_date,WEEK(MONDAY))) OVER (PARTITION BY user_pseudo_id) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ) SELECT *, SAFE_DIVIDE(cnt, first_value_cnt) AS retention_ratio FROM( SELECT *, FIRST_VALUE(cnt) OVER (ORDER BY diff_of_week) AS first_value_cnt FROM( SELECT diff_of_week, COUNT(user_pseudo_id) AS cnt FROM diff_of_week_data GROUP BY diff_of_week ) ) ORDER BY diff_of_week
-
해결됨2025년 CPPG 개인정보관리사 자격증 취득하기 (개정안 반영)
실전문제 풀이과정이 있다고 해서 강의 신청했어요
저는 강의 보다 강의 소개에 실전문제 풀이과정이 있다고 해서 신청했어요.근데, 마지막강의까지 강의 밖에 없네요.그리고, 마지막강의에서 다음수업에서 뵐게요라고 하던데뒤 과정이 더 있어야 하는거 아닌가요?
-
해결됨실습으로 손에 잡히는 SQLD의 정석(2과목)
55번 문제 질문이요
55번문제에 1번 보기는 중복때문에 안된다고 하셨는데 2번 보기도 중복이 존재 할 수 있는거 아닌가요?
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
nextjs 프리패칭
2.4) 프리페칭 강의 6분 44초 경의 화면입니다next js 같은 경우 유저가 이동할 가능성이 있는 페이지의 js bundle파일을 미리 서버로 부터 받아온다고 하셨는데만약 초기화면에서 링크 태그를 통해 페이지 이동이 일어나게 된다면1) 서버로부터 수화되기 전 html 파일을 받아와서 화면에 렌더링2) 프리페칭 받아온 js파일로 수화과정3) 상호 인터렉션 가능제가 이해한 과정이 이게 맞을 까요??만약 그렇다면 페이지 이동 시 html 파일은 서버로부터 기본적으로 매 번 불러오는 걸까요?🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨질문 하시기 전에 꼭 확인해주세요- 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다)- 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다)- 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢)질문 하실때 꼭 확인하세요- 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X)- 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지)- 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우)- 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요- 강의의 몇 분 몇 초 관련 질문인지 알려주세요!- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 @OneToOne 조회에 대해 질문 있습니다.
@Entity public class Delivery { @Id @Column(name = "delivery_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(fetch = FetchType.LAZY, mappedBy = "delivery") private Order order; private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public DeliveryStatus getStatus() { return status; } public void setStatus(DeliveryStatus status) { this.status = status; } }@Entity @Table(name = "orders") public class Order { @Id @Column(name = "order_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Delivery getDelivery() { return delivery; } public void setDelivery(Delivery delivery) { this.delivery = delivery; } public LocalDateTime getOrderDate() { return orderDate; } public void setOrderDate(LocalDateTime orderDate) { this.orderDate = orderDate; } public OrderStatus getStatus() { return status; } public void setStatus(OrderStatus status) { this.status = status; } }public class Test2 { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); Delivery delivery = new Delivery(); delivery.setStatus(DeliveryStatus.READY); delivery.setAddress(new Address("city", "street", "zipcode")); em.persist(delivery); Order order = new Order(); order.setOrderDate(LocalDateTime.now()); order.setStatus(OrderStatus.ORDER); order.setDelivery(delivery); em.persist(order); // Order 에 fetch = FetchType.LAZY 설정 , delivery 실제 값 사용 { em.flush(); em.clear(); Order findOrder = em.find(Order.class, order.getId()); Delivery findDelivery = findOrder.getDelivery(); System.out.println("findDelivery : " + findDelivery.getStatus()); } tx.commit(); }finally { em.close(); } } }실행결과Hibernate: /* insert for com.mycom.myapp.ex.Delivery */insert into Delivery (city, street, zipcode, status) values (?, ?, ?, ?) Hibernate: /* insert for com.mycom.myapp.ex.Order */insert into orders (delivery_id, orderDate, status) values (?, ?, ?) Hibernate: select o1_0.order_id, o1_0.delivery_id, o1_0.orderDate, o1_0.status from orders o1_0 where o1_0.order_id=? Hibernate: select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from Delivery d1_0 where d1_0.delivery_id=? Hibernate: select o1_0.order_id, o1_0.delivery_id, o1_0.orderDate, o1_0.status from orders o1_0 where o1_0.delivery_id=? findDelivery : READY 강의에서 진행한 Order와 Delivery를 가지고 조회 테스트를 해봤습니다. 우선 Order와 Delivery를 양방향으로 OneToOne 관계를 설정했습니다. 그리고 둘다 각각 지연로딩으로 설정했습니다.em.flush(); em.clear(); Order findOrder = em.find(Order.class, order.getId()); Delivery findDelivery = findOrder.getDelivery(); System.out.println("findDelivery : " + findDelivery.getStatus());그리고 이 부분에 대해 아래와 같이 이해를 했습니다.맨처음 em.find()를 해서 Order에 대해 DB에 select문을 보냅니다. 이때 delivery와는 지연로딩이므로 추가 select가 발생하지 않습니다. 그리고 findDelivery.getStatus()); 에서 delivery의 실제 값을 사용하므로 이때 delviery에 대한 select문이 발생합니다. 정리하면 처음에는 order에 대한 select문 그리고 실제 delevery 값을 사용할때 delivery에 대한 select문 해서 총 두번의 select문이 발생할꺼라고 예상을 했습니다.근데 실제 실행결과를 보니 총 세번의 select문이 발생했습니다. 실행결과에서 첫번째 select문과 두번째 select문이 출력된거는 이해가 되는데 마지막 select문은 왜 발생했는지 모르겠습니다.
-
미해결
예제(2) 엑셀 파일이 안 읽어집니다..
package springbatch.batch.job.file; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.database.JpaItemWriter; import org.springframework.batch.item.database.builder.JpaItemWriterBuilder; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import springbatch.batch.chunk.processor.FileItemProcessor; import springbatch.batch.domain.Product; import springbatch.batch.domain.ProductVO; import javax.persistence.EntityManagerFactory; @Configuration @RequiredArgsConstructor public class FileJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private final EntityManagerFactory entityManagerFactory; @Bean public Job fileJob() { return jobBuilderFactory.get("fileJob") .start(fileStep1()) .build(); } @Bean public Step fileStep1() { return stepBuilderFactory.get("fileStep1") .<ProductVO, Product>chunk(10) .reader(fileItemReader(null)) .processor(fileItemProcessor()) .writer(fileItemWriter()) .build(); } @Bean @StepScope public FlatFileItemReader<ProductVO> fileItemReader(@Value("#{jobParameters['requestDate']}") String requestDate) { return new FlatFileItemReaderBuilder<ProductVO>() .name("flatFile") .resource(new ClassPathResource("product_" + requestDate +".csv")) .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) .targetType(ProductVO.class) .linesToSkip(1) .delimited().delimiter(",") .names("id","name","price","type") .build(); } @Bean public ItemProcessor<ProductVO, Product> fileItemProcessor() { return new FileItemProcessor(); } @Bean public JpaItemWriter<Product> fileItemWriter() { return new JpaItemWriterBuilder<Product>() .entityManagerFactory(entityManagerFactory) .usePersist(true) .build(); } }application.ymlspring: profiles: active: mysql jpa: hibernate: ddl-auto: update database-platform: org.hibernate.dialect.MySQL5InnoDBDialect show-sql: true open-in-view: false properties: hibernate.format_sql: true --- spring: config: activate: on-profile: mysql datasource: hikari: jdbc-url: jdbc:mysql://localhost:3306/springbatch?useUnicode=true&character_set_server=utf8mb4 username: root password: ---- driver-class-name: com.mysql.cj.jdbc.Driver batch: job: names: ${job.name:NONE} enabled: false jdbc: initialize-schema: always pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>spring-batch</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-batch</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-batch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> <version>2.5.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>2.4.4</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>9.0.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>5.3.7</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.20</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> 잘 작성한거 같은데, 디버그 중단점 걸어놓아도 안걸러지네요ㅠㅠ 원인을 모르겠습니다..requestDate 부분이랑 fileItemReader이 동작을 안하는거 같습니다.
-
해결됨김영한의 실전 자바 - 기본편
상속 관계가 있는 인스턴스 생성시 메모리 구조가 궁금합니다.
[질문 내용]부모 클래스 Parent와 해당 클래스를 상속 받는 Child 클래스가 있다면 Parent 클래스의 인스턴스를 생성하면 해당 클래스를 상속받는 모든 자식 클래스도 같이 생성되는 것인가요?일전에 배우기로는 인스턴스 생성시 해당 인스턴스의 부모와 자식이 모두 같은 참조값 내부에 생성된다고 배웠습니다.혹시 자식 인스턴스를 생성했을 때만 부모가 모두 생성된다와 같은 사항이 있는건지 아니면 말 그대로 상속 관계에 있는 모든 인스턴스가 생성 되는건지 궁금합니다.