묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
대규모 시스템에 관련하여 질문 있습니다.
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강의 잘 보고 있습니다. 복습하던 중에 궁금한 부분이 있어 질문을 남깁니다.현업에서 대규모 시스템을 만드는 경우에 헥사고날 아키텍처 + MSA를 사용한다는 것으로 알고 있는데, MVC 패턴이 아니라,헥사고날 아키텍처를 대규모 시스템에서 더 선호하고 사용하는 이유가 무엇인가요?? 추가적으로 이건 강의와는 관련이 없는데, 개인적인 질문이 있습니다.저는 자바 스프링 신입 개발자를 준비하고 있는 학생입니다.지금까지는 MVC 패턴만 사용하고, 모놀리틱 아키텍처를 사용해서 배포를 진행하고 프로젝트를 해왔습니다. 제가 알기로는 학습적으로나 포트폴리오적으로나 필요성을 느껴서 하는 공부가 제일 좋다고 들었습니다. 근데, 최근에는 어떤 필요성을 느끼지 못하면서 대규모 시스템 강의,헥사고날 아키텍처가 중요하다고 하니 강의 등을 듣고 있습니다. 왜냐하면, 본격적인 취업은 내년이고 시간이 좀 남았습니다. 그래서 해당 강의들을 들어두면 언젠가 개인 프로젝트나 현업에서 사용할 수 있지 않을까하고 듣고있습니다만, 제가 사용했던 MVC 패턴의 장단점 등 기본적인 것들도 알지 못하는 상태에서 계속 진도 나가듯이 이런 저런 강의를 듣고 하는게 괜찮을까요? 즉, 아직 기본도 잘 모르면서 계속 새로운 걸 배우는 과정들이 괜찮을까하는 걱정이 드네요. 하지만, 한편으로는 CS지식이 너무 방대해서 기초를 다 잡아두고 다음 단계로 넘어간다는 것도 솔직히 엄두가 안납니다. 그래서 우선은 쭉 이것저것 배워두고 나중에 필요하면 다시 찾아보면서 공부하면 되지 않을까 싶은데, 쿠케님은 어떤 방향이 더 괜찮다고 생각하시나요??
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
eventPublisher.publishEvent 시 @Transactional을 걸어야 하지 않나요?
딩코님! 강의 너무 잘 듣고 있습니다~! 강의를 따라가며 디비와 트랜잭션 그리고 락에 관해 심화 내용도 듣고 포폴도 하나하나 잘 채워가고 있습니다! 다름이 아니라 딩코님이 내주신 과제 중에 의문이 있어 질문을 드리게 되었습니다. 1. 현재 학습 진도4주차 수강 후 락과 트랜잭션 최적화를 수행하고 있습니다. 현재 여러가지 작업(일기 작성, 포인트 적립, AI 댓글 작성 예약, 알림 이벤트 발생)에 대해 facade 계층을 만들어 중요한 작업(일기 작성, 포인트 적립)에 대해서는 트랜잭션을 묶어 우선적으로 처리되게 하고 AI 댓글은 TaskScheduler로 특정 시간 후에 비동기적으로 이루어지게 하며 알림은 spring event로 after commit 후 처리하려 합니다. 2. 어려움을 겪는 부분현재 이벤트 발행 (트랜잭션 커밋 후 실행됨, after-commit)에 대해 의문이 있습니다.현재 딩코님이 올려주신 코드에는@Component @RequiredArgsConstructor @Slf4j public class ImprovedEventJoinWithExternalApiUpdateFacade { private static final String TEST_PHONE_NUMBER = "01012341234"; private final EventExternalUpdateService eventJoinService; private final ExternalEventApi externalEventApi; private final ApplicationEventPublisher eventPublisher; public void joinEvent(Long eventId, Long memberId) { // 1. 기존 서비스로 이벤트 참가 처리 EventWithLockParticipant participant = eventJoinService.joinEventWithTransaction(eventId, memberId); // 2. 외부 API 호출 ExternalEventResponse response = externalEventApi.registerParticipant( eventId, memberId, participant.getEvent().getName() ); if (!response.isSuccess()) { throw new RuntimeException("외부 API 호출 실패: " + response.getErrorMessage()); } // 3. 외부 API 응답으로 참가자 정보 업데이트 eventJoinService.updateExternalId(participant, response.getExternalId()); // 4. 이벤트 발행 (트랜잭션 커밋 후 실행됨) eventPublisher.publishEvent(new EventJoinCompletedEvent( eventId, participant.getEvent().getName(), TEST_PHONE_NUMBER )); } }이렇게 코드 내에 @Transactional이 걸려있지 않습니다. 그런데 이벤트 리스너에는@Component @RequiredArgsConstructor @Slf4j public class EventJoinEventListener { private final KakaoTalkMessageApi kakaoTalkMessageApi; @Async @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handleEventJoinCompleted(EventJoinCompletedEvent event) { try { kakaoTalkMessageApi.sendEventJoinMessage( event.getPhoneNumber(), event.getEventName() ); } catch (Exception e) { log.error("알림 발송 실패. eventId={}, eventName={}", event.getEventId(), event.getEventName(), e); } } } 이렇게 transaction이 커밋된 후에 실행되도록 AFTER_COMMIT이 걸려있는데, 이렇게 되면 이벤트 리스너가 제대로 실행이 안되지 않나요? 제대로 이벤트 리스너가 실행이 되려면 joinEvent부터 @Transactional이 걸려있어야 하지 않나요?3. 시도해보신 내용따로 간단하게 코드를 작성하여 테스트해보았습니다. @RequiredArgsConstructor @Component public class StudyFacade { private final StudyService studyService; private final ApplicationEventPublisher eventPublisher; // @Transactional : 주석 처리하면 밑에 eventEvent가 실행되지 않음 public void execute() { studyService.saveStudy(); eventPublisher.publishEvent("event published"); } @Async @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void executeEvent(String event) { System.out.println("event = " + event); } } @RequiredArgsConstructor @Service public class StudyService { private final StudyRepository studyRepository; @Transactional public void saveStudy() { studyRepository.save(new Study("test")); } } 실제로 execute 메서드의 @Transactional을 주석처리하면 밑의 이벤트 리스너인 executeEvent가 실행이 되지 않더라구요. 이러면 ImprovedEventJoinWithExternalApiUpdateFacade의 joinEvent부터 트랜잭션을 걸어야 하니까 딩코님이 말씀하신 트랜잭션을 최대한 작게 나누는 트랜잭션 최적화가 어렵지 않나요? 항상 강의 잘 듣고 있습니다! 감사합니다!
-
해결됨15일간의 빅데이터 파일럿 프로젝트
버추어박스 5.0 설치
강의에서 버추어박스는 다른 것과 달리 올드버전을 해야 문제 없다고 하여 영상 그대로 5.0버전 설치했는데너무 예전 버전이라 그런지 아예 윈도우에서 실행이 안되게 되어있습니다. 이러면 아예 최신 버전으로 설치해도 무방한가요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
수강중에 궁금한것이 생겨 질문드립니다.
안녕하세요 좋은강의 감사드립니다. 제 주변도 사서 듣는다고 합니다.예전에 완강해놓고 관련프로젝트를 하다 궁금한점이 생겼습니다. 이런식으로 분리된 구조라면, 유저 정보는 어떻게 가져오는건가요??예를들어서 게시판이면, 거기에 들어가면 게시글들이나 댓글들 뿐만 아니라 유저의 닉네임이라던가, 유저가 설정한 대표이미지 라던가 등등 유저정보에 관한것들도 같이 뷰 렌더링을 위해선 필요한 정보들일텐데 유저와 관련된 서비스도 뭔가 따로 분리가 되어있을것 같은데 이때 유저 정보들은 어떻게 같이 가져오는지 궁금합니다.디비도 다 따로 사용할텐데 연관관계매핑도 아닐테고...모르겠네요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Snowflake처럼 동적으로 생성되는 ID, Mock 테스트가 올바른 접근법일까요?
14:42 에서 Snowflake 알고리즘으로 articleId를 생성한 후 DB에 저장된 121530268440289280L값을 사용해서 테스트 코드를 작성하시는 것을 보고,실제로 Snowflake를 도입해서 Id를 생성하고 같은 방식으로 테스트 코드를 작성한다면 DB에 종속적이라서 반복적으로 테스트 코드를 실행할 때 테스트 코드의 유지보수에서 문제가 발생할 수 있을 거라는 생각이 들었습니다.이런 문제를 막기 위해서 테스트 시에는 Mock 객체를 사용해 미리 정해진 Snowflake가 고정 ID 값을 반환하도록 하는 방식으로 테스트 코드를 작성하는게 맞는건지 궁금해서 질문글을 남기게 되었습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticleApiTest 에서 정적 내부 클래스를 사용하는 이유는?
ArticleCreateRequest, ArticleUpdateRequest은 ArticleApiTest 클래스 내부에 따로 만들어서 사용하고 있는데 이미 만들어진 클래스를 사용하지 않고 테스트 클래스 내부에서 작성해서 사용하는 이유가 뭔지 궁금합니다. 감사합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticleApiTest 에서 로그를 System.out.println()으로 남기는 이유 문의
혹시 ArticleApiTest 에서는 System.out.println() 으로 로그를 남기는 이유가 있을까요? ArticleRepositoryTest에서는 log.info로 하셨는데요.
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
main.tf 파일에서 EIP 설정 로직 수정이 필요할거 같습니다.
2025년 7월 5일 기준으로 학습 레포에서 가져온 main.tf를 기반으로 apply 명령을 실행하면 아래와 같은 에러가 발생합니다. terraform apply ╷ │ Error: Unsupported argument │ │ on main.tf line 279, in resource "aws_eip" "app": │ 279: vpc = true │ │ An argument named "vpc" is not expected here. 에러 발생 이유는 aws_eip 리소스 블록에서 vpc = true 옵션을 더이상 지원하지 않기 때문에 발생한다고 합니다. 따라서 280라인에 vpc = true 를 제거하면 해결됩니다. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-5-upgrade?utm_source=chatgpt.com#resourceaws_eip_association
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
comment에 왜 page와 pageSize가 있는 것인가요?
게시글을 보면 한 개의 게시물 아래에 댓글이 쭉 나열되어 있습니다.댓글을 확인할 때 page가 아닌 쭉 스크롤(infinite-scroll) 하면서 확인 하는 것인데게시물 댓글에 왜 page와 pageSize가 필요한 것인지 모르겠습니다.게시물의 댓글의 갯수를 말씀하시는 거라면 몇 개의 댓글을 불러오는지 이해가 가는데... 혹시 page와 pageSize가 단순히 두 단어를 말씀하시는 게 맞나요? 아니면 comment_count와 같은 게시물 갯수를 말씀하시는 건가요? @Test void readAll() { CommentPageResponse response = restClient.get() .uri("/v1/comments?articleId=1&page=1&pageSize=10") .retrieve() .body(CommentPageResponse.class); System.out.println("response.getCommentCount() = " + response.getCommentCount()); for (CommentResponse comment : response.getComments()) { if (!comment.getCommentId().equals(comment.getParentCommentId())) { System.out.print("\t"); } System.out.println("comment.getCommentId() = " + comment.getCommentId()); }
-
해결됨대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [실습]
Redis 로컬 안전한가요?
제가 로컬 Redis는 해킹에 위험하다라는 말을 들었는데 실습이라 괜찮은지 제가 잘못된 정보를 들은건지 잘 모르겠습니다!혹시 도커로 Redis를 사용하는것도 괜찮을까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
likeCount, viewCount 등을 처음부터 같이 생성하지 않는 이유가 있을까요?
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요! 수업 잘 듣고 있습니다.댓글 수나 조회수 쪽에서,likeCount, viewCount가 없는 경우 init을 통해 생성해주는 방식을 사용하고 있는데, 처음부터 게시글과 게시글의 조회수 객체를 같이 생성하는 방식을 사용하지 않는 이유가 있을까요?게시글이 있다면 게시글 조회수 객체도 같이 존재하고, 이 둘의 객체 생명주기는 같아야 한다고 생각하는데,강의가 순차적으로 진행됨에 따라 이전에 db에 생성된 값들이 존재하기 때문에 이렇게 하신건지 궁금합니다!! 그리고 처음부터 같이 생성할 수 있다면 다른 프로젝트에서 그 방법을 선택하는 게 나을까요? 감사하빈다!!
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
비관적 락, 원자적 업데이트
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 4강 트랜잭션과 락 트랜잭션과 락 관련 챕터를 수강 중입니다. 쿠폰 동시성 발급 사례를 보여주셨는데, 락이 필요하고, 왜 동시성 문제가 일어나고 어떻게 해결하는지에 대해 이해하고 있습니다. 쿠폰 동시성 발급 사례에서 코드를 보면 단순히 max값을 보고 current값을 증가하는 코드를 이용해 "락이 걸려있지 않아 의도대로 동작하지 않음"을 보여주시는 것 같습니다. 이런 사례 관련해서 많은 사람들이 "낙관적 락", "비관적 락"에 대해 공부하고, "비관적 락으로 해결"로 마무리를 하는 것 같습니다. 근데 저는 비관적 락이 아니라, query를 직접 작성해서 SELECT와 UPDATE를 한번에 사용할 수 있지 않을까 라는 관점에서 "원자적 업데이트"를 사용했습니다. 비관적 락: select + for update -> update 원자적 업데이트: update + where current < n물론 select와 update를 한 번에 해결하는 상황이 아니라, 로직이 중간에 추가되면 비관적 락을 써야된다는 것을 알고 있습니다. 하지만 다른 사람들의 블로그를 보면 하나의 쿼리로 해결할 수 있는 상황을 비관적 락으로 해결하는 게 맞는건가 라는 의문이 들었습니다. 아무튼 이런 배경에서 질문은 아래와 같습니다. 비관적 락이 아니라 원자적 업데이트 라는 말을 이력서에 쓰면 더 도움이 될까요? 실제는 SQL 쿼리 하나 작성한건데, 비관적 락이 더 있어보이는 느낌인 거 같다...?비관적 락으로 해결해야 되는 상황을 만들고 싶은데, select와 update 사이에 어떤 로직을 추가해야할까요? 기획을 변경 가능한 상황입니다!외부 API: 결제말고 다른 거... 문자 알림?다른 테이블 조회 또는 업데이트: SQL join문 잘 짜면 해결되는 거 아닌가...위 내용과 관련해서 작성한 블로그 글입니다.https://velog.io/@suhwani/QRworld-동시성-해결-원자적-업데이트감사합니다!
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
안녕하세요 선생님 헷갈리는 부분이 있어서 질문 남깁니다.
안녕하세요 ! 좋은 강의 해주셔서 감사합니다.hot article 부분에서 헷갈리는 부분이 있어서 질문 남깁니다.hot article 을 저장할때, article 의 생성 날짜 기준으로 저장하기 때문에, 생성 시간이 아닌 다른 날짜에 hot article이 되더라도, 생성 시간이 key가 되어 그 생성 시간 날짜에 저장이 되는 것이 맞나요 ?
-
미해결15일간의 빅데이터 파일럿 프로젝트
워크플로우 예약 실행시 테이블은 생성되는데 데이터가 들어가지지 않습니다.
주제 1,2에선 문제 없이 됐었는데 주제 3에서 예약을 실행하니 테이블은 생성 되는데 그 이후 데이터 삽입이 안됩니다. chat gpt 통해 여러가지 시도 해봤는데 해결이 안되네요. 어떻게 해결 가능할까요?하이브 쿼리는 강사님 쿼리 복붙 했습니다.jar 파일 돌렸을 때 날짜는 20250625였고 강의 내용대로 20200322을 다 넣었었습니다. 워크플로우 매개변수 설정도 즉시실행으로 20200322 값을 넣었습니다.JOB - 예약 - LOG2025-07-01 08:19:11,671 INFO org.apache.oozie.command.coord.CoordActionInputCheckXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@131] [0000141-250701040825040-oozie-oozi-C@131]::CoordActionInputCheck:: Missing deps: 2025-07-01 08:19:11,673 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@131] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,673 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@131] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,678 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached. 2025-07-01 08:19:11,790 INFO org.apache.oozie.command.coord.CoordActionInputCheckXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@132] [0000141-250701040825040-oozie-oozi-C@132]::CoordActionInputCheck:: Missing deps: 2025-07-01 08:19:11,792 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@132] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,792 WARN org.apache.oozie.util.DateUtils: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[0000141-250701040825040-oozie-oozi-C@132] GMT, UTC or Region/City Timezone formats are preferred instead of Asia/Seoul 2025-07-01 08:19:11,796 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached. 2025-07-01 08:19:18,058 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached. 2025-07-01 08:19:30,847 INFO org.apache.oozie.service.StatusTransitService$StatusTransitRunnable: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[-] Running bundle status service from last instance time = 2025-06-30T23:18Z 2025-07-01 08:19:30,848 INFO org.apache.oozie.service.StatusTransitService$StatusTransitRunnable: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[-] Released lock for [org.apache.oozie.service.StatusTransitService] 2025-07-01 08:20:18,064 INFO org.apache.oozie.command.coord.CoordActionReadyXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - 예약] JOB[0000141-250701040825040-oozie-oozi-C] ACTION[] Not starting any additional actions because max concurrency [1] for coordinator [0000141-250701040825040-oozie-oozi-C] has been reached.JOB - 워크플로우 - LOG2025-07-01 08:12:00,094 INFO org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] Starting action. Getting Action File System 2025-07-01 08:12:02,264 WARN org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] Invalid configuration value [null] defined for launcher max attempts count, using default [2]. 2025-07-01 08:12:02,264 INFO org.apache.oozie.action.hadoop.YarnACLHandler: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] Not setting ACLs because mapreduce.cluster.acls.enabled is set to false 2025-07-01 08:12:02,911 INFO org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] checking action, hadoop job ID [application_1751310527212_0157] status [RUNNING] 2025-07-01 08:12:02,914 INFO org.apache.oozie.command.wf.ActionStartXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] [***0000143-250701040825040-oozie-oozi-W@hive-6885***]Action status=RUNNING 2025-07-01 08:12:02,914 INFO org.apache.oozie.command.wf.ActionStartXCommand: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] [***0000143-250701040825040-oozie-oozi-W@hive-6885***]Action updated in DB! 2025-07-01 08:12:02,917 INFO org.apache.oozie.command.wf.WorkflowNotificationXCommand: SERVER[server02.hadoop.com] USER[-] GROUP[-] TOKEN[-] APP[-] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] No Notification URL is defined. Therefore nothing to notify for job 0000143-250701040825040-oozie-oozi-W@hive-6885 2025-07-01 08:22:13,932 INFO org.apache.oozie.action.hadoop.Hive2ActionExecutor: SERVER[server02.hadoop.com] USER[admin] GROUP[-] TOKEN[] APP[Subject 3 - Workflow] JOB[0000143-250701040825040-oozie-oozi-W] ACTION[0000143-250701040825040-oozie-oozi-W@hive-6885] checking action, hadoop job ID [application_1751310527212_0157] status [RUNNING]용량CM 상태
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
redisConfig 질문입니다
package org.example.config import org.redisson.Redisson import org.redisson.api.RedissonClient import org.redisson.config.Config import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Primary import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.RedisStandaloneConfiguration import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer import org.springframework.data.redis.serializer.StringRedisSerializer import java.time.Duration @Configuration class RedisConfig { @Bean fun redisConnectionFactory( @Value("\${database.redis.host}") host: String, @Value("\${database.redis.port}") port: Int, @Value("\${database.redis.password:${null}}") password: String?, @Value("\${database.redis.database:${0}}") database: Int, @Value("\${database.redis.timeout:${10000}}") timeout: Long, ) : LettuceConnectionFactory { val config = RedisStandaloneConfiguration(host, port).apply { password?.let { setPassword(it) } setDatabase(database) } val clientConfig = LettuceClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(timeout)) .build() return LettuceConnectionFactory(config,clientConfig) } @Bean @Primary fun redisTemplate(connectionFactory : RedisConnectionFactory): RedisTemplate<String, String> { val template = RedisTemplate<String, String>() template.connectionFactory = connectionFactory template.keySerializer = StringRedisSerializer() template.valueSerializer = Jackson2JsonRedisSerializer(String::class.java) template.hashKeySerializer = StringRedisSerializer() template.hashValueSerializer = Jackson2JsonRedisSerializer(String::class.java) template.afterPropertiesSet() return template } @Bean fun redissonClient( @Value("\${database.redisson.host}") host: String, @Value("\${database.redisson.timeout}") timeout: Int, @Value("\${database.redisson.password:${null}}") password: String?, ) : RedissonClient { val config = Config() val singleServerConfig = config.useSingleServer() .setAddress(host) .setTimeout(timeout) if (!password.isNullOrBlank()) { singleServerConfig.setPassword(password) } return Redisson.create(config).also { println("redisson create success") } } }An annotation argument must be a compile-time constant와 같은 에러가 나는데 강의 파일 코드로도 같은 에러가 납니다
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
좋아요 락 api test 에서 count 가 0으로 찍혀요
코드가 잘못 된 부분은 없는거 같은데 count=0으로 다 찍히네요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
댓글 최대 2depth - CUD API 구현에서 질문 있습니다.
안녕하세요 선생님 좋은 강의 해주셔서 감사합니다.댓글 create 구현에서 findParent() 함수를 구현할때,.filter(Comment::isRoot)이런 코드가 있는데, 애초에 parentCommentId 에 root 댓글이 아닌 댓글의 ID가 존재하면 안되는 것 아닌가요 ?존재하면 안되는 경우를 filter 로 걸러주는 것 같아서 필요한 코드인지 의문이 들어 질문 남깁니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
Hue 500 Error 어떻게 해결할 수 있나요?
select car_number, avg(battery) as battery_avgfrom SmartCar_Status_Infowhere battery < 60group by car_number;Hue에서 이 쿼리 돌리면 아래 에러가 뜹니다..chat gpt 통해서 hue_safety_valve.ini에 대한 Hue 서비스 고급 구성 스니펫에 아래 내용도 추가했는데 해결이 안됩니다. 이것 때문에 더이상 진도를 못 나가고 있어서 도움 부탁드려요. [yarn_clusters] [[default]] log_url_template=http://server02.hadoop.com:8042/node/containerlogs/${container_id}/${user}500 Server Error: Server Error for url: http://server02.hadoop.com:8042/node/containerlogs/admin?doAs=admin Error 500 Server Error HTTP ERROR 500 Problem accessing /node/containerlogs/admin. Reason: Server ErrorCaused by:java.lang.ArrayIndexOutOfBoundsException: 4 at org.apache.hadoop.yarn.server.nodemanager.webapp.NMWebAppFilter.containerLogPageRedirectPath(NMWebAppFilter.java:81) at org.apache.hadoop.yarn.server.nodemanager.webapp.NMWebAppFilter.doFilter(NMWebAppFilter.java:62) at com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:829) at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119) at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133) at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130) at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203) at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.security.http.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:57) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:644) at org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:592) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter.doFilter(StaticUserWebFilter.java:110) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.http.HttpServer2$QuotingInputFilter.doFilter(HttpServer2.java:1553) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.apache.hadoop.http.NoCacheFilter.doFilter(NoCacheFilter.java:45) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:119) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) at org.eclipse.jetty.server.Server.handle(Server.java:539) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108) at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) at java.lang.Thread.run(Thread.java:748) (error 500)
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
그라파나 대시보드 오타가 있는 거 같아요
그대로 복붙 해봤는데 p95가 두개있어서 p50를 측정 안하고 있었슴미다그래서 json 살펴보니 [0.95]"expr": "max by(http_method, path, query_type) (app_query_per_request{quantile=\"0.95\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false,"legendFormat": "P95 - {{http_method}} {{path}} - {{query_type}}", [0.50]"expr": "max by(http_method, path, query_type) (app_query_per_request{quantile=\"0.95\"})","hide": false, "instant": false,"legendFormat": "P50 - {{http_method}} {{path}} - {{query_type}}", 아래 0.50에 0.95의 값을 대입하고 있떠라구요잘 작성된 건가요 오타인건가요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Entity 생성 시 access 레벨 지정해주는 이유
강의를 듣다가 한가지 궁금한 부분이 있어서 질문남깁니다. Entity 객체 생성 시NoArgConstructor 선언 시access를 항상 AccessLevel.PROTECTED로 설정하시는데 이유가 있으실까요?