본문 바로가기

전체 글85

[java] LocalDateTime이 배열로 나올 때 - Jackson 설정 세 가지 날짜 타입은 모듈을 등록해야 직렬화되고, 등록만 하면 숫자 배열이 된다. null 제외와 이름 전략까지 세 가지가 자주 손대는 설정이다. API 응답에 날짜를 넣었더니 [2026,8,7,9,30] 같은 배열로 나옵니다. 프런트엔드에서 파싱이 안 된다고 합니다. 어떤 프로젝트에서는 "2026-08-07T09:30:00"으로 잘 나오는데 무엇이 다른지 모르겠습니다. null 필드를 빼거나 필드 이름을 스네이크 케이스로 바꾸는 것도 어디서 설정하는지 헷갈립니다. Jackson 설정을 어디에 두는 것인지부터 모르겠습니다.날짜는 세 단계를 지난다Jackson은 자바 8의 날짜 타입을 기본으로 모릅니다. 별도 모듈에 들어 있기 때문입니다. 모듈 없이 직렬화하면 예외가 나면서 친절하게도 무엇을 추가하라고 알려 줍니다.. 2026. 8. 29.
[docker] Docker 볼륨과 바인드 마운트 - 컨테이너를 지워도 남는 데이터 컨테이너 안에 쓴 데이터는 컨테이너와 함께 사라진다. 볼륨과 바인드 마운트가 같은 자리에서 정반대로 동작한다는 점까지 실행해 확인한다. Postgres 컨테이너를 띄워 잘 쓰다가 옵션을 바꾸려고 지우고 다시 만들었더니 데이터베이스가 비어 있었습니다. Docker 볼륨을 붙이라는 말은 봤는데 -v 뒤에 이름을 쓰는 것과 경로를 쓰는 것이 무슨 차이인지 모르겠고, 개발할 때 소스를 마운트했더니 이번에는 컨테이너 안에 있어야 할 파일이 사라져 있었습니다.컨테이너를 지우면 데이터도 사라진다컨테이너는 이미지 위에 쓰기 레이어를 한 겹 얹어 시작하고, 안에서 만든 파일은 전부 그 레이어에 들어갑니다. 그 레이어는 컨테이너의 일부라서 docker rm 과 함께 없어집니다. 서두의 '지우고 다시 만들었더니 비어 있더라.. 2026. 8. 28.
[docker] Docker 멀티스테이지 빌드로 이미지 크기 확 줄이기 (1GB → 수십 MB) Docker 멀티스테이지 빌드로 빌드 도구와 런타임을 분리해 이미지 크기와 공격면을 줄이는 법. FROM AS로 단계를 나누고 COPY --from으로 결과물만 옮기면, JRE·distroless 런타임 이미지가 수백 MB 단위로 가벼워진다. 배포하려고 이미지를 빌드했더니 1GB에 가까운 걸 보고 놀란 적이 있을 겁니다. 실행에는 jar 하나면 되는데, 이미지 안에는 JDK와 Gradle, 소스, 빌드 캐시가 통째로 들어 있습니다.이미지가 커지는 이유단일 스테이지로 빌드하면 컴파일러와 빌드 도구, 중간 산출물이 전부 최종 이미지에 남습니다. 하지만 컨테이너를 실제로 굴릴 때 필요한 건 결과물뿐입니다. Spring Boot라면 jar 하나, Go라면 바이너리 하나입니다. 빌드에만 쓰는 JDK와 Gradle.. 2026. 8. 28.
[java/spring] DTO - 엔티티를 그대로 내보내면 안에 있는 게 전부 나간다 엔티티는 DB 테이블의 모양이고 응답은 화면이 필요한 모양이다. 둘을 같은 클래스로 쓰면 필드가 새어 나가고 스키마 변경이 API를 바꾼다. 컨트롤러에서 엔티티를 그대로 돌려주면 잘 동작합니다. 굳이 DTO라는 클래스를 하나 더 만들고 변환 코드까지 쓰는 게 번거롭습니다. 실제로 무엇이 문제가 되는지, 언제부터 나눠야 하는지 모르겠습니다.안에 있는 것이 전부 나간다직렬화는 객체의 필드를 훑어 JSON으로 바꾸는 일입니다. 내가 고른 것이 아니라 그 객체가 가진 것 전부입니다. 사용자 엔티티에 passwordHash와 internalFlag가 있으면 그것들도 함께 나갑니다.실제로 찍어 보면 그대로입니다. 필요한 것은 id·email·createdAt 셋인데 다섯 개가 다 나갑니다. DTO로 고르면 셋만 남.. 2026. 8. 27.
[.net] 형 변환 - 캐스트와 as, is 중 무엇을 쓸 것인가 캐스트는 실패하면 예외, as는 null, is 패턴은 검사와 변환을 한 번에 한다. 숫자 변환의 버림·반올림·넘침도 함께 짚는다. (int)처럼 괄호로 바꾸는 것과 as, is가 다 형 변환 같은데 무엇이 다른지 모르겠습니다. as로 바꿨더니 나중에 엉뚱한 곳에서 NullReferenceException이 났고, (int)3.9가 4가 아니라 3이 나오는 것도 예상 밖이었습니다.실패했을 때가 다르다형 변환 방법이 여럿인 이유는 실패를 어떻게 다룰지가 다르기 때문입니다. 고를 때 물어야 할 질문도 그것 하나입니다 — 안 맞으면 어떻게 되어야 하나.캐스트는 안 맞으면 즉시 멈춥니다. (Dog)a 는 InvalidCastException: Unable to cast object of type 'Cat' to.. 2026. 8. 27.