묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
h2 관련 질문사항이 있습니다
섹션 10 강의를 들으면서 설정값을 바꾼후 busrefresh를 통해 성공적으로 (204)를 반환 받아도 저런식으로 오류가 발생하여 항상 전부 재시작후 실습을 진행중입니다. 어떻게 해결해야할까요?해당 json부분에 이전과 다른 데이터 값을 넣어주면 정상작동합니다. 하지만 제가 알기로는 h2 db의 경우 재시작 할 때마다 데이터가 모두 날라가는걸로 알고 있습니다.spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb username: sah2역시 인메모리 방식으로 잘 되어 있는데 왜 모든 서비스들을 전부 종료하고 재시작해야지만 h2내부의 값들이 사라지는지 궁금합니다.
-
미해결비전공자의 전공자 따라잡기 - 데이터베이스,SQL
offset 방식과 성능 질문
안녕하세요 제로초님!강의 재미있게 잘 듣고있습니다 :Doffset 방식에 대해 질문이 있는데요,게시물들이 많은 게시판의 경우 offset 방식처럼 보이는 페이지네이션이 적용되어있는 것을 많이 보았는데offset 방식을 사용할경우 조회때문에 데이터가 많을 수록 성능 이슈가 발생한다고 말씀하셔서요,이 방식과 동일하게 구현하면서 (게시물 신규등록 및 삭제시 보여지는 게시물 변동) 성능 이슈를 해결할 수 있는 방법도 존재하는지 궁금합니다!
-
미해결스프링부트 시큐리티 & JWT 강의
스프링부트 시큐리티 3강 - 시큐리티 회원가입에서 USER출력
안녕하세요 강사님 객체 전달관련해서 질문이 있습니다. 강의에서 USER 객체를 출력했을 시,아래와 같이 객체 내부값이 출력되었는데,저는 `com.want.project.domain.user.domain.Users@6bfd8b8c`이런식으로 출력이 되네요..혹시 tostring을 오버라이딩하신걸까요??그리고 제 객체를 getter로 찍어보면 내부에 값이 아닌 null이 저장되어 있는데 이유가 무엇일까요?
-
미해결
수업내용대로 했지만...오류나서 어디 문제일까요?
https://github.com/leechangseop71/blog제 깃허브 주소입니다 보시고 무슨 문제인지 오류나는지 알고 싶습니다
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
clear() 관련 질문있습니다.
안녕하세요 선생님데이터가 안 담겼는데도 clear를 해주는 이유가 있을까요? 전자가 클리어한것이고 후자는 클리어 안한것입니다.감사합니다..
-
미해결업무가 100배 빨라지는 엑셀 데이터 활용과 분석 노하우
강의자료
이 강의에는 수강자료가 따로 없을까요?예제로 들어가있는 엑셀자료들을 저도 같이 해보면서 수업을 들어야할것같은데 자료를 찾아봐도 안보이네요 ㅜ 실습용 파일이필요합니다
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
2023.08.18 정상 동작하는 코드 공유
현재 정상적으로 동작하는 코드는 아래와 같습니다<02_셀레니움_무한스크롤.py>from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options import time # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 브라우저 생성 browser = webdriver.Chrome(options=chrome_options) # 웹 사이트 열기 browser.get('https://www.naver.com') # 쇼핑 메뉴 클릭하기 browser.find_element(By.CSS_SELECTOR, ".service_icon.type_shopping").click() time.sleep(2) # 새창을 바라보게 만들기 new_window = browser.window_handles[1] browser.switch_to.window(new_window) # 화면 최대화 해야지 검색창이 보임 browser.maximize_window() # 검색창 클릭 search = browser.find_element(By.CSS_SELECTOR, "input._searchInput_search_text_3CUDs") search.click() # 검색어 입력 search.send_keys("아이폰13") search.send_keys(Keys.ENTER) # 스크롤 전 높이 before_h = browser.execute_script("return window.scrollY") # 무한 스크롤 while True: # 맨 아래로 스크롤 내린다. browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) # 스크롤 사이 페이지 로딩 시간 time.sleep(1) # 스크롤 후 높이 after_h = browser.execute_script("return window.scrollY") if after_h == before_h: break before_h = after_h # 상품 정보 div items = browser.find_elements(By.CSS_SELECTOR, ".product_item__MDtDF") for item in items: name = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K").text try: price = item.find_element(By.CSS_SELECTOR, ".price_num__S2p_v").text except: price = "판매중단" link = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K > a").get_attribute('href') print(name, price, link) <03_csv파일로저장하기.py>from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options import time import csv # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 브라우저 생성 browser = webdriver.Chrome(options=chrome_options) # 웹 사이트 열기 browser.get('https://www.naver.com') # 쇼핑 메뉴 클릭하기 browser.find_element(By.CSS_SELECTOR, ".service_icon.type_shopping").click() time.sleep(2) # 새창을 바라보게 만들기 new_window = browser.window_handles[1] browser.switch_to.window(new_window) # 화면 최대화 해야지 검색창이 보임 browser.maximize_window() # 검색창 클릭 search = browser.find_element(By.CSS_SELECTOR, "input._searchInput_search_text_3CUDs") search.click() # 검색어 입력 search.send_keys("아이폰13") search.send_keys(Keys.ENTER) # 스크롤 전 높이 before_h = browser.execute_script("return window.scrollY") # 무한 스크롤 while True: # 맨 아래로 스크롤 내린다. browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) # 스크롤 사이 페이지 로딩 시간 time.sleep(1) # 스크롤 후 높이 after_h = browser.execute_script("return window.scrollY") if after_h == before_h: break before_h = after_h # 파일 생성 f = open(r"C:\source\startcoding\startcoding_crawling\03_네이버_쇼핑_크롤링\data.csv", 'w', encoding='CP949', newline='') csvWriter = csv.writer(f) # 상품 정보 div items = browser.find_elements(By.CSS_SELECTOR, ".product_item__MDtDF") for item in items: name = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K").text try: price = item.find_element(By.CSS_SELECTOR, ".price_num__S2p_v").text except: price = "판매중단" link = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K > a").get_attribute('href') print(name, price, link) csvWriter.writerow([name, price, link]) f.close()
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
2023.08.18 기준 정상 동작하는 코드 공유
네이버 쇼핑이 예제 중에 가장 많이 업데이트 되네요 ㅎㅎ 강의 리뉴얼하면서 얘는 무조건 빼야되겠습니다. 현재 시점에서 잘 동작하는 코드입니다코드에 대한 설명은 주석으로 달아놓았으니 학습에 참고해 보세요from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options import time # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 브라우저 생성 browser = webdriver.Chrome(options=chrome_options) # 웹 사이트 열기 browser.get('https://www.naver.com') # 쇼핑 메뉴 클릭하기 browser.find_element(By.CSS_SELECTOR, ".service_icon.type_shopping").click() time.sleep(2) # 새창을 바라보게 만들기 new_window = browser.window_handles[1] browser.switch_to.window(new_window) # 화면 최대화 해야지 검색창이 보임 browser.maximize_window() # 검색창 클릭 search = browser.find_element(By.CSS_SELECTOR, "input._searchInput_search_text_3CUDs") search.click() # 검색어 입력 search.send_keys("아이폰13") search.send_keys(Keys.ENTER)
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
스프링부트
스프2는 스프링부트기반으로 작성하나요? 지금학원에서 스프링부트안적옹해서 시큐리티랑페이징 처리하는걸로프로젝트 하고있거든요
-
미해결스프링 부트 - 핵심 원리와 활용
일반로그라는 의미가 정확히 무엇인가요?
[질문 내용]강의 내용 13분쯤 "일반로그와 에러로그는 구분해서 파일로 남기자"라는 내용이 있는데요.에러로그를 구분해서 파일을 남기는건 알겠는데,일반로그라고 함은 어떤범주인가요? 서버에서 출력되는 모든 로그들을 말하는건가요? System.out.println포함하여 서버를 가동했을때 나오는 모든 출력문인지, 아니면 log.info처럼 개발자가 의도하여 찍은 로그중 에러/경고가 아닌 로그를 의미하는건지 궁금합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
수정하기 뮤테이션
안녕하세요 선생님 !하나 궁금한 점이 있어서 질문 드려요.게시물 수정할 때, 기존에 입력한 값이 사라지고 수정한 내용만 남는 문제가 발생해, 수정하기 버튼을 눌렀을 때 기존 값도 남아있고, 수정한 내용도 체인지 돼서 나오게끔 하는 부분을 공부중입니다.(이미지는 강의내용 캡쳐입니다)궁금한 게, 이렇게 코드를 적용하고 게시물을 수정하면 바뀐 내용들만 뮤테이션이 날라간다는 건 이해 하겠는데 기존에 입력한 값들이 안 사라지고 출력되는 건 이해가 쉽지 않네요.. !! 어차피 writer,title,contents 스테이트는 수정된 게 없으니 빈 값 아닌가요 ? 빈 값인데 초기값이 나온다는 게 ..ㅠㅠ 미리 답변 감사합니다 선생님.
-
미해결홍정모의 따라하며 배우는 C언어
16진수에 대한 설명
<3.8 8진수와 16진수>강의에서 16진수에 대해 설명하시면서unsigned int의 최댓값을 각각 10진수, 2진수, 8진수, 16진수로 나타내주셨습니다.16진수의 표현에서 f가 8개인 이유는 16이 2의 4제곱이기 때문이라고 하셨는데 해당 설명의 메커니즘이 잘 이해가 되지 않아 질문드립니다.수강 후 공부해본 결과, 2진수 1111이 16진수에서 f 하나에 해당하기 때문에, 해당 unsigned int의 최댓값인 2진수의 32비트는 나누기 4를 하여 16진수에서 8자리가 나타난다는 것은 이해를 하였습니다.그러나 16이 2의 4제곱이라서 8개의 자리만 있으면 된다는 설명에 대해선 이해가 어려워 조금 더 구체적으로 알려주시면 감사하겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
UI 자동화 장점
예전에 회사에서 유니티로 어플을 만들 때 버튼 클릭할 때 나오는 사운드를 BUTTON 컴포넌트에 함수로 매핑을 해준 적이 있었습니다. 드래그앤드롭으로 인스펙터창에 붙였었는데, 유지보수 측면에서 함수의 이름을 바꿔야할 상황이 왔었는데 함수 이름을 바꾸니 제가 프로젝트의 버튼에 매핑 시켰던 모든 버튼 클릭 함수가 Missing이 떴었습니다. 이 때, 루키스님의 UI 자동화의 장점을 뼈저리게 느꼈었는데 혹시 이런 상황 말고도 루키스님이 자주 쓰시고 저희에게 가르쳐주신 UI 자동화만의 장점이 있을 까요?? 단점도 궁금합니다(아마 단점은 하나의 Scene에서 게임 오브젝트의 이름이 같은 게 2개 이상 있으면 정상 동작하지 않는다 인 것 같은데 맞을까요? 그 외의 단점도 궁금합니다!!)
-
해결됨
hibernate 6.x 에서 batch size의 전략 변경하기 아는 분 있으신가요?(batch_fetch_style deprecated issue)
https://www.inflearn.com/questions/34469위 링크를 참조해보면, 이전에 hibernate 의 batch size 기본전략이 legacy 임을 알 수 있습니다.하지만, 현재 사용 중인 hibernate 6.2 에서 @BatchSize 를 사용하면 기본적으로 dynamic 으로 조회되고 있습니다. 참고로 글로벌 설정으로 default_batch_fetch_size 를 설정해도 동일합니다. select ... from my_table m1_0 where m1_0.id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) binding parameter [1] as [INTEGER] - [5] binding parameter [2] as [INTEGER] - [1] binding parameter [3] as [INTEGER] - [null] ... binding parameter [98] as [INTEGER] - [null] binding parameter [99] as [INTEGER] - [null] binding parameter [100] as [INTEGER] - [null] 그래서 batch_fetch_style 을 직접 설정하려고 봤더니 hibernate 6.0 이후부터는 deprecated 되었고, MultiKeyLoadSizingStrategy 를 사용하라고 하네요. 혹시 이 MultiKeyLoadSizingStrategy 사용해보신 분 있으신가요?또는 다른 방법으로 batch size 전략을 이전의 기본전략인 legacy 처럼 변경하신 분이나 현재 프로젝트에서 비슷한 issue 겪으신 분 있으신가요?--(아까 오전에 비슷한 질문 올리면서, spring.jpa.properties.hibernate.jdbc.batch_size 사용하면 되는 것 같다고 했었는데 착각이었습니다. 실제로는 n + 1 발생에 영향을 주지 않습니다.)--(추가)MultiKeyLoadSizingStrategy 를 사용하는 부분은 Dialect 입니다. 이때 넘겨받는 numberOfKeys 는 지정한 BatchSize 와 동일합니다. 그리고 아래 코드에 의해 최종적으로 생성하는 ? 의 개수는 최초로 딱 1번, 1개만 생성되는 것처럼 보입니다. 그러면 코드가 dynamic 처럼 작동하는 게 이해는 가네요. 동적으로 id 의 개수에 따라 다른 PreparedStatement를 사용하는 게 아니니까요.만약 BatchSize 를 10으로 정한 필드가 있다면, 해당 필드는 아래 코드에 의해 10(pad=false, column=1) 또는 16(pad=true, column=1) 둘 중 하나의 쿼리만 생성됩니다.위에서 언급한 링크에서 김영한 님 설명대로라면 10 + nlog2 개의 쿼리가 생성되는 데 반해, MultiKeyLoadSizingStrategy 는 딱 하나의 쿼리만을 생성하고 재사용하는 것 같습니다. 그런데 그 쿼리의 ? 의 개수를 '잘' 정하는 거죠.그러면 pad와 numberOfColumns 를 어떻게 바꾸느냐도 알아봐야겠네요... 그리고 최적화에 대한 새로운 패러다임? 자체도 이해할 필요가 있어 보입니다. 아래는 Dialect 추상클래스의 일부분입니다. protected final MultiKeyLoadSizingStrategy STANDARD_MULTI_KEY_LOAD_SIZING_STRATEGY = (numberOfColumns, numberOfKeys, pad) -> { numberOfKeys = pad ? MathHelper.ceilingPowerOfTwo( numberOfKeys ) : numberOfKeys; final long parameterCount = (long) numberOfColumns * numberOfKeys; final int limit = getParameterCountLimit(); if ( limit > 0 ) { // the Dialect reported a limit - see if the parameter count exceeds the limit if ( parameterCount >= limit ) { return limit / numberOfColumns; } } return numberOfKeys; };--(추가)pad 설정은 아래와 같이 하면 됩니다. 기본값은 false 인 것 같네요.spring.jpa.properties.hibernate.query.in_clause_parameter_padding=true그리고, numberOfColumns 는 굳이 건드려야 할 필요는 없어보입니다.--결론적으로 batch_fetch_style 이 deprecated 된 이후에는 기존의 legacy 처럼 여러 개의 statement 를 만들어서 사용하지 못 하고, 각 Entity 의 batch size 를 얼마나 설정하느냐에 따라 Dialect가 그에 대응하는 딱 하나의 statement 를 만드는 것 같습니다.
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
ES모듈 전환 질문
제가 지금까지 이해한 바로는, esModuleInterop를 true로 설정하면 CommonJS모듈에서 내보내기 한 것들을 ES모듈의 내보내기 한 것으로 변환 시켜주는데 CommonJS에선 module.exports나 exports.변수 나 둘 다 하나의 객체로 담겨져 보내지니 ES모듈의 내보내기로 전환될 땐 무조건 Default Export 방식으로 전환되는 것으로 알고있습니다. 그래서 ES모듈로 가져오는 것으로 바꿔줄 때에도 그냥 Default Export 를 가져오는 방식으로만 변환해주면 되는 것으로 아는데 const { Strategy: LocalStrategy } = require("passport-local"); 이 부분을import { Strategy as LocalStrategy } from "passport-local"이렇게 Named Export를 가져오는 방식으로 바꾸는 것이 가능한 게 이해가 되질 않습니다.import Strategy as from "passport-local" 이렇게 가져와서 따로 구조분해를 해야 하는 것이 아닌가요?
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
SAA오프라인 시험 준비물
안녕하세요 선생님제가 9월에 SAA 오프라인 시험을 보러가는데 저는 여권이 없습니다.그래서 주민등록증(신분증)과 + 체크카드를 들고가도되나요??
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
useState() 데이터 추가 성능 질문
안녕하세요! React에서 useState()를 사용하여 배열과 같은 데이터 구조에서 자료를 추가하는 경우,다른 언어같은 경우 원소 하나만 추가하는 시간복잡도가 O(1)으로 수행하는 함수가 있는데(C++의 append 혹은 push) React에서는 항상 [newItem,...data] 이런 식으로 원소 하나 추가할 때마다, 배열의 값을 모두 새로 만드는데, 데이터가 많아질 경우 시간복잡도가 O(n)으로 비효율적일 것 같습니다. 그래서 React에는 push()같은 방식으로 데이터를 추가하는 방법이 있나요? 없다면 없는 이유가 무엇인가요??
-
해결됨데이터 분석 SQL Fundamentals
analytic-sql과 상관 서브쿼리
안녕하세요 강의 열심히 듣고 있습니다. 감사드립니다.[서브쿼리 실습-02] 수업에 대해 질문이 있습니다. -- 상관 서브쿼리select * from hr.emp_dept_hist_01 a where todate = (select max(todate) from hr.emp_dept_hist_01 x where x.empno=a.empno);-- Analytic SQLselect * from ( select *, row_number() over (partition by empno order by todate desc) as rnumfrom hr.emp_dept_hist_01 )a where rnum = 1; 위 두 가지 방법의 성능 차이에 대해 궁금합니다. (고객 데이터 분석 업무를 수행하고 있는데, 데이터가 커서 성능이 항상 이슈더라구요)강의에서 말씀해주신대로, online 처리를 해야한다면 analytic-sql은 sorting을 해야하기 때문에 상관 서브쿼리가 더 성능이 좋을 것 같습니다.강의에서 분석을 할 때는(배치로 처리할 때) analytic sql이 더 성능이 좋다고 하셨는데 그 이유는 무엇인가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jsp 추가
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]plugins { id 'java' id 'war' id 'org.springframework.boot' version '2.7.13' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' //JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl' //JSP 추가 끝 providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } build.gradle에 jsp를 추가하였는데, 새로운 jsp파일을 생성할때 <%@ page contentType="text/html;charset=UTF-8" language="java" %>나 html같은 템플릿이 전혀 뜨지 않습니다. 해당 코드를 복붙 후 run하여 페이지를 띄우면 잘 실행 되기는 합니다.File and Code Templates에서 템플릿을 추가해보고자 했지만 jsp 선택 버튼도 보이지 않아 jsp 추가가 정상적으로 되지 않은건가 싶습니다...
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
ARP 프로토콜 관련 질문입니다
보통 L2나 L3 스위치의 enable 모드에서 sh arp 나 sh mac address-table 명령어를 쳐보면그 스위치에 연결된 하드웨어의 ip, mac 주소, 연결된 interface 정보 등이 보이는데이런 하드웨어 관련 정보는 하드웨어를 연결하고 전원을 켜면 스위치 내부에서 자동으로 갱신이 되나요?자동으로 갱신이 되는 거라면 스위치에서 주기적으로 arp request를 보내는 것인가요?