172만명의 커뮤니티!! 함께 토론해봐요.
해결됨
카카오 면접관이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
Orchestration SAGA 패턴 구현에 대해 고민하다가 질문이 생겨 남깁니다. 보상을 요청하는 메서드가 명시적으로 나와있어 호출할 때(동기로 호출) 만약 rollback을 요청하는 호출이 실패하게 된다면 이후의 순서대로 service에 보상 요청을 하는 동작을 멈춰야 할지 계속 진행하는 게 바람직할지 고민이 됩니다. 예를 들어 서비스 1,2,3,4가 있고 center server가 orchestration 관리를 하고 1,2,3,4 순서대로 서비스 호출해서 관리를 진행한다고 했을 때 3에서 장애가 발생해서 2를 롤백하던 중 2 롤백에서 예외가 발생해서 롤백에 실패한 경우 orchestration에서 1에 대한 롤백을 진행해줘야 할지 아니면 일단 멈춰야 할지 고민입니다. 고민의 이유는 순서대로 롤백을 해주는 것은 앞에 작업이 뒤의 작업에 의존성이 있을 때만 그렇게 해주면 되나에 대한 고민이 있었습니다. 두 롤백 간에 데이터 의존성이 없다면 괜찮지 않을까 고민했습니다. 다음으로 일단 1도 롤백을 한다면 어디서부터 어디까지 롤백이 진행됐는지 추적이 어려워지지 않을까 고민했습니다. 롤백을 어떤 것은 해주고 어떤 것은 안해준다면 어디까지 롤백했는지 추적이 힘들어지지 않을까 생각이 들었습니다.
java spring mysql spring-boot msa
won
2026-04-10T08:21:08.570Z
댓글 2
좋아요 0
조회수 79
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
회사에서 클로드 팀 요금제로 사용하고 있는데요. 터미널에 설치하고 초기 세팅을 하려고 하니까 해당 페이지에서 넘어가질 않네요 ㅠ
2026-04-10T06:58:32.879Z
댓글 2
좋아요 0
조회수 138
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
claude가 코딩한 것을 보면서 학습하는 것을 도와줄수 있는 명령어가 있을가요? 강의 중 노트한 내용이 있는데 찾질 못하겠습니다.
swha
2026-04-10T06:37:44.418Z
댓글 1
좋아요 0
조회수 59
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
.gitignore에 보통 무엇을 넣어야하나요? 지금 png도 넣으려고 물어보거나 .playwright-mcp 이런것도 넣으려고 하는데 이런것도 그냥 깃헙에 올리면 안되나요?
미녕
2026-04-10T05:37:17.808Z
댓글 2
좋아요 0
조회수 63
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
강사님 똑같은 프롬프트를했지만 결과는 다르게 나온다는건 알지만 혹시 강사님처럼 그 예제기능을 추가하려면 어떤식으로 프롬프트 해야할지 알수있을까요?
미녕
2026-04-10T01:04:54.465Z
댓글 2
좋아요 0
조회수 81
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
수업을 잘따라가기 위해서 아래의 md파일을 만들어 모든 폴더의 적용 할까요? 이번 강 / 특정 강의에만 넣으면 될까요? --- /init 프로젝트 초기화를 한국어로 진행해주세요. 다음 설정을 CLAUDE.md 에 포함해주세요: ## 언어 및 커뮤니케이션 규칙 - 기본 응답 언어 : 한국어 - 코드 주석 : 한국어로 작성 - 커밋 메시지 : 한국어로 작성 - 문서화 : 한국어로 작성 - 변수명/함수명 : 영어 (코드 표준 준수)
daeha
2026-04-09T23:09:58.160Z
댓글 2
좋아요 0
조회수 181
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
세션 여러 개를 동시에 실행할 수 있는 방법은 어느 챕터에서 다루고 있는지 알 수 있을까요? VS 코드 확장 프로그램에서는 그냥 새 탭을 열어서 진행하면 되었는데 CLI에서는 따로 방법이 없는 것 같더라고요. 터미널을 여러 개 실행해서 하는 방법밖에 없는 것 같은데 이거 말고는 없는지 궁금합니다.
수뼈
2026-04-09T17:45:21.720Z
댓글 2
좋아요 0
조회수 113
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
제가 문제가 되는 부분은 없지만 다른 분들이 불편하실까 싶어 수정하시라고 알려드리려고 작성했습니다. 좋은 강의 항상 감사드립니다.
수뼈
2026-04-09T15:21:37.478Z
댓글 2
좋아요 0
조회수 57
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
전체적인 토큰비용관리차원에서 가벼운 작업의 경우 settings.json에서 사고토큰수를 줄이는것과 /config에서 확장사고를 off 하는것과 어떤 차이가 있을까요?
웅비창천
2026-04-09T14:26:07.762Z
댓글 2
좋아요 0
조회수 61
해결됨
(2026 최신!) 일주일만에 합격하는 정보처리기사 실기
안녕하세요 강의 잘 듣고있습니다. 프로그래밍을 배운적이 있어서 기출 문제 강의 부터 보고 킬러문제 1,2개 제외한 나머지는 대체로 이해 하고 푸는 수준입니다. 올려주신 문제는 모두 다 풀었는데 현시점에서 새로운문제를 더 풀어보는게 나은지 이론암기와 현재까지 풀었던 문제 복습하고 시험장 가는게 나을지 .. 조언을 구해 봅니다..
python java c 정보처리기사 정보처리산업기사
김선경
2026-04-09T13:15:42.544Z
댓글 2
좋아요 0
조회수 123
미해결
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
형 ... @Bean public Step threatAnalysisStep( JpaPagingItemReader<Human> humanThreatDataReader, ItemProcessor<Human, TargetPriorityResult> threatAnalysisProcessor, FlatFileItemWriter<TargetPriorityResult> targetListWriter ) { return new StepBuilder("threatAnalysisStep") .<Human, TargetPriorityResult>chunk(10, transactionManager) .reader(humanThreatDataReader) .processor(threatAnalysisProcessor) .writer(targetListWriter) .taskExecutor(taskExecutor()) // deprecated 되어서 안씀 // .throttleLimit() .build(); } ... 에서 .throttleLimit() 부분이 5 이후로 deprecated 된다고 명시되어 있어. 관심사 분리로 인해서 taskExecutor 정의 부분에서 설정하라고 권장하는 것을 확인했거든. 현재 강의가 사실상 Spring Batch 5.x 까지의 기본 내용과 원리를 살펴봤잖아 ? 그렇다 하더라도 혼란을 줄 수 있기 때문에 해당 부분은 삭제하던지 아니면 추가 내용을 기재해야 할 것으로 보여.
java spring spring-boot spring-batch backend
2026-04-09T10:56:12.374Z
댓글 2
좋아요 1
조회수 102
미해결
[코드캠프] 강력한 CSS
배경색을 지정할 때 background와 background-color를 사용하셨는데, 둘의 차이점을 알 수 있을까요?
Yeonmi park
2026-04-09T08:59:02.754Z
댓글 1
좋아요 0
조회수 50
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
노션데이터베이스를 API 생성하고 두개 데이터베이스 만든 후 Invoice-web으로 연결하고 .env.local에 데이터베이스키와 데이터베이스 id까지 입력했지만 오류가 발생합니다. 혼자 고치려고 이래저래 해봤는데 문제를 못 찾겠네요 ㅜㅜ
2026-04-09T08:20:11.354Z
댓글 1
좋아요 0
조회수 86
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
보시다 싶이 릴리즈 노트 명령어가 뜨질 않습니다..ㅠㅠ 윈도우입니다
info
2026-04-09T08:03:26.292Z
댓글 1
좋아요 0
조회수 65
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
github > settings > Pages 에 이런 메시지가 있네요 Verify domains to restrict who can publish GitHub Pages on them.
김재영
2026-04-09T07:25:46.814Z
댓글 2
좋아요 0
조회수 66
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
이미지 캡쳐 후 클로드 코드 실행 후 터미널에 붙혀지지가 않는데 해결 방법 부탁드립니다.
mskwon333
2026-04-09T06:14:15.038Z
댓글 3
좋아요 0
조회수 161
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
클로드 코드를 윈도우 환경에 설치하고 node.js, 크롬, git 까지 설치를 완료했습니다. 그리고 나서 윈도우 cmd와 git bash, powershell 과 같은 터미널에서 node / npm / git / Claude 버전을 확인하면 잘 출력 되는데 클로드 코드 내부에서 버전을 확인하려고 하면 bash 쉘을 읽을 수 없다면서 안 됩니다. 일부러 사용자 계정도 하나 더 만들어서 영문으로 바꾸기도 했는데 왜 안될까요ㅠ환경변수 설정도 전부 맞춰서 했는데도 안됩니다
인예지
2026-04-09T06:13:12.588Z
댓글 2
좋아요 0
조회수 218
미해결
클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지
안녕하세요! 저는 윈도우os를 사용하고있는데 agent teams 를 분할창에서 사용하고싶어 wsl를 설치하고 거기에 tmux 설치 후 활성화해서 클로드를 실행했는데 창 분할이 안되네요. 요금제 max 쓰고 있고, 공식문서 보고 "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS"="1" 도 설정했는데(settings.local.json에 설정) 분할 창은 안뜨고 이렇게 진행이 됩니다. 이게 in-process 방식인것같은데,, wsl 환경에서는 tmux 써도 분할창으로 작업은 안되는건가요? 에이전트들끼리 진행할때 대화하는 내용을 보고싶습니다.
dalki7711
2026-04-09T05:35:56.105Z
댓글 1
좋아요 0
조회수 189
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] H2 데이터베이스 파일 생성방법 강의자료에서는 저장된 설정이 server가 아닌 embedded로 되어있는데 어떤것을 따라야할까요?
김주현
2026-04-09T04:23:04.555Z
댓글 2
좋아요 0
조회수 94
미해결
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
... @Slf4j @Configuration @RequiredArgsConstructor public class LogProcessingJobConfig { private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; private final String BASE_PATH = "C:\\Users\\user\\Desktop\\batch\\section3\\flatfileitemwriter"; @Bean public Job logProcessingJob( Step createDirectoryStep, Step logCollectionStep, Step logProcessingStep ) { return new JobBuilder("logProcessingJob", jobRepository) .start(createDirectoryStep) .next(logCollectionStep) .next(logProcessingStep) .build(); } @Bean public Step createDirectoryStep(SystemCommandTasklet mkdirTasklet) { return new StepBuilder("createDirectoryStep", jobRepository) .tasklet(mkdirTasklet, transactionManager) .build(); } @Bean @StepScope public SystemCommandTasklet mkdirTasklet( @Value("#{jobParameters['date']}") String date ) { SystemCommandTasklet tasklet = new SystemCommandTasklet(); tasklet.setWorkingDirectory(BASE_PATH); String collectedLogsPath = "collected_ecommerce_logs\\" + date; String processedLogsPath = "processed_logs\\" + date; try { tasklet.setCommand("cmd.exe", "/c", "mkdir", collectedLogsPath, processedLogsPath); tasklet.setTimeout(3000); } catch (Exception e) { log.error("mkdirTasklet error: ", e); } return tasklet; } @Bean public Step logCollectionStep(SystemCommandTasklet scpTasklet) { return new StepBuilder("logCollectionStep", jobRepository) .tasklet(scpTasklet, transactionManager) .build(); } @Bean @StepScope public SystemCommandTasklet scpTasklet( @Value("#{jobParameters['date']}") String date ) { SystemCommandTasklet tasklet = new SystemCommandTasklet(); tasklet.setWorkingDirectory(BASE_PATH); String processedLogsPath = "collected_ecommerce_logs\\" + date; StringJoiner commandBuilder = new StringJoiner(" & "); for (String host : List.of("localhost")) { // Windows 환경에서 해당 코드를 적용하려면 ssh 관련 설정들을 찾아야 해서 주석 처리 // String command = String.format("scp %s:~/ecommerce_logs/%s.log %s\\%s.log", host, date, processedLogsPath, host); String sourcePath = BASE_PATH + "\\ecommerce_logs\\" + date + ".log"; String command = String.format("copy %s %s\\%s.log", sourcePath, processedLogsPath, host); commandBuilder.add(command); } tasklet.setCommand("cmd.exe", "/c", commandBuilder.toString()); tasklet.setTimeout(10000); return tasklet; } @Bean public Step logProcessingStep( MultiResourceItemReader<LogEntry> multiResourceItemReader, LogEntryProcessor logEntryProcessor, FlatFileItemWriter<ProcessedLogEntry> processedLogEntryJsonWriter ) { return new StepBuilder("logProcessingStep", jobRepository) .<LogEntry, ProcessedLogEntry>chunk(10, transactionManager) .reader(multiResourceItemReader) .processor(logEntryProcessor) .writer(processedLogEntryJsonWriter) .build(); } @Bean @StepScope public MultiResourceItemReader multiResourceItemReader( @Value("#{jobParameters['date']}") String date ) { MultiResourceItemReader<LogEntry> resourceItemReader = new MultiResourceItemReader<>(); resourceItemReader.setName("multiResourceItemReader"); resourceItemReader.setResources(getResources(date)); resourceItemReader.setDelegate(logFileReader()); return resourceItemReader; } private Resource[] getResources(String date) { try { String formattedBasePath = BASE_PATH.replace("\\", "/"); String location = "file:///" + formattedBasePath + "/collected_ecommerce_logs/" + date + "/*.log"; PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); return resolver.getResources(location); } catch (IOException e) { throw new RuntimeException("Failed to resolve log files", e); } } @Bean public FlatFileItemReader<LogEntry> logFileReader() { return new FlatFileItemReaderBuilder<LogEntry>() .name("logFileReader") .delimited() .delimiter(",") .names("dateTime", "level", "message") .targetType(LogEntry.class) .build(); } @Bean public LogEntryProcessor logEntryProcessor() { return new LogEntryProcessor(); } @Bean @StepScope public FlatFileItemWriter<ProcessedLogEntry> processedLogEntryFlatFileItemWriter( @Value("#{jobParameters['date']}") String date ) { String outputPath = Paths.get(BASE_PATH, "processed_logs", date, "processed_logs.jsonl").toString(); ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))); objectMapper.registerModule(javaTimeModule); return new FlatFileItemWriterBuilder<ProcessedLogEntry>() .name("processedLogEntryJsonWriter") .resource(new FileSystemResource(outputPath)) .lineAggregator(item -> { try { return objectMapper.writeValueAsString(item); } catch (JsonProcessingException e) { throw new RuntimeException("Error Converting item to JSON", e); } }) .build(); } @Data public static class LogEntry { private String dateTime; private String level; private String message; } @Data public static class ProcessedLogEntry { private LocalDateTime dateTime; private LogLevel level; private String message; private String errorCode; } public enum LogLevel { INFO, WARN, ERROR, DEBUG, UNKNOWN; public static LogLevel fromString(String level) { if (level == null || level.trim().isEmpty()) { return UNKNOWN; } try { return valueOf(level.toUpperCase()); } catch (IllegalArgumentException e) { return UNKNOWN; } } } public static class LogEntryProcessor implements ItemProcessor<LogEntry, ProcessedLogEntry> { private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_DATE_TIME; private static final Pattern ERROR_CODE_PATTERN = Pattern.compile("ERROR_CODE\\[(\\w+)]"); @Override public ProcessedLogEntry process(LogEntry item) throws Exception { ProcessedLogEntry processedLogEntry = new ProcessedLogEntry(); processedLogEntry.setDateTime(parseDateTime(item.getDateTime())); processedLogEntry.setLevel(parseLevel(item.getLevel())); processedLogEntry.setMessage(item.getMessage()); processedLogEntry.setErrorCode(extractErrorCode(item.getMessage())); return processedLogEntry; } private LocalDateTime parseDateTime(String dateTime) { return LocalDateTime.parse(dateTime, ISO_FORMATTER); } private LogLevel parseLevel(String level) { return LogLevel.fromString(level); } private String extractErrorCode(String message) { if (message == null) { return null; } Matcher matcher = ERROR_CODE_PATTERN.matcher(message); if (matcher.find()) { return matcher.group(1); } // ERROR 문자열이 포함되어 있지만 패턴이 일치하지 않는 경우 if (message.contains("ERROR")) { return "UNKNOWN_ERROR"; } return null; } } } 윈도우즈에서는 scp 명령어 관련해서 windows 서비스에서 open-ssh-server 실행 현재 사용하고 있는 사용자(windows 사용자) 가 관리자 권한을 보유 할 경우 programdata/sshd_config 파일 수정 필요 기타 파일 권한 정리 필요 로 인하여 scp 프로그램을 windows 환경의 intellij idea 에서 id, 비번치게끔 ide 콘솔에서 지원하지 않는거 같아. 그래서 제미니가 추천해준대로 실습 환경에서 scp 접속 단을 copy 로 그냥 퉁치는 것으로 바꿔놨어. 나처럼 windows 환경인 사람들이 있으면 혹시나 참고했으면 좋겠네. ObjectMapper, JavaTimeModule 같은 경우는 org.springframework.boot:spring-boot-starter-json 의존성 추가 필요
java spring spring-boot spring-batch backend
qlghwp123
2026-04-09T03:43:12.602Z
댓글 2
좋아요 1
조회수 94