묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Sink Connect시 테이블 생성아 안됩니다
현재 my-sink-connect 등록도 잘되었고 아무 문제없이 작동을 잘 합니다. 또한 파워쉘을 통해서 데이터가 shema형태로 잘 통신되는 것도 확인 잘 되었습니다. 하지만 my_topic_users 테이블이 생성되지 않아 문제가 생겼습니다. 오류 메시지나 로그 또한 아무것도 나오지 않아 해결을 어떻게 할지 잘 모르겠습니다. PS C:\Work\kafka_2.12-3.4.0> .\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my_topic_users --from-beginning{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"},{"type":"string","optional":true,"field":"user_id"},{"type":"string","optional":true,"field":"pwd"},{"type":"string","optional":true,"field":"name"},{"type":"int64","optional":true,"name":"org.apache.kafka.connect.data.Timestamp","version":1,"field":"created_at"}],"optional":false,"name":"users"},"payload":{"id":1,"user_id":"user1","pwd":"1111","name":"userA","created_at":1753221466000}}{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"},{"type":"string","optional":true,"field":"user_id"},{"type":"string","optional":true,"field":"pwd"},{"type":"string","optional":true,"field":"name"},{"type":"int64","optional":true,"name":"org.apache.kafka.connect.data.Timestamp","version":1,"field":"created_at"}],"optional":false,"name":"users"},"payload":{"id":2,"user_id":"user2","pwd":"2222","name":"userB","created_at":1753221589000}}mysql> use mydb;Database changedmysql> show tables;+----------------+| Tables_in_mydb |+----------------+| orders || users |+----------------+ { "name": "my-sink-connect", "config": { "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", "delete.enabled": "false", "connection.password": "test1357", "auto.evolve": "true", "connection.user": "root", "tasks.max": "1", "topics": "my_topic_users", "value.converter.schemas.enable": "true", "name": "my-sink-connect", "auto.create": "true", "connection.url": "jdbc:mysql://localhost:3306/mydb" }, "tasks": [ { "connector": "my-sink-connect", "task": 0 } ], "type": "sink" }
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Kafka connect 연결시 Mysql Access Denied 문제해결법
java.sql.SQLException: No suitable driver found for jdbc:h2:mem:testdbjava.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)현재 kafak connect 연결시 이런 오류가 뜹니다. order-service를 mariadb Driver로 설정했는데 왜 h2메모리방식의 드라이버를 찾는지 이유를 잘 모르겠으며 해결방법이 절실합니다. Kafka의 zookeeper, Kafka server는 현재 작동이 잘됩니다. 윈도우 사용자입니다. 도움이 절실합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Kafka connect 실행시 No suitable driver 해결이 안됩니다
현재 zookeeper, kafka server는 다 실행되고 topic list도 잘 나오는 상황입니다. 하지만 현재Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb이 에러 때문에 진도를 못나가고 있는 상황입니다. 강의 그대로 했음에도 불구하고 어떤것이 문제인지 모르겠습니다. 제발 도와주세요
-
해결됨아키텍처와 함께하는 GCP (Google Cloud Platform)
안녕하세요, 내용에 의문이 생겨 질의드립니다.
안녕하세요, (추가) Compute Engine 생성 시 주의사항 강의 부분에서 질문이 있어 남깁니다. AZ를 모두 선택하는 경우, 제가 아는 바 로는 단순히 "Google에서 머신 유형과 가용성을 기반으로 영역을 자동으로 선택해주는 것"일 뿐, Failover, 지연시간 비용, 관리편의성 등 이런 것들과는 관련이 없습니다. [1] 혹 제가 알고있는 내용이 아닐수도 있어, 공식적인 Docs가 있다면 해당 내용의 출처를 알려주시면 감사하겠습니다.[1] https://cloud.google.com/compute/docs/regions-zones?hl=ko
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
혹시나 gradle 로 실행 어떻게 해야하나 싶으신 분들
저는 기존에 jdk 11 을 환경변수로 넣고 있어서 jdk21 은 인텔리제이에서 잡아다 쓰고 있었는데, 터미널은 시스템의 환경변수를 따라가다보니 좀 귀찮아서 찾아보니까 프로젝트 루트 디렉토리에 gradle.properties 라는 파일 생성한 뒤 org.gradle.java.home= 의 값을 넣어줘야합니다. 인텔리제이 상단 메뉴에서 File -> project Structure -> SDKs -> jdk21 버전 클릭 -> 'JDK home path' 의 경로를 통째로 org.gradle.java.home 의 값으로 복붙 -> 역슬래시(\)는 슬래시(/) 로 변경 -> 우측 사이드 패널에서 코끼리(gradle) 펼쳐다가 수동으로 새로고침 -> 인텔리제이 터미널에서 ./gradlew bootRun --args='--server.port={포트번호}' 입력하면 잘 됩니다.
-
미해결비전공자도 이해할 수 있는 AWS 중급/실전 (보안, 가용성편)
가용영역마다의 nat 게이트웨이 필수?
선생님께서 설계하신 것처럼 가용영역마다 nat gateway를 생성하셨던데 가용영역마다 natgateway는 분리되어야하나요?region-b 의 server는 region-a의 natgateway를 이용할 수 없나요?
-
해결됨Spring Boot TDD - 입문부터 실전까지 정확하게
assertThat 상태 코드 비교
학습 관련 질문을 남겨주세요. 구체적으로 적을수록 좋아요!마크다운과 단축키를 활용하면 글을 더 편하게 작성할 수 있어요.커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해보세요.서로 예의를 지키며 존중하는 분위기를 함께 만들어가요.잠깐! 인프런 서비스 관련 문의는 1:1 문의하기를 이용해 주세요안녕하세요 좋은 강의 만들어주셔서 감사합니다. 실무에 적용할 수 있도록 열심히 듣고 있습니다.강의 내용과는 조금 거리가 있는 질문일수도 있겠으나 궁금해져서 여쭤봅니다. assertThat으로 응답코드 검증 시 getStatusCode().value() 와 200으로 직접 코드값을 검증하시는 이유가 있을까요? getStatusCode() 와 HttpStatus.OK 로 enum 타입 검사가 의도가 명확하지 않나? 라는 의문이 들어서 특별한 이유가 있으신 건지 궁금해서 질문 남겨봅니다
-
해결됨아키텍처와 함께하는 GCP (Google Cloud Platform)
BIgQuery에서 사용할 데이터를 업로드 하기 (권한부여필요)
안녕하세요.올려주신 강좌 너무 유익하게 잘 보고 있습니다.감사합니다. 섹션 12. GCS (Google Cloud Storage)BIgQuery에서 사용할 데이터를 업로드 하기에서 수업 노트에 올라와있는구글 드라이브에 액세스 권한이 필요하여 다운로드가 안됩니다.(아파트거래, 시군구코드 csv 파일 입니다) 익명 액세스에 대해서 read 권한을 부여해주시면 감사하겠습니다
-
미해결ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
Business Layer 종속성 추가 불가 문제
12_3강을 듣고 있는데, HelloASP 프로젝트에서 종속성 부분을 우클릭해서 프로젝트참조추가 버튼을 눌러 Business Layer를 추가한다고 말씀주셨습니다.똑같이 따라 했는데 추가가 되지 않네요. 종속성 부분을 다시 우클릭해서 프로젝트참조추가 버튼을 누르면 Business Layer에 체크 박스가 해제 되어 있습니다. 제가 놓친 부분이 있으니까 그런 거 같은데 어딘지 모르겠습니다 ㅠㅠ 살펴 볼 만한 요소가 있을까요 ㅠㅠ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하세요 라우트 과정에서 http프로토콜 -> lb 프로토콜 질문 있습니다.
기존에는 http://localhost:8081 과같이 보내줬는데, 이걸 lb:/MY-FIRST-SERVICE로 바꿨습니다.그렇다면, 원래 localhost:8081로 직접 http 프로토콜로 보내줬던건, 유레카를 거치지 않았고, 하드코딩으로 직접 보내줬던 것이고, 그리고 lb:/를 이용하는 것이 유레카에 저장되어 있는, 정보들을 통해 읽어와서 동적으로 보내주는 것으로 이해하였는데, 제가 이해한게 맞을까요?
-
해결됨Spring Boot TDD - 입문부터 실전까지 정확하게
테스트 격리에서 테스트 랜덤 실패 이유
69강 테스트 격리에서 테스트가 랜덤으로 실패하는 이유가 뭔가요?싱글톤때문에 발생하는 문제인건 알겠는데 조회할 때 Exception이 생기는 이유를 모르겠습니다. ㅠㅠ
-
미해결ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
Console.WriteLine
백엔드에서 Console.WriteLine 찍은건 어디서 볼 수 있나요 ?
-
미해결Spring Boot TDD - 입문부터 실전까지 정확하게
테스트 코드 작성 범위 고민
안녕하세요! TDD 평소에 관심이 많았지만 실무에서 막상 적용하려니 고민이 많았는데 좋은 강의 만들어 주셔서 감사합니다. 섹션5까지 수강했는데 벌써 만족스럽네요 수강평 5점 먼저 드렸고 평소에 실무에서 항상 고민이 되던 부분이 있어서 질문드려요! 테스트코드가 너무 많아지는 것이 부담스러워서 하는 고민인데요. 특정 Service 메서드의 테스트코드를 작성 할 때 해당 메서드가 사용하고 있는 Repository 메서드 에서 테스트한 내용을 Service 에서 중복적으로 테스트해야하는 가에 대한 고민입니다. 참고로 Service, Repository 메서드 둘다 응답에 영향을 미치는 동일한 파라미터를 인풋으로 받고 있다는 전제입니다. GPT 에게 물어보면 아래와 같이 대답을 하는데요. 서비스 메서드의 인풋값이 변경되면 응답에 영향을 미치는데 Repository에서 테스트했다고 안하는 것이 맞는가? 라는 고민이 계속 되네요. 고견 주시면 감사하겠습니다![GPT 답변]Service 테스트는 Repository 동작이 "올바르다고 믿는다는 전제 하에" 작성하는 것이 일반적인 전략입니다.즉, Repository의 구현 자체를 Service 테스트에서 다시 검증할 필요는 없습니다. 질문 카테고리가 "수업질문"인데 전체질문으로 변경하는 버튼이 없어서 일단 그대로 둡니다 ㅜㅜ
-
미해결Spring Boot TDD - 입문부터 실전까지 정확하게
질문드립니다.
안녕하세요! 강의 절반을 본 수강생입니다.뒷내용에 나올법한데 질문드려봅니다. 강의에서 거짓음성에 대한 경험때문에 테스트 코드에 @Transactional 를 안붙이신다고 하셨습니다. 그럼 예를 들어서 개발 디비기준으로 CRUD 테스트를 작성하시는건가요? 또 다른 질문으론TDD 기법이 아닌 , 실무 회사 코드에서 기존 코드에 인터페이스 테스트를 작성하려고 합니다 TDD가 아닌 유닛테스트로 이해가 되는데, 이런 방법또한 상관 없을까요?
-
미해결Spring Boot TDD - 입문부터 실전까지 정확하게
cqrs 명령 아키텍처 개선 질문
안녕하세요 선생님 제가 이해가 잘 안된걸 수 있어서 확인차 질문 드립니다!var executor = new RegisterProductCommandExecutor(productRepository::save); executor.execute(command, uuid, sellerId);명령 조회를 개선하면 RegisterProductCommandExecutor 라는 실행기를 만들어서 execute 로 실행하는 동작으로 이 구조를 pdf 자료에서 확인하면궁금한점이명령모델이 new RegisterProductCommandExecutor(productRepository::save); 로 실행기를 만들면 명령모델이 실행기를 만들면서 productRepository 라는 기반구조에 의존하고 있는거 아닌가요? 구조자체에서 보면 명령실행기는 execute 를 통해서 실행기가 참조하는 기반구조 기능을 실행하는 건 직접 의존하지 않아서 자유도가 높아보인다? 라는 생각이드는데요, 실행기를 만들때 명령모델은ProductRepository 를 알아야할 것같아서 의미가 없어보입니다.실행기를 만들때 실행기 자체가 bean으로 등록이 되고 실행기 bean 안에서 ProductRepository 를 스프링에서 주입받고, 실행기를 만드는 명령 모델은 실행기만 주입받고 파라미터로 repository 를 넘겨도 되지 않으니 이게 정말 의존하지않는 구조같은데요.(제가 말한 (2) 방식이라면) 이이렇게 되면 그냥 돌고돌아서 결국엔 처음 방식인 ProductRepository 인터페이스를 (추상화 되어있으니) 그냥 바로 빈을 주입받는 것이랑 별차이 없다고 생각합니다조회도 역시 이런생각이 들었습니다. 명령과 조회를 분리한다는 개념은 이해가 갈거같은데 각 명령과 조회 모델이 기반구조에 의존? 한다는 개념을 잘 이해가 가지 않습니다!
-
해결됨대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [이론편]
강의 내용 관련 이해가 잘 되지 않아 질문 남겨봅니다.
main 은 id를 가지고 있고, 이를 복제한 replica 들은 main 의 아이디로 그룹화되어 있음 그런데, main 이 어떠한 일로 인해(삭제 등) 새롭게 만들어지면 새로운 id 를 가지게 됨 이때 구 id 를 가지고 그룹화되어 있는 replica 들은 현재의 main 과 id 가 다르니 전체 동기화가 일어남 그러면, [구 id 를 가지고 그룹화되어 있는 replica 들] 은 계속 구버전 id 를 가지게 되는건가요?아니면, 동기화 후 새로운 id 로 다시 그룹화가 되는 걸까요?추가로, 강의 초반에 위 내용 관련해서 '카프카와 비슷하다'라는 설명이 나왔는데,카프카에 대해 잘 모르는 입장에서는 조금 혼란스러울 수 있을 것 같습니다.가능하시다면 추후 강의를 개선하실 계획이 있으실 경우이 부분을 조금 더 자세히 설명해주시면 좋을 것 같습니다.
-
해결됨대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [이론편]
Cache-Aside 패턴에서 Cache Miss 시
안녕하세요 강사님!Look-Aside 패턴과 Thundering Herd 관련 강의(3:37~) 내용을 듣다가 궁금한 점이 있어 질문드립니다. 캐시-어사이드 패턴에서 캐시 미스가 발생했을 때, 강의 중 보여주신 그림에서는 ‘캐시가 직접 DB를 조회하고 데이터를 업데이트한 뒤 서버에 응답까지 전달하는 구조’처럼 표현해주셔서 다소 혼란스럽습니다. 제가 알고 있기로는 캐시-어사이드 패턴은 캐시 미스 발생 시 애플리케이션(서버)이 직접 DB를 조회하고, 조회한 데이터를 캐시에 갱신(PUT)한 뒤 클라이언트에 응답하는 방식으로 동작하는 것으로 알고 있습니다. 만약 MSA 환경에서 캐시 서버가 별도로 구성되어 있고, 데이터를 API 통신 형태로 제공하는 구조라면 그림으로 그리시면서 설명해주신 부분이 어느 정도 이해가 되지만, 해당 파트가 MSA 를 전제하고 설명하는 맥락은 아닌 것 같아서요. 혹시 이 부분에 대해 제가 잘못 이해한 부분이 있다면 피드백 주시면 감사하겠습니다!
-
미해결Spring Boot TDD - 입문부터 실전까지 정확하게
거짓 양성 감지 노하우 질문입니다
안녕하세요 규원님. 강의 잘 듣고 있습니다. 제가 실습 코드를 따라하다가 오탈자가 생겨 이를 해결하는 과정에서 의문점이 생겨 질문 남깁니다. shopper 토큰 발급 엔드포인트 구현 과정에서 @RequestBody 어노테이션을 누락했습니다@PostMapping("/shopper/issueToken") ResponseEntity<?> issueToken(IssueShopperToken query) { return repository.findByEmail(query.email()) .map(shopper -> composeToken()) .map(AccessTokenCarrier::new) .map(ResponseEntity::ok) .orElseGet(() -> ResponseEntity.badRequest().build()); }문제는 이런 상황에서 400이 발생하며 실패해야할 테스트 코드가 통과하게 됩니다.@Test void 잘못된_비밀번호가_사용되면_400_Bad_Request_상태코드를_반환한다( @Autowired TestRestTemplate client ){ // Arrange var email = generateEmail(); var wrongPassword = generatePassword(); var password = generatePassword(); client.postForEntity( "/shopper/signUp", new CreateShopperCommand(email, generateUsername(), password), Void.class ); // Act ResponseEntity<AccessTokenCarrier> response = client.postForEntity( "/shopper/issueToken", new IssueShopperToken(email, wrongPassword), AccessTokenCarrier.class ); // Assert assertThat(response.getStatusCode().value()).isEqualTo(400); }이유를 고민해보고 다음과같은 결론을 짓게 되었습니다.@RequestBody가 없는 경우 컨트롤러 메서드의 매개변수는 기본적으로 form data로 인식하게 된다.따라서 IssueShopperToken이 form data로 인식되게 된다.현재 테스트에서는 상태코드가 400인지만을 확인한다.하지만 form data가 없는 경우에도 400이 발생한다.테스트가 통과한다. 거짓 양성의 사례라고 보여집니다. 이경우에는 Assert절을 강화해 상태코드 말고도 검증되어야할 항목들을 추가해 거짓 양성을 방지할 수 있을거라고 생각됩니다. 이렇듯 테스트코드도 사람이 작성하다 보니 Assert절을 어느정도 수준까지 구체적으로 작성해야 할지를 TDD가 익숙하지 않다면 빠르게 식별하기 어렵다고 생각합니다.실무에서는 이와같은 상황은 매우 치명적일 수 있을거 같고요.그래서 실무에서 필요한 Assert절을 구체화하는 명확한 기준이나 노하우가 있으신지가 궁금합니다!
-
해결됨시스템 디자인 첫걸음: 면접에서 돋보이는 백엔드 아키텍처 설계하기
멱등성. '같은 요청'의 기준?
같은 요청이 여러 번 들어와도 한 번만 처리하는 것. 여러 번의 요청이 들어왔을 때 이 요청이 '같은 요청' 이라는 것을 정확하게 판단할 수가 있을까요?예를 들어 똑같은 점포의 똑같은 POS에서 똑같은 액수의 포인트 적립/사용이 두 번 들어왔을 때,이 두 요청이 각자 다른 요청인지? 클라이언트 단의 문제로 인해 같은 요청을 두 번 보낸 것인지? 정확하게 판단할 수 있는 걸까요?두 요청의 도착 시간 간격이 매우 짧을 때-> 일반적인 상황에서 같은 동작이라고 판단할 수야 있겠지만.. 매우 빠르게 요청을 계속해서 받아야 하는 상황이라면?도메인 특성에 따라 같은 요청임을 판단할 수 있는 기준이나 상황이 달라지기야 하겠지만 정확하게 보장 받을 수 있는 기준은 존재하기 어렵지 않나 하는 생각이 듭니다.실제 사례를 통해 예시를 들어주실 수 있는 게 있을까요?
-
해결됨ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
iis 배포 후 view페이지 수정
수업한 내용을 바탕으로visual studio에서 배포를 한 후배포한 경로로 iis 세팅을 하였습니다~ view페이지를 수정 할때마다 iis를 재기동 해야하는 문제가 발생하는데 웹폼처럼 view페이지(자바스크립트부분) 만 수정 할 수 있나요? 만약에 view페이지를 수정할때마다 배포를 하고 iis를 잠시 껐다 켜야하면 실무적으로 사용할 수 없는기술이 아닌가 싶어서요 제 질문은 view 페이지의 수정이 빈번하게 발생할때 iis 재기동 없이 업데이트 할 수 있는 방법이 있는지 여쭤보고 싶네요 웹폼처럼.. aspx파일만 수정하면 반영됬으면 좋겠는데...