JSCODE 시니
@synee
수강생
1,982
수강평
114
강의 평점
5.0
주요 이력
국가 핵심 망 관리: 대법원 및 조달청 시스템 운영·최적화 전문가
차세대 공공 플랫폼 구축: 지능형 나이스(NEIS) 응용 SW 개발 및 아키텍처 설계
풀스택 전문 교육자: K사 부트캠프 등 다수의 강의를 통한 실전 기술 전수
엔터프라이즈 솔루션 전문가: 대규모 시스템 유지보수 및 고도화 설계 역량 보유
안녕하세요! 개발자로 시작해 지금은 교육자로 활동하고 있는 JSCODE 시니입니다.
국가 중요 시스템을 직접 만들고 운영도 해봤지만, 사실 제가 가장 잘하는 건 "그 어려운 걸 누구나 이해하게 설명하는 것" 입니다.
실무 현장은 원래 거칠고 복잡합니다. 🤯
하지만 배우는 과정까지 그럴 필요는 없잖아요?
여러분이 지금 당장 배우고 싶은 스택이 무엇이든 상관없어요.
실무 현장의 복잡한 기술들을 여러분의 눈높이에 맞춰 아주 쉽게 씹어서 떠먹여 드릴게요! 🍀
머릿속에만 있던 복잡한 생각들이 실제 돌아가는 서비스로 바뀌는 신기한 경험, 저랑 같이 쉽고 재밌게 시작해 봐요!
강의
수강평
- (무료 Live) 2026 백엔드 개발자 취업 전략 설명회
- (무료 Live) 2026 백엔드 개발자 취업 전략 설명회
- (무료 Live) 2026 백엔드 개발자 취업 전략 설명회
게시글
질문&답변
소스코드 빈파일 문의
dsadadsa님 안녕하세요! JSCODE 시니 입니다~자료 다운로드가 안돼서 굉장히 답답하셨겠네요! ㅠㅠ제가 방금 다시 다운로드 해보았는데, 제 PC에서는(사진)이렇게 폴더 및 파일들이 잘 보이고 있어서 조치방법 안내드립니다.혹시 몰라 직접 인프런 문의해보니 현재 정상 다운로드 되는것으로 확인 되었습니다!해당 증상의 경우 캐시 문제일 가능성이 높아서 캐시 삭제후 재 다운로드 진행해보시고캐시 삭제후에도 동일 문제 발생시 인프런 채널톡으로 문의주시면 감사하겠습니다!혹시라도 진행이 잘 안되신다면 1:1 개인 채팅방으로 이메일 남겨주세요! 파일 보내드리도록 하겠습니다~!!
- 0
- 1
- 28
질문&답변
jobParameter를 통한 멱등성 질문
iii님 안녕하세요! JSCODE 시니입니다~ 우선 강의를 재미있게 들어주시고, 중급 강의까지 기대해 주신다니 정말 감사합니다! ㅎㅎ남겨주신 질문들을 읽어보니, 배치 프로세스 설계의 핵심이자 가장 까다로운 부분 중 하나인 멱등성과 실패 복구에 대해 아주 정확하고 깊이 있는 고민을 하고 계신 것 같아요~! 질문주신 내용은 실제 실무에서 배치를 설계할 때 반드시 고려해야 하는 포인트들 입니다! ㅎㅎ iii님이 질문 주신 세 가지 질문에 대해 하나씩 답변 드리겠습니다! 1. 실패 지점부터 재실행할 때의 파라미터 유지 여부"만약에 job을 실패지점부터 재실행 하고 싶은 경우에는 targetDate 뿐만 아니라 실패한 시간대에 time 파라미터까지 넣어서 재시작을 해야하는 것인가요?"네! 정확히 맞습니다.Spring Batch에서 동일한 Job을 식별하는 기준은 Job Parameters 입니다. 파라미터가 완벽하게 동일해야 Spring Batch는 이를 새로운 실행이 아닌 기존 JobInstance의 재실행으로 인식합니다!따라서, 실행도중 실패한 Job을 처음부터가 아닌 실패한 지점(Chunk) 부터 이어서 재실행 하고 싶다면, targetDate는 물론이고 실패했던 당시의 time 파라미터 값까지 똑같이 넣어서 실행하셔야 합니다!만약 time 값을 조금이라도 다르게 부여하면, Spring Batch는 이를 완전히 새로운 JobInstance로 판단하여 처음부터 새로운 작업을 시작하게 됩니다~! 2.다른 time 파라미터로 재실행시 DELETE Step 분리 여부"정산 테이블에서 targetDate에 해당하는 값을 DELETE를 하고 INSERT를 진행해야 멱등성이 유지될 것 같습니다. 이럴 경우 DELETE 같은 경우는 Settlement INSERT 작업 이전에 별도의 Step으로 구성이 되야할까요?"네 맞습니다!이전 실행이 완료되었거나, 실패했더라도 처음부터 완전히 다시 돌리고 싶어 새로운 time 파라미터를 부여하여 실행하는 경우가 있습니다. 이때 기존에 처리된 데이터가 남아있다면 중복 정산이 발생하므로 멱등성이 깨지게 됩니다..!이런 상황에서 멱등성을 보장하기 위해 iii님께서 말씀주신 것 처럼 INSERT 이전에 기존 데이터를 DELETE 하는 작업이 필수적 입니다.그리고 이 DELETE 작업은 별도의 Step(예를 들면 deleteSettlementStep) 으로 구성하여INSERT Step 바로 직전에 배치하는 것이 가장 권장되는 설계 방식입니다.이렇게 Step을 분리하면 역할이 명확해지고, 트랜잭션 관리도 훨씬 깔끔해질거에요!ㅎㅎ 3.DELETE 실행 방식 (한 번에 삭제 OR 나누어서 삭제)"만약에 DELETE를 해야한다면 DELETE의 경우에는 targetDate의 해당 하는 값을 한번에 전부 지우고 INSERT를 시작하는지 궁금합니다..!"일반적으로는 targetDate에 해당하는 값을 한 번에 벌크연산으로 전부 지우고 시작하는 것이 맞습니다.정산 배치의 특성상 해당 날짜(targetDate)의 정산 데이터를 처음부터 다시 만든다는 의미이므로,특정 날짜의 데이터를 초기화 하는 개념 입니다. 따라서 다음과 같이 쿼리를 작성해서 삭제하는 방식을 주로 사용합니다.DELETE FROM settlement WHERE target_date = :targetDate단, 실무에서 작업을 하다보면 삭제해야할 targetDate의 하루치 데이터가 수천만건 이상 이여서 한번에 DELETE 쿼리를 날리게 되면 DB락이 걸리게 되거나 성능상 이슈가 발생할 수도 있습니다..!이때는 예외적으로 삭제 작업도 Chunk 단위로 나누어 지우거나, 파티셔닝을 고려해야 할 수도 있습니다.하지만 제 경험상 일반적인 실무 환경에서는 날짜 조건 인덱스를 활용하여 벌크 연산으로 처리하는 경우가 가장 많았던 것 같습니다.제가 iii님의 질문을 잘 이해하고 답변을 달아드렸는지 모르겠네요~! 혹시라도 잘 해결이 되지 않는 부분이 있다면 언제든 편하게 게시판에 남겨주세요!최대한 빠르게 확인 후 답변드리도록 하겠습니다~! 오늘도 즐거운 하루 보내세요! ㅎㅎ
- 1
- 2
- 49
질문&답변
bootRun FAILED 에 대한 문의
쿠카이든님 안녕하세요~ JSCODE 시니 입니다!배치 실패 시 메일 전송 수업 들으시다가 궁금한점이 생겨 많이 답답하셨을 것 같아요! 캡쳐해주신 사진을 확인해보니, 결과 화면이 저와 다르게 bootRun FAILED로 나오셨네요!이 현상의 원인은 바로 main 메서드의 설정 차이 때문입니다~!아마 쿠카이든님 같은 경우는 실습하시면서 main 메서드를 다음과 같이 설정하셨을 거예요. System.exit(SpringApplication.exit(SpringApplication.run(SyBatchSystemApplication.class, args))); 그러나 저는 해당 실습을 진행할 때 main 메서드를 변경하지 않고 기본 상태 그대로 사용 했습니다! :)SpringApplication.run(SyBatchSystemApplication.class, args); 스프링 부트는 기본적으로 애플리케이션 내에서 예외가 발생해 프로그램이 죽더라도(우리의 경우죠!), 프로세스 종료 코드(Exit Code)를 0(정상 종료)으로 반환하며 끝나는 경우가 있습니다.! 쿠카이든님이 작성하신 System.exit(...) 코드는 스프링 애플리케이션의 종료 코드를 읽어와서 OS(운영체제)에 정확한 상태를 전달해 주는 역할을 합니다! 즉, 배치가 실패(예외 발생)했으니 비정상 종료 코드를 반환하게 되고, 그 결과 Gradle이 이를 감지해서 > Task :bootRun FAILED라고 명확하게 빌드 실패 에러를 출력한 것이죠!반면, 제가 실습한 기본 코드에서는 이 예외에 따른 비정상 종료 코드를 시스템으로 명시적으로 전달하지 않았기 때문에, 결과 화면이 다르게 나타났던 거라고 이해해주시면 될 것 같습니다! 결론적으로 쿠카이든님이 작성하신 코드가 실제 운영 환경에서 배치의 성공/실패 여부를 시스템이나 스케줄러에 정확히 알리기 위해 꼭 필요한 권장 방식이니, 아주 잘 적용하신 겁니다! ㅎㅎ 자세한사항은 저희 노션 강의자료 섹션3 - '[실습] 스프링 배치 프로젝트 생성(Spring Boot 4.x & Gradle)' 페이지의 4번 항목인 메인 메소드 변경 파트를 참고해주시면 더 좋을 것 같습니다! ㅎㅎ 오늘도 좋은 하루 보내시고, 앞으로도 배치를 공부하시다가 궁금한 점이 생기면 언제든 편하게 질문 남겨주세요!
- 1
- 2
- 58
질문&답변
[참고] Tasklet 인터페이스로 단일 배치 작업 처리 수업에 나온 코드 돌리는 방법
쿠카이든님 안녕하세요! JSCODE 시니 입니다~직접 코드까지 작성해주시고 공유해주시는 열정 너무 멋집니다!! 👍 수업에서 다룬 Tasklet의 개념도 잘 이해하고 작성하신 것 같아서 더더욱 좋은 것 같습니다!다른 수강생 분들께도 큰 도움이 될 것 같아요! 다른 수강생 분들도 쿠카이든님의 코드를 참고하셔서 Step => Tasklet으로 이어지는 스프링 배치의 기본 구조를 실습해보시면 공부에 큰 도움이 될 것 같습니다! 좋은 자료 공유해주셔서 너무 감사합니다!공부하시다 궁금한 점 생기시면 언제든 질문 남겨주세요! ㅎㅎ 항상 응원하겠습니다~!!
- 2
- 2
- 55
질문&답변
batch_db 생성 관련 문의 드립니다.
안녕하세요 solarscw85님! JSCODE 시니 입니다.강의 잘 들어주시고, 실무 적용을 위한 중요한 질문까지 남겨주셔서 정말 감사합니다.결론부터 말씀드리면, Spring Batch가 제공하는 메타 데이터 테이블(스키마)들은 실무 환경에서도 반드시 생성해주셔야 합니다!Spring Batch가 단순히 코드를 반복 실행하는 것을 넘어, 강력한 기능을 발휘하는 핵심이 바로 이 테이블들에 있기 때문인데요~ Spring Batch는 이 테이블들을 통해 다음과 같은 정보들을 관리하고 있습니다.실행 이력 관리: 배치가 언제 시작해서 언제 끝났는지, 성공했는지 실패했는지 기록재시작(Restart) 지원: 배치가 실패했을 때, 어디서부터 다시 시작해야 하는지 판단 (이게 배치의 핵심 기능입니다! :))중복 실행 방지: 같은 파라미터로 중복해서 실행되는 것을 막음만약 이 테이블들이 없다면, Spring Batch는 배치의 상태를 기억할 수 없어(In-memory 방식 제외) 실무에서 요구하는 안정적인 배치 운영이 불가능해집니다..! 말씀하신 대로 실무에서는 애플리케이션이 자동으로 테이블을 생성(ddl-auto 등)하도록 두는 것은 권장되지 않습니다. 그래서 보통 다음과 같은 절차로 진행합니다. SQL 스크립트 확보: Spring Batch 라이브러리 내부에는 이미 각 DB 벤더(Oracle, MySQL, PostgreSQL 등)에 맞는 테이블 생성 SQL 파일이 포함되어 있습니다. (운영 환경에 맞는 쿼리로 선택하시면 됩니다!)파일명 예시: schema-mysql.sql, schema-oracle.sqlIDE에서 파일 검색(Ctrl+Shift+N 등)으로 해당 파일을 찾거나, Spring Batch 공식 GitHub에서도 확인 가능합니다.DBA 요청: 위에서 찾은 SQL 스크립트 내용을 DBA분께 전달리고, 배치 프레임워크 구동을 위한 필수 메타 테이블 생성을 요청 하시면 될 것 같습니다!설정 변경: 그리고 애플리케이션 설정(application.yml)에서는 자동 생성 옵션을 끄고 배포하시면 됩니다. spring: batch: jdbc: initialize-schema: never # 혹은 validate실무 적용을 앞두고 계신 만큼, 이 메타 테이블들이 배치의 '블랙박스' 역할을 해준다고 생각하시면 이해가 편하실 거예요.도움이 되셨길 바라며, 실무에서도 성공적으로 적용하시길 응원하겠습니다! 또 궁금한 점 있으시면 언제든 질문 남겨주세요. :)
- 1
- 1
- 91




