안녕하세요. 외부 파이썬 함수 수행하기가 안되어서 문의드리게 되었습니다. 저는 Pycharm이 익숙해서 Pycharm으로 하고 있었는데, Pycharm의 경우 .env파일이 인식이 안되는 걸까요..? common 모듈을 발견하지 못하네요... .env파일을 아래와 같이 설정하였고 dags_python_import_ func.py 에서도 Enable EnvFile에 체크표시를 하였는데 여전히 해당 모듈을 읽지 못하네요...ㅠㅠ 혹시 Pycharm의 경우 .env파일을 다르게 설정해야하는 걸까요...?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] ModelAttribute로 regions,itemTypes,deliveryCodes를 FormItemController가 처리가는 모든 view에 넘겨줬습니다. 그러면, item도 거의 모든 함수에서 사용되니까, item도 Modelattribute의 이런 사용법을 사용해도 되나요? 안된다면 왜 그런가요?
디버그가 왜 안되나요? 바로 톰캣 실행되는데요. 예를들어 디버그 모드면 watch부분이랑 뷰네임이 뭐가 들어가는지 보여야 하는거 아닌가요? 해당 코드는 view모델3부분입니다. 추가질문입니다. 제가 아래 2번째 사진(빨간색 박스)를 클릭했을 때 디버깅이 시작됩니다. (그전까지는 안되요.) 보통 파이참같은 경우 코드에서 중단점 설정 후 디버그를 누르면 바로 디버깅 모드 전환이 되는데요. 인텔리제이는 코드 중단점을 설정해놓아도 톰캣 스타트 시켜놓고(첫번째사진처럼) html에서 화면을 클릭해야 해당 디버깅이 들어가지나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 전체 코드입니다. package com.example.hellospring.repository; import com.example.hellospring.domain.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Optional; class MemoryMemberRepositoryTest { MemberRepository repository = new MemoryMemberRepository(); @Test public void save(){ Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); // Assertions.assertEquals(member, result); Assertions.assertThat(member).isEqualTo(result); } @Test public void findByName(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); Member result = repository.findByName("spring1").get(); Assertions.assertThat(result).isEqualTo(member1); } @Test public void findAll(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); List<Member> result = repository.findAll(); Assertions.assertThat(result.size()).isEqualTo(2); } } 참고로 save 테스트에서 에러가 발생해서 findById 를 String -> Long 으로 바꾼 상태입니다. package com.example.hellospring.repository; import com.example.hellospring.domain.Member; import java.util.List; import java.util.Optional; public interface MemberRepository { Member save(Member member); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); } package com.example.hellospring.repository; import com.example.hellospring.domain.Member; import java.util.*; public class MemoryMemberRepository implements MemberRepository { private static Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } }
처음 http://localhost:8080/request-header?username=hello 로 URL 입력 후 콘솔을 확인하면 아래와 같이 Header 편의 조회가 출력되었습니다. 이후에 Postman을 통해서 다음과 같이 hello! 라는 메시지를 POST 방식으로 전송을 한 후 콘솔을 확인해 보니 아래와 같이 출력되었습니다. 이때 Postman을 통해 보낸 방식에서 cookie가 조회되지 않는 이유는 Postman을 사용해서 POST 요청을 할 때 쿠키 설정을 따로 해주지 않아서 그런거고 크롬에서 URL을 검색해서 GET 방식으로 조회할 때는 크롬이 자동으로 쿠키를 할당해준건거요...??
window command에서 h2.bat하고 db띄운 후 그냥 창x눌러서 껐는데요 그다음 다시 커맨드 열어서 h2.bat하고 insert 쿼리 날렸는데 insert가 반영이 안돼요 jsessionid 처음 나왔던걸로 해도 안되고 새로 나오는 것으로 해도 안되는데 창을 새로 띄워도 원래 jsessionid로 해야 하는건가요? test.mv .db 파일도 새로 생성해야 하나요? 파일을 올리고 싶은데 첨부파일 넣는 곳이 없네요 어떻게 해야 하나요?
안녕하세요! 차근차근 잘 보고 있습니다. 선생님이랑 똑같이 따라하고 있는데 저는 자꾸 에러가 나서요ㅠㅠ ".logo_naver"가 없어진거 같아서 다른걸 붙여서 했는데도 오류가 나는데 뭐가 잘못된 걸까요ㅠㅠㅠㅠ 답변이 선생님이랑은 다르게 이렇게 나와서요ㅠㅠ 똑같이 따라하는데 뭐가 잘못된 건지 모르겠어요ㅠㅠ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 질문이 있습니다 제가 회사에서 부트를 사용해서 타임리프 관련해서 학습하고 사용 할려고 하는데 form을 사용해서 action 을 하는게 아닌 거의다 js를 통해 ajax를 사용하는 등 거의 js를 통해 서버와 통신하는 방법을 사용하고 있습니다. 이럴 때 타임리프에서 th:object 옵션을 사용할 방법이 따로 없을까요? html에서 form을 사용하지 않는 이상?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.영학님이 주신 걸로 하면 버전이 안맞아서 커뮤니티 글에 있는 17버전을 새로 만들어서 영학님이 주신 form에 내용을 main하고 resources를 바꿔서 실행 하는데 서버도 열리고 잘 되는데 이상하게 이런 현상이 떠서 질문을 드립니다 이렇게 뜨고 상품관리 를 누루면 이렇게 뜨는데 위에 basic을 form으로 바꾸면 잘 뜨고 다른 기능도 잘 됩니다.그런데 할때 마다 계속 바꿔야 하니 문제를 찾아 보고 있는데 resources에 index.html도 확인 했는데 basic이 쓰인 곳도 없고 FormController 부분에도 basic을 반환 하는 부분도 없는데 프로그램 코드안 에서도 basic을 반환 하는 부분이 어디에도 없는데 뭐 때문에 그런지 잘 모르겠습니다. 재가 미숙해서 잘 못 찾는것도 있지만.. 배운다는 생각으로 충고 주시면 잘 배우겠습니다
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 이렇게 RequestMapping으로 /template으로 시작하는 url을 mapping하고, /fragment로 오는 get을 template()에서 처리합니다. 그런데 이런 컨트롤러 클래스 내부의 메소드를 public으로 하는 이유가 있을까요? 예외없이 private으로 해야하는 것 아닌가요? 다른곳에서 TemplateController 인스턴스를 만들어서 template() 함수를 쓰려고 해도, templateController가 @Controller니까 의미 없지 않나요? 즉,spring 차원에서 public을 막고 private으로만 메소드를 만들게 할 수 도 있는데, 그렇게 않한 이유가 알고 싶습니다.
실행하면 아래와 같은 메세지가 뜹니다. 실행 자체가 안되는거 같은데요? spring.messages.basename=messages 설정 여부와 상관없이 오류가 납니다. @SpringBootTest public class MessageSourceTest { @Autowired MessageSource ms; @Test void helloMessage() { String result = ms.getMessage("hello", null, null); assertThat(result).isEqualTo("안녕"); } } Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/CodingStudy/스프링/message/build/reports/tests/test/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] user.username 이 어떻게 가능한가요? private 이어서 user.getUsername() 해야하는 것 아닌가요? 아니면, 서버 사이드에서 user.username 을 user.getUsername으로 바꿔주나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 쌤 인프런, 유튜브 강의 보면서 잘 만들어 가고 있었는데 현재 코드에서 아무리 수정을 해도 css를 잘못 가져오는건지 오류가 생겨서 답답해서 질문 들고 왔습니다 현재 css 코드 찾기 좀 부탁드릴게요ㅠㅠ 안되는 항목 ✔ 연예뉴스 -> 내용을 못 가져옴 ✔ 스포츠뉴스 -> 제목, 날짜, 내용 다 못 가져옴 css를 여러개 바꿔서 넣어봐도 저는 자꾸 찾을 수 없다고 크롤링 됩니다 도와주세요,,,,,,, #네이버기사 크롤링 엑셀저장 import requests from bs4 import BeautifulSoup import time import pyautogui from openpyxl import Workbook #사용자입력 keyword = pyautogui.prompt("검색어를 입력하세요") lastpage = int(pyautogui.prompt("몇 페이지까지 크롤링 할까요?")) #엑셀 생성 wb = Workbook() #엑셀시트 생성 ws = wb.create_sheet(keyword) #열 너비 조절 ws.column_dimensions['A'].width = 60 ws.column_dimensions['B'].width = 30 ws.column_dimensions['C'].width = 60 ws.column_dimensions['D'].width = 150 #행 번호 row = 1 #페이지 번호 pageNum = 1 for i in range(1, lastpage*10, 10) : print(f"{pageNum}페이지 크롤링중입니다 =================") response = requests.get(f"https://search.naver.com/search.naver?where=news&query={keyword}&sm=tab_opt&sort=1&photo=0&field=0&pd=3&ds=2024.04.11&de=2024.15.20&news&query={keyword}&start={i}") html = response.text soup = BeautifulSoup(html, 'html.parser') articles = soup.select("div.info_group") #뉴스기사 div 10개 추출 for article in articles: links = article.select("a.info") #리스트 time.sleep(0.7) if len(links) >= 2: #링크가 2개 이상이면 url = links[1].attrs['href'] #두번째 링크의 href를 추출 response = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}) html = response.text soup_sub = BeautifulSoup(html, 'html.parser') content = soup_sub.select_one("#newsct_article") if content: content_text = content.get_text(separator="\n") else: content_text = "내용을 찾을 수 없습니다." title = None date = None #만약 연예 뉴스라면 if "entertain" in response.url: title = soup_sub.select_one(".end_tit") date = soup_sub.select_one("div.article_info > span > em") content = soup.select_one("#articeBody") #만약 스포츠 뉴스라면 elif "sports" in response.url: title = soup_sub.select_one(".Main_article_title") content = soup.select_one("._article_content") else: title = soup_sub.select_one(".media_end_head_headline") date = soup_sub.select_one("span.media_end_head_info_datestamp_time._ARTICLE_DATE_TIME") #본문 내용안에 불필요한 div, p제거 divs = content.select("div") for div in divs: div.decompose() paragraphs = content.select("p") for p in paragraphs: p.decompose() print("=======제목======= \n", title.text.strip() if title else "제목을 찾을 수 없습니다.") print("=======날짜======= \n", date.text if date else "날짜를 찾을 수 없습니다.") print("=======URL======= \n", url) print("=======내용======= \n", content.text.strip() if content else "내용을 찾을 수 없습니다") # 'else' 블록에서 'date' 변수 정의는 여기서 끝나도록 수정 ws['A1'] = '제목' ws['B1'] = '날짜' ws['C1'] = 'URL' ws['D1'] = '내용' ws[f'A{row}'] = title.text.strip() if title else "제목을 찾을 수 없습니다." ws[f'B{row}'] = date.text.strip() if date else "날짜를 찾을 수 없습니다." ws[f'C{row}'] = url ws[f'D{row}'] = content_text.strip() if content else "내용을 찾을 수 없습니다." row=row+1 #마지막 페이지 여부 확인하기 next_button = soup.select_one("a.btn_next") if next_button: isLastPage = next_button.attrs.get('aria-disabled', None) if isLastPage == 'true': print("마지막 페이지 입니다.") break pageNum = pageNum+1 wb.save(f"{keyword}_4월_뉴스기사_크롤링(4)_내용까지_0411~0415(3).xlsx")
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 강의를 따라하고 있는데 http://localhost:8080/ 를 치면 home.html 파일이 안열리고 index.html이 열립니다. 캐시를 삭제해보고 시크릿모드로 다시해봐도 index.html 파일이 열립니다! 해결 방법을 모르겠어요... 구글 드라이브 파일입니다 https://drive.google.com/file/d/18dkvdMVN4ivRebUFHNF3IXZRCPjDbS91/view?usp=drive_link
안녕하세요. 이번 수업에서 사소한? 궁금증이 생겨서 질문 남깁니다! handleReset() { this.setState(() => { return { searchKeyword: "", // searchResult: [], submitted: false, } }, () => { // console.log("TODO: handleReset", this.state.searchKeyword); console.log("TODO: handleReset", this.state.searchResult); // 이전 검색 결과가 그대로 저장되어있음. }); } 위의 handleReset 메서드 실행시, 저 같은 경우엔 주석 친 부분처럼 this.state.searchResult를 빈배열로 무조건 갱신해줘야 한다고 생각 했습니다. 이유는, reset의 동작이 검색 결과 부분에 아무것도 노출하지 않는다는 점 때문에, 검색 결과를 저장하고 있는 searchResult 역시 같이 비워줘야 하지 않나 라는 생각이 들었기 때문입니다. 물론 현재로서는 this.state.submitted으로 노출 제어를 하고 있는 상황이기 때문에 동작에는 전혀 문제가 없긴 하지만요...! 사소한 부분이긴 하지만.. 혹시 강사 님께서는 이 부분에 대해서 어떻게 생각하시는지 여쭤보고 싶습니다!