묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[입문자를 위한] Power BI로 시작하는 데이터 시각화
LEFT 함수에 대해 질문이 있습니다.
5분 45초에서 LEFT 함수 식으로 '년도 = LEFT([period],1,4)'를 입력하셨는데, 여기서 1을 왜 입력하는지 모르겠습니다.'2019'라는 총 네 자리 수를 도출하려는 것이니 '년도 = LEFT([period],4)'만 입력하면 되는거 아닌가요?
-
미해결Objective-C 강좌 - 12개 앱 만들면서 배우는 iOS 아이폰 앱 개발
144번째 강의는 어디 있는건가요?
144번째 강의는 어디 있는건가요?진도율이 143강/144강(99.31%)에서 진행이 안됩니다.최종 143강까지가 마지막으로 확인됩니다. 수강완료할수 있게 확인 부탁드립니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@PathVariable 질문 입니다.
@PathVariable 어노테이션 사용 시 위와 같이 GetMapping의 {userId} 와 변수 명이 같으면name="userId" 옵션을 생략해도 된다고 말씀해주셨는데 옵션을 생략하면 500 에러가 나고,옵션을 작성해주면 성공하는데 이런 경우에는 뭐가 문제인가요?
-
해결됨Vue 3 시작하기
target[prop] 질문
target[prop] = newValue; 를 하지 않고 render(newValue)를 해도 값이 바껴서 출력되는걸 확인할 수 있는데, target[prop]에 newValue 값을 넣어주는 이유가 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
[섹션6.중복 등록과 충돌] 동일 이름의 빈 수동, 자동 등록시 오버라이딩 관련하여
안녕하세요. 질문이 생겼습니다. 강의: 섹션6. 중복 등록과 충돌내용:3분 50초: "동일 이름의 빈이 자동, 수동 등록될 경우 수동등록을 우선하여 오버라이딩한다."AutoAppConfig.java에서 수동 빈 등록 메서드에 오타를 내어 반환 타입을 MemberRepostitory 대신 MemoryMemberRepository로 설정하였습니다. @Configuration @ComponentScan( // basePackages = "hello.core.member", // basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class) // AppConfig가 등록되지 않도록 제외시킴. ) public class AutoAppConfig { @Bean(name = "memoryMemberRepository") public MemoryMemberRepository memberRepository() { // 오타부분 return new MemoryMemberRepository(); } }이 경우 AutoAppConfigTest실행시에 overriding 관련 로그가 없습니다.스프링 부트를 실행해도(CoreApplication 실행) 에러가 발생하지 않습니다.질문1) 같은 이름으로 같은 타입의 객체가 빈 등록되는데 오버라이딩되지 않으면 어떻게 된 것인지2) 이 상황에서 빈 수동 등록 메서드의 반환형이 어떤 영향을 미친건지 감사합니다.
-
미해결
Spring Security 와 JWT 난관에 봉착했습니다...
안녕하세요.이제 개발 공부를 시작한 학생입니다.이번에 Security 와 Jwt 에 대해서 배웠는데, 실습 간 문제가 발생하여 부끄럽지만,,, 질문드립니다.문제의 핵심은 "토큰을 헤더에 담아서 요청했는데, 왜 토큰 값이 전달되지 않는가 ?" 입니다... 먼저 코드 보여드리겠습니다. WebSecurityConfig @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // CSRF 설정 http.csrf((csrf) -> csrf.disable()); http.sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) ); http.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정 .requestMatchers("/").permitAll() // 메인 페이지 요청 허가 .requestMatchers("/user/**").permitAll() // '/user/'로 시작하는 요청 모두 접근 허가 .anyRequest().authenticated() // 그 외 모든 요청 인증처리 ); http.formLogin((formLogin) -> formLogin .loginPage("/user/login-page").permitAll() .defaultSuccessUrl("/test", true) // 로그인 성공 시 /test 경로로 리다이렉트 ); // 필터 관리 http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class); http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); }우선 config 쪽에서는 리소스 및 기본페이지, user 로 시작하는 페이지는 인증 없이 접근 가능하도록 했습니다..anyRequest().authenticated() <- 이걸 설정하면 나머지 요청들은 인증이 필요하다는 것으로 알고 있습니다. JwtAuthenticationFilter인증 필터는 다음과 같습니다. protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException { log.info("로그인 성공 및 JWT 생성"); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(new ObjectMapper().writeValueAsString(new ApiResponseDto("로그인 성공", HttpStatus.OK.value()))); String loginId = ((UserDetailsImpl) authResult.getPrincipal()).getUsername(); UserRoleEnum role = ((UserDetailsImpl) authResult.getPrincipal()).getUser().getRole(); String accessToken = jwtUtil.createAccessToken(loginId, role); String refreshToken = jwtUtil.createRefreshToken(loginId); redisService.saveRefreshToken(loginId, refreshToken); // Access Token 헤더에 저장 response.addHeader(JwtUtil.AUTHORIZATION_HEADER, accessToken); // Refresh Token 쿠키에 저장 Cookie refreshCookie = new Cookie("refreshToken", refreshToken); refreshCookie.setHttpOnly(true); refreshCookie.setSecure(true); refreshCookie.setPath("/"); response.addCookie(refreshCookie); }Access 토큰과 Refresh 토큰을 구현해보고 싶어서 위와 같이 구현하였습니다. login.html<h1>로그인</h1> <form id="loginForm"> <label for="loginId">아이디:</label> <input type="text" id="loginId" name="loginId" required> <br> <label for="password">비밀번호:</label> <input type="password" id="password" name="password" required> <br> <button type="button" id="loginButton">로그인</button> </form> <script> $(document).ready(function() { $('#loginButton').on('click', function() { const loginId = $('#loginId').val(); const password = $('#password').val(); $.ajax({ type: "POST", url: "/user/login", contentType: "application/json", data: JSON.stringify({ loginId: loginId, password: password }), success: function(data, textStatus, xhr) { // 응답 헤더에서 Access Token 추출 const accessToken = xhr.getResponseHeader('Authorization'); if (accessToken) { // 로컬 스토리지에 Access Token 저장 localStorage.setItem('Authorization', accessToken); // 모든 AJAX 요청에 대해 Authorization 헤더를 설정 setupAjaxRequests(accessToken); // 로그인 성공 후 리다이렉션 window.location.href = '/test'; } else { alert('Authorization token not found'); } }, error: function(jqXHR, textStatus, errorThrown) { alert('로그인 실패: ' + textStatus); } }); }); }); function setupAjaxRequests(token) { $.ajaxSetup({ headers: { 'Authorization': token } }); } </script> </body> </html> 그래서 실제로 위와 같은 페이지를 만들어서 로그인을 시도해보면 로컬스토리지와 쿠키에 각각 토큰이 담기는 것을 확인할 수 있었습니다.그런데 여기서 문제가 있는 게, window.location.href = '/test'; 아것이 동작이 안된다는 것입니다...분명 '/test'; 라고 명시해두면 TestController@Controller public class TestController { @GetMapping("/test") public String testPage() { return "test"; } } 해당 api 가 호출되어 test 라는 페이지가 떠야하는 게 아닌가요 ? ㅠㅠㅠㅠtest page 는 우선 body 에 "테스트 페이지입니다" 정도로만 제작해두었습니다. 왜 안될까,,, 고민하다가 우선 인가 필터 쪽 로그를 찍어서 확인했습니다. JwtAuthorizationFilter @Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { // 헤더에서 토큰 추출 log.info("헤더에서 토큰 추출"); String tokenValue = jwtUtil.getJwtFromHeader(req); log.info("토큰 : " + tokenValue); if (StringUtils.hasText(tokenValue)) { // 토큰 유효성 검사 if (!jwtUtil.validateToken(tokenValue)) { log.info("Token Error"); return; } Claims info = jwtUtil.getUserInfoFromToken(tokenValue); try { setAuthentication(info.getSubject()); } catch (Exception e) { log.error(e.getMessage()); return; } } else { log.info("토큰이 없습니다."); } filterChain.doFilter(req, res); }이와 같으며, 로그인 성공 후 window.location.href = '/test'; 동작할때와 그냥 주소창에 localhost8080/test 로 접근해 본 결과 로그가 이렇게 찍히는 겁니다...2024-02-25T22:49:52.276+09:00 INFO 54640 --- [nio-8081-exec-2] JWT 검증 및 인가 : 헤더에서 토큰 추출 2024-02-25T22:49:52.276+09:00 INFO 54640 --- [nio-8081-exec-2] JWT 검증 및 인가 : 토큰 : null 2024-02-25T22:49:52.276+09:00 INFO 54640 --- [nio-8081-exec-2] JWT 검증 및 인가 : 토큰이 없습니다.대체 왜 토큰이 없는 걸까....분명 로컬 스토리지에 Access Token 저장된 거 개발자 도구로 확인했고, 이를 다시 Header 담아서 전송하는 것까지 login.html 쪽에 구현했다고 생각했는데,,, 이게 의도한 방향대로 흘러가질 않습니다. 대체 왜 토큰이 비어있으며, test 라는 페이지에 접속하지 못하는 걸까요...제가 놓친 부분이 있을까요 ?
-
미해결실습으로 배우는 선착순 이벤트 시스템
쿠폰 개수를 증가시키는 코드에서 궁금한 점이 있습니다.
public Long increment() { return redisTemplate .opsForValue() .increment("coupon_count"); } ---------------------------------------------------- public void apply(Long userId) { Long count = couponCountRepository.increment(); if (count > 100) { return; } couponRepository.save(new Coupon(userId)); }코드에서 쿠폰을 100개 발급할 수 있도록 했는데만약 동시에 100만 개의 요청이 들어오게 되면 redis에도 똑같이 100만 번의 요청이 가서 100개의 요청을 제외한 나머지 불필요한 요청을 redis가 처리해야 되는 문제가 발생할 것 같습니다. public void apply(Long userId) { Long count = couponCountRepository.getCount(); if (count > 100) { return; } couponCountRepository.increment(); couponRepository.save(new Coupon(userId)); }그래서 쿠폰 개수를 먼저 가져와서 검증 후 개수를 올리게 되면 또다시 Race Condition이 발생할 것 같습니다.실무에서는 어떠한 방식으로 코드를 작성하시는지 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
자바 스프링부트 버전 선택
스프링부트 버전이 2.7x 버전은 없는데 무엇으로 선택해야 하나요?
-
해결됨Flutter로 SNS 앱 만들기
signOut()에서 에러가 났습니다.
await context.read<AuthProvider>().signOut();main_screen.dart에서 signOut에서 에러가 났습니다.메일 보낼게요
-
해결됨(UPDATED) Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
ppt 자료
ppt 자료가 아래와 같은 화면이 뜨면서 열리지가 않는데 뭐가 문제인 걸까요..?
-
해결됨개발자를 위한 쉬운 도커
github actions 의 steps 중 platforms 제거
안녕하세요. GitHub Actions 관련 실습 중이었는데, 아래와 같은 에러가 발생했습니다. ERROR: failed to solve: node:14: no match for platform in manifest: not found154Error: buildx failed with: ERROR: failed to solve: node:14: no match for platform in manifest: not found 일단은 platforms 를 제거해서 해결했는데요.platforms 관련하여 검색해 알아보니 특정 OS 에 최적화하는 옵셔널한 값으로 넣으면 좋고 안넣어도 괜찮은 그냥 그런 것으로 소개되고 있더라고요 제 질문은 아래와 같은데요. platforms 를 지워서 GitHub Actions 가 성공했는데, 이렇게 실습해도 되나요?실무에서는 보통 platforms 를 작성하는게 관행인가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-I 타입 관련 질문드립니다.
모든 타입을 long long 타입으로 바꿨더니 성공을 하긴 했습니다!하지만 mid 부분을 int로 설정했을 경우엔 왜 안되는 것일까요...?mid가 아무리 커도 10억+10억보다는 작을 것이라 생각해서 int로 설정했는데, 이때는 오답이 나왔습니다...!!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
orderService도 rabbitmq를 어디선가 사용하나요??
order-service의 application.yml를 살펴보고, 다른부분을 살펴봐도 rabbitmq관련 설정이나, 코드는 전혀없던데 다른곳에서 자동으로 사용하는건가요?? -e "spring.rabbitmq.host=rabbitmq" 왜 rabbitmq 설정을 추가해야만 위 로그가 안뜨는지 질문드립니다. 그리고 왜 동일한 설정으로 local로 실행할때는 위 로그가 안뜨다가 왜 docker로 실행할때만 뜨는걸까요??server: port: 0 spring: application: name: order-service datasource: driverClassName: org.h2.Driver # url: jdbc:h2:mem:testdb # username: sa # password: url: jdbc:mariadb://localhost:3306/mydb driver-class-name: org.mariadb.jdbc.Driver username: root password: test1357 jpa: hibernate: ddl-auto: update show-sql: true h2: console: enabled: true settings: web-allow-others: true path: /h2-console cloud: openfeign: micrometer: enabled: true eureka: instance: instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}} register-with-eureka: true fetch-registry: true service-url: defaultZone: http://127.0.0.1:8761/eureka logging: level: com.example.orderservice.client: DEBUG pattern: level: '%5p [%X{traceId:-}-%X{spanId:-}]' management: tracing: sampling: probability: 1.0 propagation: consume: B3 produce: B3_MULTI zipkin: tracing: endpoint: "http://localhost:9411/api/v2/spans" endpoints: web: exposure: include: refresh, health, beans, busrefresh, info, metrics, prometheus application.yml파일입니다
-
미해결배달앱 클론코딩 [with React Native]
encrypted stroage 질문
안녕하세요 제로초님! https://github.com/emeraldsanto/react-native-encrypted-storage encrypted stroage 깃헙을 가보니 아카이브가 되어있어서 더이상 개발할게 없어서 중지한건지 아니면 다른 라이브러리로 이전한건지 잘 모르겠네요!? 혹시 encrypted stroage를 계속 사용해도 될까요?
-
해결됨취업/이직에 성공할 수 밖에 없는 포트폴리오 전략 강의
포트폴리오 페이지 수 관련 질문
안녕하세요!포트폴리오를 작업 중인 2년차 프로덕트 디자이너 입니다.에이전시에 근무 했을 당시 1개의 서비스에서 여러 프로젝트를 맡아 진행했었습니다. 굵직한 것만 추려 4가지 프로젝트를(선물하기, vip 등등..) 넣으려고 하는데요. 이것만 해도 설명해주신 IA 구조로 만들면 페이지 수가 꽤 되는데.. 어떻게 해야하는지 고민입니다.혹시 페이지 수에 대한 부분은 크게 상관 없을까요?
-
미해결실습으로 끝장내는 웹 크롤링과 웹 페이지 자동화 & 실전 활용
멜론 유저에이전트 값 입력했음에도 창접속이안되여 ㅜㅜ
#라이브러리 from selenium import webdriver # Selenium의 웹 드라이버를 사용하기 위한 모듈을 임포트 from selenium.webdriver.common.by import By # Selenium에서 사용하는 By 클래스를 임포트합니다. 이 클래스는 웹 요소를 검색하는데 사용 from selenium.webdriver.common.keys import Keys #키보드 입력을 제어하기 위한 Keys 클래스를 임포트 from selenium.webdriver.chrome.service import Service # Chrome 드라이버 서비스를 사용하기 위한 모듈을 임포트 from selenium.webdriver.chrome.options import Options # Chrome 드라이버 옵션을 설정하기 위한 클래스를 임포트 from webdriver_manager.chrome import ChromeDriverManager #Chrome 드라이버를 자동으로 설치 및 관리하는 데 사용되는 매니저를 임포트 import time #시간 관련 함수를 사용하기 위한 time 모듈을 임포 myOption = Options() myAgent = '''Mozilla/5.0 (Linux; Android 9.0; SAMSUNG SM-F900U Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36''' myOption.add_argument(f"user-agent = {myAgent}") myOption.add_argument("--start-maximized") myOption.add_experimental_option("detach",True) myOption.add_experimental_option("excludeSwitches", ["enable-logging"]) myService = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=myService, options=myOption ) url = "https://m2.melon.com/index.htm" time.sleep(2)
-
미해결빅데이터/텍스트마이닝 분석법 (LDA,BERTtopic,감성분석,CONCOR with ChatGPT)
3강 질문입니다.
안녕하세요.파이썬 초보인데 강의보면서 어려워도 따라해보고 있습니다.2강 까지 title_content 열에 제목+본문 내용의 형태소 추출 하는 것 까지 하고 나서 3강에서 추출된 내용을 df=head()로 확인했을때딱 title_content 부분만 나오던데 이거는 하는 방법이 따로 있나요? 저는 전체 열이 다 나오는데 엑셀에서 파일을 지우는 건지 아니면 따로 title_content 열만 나오게 하는 코딩을 해야 하는지 궁금합니다!
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강연장부탁드립니다
안녕하세요 수강연장부탁드립니다사유는 작년에 바빠서 시험에 응시하지 못하였는데올해는 복습하고 시험에 응시하려합니다.
-
미해결카프카 완벽 가이드 - 코어편
mtputty 액세스가 거부됩니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 쁘띠, mt쁘띠도 삭제해봐도 자꾸 리커넥 메세지가 나옵니다.. 일단 쁘띠는 정상동작합니다 ㅜㅜ
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
박스모델할때 크롬에서 계속 오류가 나오네요
border로 박스를 만들고난 후 크롬에서 확인하면 밑에 빨간줄이나오는데 어떻게 처리해야 하나요박스모델에서 계속 저오류가 나오고 있네요...