묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 사용시 memberId가 계속 같이 넘어오는 현상 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]세션 저장소를 이용해서 클라이언트 요청을 서버로 받아오는데, 계속해서 memberId 값이 함께 넘어오고 있습니다. 코드를 봐도 문제가 없는것처럼 보이는데 제가 원인이 되는 코드를 못찾고 있는 거 같아 문의 드립니다. 어디를 삭제하거나 고치면 되나요? [SessionManager]package hello.login.web.session;import org.springframework.stereotype.Component;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Arrays;import java.util.Map;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;/** * 세션 관리 */@Componentpublic class SessionManager {public static final String SESSION_COOKIE_NAME = "mySessionId"; private Map<String, Object> sessionStore = new ConcurrentHashMap<>(); // 세션 저장소 /** * 세선 생성 * sessionId 생성 (임의의 추정 불가능한 랜덤 값) * 세션 저장소에 sessionId와 보관할 값 저장 * sessionId로 응답 쿠키를 생성해서 클라이언트에 전달 */ public void createSession(Object value, HttpServletResponse response){// 세션 id를 생성하고, 값을 세션 저장소에 저장 String sessionId = UUID.randomUUID().toString(); sessionStore.put(sessionId, value); // 쿠키 생성 Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); response.addCookie(mySessionCookie); }/** * 세션 조회 */ public Object getSession(HttpServletRequest request){Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME); if (sessionCookie == null){return null; }return sessionStore.get(sessionCookie.getValue()); }/** * 세션 만료 */ public void expire(HttpServletRequest request){Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME); if (sessionCookie != null){sessionStore.remove(sessionCookie.getValue()); }}public Cookie findCookie(HttpServletRequest request, String cookieName){if (request.getCookies() == null){return null; }return Arrays.stream(request.getCookies()).filter(cookie -> cookie.getName().equals(cookieName)).findAny().orElse(null); }} [LoginController]package hello.login.web.login;import hello.login.domain.login.LoginService;import hello.login.domain.member.Member;import hello.login.web.session.SessionManager;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Controller;import org.springframework.validation.BindingResult;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.PostMapping;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@Slf4j@Controller@RequiredArgsConstructorpublic class LoginController {private final LoginService loginService; private final SessionManager sessionManager; @GetMapping("/login")public String loginFor(@ModelAttribute("loginForm") LoginForm form){return "login/loginForm"; }// @PostMapping("/login") public String login(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response){if (bindingResult.hasErrors()){return "login/loginForm"; }Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if(loginMember == null){bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; }// 로그인 성공 처리 // 쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료 시 모두 종료) Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(idCookie); return "redirect:/"; }@PostMapping("/login")public String loginV2(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response){if (bindingResult.hasErrors()){return "login/loginForm"; }Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if(loginMember == null){bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; }// 로그인 성공 처리 // 세션 관리자를 통해 세션을 생성하고, 회원 데이터 보관 sessionManager.createSession(loginMember, response); return "redirect:/"; }// @PostMapping("logout") public String logout(HttpServletResponse response){expireCookie(response, "memberId"); return "redirect:/"; }@PostMapping("logout")public String logoutV2(HttpServletRequest request){sessionManager.expire(request); return "redirect:/"; }private static void expireCookie(HttpServletResponse response, String cookieName) {Cookie cookie = new Cookie(cookieName, null); cookie.setMaxAge(0); response.addCookie(cookie); }} [HomeController]package hello.login.web;import hello.login.domain.member.Member;import hello.login.domain.member.MemberRepository;import hello.login.web.session.SessionManager;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.CookieValue;import org.springframework.web.bind.annotation.GetMapping;import javax.servlet.http.HttpServletRequest;@Slf4j@Controller@RequiredArgsConstructorpublic class HomeController {private final MemberRepository memberRepository; private final SessionManager sessionManager;// @GetMapping("/") public String home() {return "home"; }// @GetMapping("/") public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model){if(memberId == null){return "home"; }// 로그인 Member loingMember = memberRepository.findById(memberId); if(loingMember == null){return "home"; }model.addAttribute("member", loingMember); return "loginHome"; }@GetMapping("/")public String homeLoginV2(HttpServletRequest request, Model model){// 세션 관리자에 저장된 회원 정보 조회 Member member = (Member) sessionManager.getSession(request); // 로그인 if(member == null){return "home"; }model.addAttribute("member", member); return "loginHome"; }}
-
해결됨홍정모의 따라하며 배우는 C++
학원 선생님이 주석을 각주라고 말하셨는데 이것도 맞는 말인가요?
게임학원에 다니면서 언리얼과 프로그래밍 수업을 듣고 있습니다.제가 묻고싶은 것은 학원 선생님이 주석을 각주라고 하셨는데 이 표현도 맞는말인가요?
-
해결됨다양한 사례로 익히는 SQL 데이터 분석
쿼리 관련 질문이 있습니다.
안녕하세요. 강의 듣는 중 궁금한 점이 있어서 질문드립니다. 만약 '카테고리별 기준 월, 전 월, 작년 월 ( 기준 월 = 2023/10, 전월 = 2023/09, 작년 월 = 2022/10)의 차이'를 구하라고 한다면 강의와 같이 기준 연월의 일년 정도의 데이터(2022/10 ~ 2023/10)를 가져와서 사용하는게 더 좋을까요?아니면, 3개 조건 각각 select하여 카테고리 기준으로 join하는게 더 좋을까요?ex) with as ( 기준 월), with as (전 월), with as (작년 월)... 혹은 더 좋은 방법이 있다면 알려주시면 감사하겠습니다. 이런 질문 드려도 되는지 모르겠지만.. 강의 잘 듣고 있습니다.감사합니다.
-
미해결FreeRTOS 프로그래밍
강의 "소스코드 분석-vTaskSuspend" 관련 질문 드립니다!
안녕하세요 강사님 :) 스케줄링 관련 질문이 있어 글을 남깁니다.Task2보다 우선 순위가 높은 Task1 이 vTaskDelay(1000)로 1초 동안 blocked 상태였다가 다시 ready상태로 돌아왔을 때, 혹은 vTaskSuspend() 함수로 인해 blocked상태였다가 vTaskResume() 을 통해 다시 ready상태가 됐을 때 만약 자신보다 우선순위가 낮은 Task2가 running 상태라면 우선순위가 더 높은 Task1이 ready상태이니 Task2는 running 상태에서 쫒겨나고, Task1이 running 상태가 되는 것이 맞습니까?그리고 이 때 Task2는 어떤 작업에 의해 어떤 상태가 되는지(blocked? ready?)도 궁금합니다!!
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
결과값에 코드가 함께나와요ㅠㅠ
프린트문 아래 보이는 코드는 뭘까요ㅠㅠ제가 뭘 잘못한걸까요?ㅠㅠ<ipython-input-42-94425356488d>:10: FutureWarning: The default value of numeric_only in DataFrameGroupBy.sum is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function. df = df.groupby(['city','f2']).sum().reset_index()
-
해결됨두고두고 써먹는 유니티 VR
오류 수정
안녕하세요!컨트롤러 모델을 만들고 게임 플레이를 하면 계속 이러한 오류가 계속 발생하는데 오류를 어떻게 수정해야 하나요?
-
미해결
npm run dev 실행 오류
MongoDB Connected... 라고는 뜨는 것 보면 DB 연결은 된 것 같은데 아무 창도 안뜨고 vscode 터미널 보니까 위쪽에 빨간색으로 뭔가 뜨더라고요. 뭔지 잘 모르겠어서 오류 문의 드립니다. 어떻게 해결해야 할까요?환경은 windows이고, 원래는 npm install부터 잘 안됐어서위 댓글을 참고해서 변경한 상태입니다. 그러다가 npm install 2개 하는 것까지는 됐는데 npm run dev에서 막혀버렸어요.node.js 버전은 18.18.0입니다. 오류 해결 조언 부탁드려요
-
미해결iOS SwiftUI AR 증강현실
Reality Composer가 없어요ㅠㅜ
Xcode 버전이 15로 바뀌면서 Developer Tool에서 Reality Composer가 아예 사라져서 없어습니다...ㅠㅜ 인터넷에도 쳐봤는데 도저히 관련 자료를 찾을 수가 없어요
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
iOS 에서 영상 고르면 압축을 하는데 바로 재생할 방법이 없나요 ?
iOS 에서 직접 개발할때는, 영상 고르면 바로 플레이 가능했는데. 해당 프로젝트에서 영상을 고르면 한동안 압축을 하고 있어서요. 영상이 길어질수록 오래 걸리던데, 추가로 화질도 떨어집니다. 상용앱에선 사용하기 힘들어 보여서요. 안드로이드에서 영상선택하면, 압축과정이 없는데iOS 에서 혹시 해당 이슈 해결할 방법이 있을까요 ? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
해결됨홍정모의 따라하며 배우는 C언어
질문이 있습니다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { // 복리 계산 프로그램 double seed_money, target_money, annual_interest; printf("Input seed money : "); scanf("%lf", &seed_money); printf("Input target money : "); scanf("%lf", &target_money); printf("Input annual interest(%) : "); scanf("%lf", &annual_interest); double fund = seed_money; int year_count = 0; while (fund < target_money) { year_count++; fund = fund * ( 1.0 + ( annual_interest % 100.0 ) ); }; printf("It takes %d year\n", year_count); return 0; } 제가 작성한 코드에는 annual_interest과 100.0 아래 빨간줄이 나오면서 expression must have integral type이라고 출력되는데 왜이럴까요..??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Unable to build Hibernate SessionFactory오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]10월 16, 2023 11:17:27 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [name: hello]10월 16, 2023 11:17:27 오후 org.hibernate.Version logVersionINFO: HHH000412: Hibernate ORM core version 6.3.0.Final10월 16, 2023 11:17:27 오후 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl lambda$normalizeConnectionAccessUserAndPass$6WARN: HHH90000021: Encountered deprecated setting [javax.persistence.jdbc.user], use [jakarta.persistence.jdbc.user] instead10월 16, 2023 11:17:27 오후 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl lambda$normalizeConnectionAccessUserAndPass$12WARN: HHH90000021: Encountered deprecated setting [javax.persistence.jdbc.password], use [jakarta.persistence.jdbc.password] instead10월 16, 2023 11:17:27 오후 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl normalizeDataAccessWARN: HHH90000021: Encountered deprecated setting [javax.persistence.jdbc.url], use [jakarta.persistence.jdbc.url] instead10월 16, 2023 11:17:27 오후 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl normalizeDataAccessWARN: HHH90000021: Encountered deprecated setting [javax.persistence.jdbc.driver], use [jakarta.persistence.jdbc.driver] instead10월 16, 2023 11:17:27 오후 org.hibernate.cache.internal.RegionFactoryInitiator initiateServiceINFO: HHH000026: Second-level cache disabled10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using built-in connection pool (not intended for production use)10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: Loaded JDBC driver class: org.h2.Driver10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001012: Connecting with JDBC URL [jdbc:h2:tcp://localhost/~/jpashop]10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {password=****, user=sa}10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: false10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>INFO: HHH10001115: Connection pool size: 20 (min=1)10월 16, 2023 11:17:27 오후 org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl constructDialectWARN: HHH90000025: H2Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)10월 16, 2023 11:17:29 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateServiceINFO: HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)10월 16, 2023 11:17:29 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@5dc769f9] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.10월 16, 2023 11:17:29 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptionsWARN: SQL Error: 42122, SQLState: 42S2210월 16, 2023 11:17:29 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptionsERROR: Column "start_value" not found [42122-214]10월 16, 2023 11:17:29 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/jpashop]Exception in thread "main" jakarta.persistence.PersistenceException: [PersistenceUnit: hello] Unable to build Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1563) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1484) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:55) at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80) at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at jpashose.jpashop.JpaMain.main(JpaMain.java:12)Caused by: org.hibernate.exception.SQLGrammarException: Unable to build DatabaseInformation [Column "start_value" not found [42122-214]] [n/a] at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:66) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:58) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:94) at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:194) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:98) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:286) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:145) at java.base/java.util.HashMap.forEach(HashMap.java:1337) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:142) at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:295) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1479) ... 4 moreCaused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "start_value" not found [42122-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492) at org.h2.jdbc.JdbcResultSet.getLong(JdbcResultSet.java:745) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.resultSetStartValueSize(SequenceInformationExtractorLegacyImpl.java:110) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.lambda$extractMetadata$0(SequenceInformationExtractorLegacyImpl.java:54) at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:50) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.<init>(DatabaseInformationImpl.java:60) at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) ... 14 moreh2설정후 main돌려보면 자꾸 이런식으로 뜹니다 재설치도 많이해봤고 강의와 같은버젼으로 돌렸는데도 오류가 발생하는데왜이러죠 >?? public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");EntityManager em = emf.createEntityManager();EntityTransaction tx = em.getTransaction();tx.begin();try { tx.commit(); } catch (Exception e) { tx.rollback();}finally {em.close();} emf.close();}} 이건 main코드입니다
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
노드 버드 강의에서 배포 파트 관련 질문
혹시 해당 강의에서 진행하는 배포 파트의 경우 아래 내용이 포함되어 있을까요?현재 강의 진행전에 따로 공부 중인 내용인데 혼자 진행하기엔 좀 햇갈리는 부분이 있어 강의에 포함된다면 강의를 먼저 들어보고 진행하려합니다. 노드버드 강의에 없더라도 다른강의에 상세하게 다루고 있다면 해당 강의 명을 부탁드립니다. 실무에 적용될수있는 CI/CD가 내용에 포함되어있는지?2. 빌드와 관련해 Webpack, ESBuild, SWC, Babel에 관한 내용이 있는지?3. 개인도메인으로 배포하는법
-
해결됨[핵집] 2025 빅데이터 분석기사(실기)_작업형 1·2·3유형
예시 파일이 없어요...
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 문제 예시에 나와 있는 cellphone2. csv파일을 찾을 수가 없습니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
gui로 검색어 변경 시 다른 내용이 나와요!
안녕하세요! 크롤링 진행중입니다!제가 keyword 변수에 gui 를 사용해서 검색어를 input하는 방식으로 이용중입니다. 그냥 경로를 넣었을 때는 검색어가 잘 나오는데, gui를 사용하면 다른 내용이 나옵니다. 저의 결과로는 책을 크롤링해오고 있습니다.. 무엇이 문제일까요 ㅠㅠ import requests from bs4 import BeautifulSoup import time import pyautogui keyword = pyautogui.prompt('검색어를 입력하세요.') path = 'https://www.coupang.com/np/search?q={keyword}&channel=recent' # 헤더에 User-Agent, Accept-Language 를 추가하지 않으면 멈춤 header = { 'Host': 'www.coupang.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3', } response_1 = requests.get(path, headers=header) html = response_1.text soup_1 = BeautifulSoup(html, 'html.parser') links = soup_1.select('a.search-product-link') for link in links: # 광고상품 제거 if len(link.select('span.ad-badge-text')) > 0: print('광고 상품 입니다.') else: sub_path = 'https://www.coupang.com/' + link.attrs['href'] # print(sub_path) response_2 = requests.get(sub_path, headers=header) html = response_2.text soup_2 = BeautifulSoup(html, 'html.parser') # 회사 - 있을 수도 있고, 없을 수도 있음. # 중고상품은 태그가 달라짐 try: brand_name = soup_2.select_one('a.prod-brand-name').text except: brand_name = "" # 제품명 product_name = soup_2.select_one('h2.prod-buy-header__title').text # 가격 try: product_price = soup_2.select_one('span.total-price > strong').text except: product_price = 0 print(brand_name, product_name, product_price) print('\nDvlp.H.Y.C.Sol\n')
-
미해결Flutter 응용 - 공공 API를 활용한 앱 만들기 (MVVM 패턴)
http 쓸때 버전 변경에따른 이슈
버전 올라가면서 http 쓸때 var 로 string 값 박으면 안되는것 같은데 이런식으로 하면 되는것같네요Uri url = Uri.https("gist.githubusercontent.com","/junsuk5/bb7485d5f70974deee920b8f0cd1e2f0/raw/063f64d9b343120c2cb01a6555cf9b38761b1d94"); http.Response response = await http.get(url);
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
todoItem.item이 왜 key가 될까요?
안녕하세요 강사님!어플리케이션 탭을 보면 엄연히 key, value가 있고 value 안에 completed, item이 있는 건데...todoItem.item이 어떻게 키값이 되는건지 궁금합니다.처음 설정할 때 key값과 todoItem.item을 같게(?) 해놓으면 todoItem.item을 key 값으로 접근할 수 있나요?만약 key(id값)으로 접근하려면 어떻게 해야 하나요?초보라 질문이 많습니다 ㅠㅠ 시간되실 때 답변해주시면 감사드리겠습니다 :)
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형 시험 별 부분 점수가 존재하나요?
안녕하세요. 예를 들어 작업형2는 1문제이고 40점인데, 틀려서 0점이거나 40점인지 아니면 풀면 그 중에서 어느정도 점수 인정해서 부분 점수가 나오는지 궁금합니다.
-
미해결처음 만난 리액트(React)
여기서 백틱으로 감싸주는 이유가 궁금합니다.
const Wrapper = ~~~ 아래에 백틱으로 감싸주는 이유가 궁금합니다.그리고 왜 저는 강사님처럼 안나오고 전부 붉게 나올까요..?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
send 과정에서 멀티스레딩에 관한 질문입니다
//양질의 수업 감사합니다. 데이터를 보내는 과정은 수업에서 크게send() // 데이터를 큐에 넣고 보내는 사람이 없으면 직접 보냄register_send() // 비동기로 send 실행on_send() // 데이터 전송 후 콜백 함수총 3가지 과정입니다근데 여기서 lock 경합 상태를 방지하기 위해 누군가가 보내고 있으면 큐에 데이터를 넣기만 하고 다른 일을 하러 가고 실제로 보내는 스레드는 단 1개로 설계한 것처럼 보이는데 큐에 데이터를 넣는 과정도 lock 안에 있어서 데이터를 보내는 스레드가 일을 마칠 때까지 큐에 데이터 못 넣고 대기 상태에 빠지지 않나요? 그래서 결국엔 lock 경합을 예방하는데 도움이 되는지 궁금하네요뭔가 send_queue 이 자원은 object key를 따로 만들어서 딱 이 녀석만 상호배제해야 할 것처럼 생각이 드네요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터 제한시 리다이렉트 처리하지 않는 경우
질문이 있는 부분은 강의에서 인터셉터를 통해 로그인 인증을 구현하는 부분입니다.요청 중 로그인이 필요한 페이지에 로그인하지 않은 채 요청을 보내면 response.sendRedirect()를 하여 HTTP 응답 Location 헤더를 통해 /login 으로 리다이렉션하고 있습니다.@Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); HttpSession session = request.getSession(false); log.info("인증 체크 인터셉터 실행 {}", requestURI); if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) { log.info("미인증 사용자 요청"); response.sendRedirect("/login?requestURL=" + requestURI); return false; } return true; } } 그러다 문득 response.sendRedirect() 을 주석처리하면 어떻게 될까 궁금해졌습니다.즉, 인터셉터 제한되는 상황에서 리다이렉트 처리하지 않으면 WAS 또는 스프링이 어떻게 처리하는지 궁금해진 것인데요. 해당 코드를 주석처리하고 로그인이 필요한 페이지로 브라우저를 통해 요청을 하얀색 화면이 나오는 것을 확인하였습니다.@Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); HttpSession session = request.getSession(false); log.info("인증 체크 인터셉터 실행 {}", requestURI); if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) { log.info("미인증 사용자 요청"); //response.sendRedirect("/login?requestURL=" + requestURI); return false; } return true; } }포스트맨으로 응답을 확인하니 다음과 같았습니다.인터셉터 제한되는 상황이므로 컨트롤러가 호출되지 않았다는 사실은 알 수 있었지만,정확히 어떠한 흐름으로 응답이 처리되는지는 이해할 수가 없어 질문을 하게 되었습니다. 인터셉터 제한되는 상황에서 리다이렉트 처리하지 않으면, 이러한 응답은 누가 어떻게 보내주는 것인가요?