강의 재밌게 잘 보고 있습니다. 궁금한 게 있어 질문드립니다. 인터페이스는 구현체와 같은 모듈에 두는 게 아닌, 사용하는 클래스에 가장 가까이 두는 걸로 이해했습니다. 하지만 그 인터페이스를 사용하는 클라이언트가 많다면 어떻게 해야할까요? 예를 들어 Payment 패키지의 PaymentService 도 ExRateProvider 를 쓰고, XXX 패키지의 XXXService 도 ExRateProvider 를 쓴다면 ExRateProvider 의 모듈 위치는 어디에 존재를 해야할까요? 아니면 다른 방법이 있을 듯 한데, 그 방법은 무엇일까요? ExRateProvider 의 모듈 위치가 클라이언트와 분리되어 있다면, DIP 적용 이전 그러니까 WebApiExRateProvider 와 ExRateProvider 가 한 모듈에 같이 위치한 그림과 별반 다를 것이 없다(모듈 의존성에 따른 변경 가능성) 생각이 들어서요
안녕하세요. OAuth 2.0을 배우고 싶어 학습 신청했습니다. 유익한 강의 준비해주셔서 감사합니다. 막연하게 알고 있는 Spring Security 에 대해 강의를 통해 명확하게 알아가고 있습니다. 강의를 들으며 몇가지 궁금한 점이 있어 질문드립니다. 우선은 자체 로그인만 구현할 예정이라면, 소셜 로그인 기능이 없는 경우에는 OAuth 2.0을 도입할 필요가 없는 건가요? Resource Owner Password Credentials Grant Flow 는 Deprecated 된다고 하는데 그럼 어떻게 구현해야하나요? 답변주시면 성장하는데 큰 도움이 될 것 같습니다! 감사합니다!
조건반복문 강의 4분 40초쯤에서 if절 에서 2의약수 또는 3의약수가 참일때, 6의 배수가 아닌것을 세어라. 로 해석되는데요. 1.일단 해당강의에서 ‘약수’로 표현한건 전부 ‘배수’인거죠? 모두 %정수로 표기되는데 약수, 배수 혼용되어서요. ll 연산자는 둘중 하나만 참이어도 전체가 참...으로 배웠는데! 왜 각각의 배수를 함께합쳐서 12개로 풀어야하는지 이해가 안갑니다. 11:51초에서도 &&연산자는 둘다 참이어야 참인데, 위와 마찬가지로 2의배수중 3의배수가 아닌것을 골라야하는대 왜 이렇게 적용되는지 이해가 안갑니다. if문이 계속 괄호안에 반복되면 순차적으로 조건문을 실행하여 참인지 보면 되는건가요? 혹시 강좌에 나오는 예제들만 모아놓은 출력물은 없을까요? 강좌에서 나오는 꼭외워야할부분, 강의 마지막에 나오는 요약문도 출력물이 없을까요? 예제문제를 다시풀어보고싶은데 강의마다 예제나오는 부분을 찾아보기가 시스템이 수월하지않아서요 .
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 저는 왜 다운로드 버튼이 없고 select 버튼만 있을까요? 기존에 JDK8 이 설치되어있긴 한데 JDK8로 수업을 들어도 무관할까요?
import requests from bs4 import BeautifulSoup keyword = input("검색할 상품을 입력하세요 : ") url = f"https://search.shopping.naver.com/search/all?&query={keyword}" user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" headers = {"User-Agent" : user_agent} req = requests.get(url, headers=headers) html = req.text soup = BeautifulSoup(html, "html.parser") print(soup) 위 코드 사용 시 아래와 같은 결과가 나타납니다. keyword = input("검색할 상품을 입력하세요 : ") url = f"https://search.shopping.naver.com/search/all?&query={keyword}" user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" headers = {"User-Agent" : user_agent} req = requests.get(url, headers=headers) # req = requests.get(url, headers=headers) # print(req.request.headers) html = req.text soup = BeautifulSoup(html, "html.parser") print(soup) <title>네이버쇼핑</title> </head> <body> <div class="content_error"> <div class="head">쇼핑 서비스 접속이 일시적으로 제한되었습니다. </div> <div class="desc"> 네이버는 안정적인 쇼핑 서비스 제공하고자 시스템을 통해 아래와 같은 비정상적인 접근이 감지될 경우 해당 네트워크의 접속을 일시적으로 제한하고 있습니다. </div> <ul class="reason"> <li>상품 구매, 탐색과 무관한 외부 이벤트를 통한 접속</li> <li>짧은 시간 내에 너무 많은 요청이 이루어진 IP</li> <li>VPN을 사용하여 접속한 IP</li> <li>특정 확장 프로그램 이용 시</li> </ul> <div class="footer">위와 같은 접근이 아님에도 접속이 제한된 경우,네이버앱을 업데이트 또는 <a href="https://help.naver.com/service/30016/category/5278" target="_blank"> 원클릭 진단</a>을 부탁드립니다.<br/> 해당 방법을 통해서도 접속이 불가한 경우 <a href="https://help.pay.naver.com/mail/form.help?alias=shopping_stop" target="_blank">네 이버쇼핑 고객센터</a>로 문의 부탁드립니다.</div> </div> </body> </html> 이런 상황에서 대안이 있을까요?
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 17 :13 에서 MemberServiceIntegrationTest 의 회원가입을 실행했을 때 김영한님은 insert into member(id,name) values (null,?) 라고 뜨시는데 저는 insert into member (name, id) values (?,default) 라고 뜹니다 member 과 values 둘 다 순서가 바뀐 것 같은데 어디를 봐야 고칠 수 있을까요..?
아래와 똑같은 질문입니다. 19번 라인 trm.start부분에서 계속 오류가 납니다. 아래 질문의 답변을 통해 Classic Slack App으로 생성하지 않아(현재 불가능) 발생한 것으로 파악하였습니다. 강의 업데이트 공지 상으로 6월 중으로 완료될 예정이라고 하셨는데 아직 강의가 업데이트 되지 않은 것 같아 질문 드립니다. 업데이트 된 강의는 언제 올라올 예정인가요? 오류 해결 방법을 알고 싶습니다.
[질문 내용] 섹션9 배열 문제와풀이3 강의 10:41초부터 선생님께서 사용자가 메뉴를 잘못칠 수 있는 경우에 처리방법을 else문으로 알려주셨는데요! 만약 사용자가 아래처럼 숫자가 아닌 문자를 입력하면 어떻게 처리를 해야하는지 궁금하였습니다. 입력값을 문자로 하였을때 나오는 inputmismatchexception 에러검색을 하다가 try catch문을 알게되었습니다 제가 원하는 방향은 사용자가 정수가 아닌 문자를 입력했을시에 에러메시지를 출력하고 다시 메뉴 선택으로 돌아가는 방향으로 하고싶어서 전체코드를 보시면 try문에 실행하고자 하는 코드를 넣고, 메뉴선택시 문자를 입력하면 에러가 나도록 catch문에 에러메시지를 출력하고 continue문을 넣었습니다. package array.ex; import java.util.InputMismatchException; import java.util.Scanner; public class ProductAdminEx { public static void main(String[] args) { // *제약 조건 : 상품은 최대 10개까지 등록할 수 있다.* int maxCount = 10; // 상품구조 최대치를 유연하게 정하기위해 ArrayList 자료구조 사용 int productCount = 0; String[] productNames = new String[maxCount]; int[] productPrices = new int[maxCount]; Scanner sc = new Scanner (System.in); while(true) { System.out.println("1. 상품등록 | 2. 상품목록 | 3. 종료"); System.out.print("메뉴를 선택하세요 : "); try { int option = sc.nextInt(); sc.nextLine(); if(option == 1) { if(productCount >= 10) { System.out.println("더 이상 상품을 등록할 수 없습니다."); continue; } System.out.print("상품 이름을 입력하세요:"); productNames[productCount] = sc.nextLine(); System.out.print("상품 가격을 입력하세요:"); productPrices[productCount] = sc.nextInt(); sc.nextLine(); productCount++; } else if(option == 2) { System.out.println("지금까지 등록한 상품의 이름과 가격입니다."); for(int i = 0; i < productCount; i++) { System.out.println(productNames[i] + ":" + productPrices[i]); } } else if(option == 3) { System.out.println("프로그램을 종료합니다."); break; } // 잘못된 메뉴 입력시 문자입력시에 inputmismatchexception 예외처리를 사용할 수 있다. else { System.out.println("잘못된 메뉴 입력입니다."); } } catch (InputMismatchException e) { System.out.println("[ERROR] 숫자를 입력해주세요."); break; // continue문을 쓰면 에러메시지가 계속 반복된다. } } } } 문제는 다시 메뉴선택 부분으로 가지않고 끝없이 에러문이 반복됩니다. 그래서 일단 break문을 써서 프로그램이 종료되도록 하였습니다.. 여기서 에러메시지가 한번 출력되고 다시 메뉴선택 부분으로 가도록 하려면 어떻게 해야 할까요..?!
def dijkstra(graph, start, final): costs = {} # 방문 여부 pq = [] # 우선순위 큐 heapq.heappush(pq, (0, start)) # 시작 노드 추가 while pq: cur_cost, cur_v = heapq.heappop(pq) if cur_v == final: return cur_cost if cur_v not in costs: # 방문여부 확인 costs[cur_v] = cur_cost # 인접 노드 탐색하면서 비용 업데이트 for next_v, cost in graph[cur_v]: # 현재노드와 연결된 인접노드와 그 비용 next_cost = cur_cost + cost heapq.heappush(pq, (next_cost, next_v)) return costs[final] 정말 사소한건데요, while pq: 내용 중 for cost, next_v in graph[cur_v]: 를 for next_v, cost in graph[cur_v]: 로 고쳐도 되는지 묻고 싶습니다. 우선순위 큐는 비용을 기준으로 하니까 (E,V)가 맞는거 같은데요. 그래프가 G=(V,E) 수식을 따르다 보니까 그래프로 초기화할 때도 ("A", 3)과 같이 노드와 비용 순서대로 하잖아요? 그래서 이러한 논리를 for문에도 적용하면 훨씬 이해하기 쉽지 않을까 개인적으로 생각이 듭니다. (아! 이건 제 개인적인 생각이니 코드를 고쳐달라고 요구를 하는 건 절대 아닙니다 😅 )
안녕하세요 선생님, 강의 잘 듣고 있습니다! 강의 중 궁금한 점이 있어서 질문드립니다.. ㅎㅎ 커널모드로 전환 시 시스템 콜과 응용 프로그램 사이에 라이브러리라고 표기가 되어있던데, 자바일 경우 JNI를 의미하는 것이 맞으실까요??.. 병렬 스트림 사용에 대한 예시를 구글링 해보면, 따로 스레드 풀을 생성해서 만들지 않을 경우, 하나의 common 스레드 풀을 공유하여 사용해 스레드가 부족하게 될 경우를 대비해, 따로 별도의 포크조인 스레드 풀을 생성하라는 가이드가 많은데요, 무분별하게 스레드 풀을 많이 생성했을 경우에 생기는 문제점들이 어떤 것이 있을지 알 수 있을까요?.. i/o가 잦은 프로세스에서 스레드의 개수가 많아 스레드들간의 컨텍스트 스위칭이 많은 경우에는 메모리 점유 외에 프로세스 성능에 크게 영향을 주지 않을 것이라고 생각 중이지만 다른 사이드 이펙트가 있을까 하여 질문 드립니다! 감사합니다 :)
내 업무를 대신 할 파이썬(Python) 웹크롤링 & 자동화 (feat. 주식, 부동산 데이터 / 인스타그램)
5.4 영상보면 전일비는 숫자로만되어있네요 영상보면 전일비는 숫자로만되어있네요 제 코드는 아래와 같고 어떻게 상승,하락을 없애는지 모르겠습니다. import requests import bs4 import re import time total_data_list = [] # 추출하고자 하는 데이터 리스트를 모아놓을 곳 page_number = 1 pre_data_time_set = set() # 이전 페이지에서 추출한 데이터를 모아놓는 곳 cuz 중복되면 그만두게 하기 위해 while True: # 특정 조건이 만족하면 break로 루프 끝냄 # 페이지 번호를 포함한 url 생성 - {}.format을 사용해서 동적으로 사용 url2 = "https://finance.naver.com/item/sise_day.naver?code=453450&page={}".format(page_number) # 해당 url로 요청 res2 = requests.get(url=url2, headers=headers2) # 요청한 정보를 .text로 만든 뒤 파싱 soup3 = bs4.BeautifulSoup(res2.text, "lxml") tr_eli = soup3.select("table.type2 > tr[onmouseover='mouseOver(this)']") current_time_set = set() # 현재 페이지의 날짜 데이터를 저장할 set for a in tr_eli: # tr_eli라는 ResultSet에서 하나씩 추출 td_eli = a.select("td") # a.select("td") = 위에서 추출한 것에서 'td' 태그를 포함한 것을 추츨하고 ResultSet으로 반환 # a는 태그지만 td_eli는 ResultSet이다 : data_list = [] # 추출한 데이터를 담을 리스트 for i, td_real2 in enumerate(td_eli): # 추출한 ResultSet(열)들과 인덱스를 같이 순회 clean_data = re.sub(r'\s+', " ", td_real2.text.replace(",","")) # 숫자가 아닌 모든 문자를 제거 if clean_data == " ": break if i == 0: # 첫 번째 인덱스는 무조건 날짜임 current_time_set.add(clean_data) data_list.append(clean_data) if len(data_list) > 0: # data_list가 빈칸이 아닐경우에 total에다가 추가 total_data_list.append(data_list) else: # eliment를 가져오는거 자체를 그만두게 하는 것 break # 이전에 수집한 날짜와 현재 페이지의 날짜가 동일하면 루프 중단 if pre_data_time_set == current_time_set: print("끝났다", page_number) break else: pre_data_time_set = current_time_set # 현재 페이지의 날짜로 업데이트 time.sleep(3) # or random.random() * 2 page_number += 1 # 페이지 번호를 1씩 증가 # 결과 출력 for data in total_data_list: # total_data_list는 리스트 형식이라 리스트안에 리스트를 빼내는 작업하는 것 print(data) # 중복되는 내용 없애는거는 나중에 DataFrame 사용하면 편한데 로직내에서도 가능하긴 하다.
java : 21 spring : 3.3.3 사용 뭔가 제대로 빌드가 되지 않은 것 같아서 gradle 클린하고 재빌드하고 여러번 했는데도 반복적으로 오류 메세지가 발생합니다 ㅠㅠ 영한쌤의 다른 자바 강의도 수강 중인데 그건 해당 경로에 있어도 실행이 잘되는데 특이하게 spring 프로젝트는 안되네요... 경로에 한글이 있어서 그런가 싶어 UTF-8 설정도 해두었습니다. 얼른 수업 듣구 싶어욧,,, 도와주세요 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 뭐가 문제인지 모르겠습니다 ㅠㅠ isEqualto도 빨간색으로 뜨면서 작동이 안되고요 ㅠㅠ package hello.hello_spring.service; import hello.hello_spring.domain.Member; import hello.hello_spring.repository.MemoryMemberRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberService memberService = new MemberService(); MemoryMemberRepository memoryMemberRepository = new MemoryMemberRepository(); @AfterEach public void afterEach() { memoryMemberRepository.cleatStore(); } @Test void 회원가입() { //given Member member = new Member(); member.setName("hello"); //when long saveId = memberService.join(member); //then Member findMember = memberService.findOne(saveId).get(); //ctrl + alt + v assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test public void 중복_회원_예외() throws Exception { //given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); //when Long saveId = memberService.join(member1); //then IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); assertThat(e.getMessage().isEqualTo("이미 존재하는 회원입니다.")); /* try { memberService.join(member2); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage().equals("이미 존재하는 회원입니다.")); } */ } @Test void findMembers() { } @Test void findOne() { } } Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.RuntimeException> Expected :class java.lang.IllegalStateException Actual :class java.lang.RuntimeException <Click to see difference> org.opentest4j.AssertionFailedError: Unexpected exception type thrown, expected: <java.lang.IllegalStateException> but was: <java.lang.RuntimeException> at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:67) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:35) at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:3115) at hello.hello_spring.service.MemberServiceTest.중복_회원_예외(MemberServiceTest.java:53) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:28) at java.base/java.util.Optional.ifPresent(Optional.java:178) at hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:24) at hello.hello_spring.service.MemberService.join(MemberService.java:16) at hello.hello_spring.service.MemberServiceTest.lambda$중복_회원_예외$0(MemberServiceTest.java:54) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:53) ... 6 more Caused by: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:26) ... 11 more java.lang.IllegalAccessException: 이미 존재하는 회원입니다. java.lang.RuntimeException: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:28) at java.base/java.util.Optional.ifPresent(Optional.java:178) at hello.hello_spring.service.MemberService.validateDuplicateMember(MemberService.java:24) at hello.hello_spring.service.MemberService.join(MemberService.java:16) at hello.hello_spring.service.MemberServiceTest.lambda$중복_회원_예외$0(MemberServiceTest.java:54) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:53) at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:35) at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:3115) at hello.hello_spring.service.MemberServiceTest.중복_회원_예외(MemberServiceTest.java:53) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: java.lang.IllegalAccessException: 이미 존재하는 회원입니다. at hello.hello_spring.service.MemberService.lambda$validateDuplicateMember$0(MemberService.java:26) ... 11 more