전체 글 썸네일형 리스트형 composer.json만 수정했는데 왜 composer.lock 때문에 배포가 실패할까? Laravel이나 PHP 프로젝트를 개발하다 보면 composer.json을 수정하는 일이 자주 있다.패키지를 추가하거나 버전을 변경하는 경우도 있고, Composer 설정을 변경하는 경우도 있다.그런데 로컬에서는 아무 문제 없이 동작했는데 Git에 커밋하고 CI나 배포 과정에서 갑자기 이런 오류를 만나는 경우가 있다.The lock file is not up to date with the latest changes in composer.json처음 보면 의존성 패키지에 문제가 있는 것처럼 보인다.그런데 이 오류는 패키지 자체보다 composer.json과 composer.lock의 상태가 서로 맞지 않아서 발생하는 경우가 많다.이번에는 composer.json과 composer.lock이 어떤 관계인지.. Laravel Scheduler가 같은 작업을 여러 번 실행한다면? withoutOverlapping()과 onOneServer() 제대로 이해하기 Laravel로 개발하다 보면 특정 작업을 정해진 시간마다 실행해야 하는 경우가 있다.예를 들어 매일 새벽에 데이터를 정리하거나, 매시간 통계를 생성하거나, 특정 조건을 만족하는 사용자에게 알림을 보내는 작업이다.Laravel에서는 이런 작업을 Scheduler에 등록할 수 있다.문제는 처음에는 잘 동작하던 스케줄러가 어느 순간부터 이런 식으로 보일 수 있다는 것이다.같은 작업이 두 번 실행됨같은 사용자에게 알림이 여러 번 발송됨정산 데이터가 중복 처리됨같은 명령어가 동시에 실행되고 있음처음에는 Artisan Command 자체에 문제가 있다고 생각하기 쉽다.그런데 실제로는 Command가 아니라 Scheduler가 같은 작업을 여러 번 실행하고 있는 것일 수 있다.이 문제를 이해하려면 Laravel의 .. MySQL INSERT ... ON DUPLICATE KEY UPDATE 제대로 이해하기 - Upsert는 어떻게 동작할까? 개발하다 보면 이런 상황이 자주 발생합니다.사용자가 있으면 UPDATE없으면 INSERT예를 들어 회원의 마지막 로그인 시간을 기록한다고 해보겠습니다.user_id = 100이미 존재한다→ UPDATE존재하지 않는다→ INSERT애플리케이션 코드로 처리한다면 보통 다음과 같이 생각할 수 있습니다.SELECT 존재 여부 확인 ↓있음? ├─ YES → UPDATE └─ NO → INSERT그런데 MySQL에서는 이 작업을 하나의 SQL로 처리할 수 있습니다.바로:INSERT ... ON DUPLICATE KEY UPDATE입니다.흔히 Upsert라고 부르는 패턴입니다.1. Upsert란?Upsert는:UPDATE + INSERT를 합쳐서 부르는 표현입니다.의미는 간단합니다.데이터가 없으면 IN.. MySQL DATE, DATETIME, TIMESTAMP 차이 - 언제 무엇을 사용해야 할까? MySQL에서 날짜와 시간을 저장할 때 가장 많이 사용하는 타입은 다음과 같습니다.DATEDATETIMETIMESTAMP처음에는 단순하게 생각하기 쉽습니다.DATE→ 날짜DATETIME→ 날짜 + 시간TIMESTAMP→ 날짜 + 시간하지만 DATETIME과 TIMESTAMP는 단순히 이름만 다른 것이 아닙니다.특히 시간대(Time Zone), 자동 시간 처리, 저장 가능한 범위에서 차이가 있습니다.테이블을 설계할 때 이 차이를 모르고 타입을 선택하면 나중에 다음과 같은 문제가 발생할 수 있습니다.서버 시간을 UTC로 변경했더니 시간이 달라졌다한국 시간으로 저장했는데 조회하면 시간이 바뀌어 있다created_at은 DATETIME이 맞을까?생년월일을 DATETIME으로 저장해야 할까?TIMESTAMP는 무.. Claude Code에서 Jira MCP 연결하기 - 이슈 조회부터 댓글 작성, 상태 변경까지 개발 업무를 하다 보면 Jira에서 일감을 확인하고, 요구사항을 읽고, 작업이 끝난 뒤 댓글을 작성하는 일을 반복하게 됩니다.Claude Code에서는 Atlassian Rovo MCP(Model Context Protocol)를 연결하면 Jira와 Confluence 정보를 직접 조회하고 일부 작업을 수행할 수 있습니다.예를 들어 다음과 같은 요청이 가능합니다.DD-123 일감 내용 알려줘DD-123 요구사항 정리해줘내 담당 열린 이슈 찾아줘DD-123 작업 내용 댓글로 정리해줘DD-123 상태를 진행 중으로 변경해줘이번 글에서는 Claude Code에서 Atlassian Jira MCP를 연결하는 방법과 실제 활용 방법을 정리해 보겠습니다.MCP란?MCP(Model Context Protocol)는 .. 갤럭시 휴대폰 변경 전 준비할 것 총정리|Smart Switch부터 카카오톡, 모바일 신분증까지 갤럭시 휴대폰 변경 전 준비할 것 총정리오래 사용하던 휴대폰을 새 휴대폰으로 바꾸면 단순히 유심만 옮기면 끝날 것 같지만, 실제로는 미리 확인해야 할 것들이 생각보다 많습니다.특히 사진, 카카오톡 대화, 금융 앱, 인증 앱, 모바일 신분증 등은 기기 변경 과정에서 별도로 확인해야 하는 경우가 있습니다.이번 글에서는 갤럭시 휴대폰에서 새로운 갤럭시 휴대폰으로 변경할 때 준비해야 할 것과 데이터 이전 방법을 정리해 보겠습니다.예시는 다음과 같습니다.갤럭시 A34 → 갤럭시 S25하지만 대부분의 갤럭시 기기 변경 과정에도 동일하게 적용할 수 있습니다.1. 휴대폰 변경 전에 가장 먼저 확인할 것새 휴대폰이 도착하기 전에 기존 휴대폰에서 몇 가지 백업을 확인하는 것이 좋습니다.가장 중요한 것은 다음과 같습니다.G.. MySQL 문자열 정렬과 Collation - 같은 문자열인데 결과가 다른 이유 MySQL에서 문자열을 저장할 때 VARCHAR만 지정하면 끝이라고 생각하기 쉽다.그런데 문자열을 비교하거나 정렬하다 보면 이런 상황을 만날 수 있다.SELECT 'ABC' = 'abc';결과가 1이 나올 수도 있고 0이 나올 수도 있다.또,SELECT nameFROM usersORDER BY name;를 실행했는데 내가 예상한 순서와 다른 결과가 나올 수도 있다.왜 그럴까?문자열의 저장 방식만 결정하는 것이 아니라 문자열을 어떻게 비교하고 정렬할 것인지까지 결정해야 하기 때문이다.이때 등장하는 것이 Collation(콜레이션)이다.1. Character Set과 Collation은 다르다먼저 둘을 구분해야 한다.Character Set문자를 어떤 방식으로 표현하고 저장할 것인지를 결정한다.예를 들어:u.. MySQL NULL 제대로 이해하기 - = NULL이 안 되는 이유 MySQL을 사용하다 보면 다음과 같은 조건을 작성할 때가 있습니다.SELECT *FROM usersWHERE deleted_at = NULL;그런데 예상과 달리 데이터가 조회되지 않습니다.분명 deleted_at이 비어 있는 데이터가 있는데도 결과가 나오지 않는 것입니다.이런 상황에서 처음 MySQL을 사용하는 경우에는 다음과 같이 생각하기 쉽습니다.NULL은 값이 비어 있다는 뜻이니까 = NULL로 비교하면 되지 않을까?하지만 SQL에서는 이렇게 비교하지 않습니다.WHERE deleted_at = NULL대신 다음과 같이 작성해야 합니다.WHERE deleted_at IS NULL이번 글에서는 MySQL에서 NULL이 정확히 무엇을 의미하는지, 왜 = NULL이 동작하지 않는지, 그리고 실무에서는 어.. 이전 1 2 3 4 ··· 9 다음