묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! Querydsl
테스트db 분리하기 yml
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의처럼 스프링부트 프로젝트에서 test디렉토리의 yml파일에 별도의 데이터베이스 설정을 하지 않는다면 임베디드 데이터베이스(h2)를 사용할 것으로 예상하고, 이 때 테스트를 진행했는데 main디렉토리의 yml파일 데이터베이스를 사용하는 것으로 보입니다. 이는 @SpringBootTest를 사용해서 테스트를 실행했기 때문이며, 애플리케이션 전체 컨텍스트를 로드 하는데 설정 파일application.yml도 포함해서 로드하기 때문입니다.만약 테스트 db를 main db와 다르게 임베디드 데이터베이스 를 사용하려면, 테스트의 yml 파일에 profile을 설정해 주면 가능합니다.db2에서 배웠던 내용인데, 사고 과정이 역순이기도 하고 ai의 정리를 한번 듣고 싶어서 질문 올려보았습니다.
-
미해결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 프록시 객체에 담겨야 할 거라고 생각했는데, 디버깅과 콘솔에서 확인해본 결과 멤버 엔티티가 그대로 담긴 것 같아서 질문드립니다인터페이스디버깅 결과콘솔 화면
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트코드 순서 질문
강의를 듣다 궁금한게 생겼습니다.보통 API 개발을 할 때, 컨트롤러단 부터 완성이 되고 나머지 서비스나 영속성 계층 로직이 완성 되는것 같은데 테스트 코드 순서를 어떻게 가져가시나요 ?강의에서는 영속성 -> 서비스 -> 컨트롤러 순으로 테스트가 진행 되는데 이 순서대로 하시나요 ?
-
미해결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는 잘 등록된 것 같습니다.. 뭐가 문제일까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
@SpringBootTest 사용 이유
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요! Persistence Layer에서 @Mock 대신 @SpringBootTest를 사용해 단위 테스트를 진행하는 이유가 궁금합니다! 리소스가 더 사용되면서 테스트가 오래걸리는 단점이 있지 않나요?같은 이유로, Business Layer에서 @Mock과 @InjectionMocks으로 단위테스트를 진행하는 대신, @SpringBootTest로 통합테스트를 선호하시는 이유가 무엇인가요?@SpringBootTest를 사용해도 큰 단점은 없는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
[주문조회 4V; jpa에서 DTO 직접 조회] 응답으로 DTO 전달 시, enum 과 값 타입 포함 관련
안녕하세요, 강의에서 궁금한 점이 있어 질문 드립니다.응답으로 엔티티를 그대로 반환하는 것이 아닌, DTO 를 반환하는 이유 중 하나가엔티티 변경 시, API 스펙에도 영향이 가는 것을 방지하기 위함이라고 이해했습니다. 그렇다면, 4:35 분 경, OrderQueryDto 를 구성할 때, Entity 에서, 해당 값들을 받아올 때, 1) Address 와 같은 값 타입이나,OrderStatus 와 같은 enum 들도, 별도의 Dto 로 만들어서 반환해야 되는것인지, 2) 그게 아니라면, 값 타입이나, Enum 값은 변경이 별로 없다는 것을 전제로 하고, 그대로 내려줘도 되는 것일지3) 둘 다 이유가 될 경우, 최종적으로는, 회사 별 코드 스타일대로 따르면 될지 질문드려요.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
실습 코드 커밋
커밋을 강의 중간에 계속 하던데 깃허브에는 커밋이 한개밖에 없네요 어떻게 알수있을까요
-
해결됨개발 입문을 위한 실무자가 알려주는 Spring Boot
혹시 대규모로 메일 발송을 해야할 땐 어떤 조치를 해야하나요?
혹시 대규모로 메일 발송을 해야할 땐 어떤 조치를 해야하나요? 이번에 회사에 대량의 이메일을 발생할 일이 있는데... 어떤준비를 해야할지 모르겠어서 조언을 구하고싶습니다.
-
해결됨개발 입문을 위한 실무자가 알려주는 Spring Boot
템플릿의 대한 정보는 sesclient에 왜 넘겨주나요?
템플릿의 대한 정보는 sesclient에 왜 넘겨주나요?그냥 문자열 값같은데 메일 템플릿의 대한 내용이라면 그건 어디에 저장하고 있어야되는건지 궁금합니다.
-
해결됨Spring Boot를 활용하여 채팅 플랫폼 만들어보기
작동하는 방법
이거 작동 확인하려면 source_code에 있는 client와 server 동시에 실행 시켜서 작동 확인해보면 되나요?
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
도메인형 패키지 구조 질문
안녕하세요.강의에서 사용하는 도메인형 패키지 구조는 도메인 주도 설계(DDD) 원칙이 적용된 구조라고 봐도 될까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
isLoaded, gerReference
emf.PersistenceUnitUtil.isLoaded()로 프록시 인스턴스가 초기화 되었는지를 확인할 때 Member member1 = new Member(); member1.setUsername("user1"); em.persist(member1); em.flush(); em.clear(); Member refMember = em.getReference(Member.class, member1.getId()); System.out.println("refMember.getClass() = " + refMember.getClass()); // refMember.getUsername(); // 프록시에 없는값을 조회하여 프록시를 초기화 // Hibernate.initialize(refMember); // refMember를 강제로 초기화 System.out.println("isLoaded(refMember) = " + emf.getPersistenceUnitUtil().isLoaded(refMember)); tx.commit();이런 상황이면 false가 나오는 이유에 대해 메커니즘을 제대로 이해했는지 모르겠어서 문의드립니다!저는 getReference만으로도 객체를 생성했으니까 초기화가 이루어졌구나라고 이해했는데,처음 getReference로 조회하면 프록시 객체가 생성될 때 원래의 Entity를 상속받아서 생성되는게 아니라,아규먼트 값의 getId값만으로 프록시가 생성되었기 때문에 초기화는 아직 안한 상태여서 그런것일까요?그럼 초기화를 해야서 프록시의 target에 실제 객체를 연결해야지만 실제 엔터티를 상속받은 프록시 객체라고 이해해야할지 명확하게 이해가 안되어서 문의드립니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
given - when - then 구조에 대해 질문 있습니다.
@Test void remove() { CafeKiosk cafeKiosk = new CafeKiosk(); Americano americano = new Americano(); cafeKiosk.add(americano); assertThat(cafeKiosk.getBeverages()).hasSize(1); cafeKiosk.remove(americano); assertThat(cafeKiosk.getBeverages()).isEmpty(); }저는 given은 CafeKiosk cafeKiosk = new CafeKiosk(); 이런식으로 객체를 생성하는 단계when은 cafeKiosk.add(americano); 와 같이 실제 메서드를 사용하는 단계then은 assertThat(cafeKiosk.getBeverages()).isEmpty(); 와 같이 실제값과 기대값을 검증하는 단계라고 이해를 했습니다. 제가 given - when - then에 대해 위와 같이 이해를 했는데 맞게 이해를 한건지 궁금합니다.먼가 깔끔한(?) 코드는 given - when - then이 딱딱 나눠져야 하는건지 (객체 생성은 given 쪽에 몰아두고 메서드 사용은 when쪽에 몰아두고 검증은 then쪽에 몰아두는) 궁금합니다.하나의 단위 테스트에서도 given - when - then 의 흐름이 여러개가 존재할 수 있나요? 전체적인 하나의 흐름만 존재하는 건지 아니면 단위 테스트 내에서도 여러 흐름이 존재하는건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order import 문제
<orderServiceTest> <OrderService>Order의 import를 domain에 있는 Order class로 했는데 왜 위와 같은 오류가 나는지 모르겠습니다.
-
미해결실전! Querydsl
pageable size 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Pageable의 size의 최댓값을 제한하거나 개발자가 정한 임의의 값으로 고정하는 방법이 있을까요?다른 질문글에 있는 링크는 글이 삭제된 건지 제대로 나오지 않습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
6장 상품 등록을 이미지 없이 등록 후 getList 할 때 질문
안녕하세요 6장 상품 등록을 이미지 없이 등록을 해봤는데요 예를 들어 상품번호가 17번이면product_image_list 테이블에 17번(product_pno)이등록되지 않아서 left join이 걸리지 않아 리스트를 호출시 해당 번호의 상품만 호출이 안되더라구요이럴 경우에는 어떠한 방법으로 해결할 수 있을지 궁금하여 질문드립니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
AWS EC2 Launch Template 생성 문의 - 빈즈토크 배포 이슈
안녕하세요. 한가지 문의 드립니다.부록_AWS 빈즈톡, RDS, S3 자료.pdf 를 보고 있습니다.7 (/ 45) 페이지에서 보면 정상적으로 환경 구성이 완료되면 configurations 결과 화면이 잘 출력됩니다.헌데 일부 계정 아마도 최근에 생성한 aws 계정은 이게 정상적으로 진행이 안되고 아래와 같은 메시지가 나옵니다.Creating Auto Scaling launch configuration failed Reason: Resource handler returned message: "The Launch Configuration creation operation is not available in your account. Use launch templates to create configuration templates for your Auto Scaling groups. (Service: AutoScaling, Status Code: 400, Request ID: 850290f7-96b3-4229-81dc-966dbee4d735)" (RequestToken: 44311bf6-616a-3270-9235-5c2d1993a1b7, HandlerErrorCode: GeneralServiceException) AWS EC2 Launch Template을 반드시 생성해야 7 (/ 45) 페이지에서 보이는 환경 구성이 정상적으로 완료가 되고 그 결과 configurations 화면이 잘 출력되는 것으로 최근 변경 된 것 같습니다.문제는 이 AWS EC2 Launch Template 생성에 대한 부분에서 벽에 막힌 상태입니다.어떻게 하면 좋은지 요청 드려 봅니다.감사합니다.
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
application.yml token 선언 시 오류
token: secret: and0LXRva2VuLXNlY3JldA== # 임의의 문자열 access-token-expiration-time: 900000 # 15분 1000(ms) x 60(s) x 15(m) refresh-expiration-hours: 1209600000 # 2주 1000(ms) x 60 (s) x 60(m) x 24(h) x 14(d) 구성 프로퍼티 'token. access-token-expiration-time'을(를) 해결할 수 없습니다구성 프로퍼티 'jwt. refresh-token-expiration-time'을(를) 해결할 수 없습니다. 위 코드말고 다른 코드로 대체해야 하는지 궁금합니다.
-
해결됨Spring Boot를 활용하여 채팅 플랫폼 만들어보기
Package 구성
domain안에 따로 repository를 만든 이유가 있나요?