본문 바로가기

전체 글

(104)
운영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..
MySQL InnoDB Primary Keys 해당 영상을 보고 정리한 글입니다.https://www.youtube.com/watch?v=aQpa3hm9gE0 Clustered IndexEach InnoDB table has a special index called the clustered index that stores row data.Typically, the clusterd Index is synonymous with the primary key.InnoDB는 클러스터 인덱스라는 특별한 인덱스가 있고, 이는 primary key와 같다. (=동의어이다) 인덱스의 동작을 memtal representation으로 설명한 것.데이터가 추가되면, 인덱스가 정렬되고, 이 인덱스는 각각의 row를 가리킨다.하지만 실제 InnoDB의 동작은 이렇지 않..
[Network] 클라이언트의 진짜 IP를 얻기 (X-Forwarded-For 헤더) HttpServletRequest의 getRemoteAddr()가장 기본적인 방법이다.이 방법은 클라이언트와 서버가 직접 통신할 때 유용하다.그러나 프록시 서버나 로드 밸런서를 사용하는 경우에는 프록시나 로드밸런서의 주소가 반환될 수 있다. 다양한 헤더를 통해 얻기프록시 서버나 로드밸런서 등의 존재 때문에, 클라이언트의 진짜 IP를 얻기 위해서는 아래와 같은 코드가 쓰이기도 한다.mport javax.servlet.http.HttpServletRequest;public static String getClientIp(HttpServletRequest request) { String clientIp = request.getHeader("X-Forwarded-For"); if (clientIp ==..
[러다이트 운동] 순수 Java와 맥북으로 홈서버 만들어보기(포트 포워딩, 도메인, 외부망에서 접속) 어느 날 갑자기 쇼츠에 이런 영상이 떴다.https://www.youtube.com/shorts/hFlx1tzeZJg 생각해보니까 나는 AWS ec2 같은 것만 써봤지, 집컴으로 서버를 만들어본적이 없다.그래서 오늘 스프링부트, 스프링, AWS 등을 쓰지 않고 간단한 서버를 만드는 러다이트 운동을 해보기로 했다 1. 서버 띄우고 로컬에서 접속해보기일단 코드는 지피티 형님한테 짜달라고 했다 (러다이트 운동이라며 지피티 쓰는게 어불성설 같긴 하지만..) import com.sun.net.httpserver.HttpServer;import com.sun.net.httpserver.HttpHandler;import com.sun.net.httpserver.HttpExchange;import java.io.IOE..
[Java 21] Virtual Thread란 무엇일까? Virtual thread경량 스레드란 기존 언어의 스레드 모델보다 더 작은 단위로 실행 단위를 나눠서 컨텍스트 스위칭 비용과 blocking 타임을 낮추는 개념JVM 진영에는 2017년 Kotlin 1.1에 처음 도입된 coroutine이 존재했다.2023년 9월 정식 출시된 JDK21에 경량 스레드 모델 virtual thread가 정식 feature로 포함되면서 자바에서도 경량 스레드 모델을 다룰 수 있게 되었다. 일반 스레드와 Virtual Thread 비교일반 스레드 특징플랫폼 스레드OS에 의해 스케줄링커널 스레드와 1:1 매핑작업 단위 RunnableVirtual Thread 특징플랫폼 스레드가 아닌 가상 스레드OS에 의해 스케줄링 되지 않고 JVM에 의해 스케줄링JVM의 캐리어 스레드와 1..