묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
프레임 전환
안녕하세요 강사님! 강의 너무 잘 만들어주셔서 감사합니다. 강사님과 같은 코드를 사용하여 iframe을 전환했는데 저는 자꾸 NoSuchElementException 오류가 뜨네요 위 부분 코드도 그대로 따라했는데 같이 올려봅니다! #셀레니움 기본 템플릿 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time import pyperclip user_id = "제 아이디" user_pw = "제 비밀번호" #크롬드라이버 생성 driver = webdriver.Chrome() #페이지 이동 driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/") # time.sleep(1) #아이디 입력 id = driver.find_element(By.CSS_SELECTOR, '#id') pyperclip.copy(user_id) id.send_keys(Keys.CONTROL,'v') # time.sleep(1) #패스워드 입력 pw = driver.find_element(By.CSS_SELECTOR, '#pw') pyperclip.copy(user_pw) pw.send_keys(Keys.CONTROL,'v') # time.sleep(1) #로그인버튼 클릭 driver.find_element(By.CSS_SELECTOR,'#log\\.login').click() #드롭다운 메뉴 클릭 driver.find_element(By.CSS_SELECTOR,'#account > div.MyView-module__my_menu___eF24q > div > div > ul > li:nth-child(1) > a > span.MyView-module__item_text___VTQQM').click() #메일함버튼 클릭 driver.find_element(By.CSS_SELECTOR,'#account > div.MyView-module__layer_menu_service___NqMyX > div.MyView-module__service_sub___wix9p > div.MyView-module__sub_left___AIWHR > a').click() #현재 열려있는 창 driver.window_handles #새창으로 전환 driver.switch_to.window(driver.window_handles[1]) #메일쓰기버튼 클릭 driver.find_element(By.CSS_SELECTOR,'#root > div > nav > div > div.lnb_header > div.lnb_task > a.item.button_write').click() #받는사람 recieve = driver.find_element(By.CSS_SELECTOR, '#recipient_input_element') recieve.send_keys('kiyoung3159@naver.com') title = driver.find_element(By.CSS_SELECTOR,'#subject_title') title.send_keys('음하하 아주 잘했어') #프레임전환 iframe = driver.find_element(By.CSS_SELECTOR,"#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe") driver.switch_to.frame(iframe) 에러 코드는 아래와 같이 뜨네요! NoSuchElementException Traceback (most recent call last) Cell In[61], line 2 1 #프레임전환 ----> 2 iframe = driver.find_element(By.CSS_SELECTOR,"#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe") 3 driver.switch_to.frame(iframe) File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\selenium\webdriver\remote\webdriver.py:741, in WebDriver.find_element(self, by, value) 738 by = By.CSS_SELECTOR 739 value = f'[name="{value}"]' --> 741 return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\selenium\webdriver\remote\webdriver.py:347, in WebDriver.execute(self, driver_command, params) 345 response = self.command_executor.execute(driver_command, params) 346 if response: --> 347 self.error_handler.check_response(response) 348 response["value"] = self._unwrap_value(response.get("value", None)) 349 return response File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\selenium\webdriver\remote\errorhandler.py:229, in ErrorHandler.check_response(self, response) 227 alert_text = value["alert"].get("text") 228 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here --> 229 raise exception_class(message, screen, stacktrace) NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe"} ... (No symbol) [0x00007FF7544255E0] (No symbol) [0x00007FF754414A7F] BaseThreadInitThunk [0x00007FFF14F8257D+29] RtlUserThreadStart [0x00007FFF16E4AF28+40] 무엇이 잘못되었는지 1시간 고민하다가 질문 올려봅니다!!
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
증감식 없는 반복문에 조건을 통해 루프 종료
13:50에 출력(printf) 이후에 조건(if)을 줘도 조건이 출력에 영향을 주는 구조인건가요?
-
해결됨스프링 핵심 원리 - 고급편
logTrace를 파라미터로 받는 이유 ?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.InterfaceProxyConfig에서 logtrace를 파라미터로 받아오는 특별한 이유가 있을까요 ? logtrace를 이런식으로 생성자 주입으로 받아서 사용한다면 문제가 생길까요 ? 정상작동은 하는데 궁금합니다. @RequiredArgsConstructor @Configuration public class InterfaceProxyConfig { private final LogTrace logTrace; @Bean public OrderControllerV1 orderController(){ OrderControllerV1Impl controllerImpl = new OrderControllerV1Impl(orderService()); return new OrderControllerInterfaceProxy(controllerImpl,logTrace); } @Bean public OrderServiceV1 orderService(){ OrderServiceV1Impl serviceImpl = new OrderServiceV1Impl(orderRepository()); return new OrderServiceInterfaceProxy(serviceImpl,logTrace); } @Bean public OrderRepositoryV1 orderRepository(){ OrderRepositoryV1Impl repositoryImpl = new OrderRepositoryV1Impl(); return new OrderRepositoryInterfaceProxy(repositoryImpl,logTrace); } }
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
33:20 키 입력 시 이벤트를 한 번만 발생시키도록 할 때
강의에선 에디터에서 InputAction의 Triggers 에서 Pressed를 추가하셨는데 저는 개인적으로 cpp에서 BindAction 에서 바인드 할 때 ETriggerEvent::Started 로 설정해서 이벤트가 한 번만 발생하도록 하는 방법을 썼습니다. 이런 방법도 괜찮나요? 아니면 이런 방법은 렉이 걸리거나 할 때 이벤트가 발생되지 않을 가능성도 있을까요?
-
해결됨RAG를 활용한 LLM Application 개발 (feat. LangChain)
엑셀 파일 관련 문의가 있습니다~!
안녕하세요 강사님 질문이 있습니다.엑셀파일을 pinecone에 업로드하여 데이터 분석용으로도활용이 가능할까요?예를 들어서 "판매 건수가 50개 이상인 월 알려줘" 입니다엑셀파일을 pinecone에 업로드는 완료하였는데,답변을 전혀 못하고 있어, 다른 방법이 있는지 궁금하네요.감사합니다.추가로 엑셀파일을 pinecone에 적재할 때하나의 행이 하나의 ID에 적재되는게 맞을까요??
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
동시성 문제 해결방안
@Transactional public void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); }현재 강의 코드인데, 락을 사용해서 해결을 할 수도 있지만, 그냥 아래와 같이 JPQL을 사용해서 해결할 수 있지 않나요?@Transactional public void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); if (stock.getQuantity - quantity < 0) { throw new RuntimeException("재고는 0개 미만이 될 수 없습니다."); } stockRepository.decrease(id, quantity); }@Modifying @Query("UPDATE Stock s SET s.quantity = s.quantity - :quantity WHERE s.id = :id") public void decrease(@Param("id") Long id, @Param("quantity") Long quantity);락을 사용하는 것보다 이렇게 하는게 비용이 더 적을 것 같은데, 이렇게 하지 않는 이유를 알 수 있을까요??
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
Datasource 분리 의미
커넥션 문제가 발생할 수 있어 네임드락을 사용하는 경우 각 트랜잭션마다 Datasource를 분리해주는 것이 좋다고 하셨는데,Datasource를 분리해준다는 것은 서로 다른 DB를 사용해야 하는 것인가요?
-
미해결스프링 시큐리티 OAuth2
비대칭키 내용 중 궁금한게 있습니다.
데이터 보안 측면에서 송신자 공개키로 암호화 -> 송신자 개인키로 복호화를 한다고 적혀있는데요.수신자가 송신자의 개인키를 가지고 있다는게 보안적으로 문제가 되는게 아닌가 싶습니다. 수신자 공개키로 암호화 -> 수신자 개인키로 복호화의 오타인 것인지, 아니라면 어떻게 보안적으로 괜찮은건지 궁금합니다.
-
해결됨스프링 핵심 원리 - 고급편
ProxyApplication 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.LogTrace를 @Bean등록할때 ProxyApplication 쪽에 등록한 특별한 이유는 없는건가요 ? 그냥 InterfaceProxyConfig안에 등록해도 상관은 없는거죠 ? @Configuration public class InterfaceProxyConfig { @Bean public OrderControllerV1 orderController(LogTrace logTrace){ OrderControllerV1Impl controllerImpl = new OrderControllerV1Impl(orderService(logTrace)); return new OrderControllerInterfaceProxy(controllerImpl,logTrace); } @Bean public OrderServiceV1 orderService(LogTrace logTrace){ OrderServiceV1Impl serviceImpl = new OrderServiceV1Impl(orderRepository(logTrace)); return new OrderServiceInterfaceProxy(serviceImpl,logTrace); } @Bean public OrderRepositoryV1 orderRepository(LogTrace logTrace){ OrderRepositoryV1Impl repositoryImpl = new OrderRepositoryV1Impl(); return new OrderRepositoryInterfaceProxy(repositoryImpl,logTrace); } @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); }이런식으로요. 생각해보면 logtrace는 proxyconfig쪽이랑은 크게 연관성이 없는거같긴한데 궁금해서요 ..
-
미해결
ㅁㄴㅁㄴ
ㅁㄴㄴㅁㅇ
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
파이썬에서 계행되는 조건이 무엇인가요?
이전 c나 java의 경우엔 \n ln등 표기 되는 문구가 있었습니다. 파이썬의 경우엔 print가 끝나면 자동으로 계행이 되는건지,아니면 다른 조건이 있는건지 알고싶습니다.
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
HDL 16장 실습편 시뮬레이션 결과 질문
안녕하세요 🙂[1. 질문 챕터] : HDL 16장 실습편 9분 30초~ 의 시뮬레이션 wv 결과 화면[2. 질문 내용] : 시뮬레이션 결과를 보면 o_done과 현재 state가 reset_n이 0으로 입력되기 훨씬 전부터 각각 리셋되는 것으로 나타나는데 왜 이런 것인지 잘 이해가 되지 않습니다. (저는 don't care 'X' 상태가 reset_n=0전까지 유지될 것이라고 예상했습니다) 감사합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
9996번 질문있습니다
#include<bits/stdc++.h>using namespace std;int N; //string input, contrast; //입력할 문자, 대조할 패턴bool YN[104]; //일치 유무string forward_str, back_str; //앞부분 문자열, 뒷부분 문자열int main() { cin >> N; cin >> contrast;; back_str = contrast.substr(contrast.find('*') + 1); forward_str = contrast.substr(0, contrast.find('*')); for (int i = 0; i < N; i++) { cin >> input; if (forward_str == input.substr(0, forward_str.length()) && back_str == input.substr(input.length()- back_str.length(), input.length() - 1)) { YN[i] = 1; } else YN[i] = 0; } for (int i = 0; i < N; i++) { if (YN[i]==1)cout << "DA" << '\n'; else cout << "NE" << '\n'; } return 0;}이렇게 작성하여 컴파일했을때 분명 다 맞게 나왔지만 백준에 제출하면 런타임 에러가 납니다. 무엇이 문제인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
UDF 를 구현 할때 Annotation 방식만으로는 예외처리 당합니다
UDF 를 구현 할때 2가지 방법이 있는 것으로 소개 해주셔서테스트 삼아 Fluent Api 방식의builder.HasDbFunction(() => Program.GetAverageReviewScore(0));를 주석 처리 하고Annotation 방식의[DbFunction()]구절만 남겨서 진행을 했는데GetAverageReviewScore 함수에서 예외처리가 되며 실행이 막히네요Annotation 방식으로 UDF 를 구현하기 위해선 추가적인 내용이 필요한 것일까요?
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
IOCP 멀티 게임에서 Collsion 충돌 처리는 어떻게 구현하나요?
본 강의에서는 제가 못찾고 있는지는 모르겠지만 멀티 게임 구현시 타일맵을 이용한 충돌 구현만 있는 것 같습니다. (혹시 만약 있다면 어디에서 언급되는지 모르겠네요..) 얼핏 기억하기로는 충돌 처리는 서버에서 해야 한다고 했던 기억이 있습니다. 그러면 클라이언트에 있는 CollisionManager, Collison클래스와 같이 충돌과 관련된 클래스를 서버 쪽에도 복붙하여 충돌 처리를 하는 방향이 맞을까요? 만약 그렇다면 현재까지는 클라이언트에서 Collision 범위를 네모 박스와 같은 형태로 그려서 눈으로 직관적으로 확인 가능하니까 쉽게 디버깅할 수 있었는데, 서버에서 충돌을 구현하면 눈에 보이지 않는거 아닌가요? (그렇다면 디버깅이 굉장히 어렵겠네요...) 서버에서 충돌을 구현하면 클라이언트에서는 충돌 처리를 안하니까 클라이언트의 Bullet과 벽은 Collision은 제거하면 될까요? 멀티 게임에서 충돌을 어떻게 처리해야 할지 방향을 잘 모르겠습니다. 그리고 강의 너무 잘 보고 있습니다!
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
RISS논문크롤링하고 있는데 서버 거부..
서버 거부가 되어서 헤더추가까지 했는데도... 여전히 서버 거부인 듯하네요.. 강사님 그대로 따라 했는데.. 왜 이렇죠.ㅠㅠ import requests from bs4 import BeautifulSoup import pandas as pd # 파라미터 종류가 많은 경우 꿀팁 param = { 'isDetailSearch': 'N', 'searchGubun': 'true', 'viewYn': 'OP', 'strQuery': '패션 인공지능', 'order': '/DESC', 'onHanja': 'false', 'strSort': 'RANK', 'iStartCount': 0, 'fsearchMethod': 'search', 'sflag': 1, 'isFDetailSearch': 'N', 'pageNumber': 1, 'icate': 're_a_kor', 'colName': 're_a_kor', 'pageScale': 100, 'isTab': 'Y', 'query': '패션 인공지능', } reponse = requests.get('https://www.riss.kr/search/Search.do',params=param) html = reponse.text soup = BeautifulSoup(html, 'html.parser') articles = soup.select('.srchResultListW > ul > li') # 헤더가 필요한 경우(서버가 막힌 경우) header = { 'User-Agent' : 'Mozilla/5.0', 'Referer' : 'https://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&exQuery=&exQueryText=&order=%2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount=0&orderBy=&mat_type=&mat_subtype=&fulltext_kind=&t_gubun=&learning_type=&ccl_code=&inside_outside=&fric_yn=&db_type=&image_yn=&gubun=&kdc=&ttsUseYn=&l_sub_code=&fsearchMethod=search&sflag=1&isFDetailSearch=N&pageNumber=1&resultKeyword=&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y®nm=&dorg_storage=&language=&language_code=&clickKeyword=&relationKeyword=&query=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5', } for article in articles[:1]: title = article.select_one('.title > a').text link = 'https://www.riss.kr' + article.select_one('.title > a').attrs['href'] # 상세 페이지로 요청(페이지 안에 들어가야 내용이 있는 경우) response = requests.get(link, headers=header)# 여기서 헤더 추가 html = reponse.text soup = BeautifulSoup(html, 'html.parser') print(soup) press = soup.select_one('.infoDetailL > ul > li:nth-of-type(2) > div').text #print(title,link,press)
-
미해결
Title: Becoming a Scrum Master: Your Gateway to Agile Success
Title: Becoming a Scrum Master: Your Gateway to Agile SuccessIn the world of software development and project management, Agile methodologies have gained immense popularity for their flexibility and efficiency. At the heart of many Agile teams is the Scrum Master, a crucial role that ensures the team adheres to Scrum practices and principles. Whether you're looking to transition into a Scrum Master role or simply want to understand what it entails, this guide will provide you with the insights you need.What is a Scrum Master?A Scrum Master is a facilitator and servant leader who helps an Agile team follow Scrum practices and achieve its goals. Unlike a traditional project manager, a Scrum Master does not manage the team but rather empowers them to self-organize, remove obstacles, and continuously improve. The Scrum Master acts as a bridge between the team and external stakeholders, ensuring that the team remains focused on delivering value.Key Responsibilities of a Scrum MasterFacilitating Scrum Events: A Scrum Master is responsible for organizing and facilitating the core Scrum events, also known as ceremonies. These include the Daily Standup, Sprint Planning, Sprint Review, and Sprint Retrospective. The goal is to keep the team aligned, focused, and productive.Removing Impediments: One of the most critical responsibilities of a Scrum Master is to identify and remove any obstacles that may hinder the team's progress. This could involve resolving conflicts, addressing technical challenges, or ensuring that the team has the necessary resources.Coaching the Team: The Scrum Master serves as a coach, guiding the team in understanding and implementing Scrum principles. They help the team members embrace Agile values, adopt best practices, and continuously improve their processes.Protecting the Team: The Scrum Master acts as a buffer between the team and external pressures. They protect the team from unnecessary distractions, scope creep, and unrealistic demands from stakeholders, allowing the team to focus on delivering high-quality work.Promoting Collaboration: Scrum Masters foster a culture of collaboration and open communication within the team. They encourage team members to share knowledge, solve problems collectively, and support each other's growth.How to Become a Scrum MasterUnderstand Scrum and Agile Principles: Before becoming a Scrum Master, it's essential to have a solid understanding of Scrum and Agile methodologies. Familiarize yourself with the Agile Manifesto, Scrum Guide, and key concepts such as sprints, product backlog, and user stories.Gain Experience with Agile Teams: Experience working with Agile teams is invaluable. If you're already part of a Scrum team, take the opportunity to observe how the Scrum Master operates. If not, consider volunteering for Agile projects within your organization to gain hands-on experience.Obtain a Scrum Master Certification: Earning a Scrum Master certification can significantly enhance your credibility and knowledge. Popular certifications include the Certified ScrumMaster (CSM) from Scrum Alliance and the Professional Scrum Master (PSM) from Scrum.org. These certifications typically involve training and passing an exam.Develop Leadership and Facilitation Skills: As a Scrum Master, you'll need strong leadership, communication, and facilitation skills. Practice leading meetings, resolving conflicts, and guiding teams through challenges. Developing these soft skills is just as important as mastering Scrum practices.Build a Network: Connect with other Scrum Masters and Agile professionals through online communities, local meetups, and conferences. Networking can provide you with valuable insights, support, and opportunities for career growth.Continuously Learn and Adapt: Agile is all about continuous improvement, and the same applies to your journey as a Scrum Master. Stay updated on the latest Agile trends, tools, and techniques. Regularly reflect on your experiences and seek feedback to refine your approach.The Benefits of Being a Scrum MasterEmpowering Teams: As a Scrum Master, you have the opportunity to empower teams to work more effectively and deliver better results. The sense of accomplishment that comes from helping teams overcome obstacles and achieve their goals is incredibly rewarding.Diverse Career Opportunities: Scrum Masters are in high demand across various industries, including IT, finance, healthcare, and more. The skills you develop as a Scrum Master can open doors to roles such as Agile Coach, Product Owner, or even executive positions.Continuous Learning: The Scrum Master role is dynamic and ever-evolving, offering endless opportunities for learning and growth. Each project presents new challenges, allowing you to continuously expand your expertise.Making an Impact: Scrum Masters play a crucial role in driving organizational change and fostering a culture of collaboration, transparency, and continuous improvement. Your work as a Scrum Master can have a lasting impact on both your team and the broader organization.ConclusionBecoming a Scrum Master is a fulfilling and impactful career path for those passionate about Agile methodologies and team dynamics. By mastering Scrum practices, developing strong leadership skills, and committing to continuous learning, you can excel in this role and contribute to the success of your team and organization. Whether you're just starting your journey or looking to advance your career, the Scrum Master role offers a unique opportunity to make a meaningful difference.
-
미해결디버깅으로 배우는 RISC-V 아키텍처 -1부
T32에 관련해서
c드라이브에 이미 T32라는 폴더가 있습니다(회사에서 사용중이므로) 그러한 관계로 T32_edu라고 따로 폴더를 만들어서 진행해도 괜찮나요?맥북에서도 T32시뮬레이션을 사용할수 있나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticationProvider 사용방법 - 빈으로 생성 질문 있습니다.
17~18분 사이에 설명에서 builder와 configuration 이 같은 ProviderManager를 가져온다고 하시는데요.디버깅된 사진을 보면 customAuthenticationProvider 추가는 8334번 providers에 추가가 되고, configuration에서 ProviderManager 가져와서 0번째 provider를 지운것은 parent 안에 있는 8340 리스트에서 제거한것처럼 보여지는데 맞을까요???
-
미해결스프링 배치
slave 청크의 실패 횟수에 따라 나머지 청크를 중지시키는 방법이 있을까요?
return new StepBuilder("apiStep", jobRepository) .<HelloVO, Hello>chunk(CHUNK_SIZE, transactionManager) .reader(helloReader(null)) .processor(helloVO -> { LocalDate date = helloVO.getDate(); if(date.getDayOfMonth() == 10){ throw new IllegalStateException("!! " + helloVO); } return helloVO.toEntity(); }) .writer(v -> log.info("write = {}", v)) .listener(partitionLimitSkipListener(null)) .build(); 안녕하세요.만약 위 상황에서 파티션이 1000개라고 가정할 경우 천 건의 청크가 동작하게 될텐데요. 만약 첫 번재 값이 timeout으로 예외가 발생할 경우, 남은 999건 동일한 timeout이 발생할 수 있다고 예상되고 이런 에러는 장애로 확장될 수 있다고 예상됩니다. 실제로 위의 throw ex 상황에서 failed로 처리된 1000건의 step이 발생함을 확인하였습니다. 이런 문제를 최소화 해야 하는 것에 목적이 있습니다.이를 해결하기 faultTolerant로 사용하고 chunkListener의 afterError메서드로 step context까지 도달하여 setTerminal 을 하였으나... 이 방법으로는 해결이 되지 않더라고요. 결국 결국 아래와 같이 operator로 처리하였습니다. @Slf4j public class ChunkExceptionCounterListener implements ChunkListener { private int failureCount = 0; private static final int MAX_FAILURES = 3; private final JobOperator jobOperator; public ChunkExceptionCounterListener(JobOperator jobOperator) { this.jobOperator = jobOperator; } @Override public void afterChunkError(ChunkContext context) { failureCount++; log.error("chunk {} exceeds error {}/{}", context.getStepContext().getStepName(), failureCount, MAX_FAILURES); if (failureCount >= MAX_FAILURES) { log.error("stop job! with afterChunkError!"); context.getStepContext().getStepExecution().setTerminateOnly(); // 안됨..ㅠ context.getStepContext().getStepExecution().getJobExecution().setExitStatus(ExitStatus.FAILED); Long jobExecutionId = context.getStepContext().getStepExecution().getJobExecutionId(); try { jobOperator.stop(jobExecutionId); // 이건 된다! } catch (NoSuchJobExecutionException e) { throw new RuntimeException(e); } catch (JobExecutionNotRunningException e) { throw new RuntimeException(e); } } } } 위 방식이 좋은 방식인지는 솔직히 모르겠습니다. 일단 기대하는 것처럼 interrupt로 에러로 남은 모든 step이 stopped되어 좋긴 하였는데, 제가 혼자서 구현한 방식인지라... 최적의 방식인지는 잘 모르겠네요. 더불어 retry template에서 recover callback 메서드를 구현할 경우 청크 파티션 일부의 에러를 마스터 슬레이브 전체에 대한 정지 처리로 할 수 있던 것으로 기억하는데, 이 정도의 튜닝은 제공하는지도 궁금합니다. 감사합니다^^