전체 글309 동기/비동기, 블로킹/논블로킹 차이, 기준 두 개로 끝내기 저번 글에서 동기와 비동기, 블로킹과 논블로킹을 정리했는데, 쓰고 나니 오히려 더 헷갈렸다. 두 쌍의 개념을 자꾸 같은 말처럼 섞어 쓰고 있었기 때문이다. 그래서 이번 글에서는 명확한 기준을 먼저 세우고 시작한다. 핵심은 두 개념이 서로 다른 질문에 답한다는 점이다. 참고로 이 글은 국내 개발 커뮤니티에서 널리 쓰는 해석, 즉 완료 통보와 제어권 양도를 각각의 기준으로 삼는 관점을 따른다. POSIX나 스티븐스(Stevens)의 네트워크 프로그래밍 책에서는 동기를 "작업이 끝날 때까지 요청한 프로세스가 블록되는 것"으로 정의하므로, 그 관점에서는 분류가 달라질 수 있다. 1. 두 개념의 기준동기와 비동기는 완료 통보가 기준이다동기(synchronous)는 호출한 쪽이 작업의 완료를 직접 확인하거나 결과를.. 2026. 10. 6. GitHub Actions cron을 믿으면 안 되는 이유 들어가며GitHub Actions의 cron으로 워크플로를 정해진 시각에 돌리도록 예약해 두었는데, 그 시각이 지나도 잡이 돌지 않았다. Actions 탭을 새로고침해도 아무 기록이 없었고, 한참 지나서야 실행이 시작됐다. 처음에는 YAML 문법이나 브랜치 설정을 의심했다. 하지만 원인은 설정 오류가 아니라 GitHub Actions 스케줄 트리거의 성격 자체에 있었다. 나만 겪는 문제가 아니었다원인을 찾으려고 구글에 why doesnt github actions fire on time 이라고 검색해 봤다. 첫 화면부터 같은 문제를 다룬 글이 줄줄이 나왔다. 화면 한 장에 보이는 것만 일곱 개였다. Stack Overflow 질문, DEV Community 글, GitHub 커뮤니티 토론 여러 개, 그.. 2026. 10. 4. Docker는 방화벽을 무시한다 - ufw/firewalld가 외부 노출을 막지 못하는 이유 오늘 있었던 일홈서버에서 스프링(Spring) 배치/스케줄러 앱을 도커 컴포즈(Docker Compose)로 띄워놓고 쓰고 있다. 이 앱은 8080 포트로 열려 있고, 필요할 때 curl로 특정 엔드포인트를 호출해서 배치 작업을 트리거하는 구조다. 서버는 ufw로 방화벽을 켜놓은 상태였고, 8080 포트는 ufw 허용 목록에 올려둔 적이 없었다. 그래서 당연히 외부에서는 접근이 불가능하다고 생각하고 있었다. 그런데 오늘 우연히 톰캣(Tomcat) 로그에서 이런 에러를 발견했다. java.lang.IllegalArgumentException: Invalid character found in method name[0x16 0x03 0x01 ...]. HTTP method names must be tokens.. 2026. 9. 26. await 없는 async 함수는 비동기로 동작하지 않는다 async라는 이름이 만드는 오해자바스크립트의 async function을 보면 자연스럽게 "이 코드는 비동기로 동작하는구나"라고 생각하게 된다. 하지만 실제로 실행 흐름을 뜯어보면, async라는 키워드 자체는 비동기 실행을 보장하지 않는다. 진짜 비동기 전환을 일으키는 건 async가 아니라 그 안에 있는 await이다. 이 글에서는 코드로 그 근거를 하나씩 확인한다. await 없는 async 함수는 동기로 동작한다다음 코드를 실행해보자. console.log('A');async function asyncFunc() { console.log('B'); // await 없음}asyncFunc();console.log('C'); 결과는 A → B → C 순서다. asyncFunc()를 호출하는 순간 .. 2026. 9. 25. 이전 1 2 3 4 ··· 78 다음