묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티 OAuth2
CustomAuthenticationProvider 질문
http://localhost:9000/oauth2/authorize?response_type=code&client_id=oauth2-client-app1&scope=openid%20read%20write&redirect_uri=http://127.0.0.1:8081형태에 첫 로그인 요청을 했을때, 로그인 페이지로 가지 않는 현상이 있습니다.=> 확인을 해봤을때, CustomAuthenticationProvider 에서 프로세스 진행 완료 후 principal = AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=null, Granted Authorities=[ROLE_ANONYMOUS]]principal 까지 확인되었습니다. 그 다음 추가적인 내용을 확인해봐야될 내용이 어떤 걸 까요?추가적으로 첫 요청에 따른 redirect 하는 클래스가 어디인지 알고 싶습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Unknown host 'admin'. 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.위와 같은 오류가 뜨는데 인텔리제이와 스프링 자바 버전 둘 다 17로 맞췄고스프링 초기값은 다음과 같이 맞춰서 제너레이트를 했는데 위 오류 때문에 실행도 시킬 수가 없네요 어떻게 해결해야 할까요?
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
7장 테스트 에러
똑같이 코딩해서 테스트를 했는데 에러가 발생합니다.이유가 무엇일까요?똑같이 코딩해도 에러가 발생하니 답답하네요.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
섹션4 목록처리를 보고있어요
리스폰스로 json값이 오는건 이해가가는데 ], "pageNumList": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], "pageRequestDTO": { "page": 5, "size": 10 }, "prev": false, "next": true, "totalCount": 105, "prevPage": 0, "nextPage": 11, "totalPage": 0, "current": 0} 이값들은 api어느부분에서 전송하는건지 알수있을까요?
-
미해결토비의 스프링 부트 - 이해와 원리
MyOnClassCondition에 있는 matches method의 Invoke 횟수
안녕하세요 토비님, 질문의 앞서, 좋은 강의자료 감사드립니다. 앞으로도 계속 꾸준히 만들어 주세요! ^^ 혹시 MyOnClassCondition에 있는 matches method의 Invoke 횟수를 어떻게 예상하시나요? 저는 두번이라고 생각했는데요. "@ConditionalMyOnClass" annotation이 붙어있는 클래스가 두개 뿐이라서요. 그런데, 실제로 matches 안에서 출력을 해보니, 세번이 출력 되었습니다. 예상대로, TomcatWebServerConfig와 JettyWebConfigServerConfig를 각각 출력 했는데요. 그후에 한번 더 출력하더라구요. 마지막 출력은, 라이브러리에 포함된 것에 대한 config가 출력 됬습니다. 혹시 이유를 아시는지요?
-
미해결스프링 시큐리티 OAuth2
인증과정 질문입니다.
이전 챕터중 OAuth2Login api를 사용했을때는 인가서버로부터 accessToken을 받은후 인증처리를 하기 위해서 다시 인가서버에 userinfo endpoint로 요청을 보내서 유저정보를 가져오고 이 정보를 바탕으로 OAuth2User 객체를 만들어서 인증객체를 만들고 인증과정을 완료했습니다. 근데 지금 ResouceServer api를 사용했을때는 accessToken, 즉 jwtToken 만으로도 인증객체를 만들고 인증처리를 완료하는데 그러면 이전에는 accessToken을 받고 왜 이것만으로 인증처리를 완료하지 않은건가요?
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
Docker 데스크탑에서 push to Docker hub 를 클릭한 후 오류가 납니다...
Engine runningRAM 1.08 GBCPU --.-- %Disk --.-- GB avail. of --.-- GBBETATerminalv4.34.3 (HTTP code 400) unexpected - invalid tag format위와 같은 오류가 나는데 왜 그런 걸까요? 인텔리제이에서 빌드할 때도 문제가 없었습니다...
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하세요 Eureka 관련 질문 있습니다.
AWS ECS를 통해 MSA 프로젝트를 배포하려고 노력중입니다. Eureka, Api Gateway, 그리고 나머지 서비스를 배포하려고 하는데, 유레카가 ECS 환경에서 잘 검색하고 있지 못한 것 같습니다. 왜 이런지 도저히 감이 안잡혀서 질문 올립니다. 그림에 있는 것과 마찬가지로 모두 같은 ip 주소를 가져오고 있습니다. AWS ECS (Fargate) 환경이고, ALB 사용중입니다. 제 추측으로는 저 공통된 ip 주소가 ALB의 ip 주소이지 않을까 해서 다양한 방법을 시도해봤지만 private ip를 유레카가 가지고 있게 하는 것을 실패했습니다.
-
해결됨실전! 스프링 데이터 JPA
open projection 결과
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]open projection을 사용해서 username과 age만 UsernameOnly 프록시 객체에 담겨야 할 거라고 생각했는데, 디버깅과 콘솔에서 확인해본 결과 멤버 엔티티가 그대로 담긴 것 같아서 질문드립니다인터페이스디버깅 결과콘솔 화면
-
해결됨장애 없는 서비스를 만들기 위한 Resilience4j - CircuitBreaker
Riot API Circuit Breaker 적용
Riot API Limit을 보면 이렇게 Rate Limit이 있다고 설명되어 있는데요. 이를 위해서 CustomCircuitBreaker를 아래와 같이 개발해봤습니다. @Bean(name = "shortTermCircuitBreaker") public CircuitBreaker shortTermCircuitBreaker(CircuitBreakerRegistry registry) { return registry.circuitBreaker("shortTermBreaker", CircuitBreakerConfig.custom() .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED) .failureRateThreshold(1) .slidingWindowSize(1) .waitDurationInOpenState(Duration.ofSeconds(1)) // open -> half open까지 기다리는 시간 .automaticTransitionFromOpenToHalfOpenEnabled(true) // open 상태에서 자동으로 half open으로 전환 .build() ); } @Bean(name = "longTermCircuitBreaker") public CircuitBreaker longTermCircuitBreaker(CircuitBreakerRegistry registry) { return registry.circuitBreaker("longTermBreaker", CircuitBreakerConfig.custom() .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED) .failureRateThreshold(1) .slidingWindowSize(120) .waitDurationInOpenState(Duration.ofMinutes(2)) // open -> half open까지 기다리는 시간 .automaticTransitionFromOpenToHalfOpenEnabled(true) // open 상태에서 자동으로 half open으로 전환 .build() ); }제가 궁금한 점은 slidingWindowType을 TIME_BASED로 했을 경우, slidingWindowSize에 들어가는 값의 단위가 초 단위인가 하는 것입니다. 공식 문서에는 이렇게 나와있는데 애매한 것 같아서요.
-
미해결스프링 배치
job 재실행
안녕하세요 강사님 좋은 강의 감사드립니다.강의의 코드를 따라하며 실습을 하고 있는데 job이 실패했을 경우에만 재시작이 가능하고 completed로 정상적으로 종료되었을 경우에는 재실행이 안된다는 것을 숙지하고 있습니다.(파라미터 없거나 동일할 경우)근데 현재 flow 관련 실습을 하다보니 job 실행 시 아무런 파라미터도 주지 않고 Job이 completed로 정상적으로 끝났음에도 불구하고 Job이 재실행되는 경우가 있는데 이는 어떤 이유 때문인지 알려주실 수 있을까요?step 내부에서 contribution을 통해 extiStatus를 FAILED로 설정한 것 때문인지, 이외에도 다른 이유가 있는지 궁금합니다.확인해주시고 답변 주시면 많은 도움이 될 것 같습니다.감사합니다.
-
미해결스프링 시큐리티 OAuth2
최초로그인 -> 로그아웃 후 다시 로그인 시 질문
처음 서버 run 하고 google, naver, keycloak 전부 처음에는 아이디, 비밀번호를 입력하는 사용자입력이 필수적인데, 한번 로그인하고 나서는 웹어플리케이션 서버를 종료하고 다시 시작해도 구글, 네이버, keycloak 계정으로 로그인하는 과정이 필요없이 바로 인증이 됩니다. 왜이런건가요? 로그아웃했으면 당연히 다시 로그인하는 과정이 필요한데 이러면 잘못된거 아닌가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka connector 등록 후 조회 시 에러
강의에서 알려주신대로 my-source-connect라는 connector를 등록한 후 http://localhost:8083/connectors로 GET 조회시 아래와 같이 connector가 잘 뜨는 것을 확인하고http://localhost:8083/connectors/my-source-connect/status로 GET 조회시 아래와 같은 오류 메시지가 응답됐습니다.{ "name": "my-source-connect", "connector": { "state": "FAILED", "worker_id": "127.0.0.1:8083", "trace": "java.lang.NoSuchMethodError: 'boolean org.apache.kafka.common.utils.Utils.isBlank(java.lang.String)'\n\tat io.confluent.connect.jdbc.util.StringUtils.isNotBlank(StringUtils.java:79)\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getJdbcCredentialsProvider(GenericDatabaseDialect.java:2010)\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.<init>(GenericDatabaseDialect.java:192)\n\tat io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect.<init>(MySqlDatabaseDialect.java:67)\n\tat io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect$Provider.create(MySqlDatabaseDialect.java:57)\n\tat io.confluent.connect.jdbc.dialect.DatabaseDialects.findBestFor(DatabaseDialects.java:134)\n\tat io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:87)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:185)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:210)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:332)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117)\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base/java.lang.Thread.run(Thread.java:840)\n" }, "tasks": [], "type": "source" } kafka connect 터미널 로그에는 다음과 같이 찍혀있었습니다.[2024-10-13 23:15:36,747] ERROR WorkerConnector{id=my-source-connect} Error while starting connector (org.apache.kafka.connect.runtime.WorkerConnector:193) java.lang.NoSuchMethodError: 'boolean org.apache.kafka.common.utils.Utils.isBlank(java.lang.String)' at io.confluent.connect.jdbc.util.StringUtils.isNotBlank(StringUtils.java:79) at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getJdbcCredentialsProvider(GenericDatabaseDialect.java:2010) at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.<init>(GenericDatabaseDialect.java:192) at io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect.<init>(MySqlDatabaseDialect.java:67) at io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect$Provider.create(MySqlDatabaseDialect.java:57) at io.confluent.connect.jdbc.dialect.DatabaseDialects.findBestFor(DatabaseDialects.java:134) at io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:87) at org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:185) at org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:210) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:332) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:840) [2024-10-13 23:15:36,747] ERROR [Worker clientId=connect-1, groupId=connect-cluster] Failed to start connector 'my-source-connect' (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1339) org.apache.kafka.connect.errors.ConnectException: Failed to start connector: my-source-connect at org.apache.kafka.connect.runtime.distributed.DistributedHerder.lambda$startConnector$5(DistributedHerder.java:1305) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:335) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:840) 다음은 제가 시도해본 해결방법 3가지 입니다. 테이블 이름 수정https://www.inflearn.com/community/questions/618181/source-connector-%EC%98%A4%EB%A5%98?srsltid=AfmBOooaiA_jLl3ijo0mPjPhnhjM4FQeCSDVdXjgXAAHMsN7sojnFkIRusers 테이블은 예약어라고 해서 user1으로 수정해서 POST 요청을 보냈을 때는 아래와 같이 응답이 잘 왔습니다. mariadb-java-client.jar 파일 올바른 폴더에 넣기https://www.inflearn.com/community/questions/970970/kafka-connectors-%EC%97%90%EB%9F%AC?srsltid=AfmBOoopKwFbCFMIgaLAKg5-4urO7Fzzxwl2ChzmqH8evzNEc4H1ECsD다음 글을 참고해서 mariadb-java-client.jar 파일을 아래와 같이 kafka 폴더에 옮겨 놓았습니다 플러그인 확인https://www.inflearn.com/community/questions/245034/localhost-8083-connectors-%ED%98%B8%EC%B6%9C%EC%8B%9C-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EB%8B%A4?srsltid=AfmBOophiRaXpfFVHkArBbyirgaPdUfbGUP2W8o5Px-k_ZZDJ2b7wgmf다음 글을 참고해서 http://localhost:8083/connector-plugins [ { "class": "io.confluent.connect.jdbc.JdbcSinkConnector", "type": "sink", "version": "10.8.0" }, { "class": "io.confluent.connect.jdbc.JdbcSourceConnector", "type": "source", "version": "10.8.0" }, { "class": "org.apache.kafka.connect.file.FileStreamSinkConnector", "type": "sink", "version": "6.1.0-ccs" }, { "class": "org.apache.kafka.connect.file.FileStreamSourceConnector", "type": "source", "version": "6.1.0-ccs" }, { "class": "org.apache.kafka.connect.mirror.MirrorCheckpointConnector", "type": "source", "version": "1" }, { "class": "org.apache.kafka.connect.mirror.MirrorHeartbeatConnector", "type": "source", "version": "1" }, { "class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", "type": "source", "version": "1" } ]다음과 같이 응답이 왔습니다.jdbc connector는 잘 등록된 것 같습니다.. 뭐가 문제일까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원 서비스 테스트 회원가입() assertThat()
[질문 내용]assertThat()메소드의 도큐먼트에서는 assertThat(실젯값).isEqualTo(기댓값)이라고 정의되어 있지만,5분 13초 쯤에 김영한 강사님께서 회원가입() 메소드를 테스트하는 과정에서 assertThat() 메소드를 작성하실때assertThat(member.getName()).isEqualTo(findMember.getName());라고 하셨는데실제로는 assertThat(findMember.getName()).isEqualTo(member.getName());이렇게 정의하는게 맞지 않나요?확인부탁드립니다!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
assertEquals(), assertThat()
[질문 내용] 강사님께서 assertEquals() 메소드는 괄호 안에 assertEquals(expected기댓값, actual실제값), assertEquals(member, result) 하셨고, assertThat(member).isEqualTo(result); 작성하셨는데 제가 assertThat 메소드 도큐먼트를 확인하니 assertThat(actual실제값).isEqualTo(expected기대값) 으로 정의 되어있어서 그렇게 된다면, assertThat(result).isEqualTo(member) 해야 올바르게 작성하는 코드 아닌가요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
[주문조회 4V; jpa에서 DTO 직접 조회] 응답으로 DTO 전달 시, enum 과 값 타입 포함 관련
안녕하세요, 강의에서 궁금한 점이 있어 질문 드립니다.응답으로 엔티티를 그대로 반환하는 것이 아닌, DTO 를 반환하는 이유 중 하나가엔티티 변경 시, API 스펙에도 영향이 가는 것을 방지하기 위함이라고 이해했습니다. 그렇다면, 4:35 분 경, OrderQueryDto 를 구성할 때, Entity 에서, 해당 값들을 받아올 때, 1) Address 와 같은 값 타입이나,OrderStatus 와 같은 enum 들도, 별도의 Dto 로 만들어서 반환해야 되는것인지, 2) 그게 아니라면, 값 타입이나, Enum 값은 변경이 별로 없다는 것을 전제로 하고, 그대로 내려줘도 되는 것일지3) 둘 다 이유가 될 경우, 최종적으로는, 회사 별 코드 스타일대로 따르면 될지 질문드려요.
-
해결됨개발 입문을 위한 실무자가 알려주는 Spring Boot
혹시 대규모로 메일 발송을 해야할 땐 어떤 조치를 해야하나요?
혹시 대규모로 메일 발송을 해야할 땐 어떤 조치를 해야하나요? 이번에 회사에 대량의 이메일을 발생할 일이 있는데... 어떤준비를 해야할지 모르겠어서 조언을 구하고싶습니다.
-
해결됨개발 입문을 위한 실무자가 알려주는 Spring Boot
템플릿의 대한 정보는 sesclient에 왜 넘겨주나요?
템플릿의 대한 정보는 sesclient에 왜 넘겨주나요?그냥 문자열 값같은데 메일 템플릿의 대한 내용이라면 그건 어디에 저장하고 있어야되는건지 궁금합니다.
-
미해결스프링 시큐리티 OAuth2
정적 리소스 파일 설정 질문입니다.
application.yml에서 마지막에 web : static-path-pattern: /static/**이걸 안하면 static 폴더 아래에 있는 정적 리소스 파일이 html파일에 적용이 안되는데 왜이런건가요? 이전에는 해당 코드가 yml에 없었어도 제대로 됐었던것같은데 이유가 뭔가요? 그리고 정적 리소스 파일의 디폴트값은 원래 /static 아닌가요?
-
해결됨Spring Boot를 활용하여 채팅 플랫폼 만들어보기
작동하는 방법
이거 작동 확인하려면 source_code에 있는 client와 server 동시에 실행 시켜서 작동 확인해보면 되나요?