묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
MSA와 사가 패턴을 찾아보면서 궁금했던 부분이 있어서 질문 남겨봅니다.
모든 자료가 그런 것은 아니지만 많은 MSA 관련 자료가 EDA (Event-Driven Architecture)를 이야기하고 있고, 카프카를 도입하면서 느슨하게 연결되어있고 원하는 메시지만 수신할 수 있도록 하는 구조로 설명을 하는 것 같습니다. (메시지 큐를 도입했을 때의 문제점에 대한 이야기는 별로 없고, 그 이상의 무언가를 찾거나 노하우를 구하기 쉽지 않은 듯 하네요.) 디커플링 자체는 상당히 좋은 장점 중 하나이지만, 개별 시스템으로 분리되면서 트랜잭션 관련해서도 고민이 많이 필요하고 연결하는 고리가 많아지는 만큼 신경써야 할 부분도 많을 것으로 보입니다. 그래서 들었던 질문이 몇 가지 있는데 마땅히 답을 구할만한 곳이 없었는데 이 쪽에서 관련된 질문에 답을 해주실 것 같아 달아봅니다. 1. 이벤트 소싱에 대해 맞게 이해한 것인지 ? 우선 이벤트 소싱이 CQRS, 비동기 처리와 많이 엮여서 나오는 주제이긴 하지만 이벤트 소싱 자체만을 두고 봤을 때에는 1) 이벤트의 모든 이력을 남기고 2) 핸들러가 이를 처리하는 것이 전부라고 이해해도 될까요 ?CQRS는 표면적으로는 변경과 질의를 분리하는 개념이지만, 이벤트 기록을 모두 재생해서 조회하는 것이 어려워서 질의와 변경을 분리하는 아이디어 때문에 이벤트 소싱에서 함께 언급되는 패턴으로 이해했고, 비동기 처리는 이벤트 소싱이 비동기 처리를 편하게 할 수 있는 환경 정도로만 이해했습니다. 제가 이해한게 맞는지 모르겠어서 잘 이해했는지 질문을 드리고 싶구요 ㅎㅎ 2. 짧은 시간 안에 처리되어야 하는 API도 MSA에 적합한가 ? 위에 제가 이해한 것이 맞다는 가정하에 말씀드리는 거긴 한데요. 예를 들면 만약에 OTT에서의 유료 영상 결제, 문서 파일 결제, 웹툰 등에서 결제하자마자 결과를 검증하고 사용해야 하는 과업이 있고, 이 과업을 단일 API로 처리하던 것을 MSA로 전환할 경우에 1) API, gRPC 등 네트워크 통신을 사용하는 MSA의 경우 : 코드나 개념적인 분리를 통해 서비스를 작게 쪼갤 수 있는 장점은 있지만 네트워크 이슈, 롤백 등 신경써야 할 문제가 많아진다 2) 카프카 등의 메시지 큐를 통한 MSA일 경우 : 카프카 자체의 문제 혹은 처리하는 개별 마이크로 서비스에 병목이 생기면 처리가 지연되며, 단일 API로 주고받던 경우에는 앱 수정이 불가피하다 (카프카를 사용하면 더더욱 이벤트 소싱을 고려할 수밖에 없고 PENDING 상태가 기존 앱에서 정의되지 않았기 때문에) 는 문제가 있을 것 같습니다. 아무래도 제가 카프카를 넣는 것이 우려가 되는 이유는 1) 각 서비스에서 발행한 카프카 메시지를 어떻게 추적하는지 쉽지 않다고 생각했고,2) 장애 포인트가 쪼개지는 서비스와 개념적으로 발생하는 연결의 갯수에 비례해서 많아지기 때문이라 생각했고,3) 또한 카프카를 통해서 처리하는 속도가 API로 처리하는 지금 속도 대비 느리게 세팅된 상태라 과하게 생각하는건가 싶기도 하고, 4) 앱에서 '서버의 아키텍쳐 변경을 위해 생긴 PENDING 상태에 대해 알고 있어야 하는가'에 대해서 고민이 많아서 그런 것 같습니다. 제가 MSA 관련해서는 경험이 없다보니 의견을 좀 들어보고 싶습니다. 3. 보상 트랜잭션과 관련하여각자의 로컬 트랜잭션만 보장하고 문제가 생기면 그게 반하는 트랜잭션을 새로 발행해서 상태를 상쇄시키는 형식인 것 같습니다. 상태 머신이 명확하게 구분된다면 보상 트랜잭션 구현이 용이하겠지만, 그렇지 않을 경우나 모호한 경우가 있을 것이라 생각됩니다. 또한 보상 트랜잭션이 실패하는 경우 더더욱 현상 파악이 쉽지 않을 것 같기도 하고, 구현하는 서비스마다 제각각이라 노하우를 구하기 쉽지 않을 것으로 보여서 구현 난이도가 꽤 올라갈 것으로 보이는데, 이런 부분을 보완할 수 있는 방법이 있을지 궁금합니다.
-
미해결비트코인 알고리즘 트레이딩 봇 개발
read_json오류 문의
read_json으로 출력시 오류가 발생합니다. vscode 와 jupyter 모두 오류가 발생하네요. 어떤 문제일까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
select 쿼리 발생
영한님 서포터즈님들 안녕하세요 프로젝트를 하다가 갑자기 궁금한 점이 생겨 테스트를 만들어보고 제가 현재 어느 부분에서 헤매고 있는지 몰라서 질문드립니다,, ```java @Entitypublic class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();} @Entitypublic class Member{@Id @GeneratedValue@Column(name = "MEMBER_ID")private Long id;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "TEAM_ID")private Team team;public void addTeam(Team team) { this.team = team; team.getMembers().add(this);} Main 부분 Team team1 = new Team();team1.setName("team1");em.persist(team1);Member member1 = new Member();member1.setName("member1");Member member2 = new Member();member2.setName("member2");Member member3 = new Member();member3.setName("member3");member1.addTeam(team1);member2.addTeam(team1);member3.addTeam(team1);em.persist(member1);em.persist(member2);em.persist(member3);em.flush();em.clear();Team team = em.find(Team.class, team1.getId());for (Member member : team.getMembers()) { //select 쿼리가 member의 개수만큼 나가야한다고 생각 System.out.println("member.getName() = " + member.getName());} ``` db에도 잘 저장되있습니다. 제가 궁금한 점은 주석과 같이 member.getName을 사용하게 되면 member 수만큼 쿼리가 나가야한다고 생각이 드는데 제가 어느 개념을 놓치고 있는지 너무 궁금합니다.. 프록시 부분을 다시 봐도 member의 실제 값을 사용하는데 어떻게 List<Member> members를 한 번에 조회해오지? 라는 생각이 듭니다,, 혹시 어느 부분을 놓쳤는지 말씀해주시면 바로 공부해보도록 하겠습니다 감사합니다 추가로 ```java Team team = em.getReference(Team.class, team1.getId()); ``` 제가 프록시와 헷갈려서 위와 같이 코드를 작성하고 다시 해봤는데도 똑같습니다,,
-
미해결대세는 쿠버네티스 [초급~중급]
CronJob concurrencyPolicy 설정 관련
안녕하세요. 우선 좋은 강의 해주셔서 감사드립니다. 중요한 내용은 아니고 강의를 보다가 궁금한 내용이어서, 1.19 버전 이후에는 replace 모드로 될 때 기존 Job은 삭제되고 새로운 Job이 생성되도록 변경이 되었는데, 1.19 이전에는, 1. 기존 Job은 유지되고 Job에서 연결되는 Pod를 새로 생성 이 된다고 하셨는데, 이 과정에서 궁금한게.. 1-1. 기존 Job에서 동작 중인 Pod는 종료처리 되는지(Terminating..) 1-2. 기존 Job에서 동작 중이던 Pod는 그대로 돌고, 새로 생성된 Pod도 새롭게 작업을 수행(Job과 연결되는 Pod만 변경되고, 기존 Pod는 그대로 작업 수행)되는지, 여쭤보고 싶습니다. 질문이 이상해서 요약드리면, 1. cronjob이 수행되면서 job을 replace하게 되는 상황에서(기존 잡이 안끝났는데, 새로운 잡을 수행해야 할 때) 2. Job은 그대로이고, Pod를 새로 생성해서 replace를 하게 될 때, 3. 기존 Job에서 생성된 Pod는 종료되고, 새로운 Pod가 생성되는지, 아니면 그냥 새로운 Pod만 따로 생성되는지, 여쭤봐도 될까요? 기존 Pod는 제거가 될 것 같기는 하지만, 강의를 듣다가 기존 버전에는 어떻게 동작했는지 급.. 궁금해서 여쭤보게 되었습니다. 감사합니다. :)
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
gunicorn 질문입니다.
강사님 안녕하세요. 속도 이슈 관련해서 질문드립니다. Gunicorn에서 WORKER TIMEOUT이 자주 뜨는데 해결 방법이 없을까요? 우선 크롬 콘솔에서 확인해보면 아래와같이 CORS 에러가 나긴 하는데 CORS_ALLOWED_ORIGINS에 주소를 추가해주어도 여전히 에러가 발생하고 있습니다. 혹시 Azure쪽에서 따로 추가해야하는 설정이 있을까요?
-
미해결초보를 위한 쿠버네티스 안내서
nodePort 외부접근 안됨
안녕하세요 수업 잘 듣고있습니다! 실습하는 부분에서 노드포트를 이용해서 외부에서 접속하려고 하는데 접속이 안됩니다ㅠㅠ macOS이고, minikube ssh에도 접속이 되고, minikube에 접속한 후(노드에 들어가서) curl <svc EXTERNAL IP>:3000 으로 테스트하면 결과가 잘 나오는데, 확인해야 할 부분이 뭐가 있을까요? 추가로 알려드려야 할 내용이 있다면 알려주세요. 감사합니다!
-
미해결
ㅇ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결애플 웹사이트 인터랙션 클론!
중요 메모
식은 죽은 원래 맛이 없다.. 1분코딩님은 죽을 원래 싫어하신다.. 메모..
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
mongooseServerSelectionError 로 인한 디비연결실패
const express=require('express'); const app=express(); const port=3000; const mongoose=require('mongoose'); const uri=`mongodb+srv://username:password@cluster0.r3buu.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`; mongoose.connect(uri).then(()=>{ console.log('MongoDB Connected...'); }).catch((err)=>{ console.log(err); }) app.get('/', (req, res)=>{ res.send('Hello world!'); }); app.listen(port, ()=>{ console.log(`Example app listening on port ${port}!`); }); mongooseServerSelectionError 로 뜨면서 디비 연결이 안됩니다. 웬만하면 이 오류는 ip문제라고 해서 몽고디비 사이트에서 네트워크 들어가서 ip에 현재 ip를 넣어봤는데도 같은 오류가 발생하여 그냥 0.0.0.0을 넣었는데도 같은 오류가 발생합니다. 다른 분들은 0.0.0.0을 넣으면 해결된다고 하는데 저는 공용아이피를 넣어도 해결이 안되네요.. 어떻게 해결해야하나요?
-
미해결버그헌팅과 시나리오 모의해킹 전문가 되기
아래 질문 글 봤지만 이해가 안돼서 질문 드립니다.
hotst파일은 호스트 이름을 IP랑 매핑 시키는 것으로 이해 했습니다. 예를 들어 hosts파일에 192.168.0.5 boan 이라고 입력 되어있을 시 브라우저를 통해 http://192.168.0.5/secret이나 http://boan/secret 으로 접근했을 때 호스트 이름도 결국 IP로 바뀌는 것에 불과하기 때문에 위 2가지 케이스는 모두 같은 결과가 나와야하는거 아닌가요?? 왜 host파일을 수정해야만 정상적인 렌더링이 되는지 궁금합니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
카프카 설정이 맞는건지 궁금합니다.
안녕하세요. 우선 로컬에서 카프카 돌려서 코드상의 문제는 없었던 것 확인했구요. 카탈로그 서비스 돌리기 시작하면서 이상한 부분이 감지되었는데 강사님은 동일한 이슈가 없으셨는지 궁금합니다.엄밀하게는 카프카 이슈지만 카탈로그 서비스를 구동하면서 발견하게 된 문제라 이 쪽에 적습니다. 우선 이슈 사항은 카탈로그 서비스를 동작하면 이상한 에러가 계속 발생하는 것이고 이미지 내에서 발생하는 로그는 다음과 같습니다.1. 카프카 컨테이너 생성 결과 auto.create.topics.enable = trueauto.leader.rebalance.enable = truebackground.threads = 10broker.heartbeat.interval.ms = 2000broker.id = -1broker.id.generation.enable = true...creating topics: example-order-topic:1:1Created topic example-order-topic. 말씀 주신 이미지에서 `KAFKA_CREATE_TOPICS`에서 예제에서 사용하는 토픽을 미리 만들고자 "example-order-topic:1:1" 값을 추가함 (원래는 만들 필요도 없이 auto.create.topics.enable = true로 설정이 되어있으면 자동 생성되는 것으로 알고 있으나, 생성되지 않는 듯 하여 추가했고 로그로 확인)2. 카탈로그 서비스 컨테이너 실행 후 카프카 컨테이너 로그 [2022-02-02 14:16:37,395] INFO [Admin Manager on Broker 1001]: Error processing create topic request CreatableTopic(name='example-order-topic', numPartitions=1, replicationFactor=1, assignments=[], configs=[]) (kafka.server.ZkAdminManager) 위와 같은 로그가 반복적으로 발생 3. 카탈로그 서비스 컨테이너 로그 2022-02-02 14:18:09.506 WARN 1 --- [ntainer#0-0-C-1] org.apache.kafka.clients.NetworkClient : [Consumer clientId=consumer-consumerGroupId-1, groupId=consumerGroupId] Error while fetching metadata with correlation id 958 : {example-order-topic=INVALID_REPLICATION_FACTOR} 거의 카프카 로그 생성 주기와 비슷하게 생성되는 이슈로 보임. 참고로 컨테이너 내에서 `/opt/kafka/bin`에 있는 카프카 명령어로 실행을 하려고 할 경우, (토픽 생성, 목록 조회 등) 로컬에서 실행했을 때와 다르게 제대로 동작하지 않는 것 같아서 해당 설정이 맞는지 약간 걱정이 되네요.
-
해결됨더 자바, Java 8
람다 표현식, 메서드 레퍼런스 관련 질문입니다.
강의 수강 중 의문이 생겨 질문 드립니다. 람다 표현식을 통해 함수 객체가 생성된다고 배웠습니다. 그리고 메서드 레퍼런스는 람다 표현식을 간결하게 쓸 수 있는 것이므로 당연히 메서드 레퍼런스를 써도 어떠한 함수 객체? 가 생기게 된다고 이해했습니다. 여기서 의문이 생기는데 List의 sort() 메서드는 인자로 Comparator를 받고 이는 함수형 인터페이스이므로 메서드 레퍼런스를 통해 Comparator를 생성하여 인자 자리에 넣을 수 있는데 이때 메서드 레퍼런스를 통해 생성되는 '함수 객체'는 Comparator 클래스의 인스턴스 객체인가요? 아니면 다른 종류의 객체인가요? 해당 객체를 통해 reversed 등 Comparator 클래스의 함수를 호출할 수 있는 것으로 보아 Comparator 클래스의 인스턴스인가 생각했는데 제가 이해하기로는 람다 표현식으로 생성되는 객체는 클래스의 인스턴스가 아닐 것 같아서 질문드립니다. 아직 람다 표현식에 대한 이해가 부족해 질문이 조금 두서 없는 점 죄송합니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
스웨거 질문
스웨거를 쓰고 apiproperty 하고 picktype쓸때 에디터에서 저런 에러가 납니다.
-
미해결Redux vs MobX (둘 다 배우자!)
useSelector 사용시 성능 문제점 문의드립니다.
안녕하세요 제로초님 실무에서 redux를 사용중입니다.강의에서 class형과 달리 훅스 방식으로는 useSelector 사용시 const { user , post } = useSelector((state) => state)이렇게 구조분해할당 으로 가져오게 된다면 const user = useSelector((state) => state.user);const post = useSelector((state) => state.user );이렇게 따로 가져오는것에 비해 낭비가 발생하는걸까요?낭비가 발생하는 이유는 비구조화할당으로 해당 객체의 값이 바뀌었는지 알지못해서 항상 기존 값을 기억하지못해서 그런걸까요? 질문드립니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
gateway.ip 가 필요한 값이었는지 ... ?
해당 값의 경우, 다른 분의 질문에서도 말씀 주신 것처럼 외부에서 연동되는 값이기 때문에 Git의 설정 파일을 수정하는게 맞을 것 같긴 한데요. `Configuration Service > Spring Cloud Config - 프로젝트 생성 > 1:52` 이쪽에서 처음 gateway.ip를 사용하시는 것 같은데, 이후로 해당 프로퍼티 값을 따로 사용하진 않는 것으로 보입니다. (apigw의 역참조도 발생하지 않았고 lb://api-gateway-service로 접근하기 때문, 코드상으로도 보이지 않았던 것으로 기억) 때문에 이 설정을 변경하는 것이 필수인 것인지 궁금합니다. (사용처를 못찾아서 여기에 달아야 하는 질문인지는 모르겠습니다)
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
국제화 테스트 과정에서 글자깨짐
[질문 내용]안녕하세요. 국제화 강의를 듣고있습니다. 메세지,국제화단원에서 스프링 메시지 소스 사용의 테스트 과정에서 messages.properties파일에서의 hello를 테스트 하는 과정에서 Assertions.assertThat(result).isEqualTo("안녕"); 하게 되면 ??와 안녕을 비교하네요.. utf-8적용을 해줘야하나요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
"비회원 로그인 실패"
"비회원 로그인 실패"라고 뜨시는 분들은, 앱에 인터넷 권한을 주는 과정을 추가로 진행하셔야 합니다. (강의에는 안 나와요!) 여기 블로그 참고하셔서 AndroidManifest.xml에 permission 추가해주시고, 에뮬레이터에서 앱을 삭제한 후에 다시 실행시켜주셔야 정상적으로 작동합니다! 도움이 되셨으면 좋겠습니다 :)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Test실패 관련 문의
MemberServiceTest 실행시 다음과같이 에러가 발생합니다. Execution failed for task ':test'. > No tests found for given includes: [jpabook.jpashop.service.MemberServiceTest](--tests filter) * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights.
-
해결됨일잘하는 마케터, MD에게 꼭 필요한 파이썬 데이터 분석
데이터시각화 파트에서 사용되는 엑셀파일은 어디서 받을 수있나요?
안녕하세요. 선생님, 강의 잘 듣고 있습니다~ 데이터 시각화에서 사용되는 엑셀파일들은 어디서 받을 수 있을지 문의드립니다. 강의에는 코드 url만 있어서요 ㅠㅠ 감사합니다.
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
43번)뮤직비디오(이분검색 응용) 관련 질문있습니다!
강사님께서 보여주신 코드를 보면, main함수속의 while문에서, if(Count(mid)<=m) { res = mid; rt = mid - 1; } else lt = mid + 1; 이렇게 코드를 구현하셨는데요, 제가 여기서 궁금한 점은, Count(mid)<=m 조건을 만족할때마다, res = mid; 이렇게 DVD의 용량 값을 업데이트를 해주고 있는데요, 저는 Count(mid)==m 이렇게 작을경우는 말고, 오직 같을때만 업데이트를 해줘야한다고 생각하는데, 왜 강사님께서는 사용자가 m개의 DVD를 사용하고 싶다고 했으면, 딱 m개일때만 DVD의 용량을 업데이트를 하지 않고, m보다 더 작은 개수가 나왔을때도, res = mid; 이렇게 DVD의 크기를 업데이트 해주는지 궁금합니다! 답변해주시면 감사하겠습니다!