본문 바로가기

전체 글

(108)
[git] 브랜치 조상 관계 이슈로 PR이 생성되지 않는 문제 해결하기 (git rebase와 cherry pick) git rebasemain, feature 브랜치가 있고 feature가 main에서 나온 브랜치라고 치자.rebase는 브랜치의 커밋 전체가 합쳐지지만, main의 새 기준점 위로 다른 커밋 SHA를 가지고 쌓인다.git checkout featuregit rebase main # feature의 커밋들을 최신 main 위로 재배치git push --force-with-lease # 이미 push했다면 필요 (공유 브랜치는 주의) *참고: --force-with-lease:내가 마지막으로 확인한 원격 상태 그대로일 때만 강제 push 하겠다는 옵션rebase나 cherry-pick, reset --hard처럼 히스토리를 바꾼 뒤에는 일반 push가 거부되기 때문에 강제 push 해야..
Spring Boot가 변수를 읽어오는 순서, 다중 설정값 로드(spring.profiles.group) Spring Boot에서 설정 데이터의 우선 순위Spring Boot에서는 같은 키가 여러 곳에 있으면 우선순위가 높은 값이 이긴다는 원칙으로 동작한다. 위가 우선 순위가 가장 높으며, 아래로 갈수록 낮다. 1. 테스트의 @SpringBootTest(proterties=...), @TestPropertySource2. 커맨드라인 인자 (--server.port=9090)3. SPRING_APPLICATION_JSON (환경변수/시스템 프로퍼티에 담은 JSON)4. Java 시스템 프로퍼티(-Dserver.port=9090)5. OS 환경변수 (SERVER_PORT=9090)6. jar 외부의 profile별 설정 파일(application-{profile}.yml)7. jar 외부의 기본 설정 파일(ap..
[Kafka / 삽질] Kafka message consume이 안됨(contentType 불일치) 메시지를 발행하면 쌓이기만 하고 소비가 안됐다... 분명 avro schema도 잘 적용했고, consumer 쪽의 topic명도 잘 일치하는데 알고보니 contentType을 json으로 잘못 써준 것이었다. 발행하는 쪽은 avro로 발행하고, consumer도 avro로 생성된 메시지 클래스를 소비하도록 구현해놓고, 설정값을 잘못써준 것이었음
오늘부터 2년차입니다 2025년 2월 10일에 근로계약서 썼으니까, 오늘부터 나는 2년차 개발자다.어쨌거나 저쨌거나 실무에서 만 1년을 일한거다. 그런데 나는... 1년간 뭘 한걸까? 입사 초기에는 잘하고 싶은 욕심도 많고 평일 저녁, 주말마다 개발 공부도 열심히 했던 것 같은데어느 순간부터는 성장하고 싶은 마음도 사그라지고 어영부영 시간이 지나갔던 것 같다. 지난 1년은,,,개발 실력이 늘었는가? => X일을 잘했는가? => X취미를 열심히 해서 실력이 많이 늘었는가? => X운동을 열심히 했는가? => X돈을 많이 모았는가? => X연애를 했는가? => X 진짜 정말 한게 없다.물론 나도 모르는 새에 나도 야금야금 성장하고 변했을지도 모르겠지만,, 확실한건 1년새에 의지는 정말 많이 털렸다. 신입사원일 때는 회사에서 대학..
운영DB 변경, 운영 환경 배포시 주의할 점(default 설정, not null 설정) 어떤 기능을 변경하다 보면, 테이블에 컬럼 추가가 필요한 경우가 있다.보통은 운영DB 변경을 먼저하고 소스 배포가 나가고 소스 배포가 밀리는 경우, 운영 DB가 변경되고 소스는 AS-IS인 채로 며칠이 지나가기도 한다.그럴 때 주의해야겠다고 느낀 점에 대해서 적어보려고 한다. not null 옵션을 주어야하는지 고려not null이 꼭 필요한지 고려해보자.JPA 같은 ORM을 쓰고 있는 상태에서 AS-IS 소스가 동작하면 save() 메서드가 호출되면서 insert 쿼리가 나갈 때 새로 추가된 컬럼에 값이 지정돼 있지 않은 쿼리가 나가게 된다.이때 새롭게 추가된 컬럼이 not null이라면? 값이 지정돼 있지 않기 때문에 에러가 발생한다.(정확히는 해당 컬럼에 default 옵션이 걸려있지 않을 때, d..
Spring Boot 라이브러리 버전 관리(Dependency Management) 스프링 부트는 io.spring.dependency-management 플러그인을 통해 여러 라이브러리의 버전을 개발자 대신 관리해준다.개발자는 원하는 라이브러리만 고르고 버전을 지정하지 않아도 된다.스프링부트가 부트 버전에 맞는 최적화된 라이브러리 버전을 선택해준다. 플러그인 설정io.spring.dependenct-management 플러그인을 적용하려면 build.gradle에 다음과 같이 써주면 된다.plugins { id 'java' id 'org.springframework.boot' version '3.4.7' id 'io.spring.dependency-management' version '1.1.7' // ⭐ // ... 생략} 그러면 아래와 같이 라이브러리의 버전을..
[MySQL] year_month 키워드 마이바티스 raw 쿼리에서 alias로 year_month를 썼더니 에러가 났다.원인 찾는데 오래걸렸는데, year_month가 예약어라는 걸 알게됐다...year_month 예약어에 대해 알아보자. year_month는 extract() 함수와 함께 쓰이며, 시간에서 년,월을 추출한다. SELECT EXTRACT(YEAR_MONTH FROM NOW()); -- 202509 아래 쿼리와 결과가 동일하다. SELECT CONCAT(YEAR(NOW()), MONTH(NOW()));
CQRS 패턴 CQRS의 필요성시스템이 제공하는 기능은 크게 두가지로 나눌 수 있다.상태를 변경하는 기능ex. 배송지 변경, 새로운 주문 생성주로 여러개의 애그리거트가 필요상태 정보를 조회하는 기능ex. 주문 내역 보기, 게시글 보기 등주로 한 애그리거트를 변경→ 상태를 변경하는 범위와 상태를 조회하는 범위가 정확하게 일치하지 않기 때문에 단일 모델로 두 종류의 기능을 구현하면 모델이 불필요하게 복잡해진다. CQRS 패턴단일 모델을 사용할 때 발생하는 복잡도를 해결하기 위해 사용하는 방법이 CQRS(Command Query Responsibility Segregation)이다.명령측(Command)은 create, update, delete 요청을 처리한다.쿼리(Query) 측에서는 읽기 전용 복제본을 사용하여 que..