묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨장애 없는 서비스를 만들기 위한 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 동시에 실행 시켜서 작동 확인해보면 되나요?
-
미해결스프링 시큐리티 OAuth2
클라이언트 인가 후 저장 질문
클라이언트가 인가서버로부터 인가를 받으면 authorizedClient가 생성되는데, 이 생성된 authorizedClient는 세션에 저장돼서 다음 요청일때 이 세션에서 객체를 가져와 인가처리된 클라이언트인지 아닌지 확인하는건가요? 마치 인증완료후 authentication 객체가 securityContext에 저장되고, 이 컨텍스트가 세션에 저장되는것처럼 작동하는건가요?
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
도메인형 패키지 구조 질문
안녕하세요.강의에서 사용하는 도메인형 패키지 구조는 도메인 주도 설계(DDD) 원칙이 적용된 구조라고 봐도 될까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
hello-static.html과 index.html의 차이
localhost:8080만 실행했을 때 같은 static폴더 내에 있지만 hello-static.html가 아닌 index.html가 웹 창에 뜬 이유가 궁금합니다.
-
미해결토비의 스프링 부트 - 이해와 원리
인용구의 출처가 궁금합니다.
안녕하세요. 강의 마지막에 조영호님의 프레임워크에 대한 견해를 소개해주셨는데요. 조영호(프레임워크3부) 라는 설명이 달려있는데프레임워크3부 라는 것이 무엇인지 알 수 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강사님이 보시는 문서 볼 수 있는 곳이 있나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강사님이 보시는 문서 볼 수 있는 곳이 있나요?
-
미해결스프링 시큐리티 OAuth2
authentication server 토큰 검증 api 테스트 질문
현재 /oauth2/token 에 접근하지 못하는 문제가 있는 것으로 보입니다.제가 확인해봐야할 내용이 어떤게 있을까요?동영상에서 37:33쪽에 있는 내용하고 비교를 해봤을 때, 현재로썬 authenticated 가 다르다게 진행이 되고 있어서 질문드립니다.
-
미해결스프링 시큐리티 OAuth2
인증처리에서 SecurityContext 질문입니다.
컨트롤러에서 직접 사용자 인증처리를 구현하는데 마지막에 Oauth2AuthenticationToken을 SecurityContextHolder를 사용해 securityContext에 저장하는데, 이 처리는 이번 요청이 끝나면 securityContext가 초기화되므로 securityContext를 세션에도 저장해줘야 하는거 아닌가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order import 문제
<orderServiceTest> <OrderService>Order의 import를 domain에 있는 Order class로 했는데 왜 위와 같은 오류가 나는지 모르겠습니다.
-
미해결스프링 시큐리티 OAuth2
로그인 인증 후 처리 질문입니다.
처음 로그인 인증처리받을때는 인가서버로부터 code를 받기 전에 유저의 동의가 필요하므로 유저가 아이디, 비밀번호를 입력하는 과정이 필요합니다. 그리고 이후 로그인 인증처리 완료되면 서버 세션에 SecurityContext 가 저장되고 인가서버에도 해당 유저의 세션이 저장되고 인증처리가 끝납니다. 근데 서버를 종료하고 재시작하면 서버의 세션이 초기화되므로 인증처리가 처음부터 다시 시작해야 될거같은데 서버 종료 후 다시 인증처리 받기 시작할땐 유저가 아이디, 비밀번호를 입력하는 과정 없이 authorizationEndpoint로 인가서버에 요청하기만 하면 인증과정이 성공합니다. 이유가 뭔가요?