[{"data":1,"prerenderedAt":1446},["ShallowReactive",2],{"navigation_docs_ko":3,"-ko-note-spring-java-year-month":267,"-ko-note-spring-java-year-month-surround":1441},[4,130,253],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":33},"Note (개발 지식)","emojione-v1:note-pad","\u002Fko\u002Fnote","ko\u002F1.note",[10,34,48,74,84,94,110,120],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":33},"Spring","logos:spring-icon","\u002Fko\u002Fnote\u002Fspring","ko\u002F1.note\u002F0.spring",[16,21,25,29],{"title":17,"path":18,"stem":19,"icon":20},"Spring AI 핵심 개념과 LLM 애플리케이션 구조 이해","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai","lucide:file-text",{"title":22,"path":23,"stem":24,"icon":20},"[Java] Record와 @Version으로 이해하는 불변 데이터와 동시성 제어","\u002Fko\u002Fnote\u002Fspring\u002Frecord-and-version-concurrency","ko\u002F1.note\u002F0.spring\u002F2.record-and-version-concurrency",{"title":26,"path":27,"stem":28,"icon":20},"[JPA] @PersistenceContext와 EntityManager로 이해하는 영속성 컨텍스트","\u002Fko\u002Fnote\u002Fspring\u002Fspring-persistence-context","ko\u002F1.note\u002F0.spring\u002F3.spring-persistence-context",{"title":30,"path":31,"stem":32,"icon":20},"[Java] YearMonth로 월 단위 날짜를 다루는 방법","\u002Fko\u002Fnote\u002Fspring\u002Fjava-year-month","ko\u002F1.note\u002F0.spring\u002F4.java-year-month",false,{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":33},"Javascript","skill-icons:javascript","\u002Fko\u002Fnote\u002Fjavascript","ko\u002F1.note\u002F1.javascript",[40,44],{"title":41,"path":42,"stem":43,"icon":20},"Promise.all과 구조 분해 할당을 활용한 데이터 처리 패턴","\u002Fko\u002Fnote\u002Fjavascript\u002Fdestructuring","ko\u002F1.note\u002F1.javascript\u002F1.destructuring",{"title":45,"path":46,"stem":47,"icon":20},"JavaScript 배열 고차 함수와 데이터 처리 패턴 이해","\u002Fko\u002Fnote\u002Fjavascript\u002Ffilter","ko\u002F1.note\u002F1.javascript\u002F2.filter",{"title":49,"icon":50,"path":51,"stem":52,"children":53,"page":33},"Nuxt4","logos:nuxt-icon","\u002Fko\u002Fnote\u002Fnuxt4","ko\u002F1.note\u002F2.nuxt4",[54,58,62,66,70],{"title":55,"path":56,"stem":57,"icon":20},"Nuxt 4를 선택한 이유와 아키텍처 및 실무 가이드","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-info","ko\u002F1.note\u002F2.nuxt4\u002F1.nuxt-info",{"title":59,"path":60,"stem":61,"icon":20},"Nuxt useAsyncData 동작 원리와 SSR 데이터 페칭 최적화","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-use_async_data","ko\u002F1.note\u002F2.nuxt4\u002F2.nuxt-use_async_data",{"title":63,"path":64,"stem":65,"icon":20},"Nuxt Content v3 데이터 모델과 Query 시스템 이해","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-content-v3","ko\u002F1.note\u002F2.nuxt4\u002F3.nuxt-content-v3",{"title":67,"path":68,"stem":69,"icon":20},"Nuxt Auto-imports 내부 동작과 컴파일 과정 분석","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-auto-import","ko\u002F1.note\u002F2.nuxt4\u002F4.nuxt-auto-import",{"title":71,"path":72,"stem":73,"icon":20},"Nuxt 렌더링 방식 이해: SSR, SSG, ISR, CSR 구현 방법","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-rendering-strategy","ko\u002F1.note\u002F2.nuxt4\u002F5.nuxt-rendering-strategy",{"title":75,"icon":76,"path":77,"stem":78,"children":79,"page":33},"Nitro","unjs:nitro","\u002Fko\u002Fnote\u002Fnitro","ko\u002F1.note\u002F3.nitro",[80],{"title":81,"path":82,"stem":83,"icon":20},"Nitro 아키텍처와 서버 엔진 구조","\u002Fko\u002Fnote\u002Fnitro\u002Fnitro","ko\u002F1.note\u002F3.nitro\u002Fnitro",{"title":85,"icon":86,"path":87,"stem":88,"children":89,"page":33},"Devops","vscode-icons:file-type-pipeline","\u002Fko\u002Fnote\u002Fdevops","ko\u002F1.note\u002F4.devops",[90],{"title":91,"path":92,"stem":93,"icon":20},"서버사이드 WebAssembly(Wasm)와 차세대 실행 환경","\u002Fko\u002Fnote\u002Fdevops\u002Fwebassembly","ko\u002F1.note\u002F4.devops\u002F1.webAssembly",{"title":95,"icon":96,"path":97,"stem":98,"children":99,"page":33},"Tooling","lucide:wrench","\u002Fko\u002Fnote\u002Ftooling","ko\u002F1.note\u002F4.tooling",[100],{"title":101,"icon":102,"path":103,"stem":104,"children":105,"page":33},"Package Manager","devicon:npm","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager","ko\u002F1.note\u002F4.tooling\u002F1.package-manager",[106],{"title":107,"path":108,"stem":109,"icon":20},"Package Lock 파일의 역할과 의존성 관리 원리","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager\u002Fpackage-lock","ko\u002F1.note\u002F4.tooling\u002F1.package-manager\u002F1.package-lock",{"title":111,"icon":112,"path":113,"stem":114,"children":115,"page":33},"Web","streamline-plump:web","\u002Fko\u002Fnote\u002Fweb","ko\u002F1.note\u002F4.web",[116],{"title":117,"path":118,"stem":119,"icon":20},"웹 애플리케이션 렌더링 아키텍처 이해","\u002Fko\u002Fnote\u002Fweb\u002Frendering-modes","ko\u002F1.note\u002F4.web\u002F2.rendering-modes",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":33},"SEO","icon-park-solid:seo","\u002Fko\u002Fnote\u002Fseo","ko\u002F1.note\u002F6.seo",[126],{"title":127,"path":128,"stem":129,"icon":20},"[SEO] 개발 블로그 검색 노출을 위한 robots.txt와 SEO 설정 가이드","\u002Fko\u002Fnote\u002Fseo\u002Fseo","ko\u002F1.note\u002F6.seo\u002F1.seo",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":33},"Project (개발일지)","icon-park-solid:branch-two","\u002Fko\u002Fproject","ko\u002F2.project",[136,187],{"title":137,"icon":138,"path":139,"stem":140,"children":141,"page":33},"Brolog","custom:symbol","\u002Fko\u002Fproject\u002Fbrolog","ko\u002F2.project\u002F1.brolog",[142,146,150,154,158,162,166,170,174,179,183],{"title":143,"path":144,"stem":145,"icon":20},"[Brolog] 프로젝트 개요","\u002Fko\u002Fproject\u002Fbrolog\u002Foutline","ko\u002F2.project\u002F1.brolog\u002F1.outline",{"title":147,"path":148,"stem":149,"icon":20},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (3) - Runtime 기능 문제 분석과 AI Assistant 전환","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy3-ai-integration","ko\u002F2.project\u002F1.brolog\u002F10.vercel-deploy3-ai-integration",{"title":151,"path":152,"stem":153,"icon":20},"[Brolog] AI Assistant 적용 과정 - Agent 구조와 API 사용량 관리 시 고려사항","\u002Fko\u002Fproject\u002Fbrolog\u002Fai-assistant-application-process","ko\u002F2.project\u002F1.brolog\u002F11.ai-assistant-application-process",{"title":155,"path":156,"stem":157,"icon":20},"[Brolog] 검색 엔진 노출을 위한 SEO 적용 과정","\u002Fko\u002Fproject\u002Fbrolog\u002Fbrolog-seo","ko\u002F2.project\u002F1.brolog\u002F12.brolog-seo",{"title":159,"path":160,"stem":161,"icon":20},"[Brolog] 프로젝트 구조","\u002Fko\u002Fproject\u002Fbrolog\u002Fstructure","ko\u002F2.project\u002F1.brolog\u002F2.structure",{"title":163,"path":164,"stem":165,"icon":20},"[Brolog] Nuxt Content 네비게이션 아이콘 커스텀 빌드","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-icon","ko\u002F2.project\u002F1.brolog\u002F3.custom-icon",{"title":167,"path":168,"stem":169,"icon":20},"[Brolog] Nuxt4 Auto-imports 동작 원리와 자동 import 시스템 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fnuxt-auto-import","ko\u002F2.project\u002F1.brolog\u002F4.nuxt-auto-import",{"title":171,"path":172,"stem":173,"icon":20},"[Brolog] 개발 블로그 메인 페이지 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fdevelop-main","ko\u002F2.project\u002F1.brolog\u002F5.develop-main",{"title":175,"path":176,"stem":177,"icon":178},"[Brolog] 브랜드 아이덴티티 적용 - Custom 404 페이지와 Default No Image 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-error-and-default-thumbnail","ko\u002F2.project\u002F1.brolog\u002F6.custom-error-and-default-thumbnail","lucide:image",{"title":180,"path":181,"stem":182,"icon":20},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (1)","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy1","ko\u002F2.project\u002F1.brolog\u002F8.vercel-deploy1",{"title":184,"path":185,"stem":186,"icon":20},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (2) - Build Pipeline 오류 분석과 Nuxt 실행 구조 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy2-error-analyze","ko\u002F2.project\u002F1.brolog\u002F9.vercel-deploy2-error-analyze",{"title":188,"icon":189,"path":190,"stem":191,"children":192,"page":33},"Brobean","custom:brobean","\u002Fko\u002Fproject\u002Fbrobean","ko\u002F2.project\u002F2.brobean",[193,197,201,205,209,213,217,221,225,229,233,237,241,245,249],{"title":194,"path":195,"stem":196,"icon":20},"[BroBean] 연인과 함께 사용하는 가계부: BroBean - 프로젝트 기획과 이름의 탄생","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-01","ko\u002F2.project\u002F2.brobean\u002F1.brobean-dev-log-01",{"title":198,"path":199,"stem":200,"icon":20},"[BroBean] 연인과 함께 사용하는 가계부: BroBean 프로젝트 시작 - Nuxt 4 기반 프론트 개발 환경 구축","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-02","ko\u002F2.project\u002F2.brobean\u002F2.brobean-dev-log-02",{"title":202,"path":203,"stem":204,"icon":20},"[BroBean] BroBean 프로젝트 #3 - 모바일 앱 전환을 고려한 공통 레이아웃 설계","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-03","ko\u002F2.project\u002F2.brobean\u002F3.brobean-dev-log-03",{"title":206,"path":207,"stem":208,"icon":20},"[BroBean] BroBean 프로젝트 #4 - 홈 화면(Dashboard) 설계와 Mock 데이터 구성","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-04","ko\u002F2.project\u002F2.brobean\u002F4.brobean-dev-log-04",{"title":210,"path":211,"stem":212,"icon":20},"[BroBean] BroBean 프로젝트 #5 돈을 모으면 캐릭터도 성장한다 - 브로빈 성장 시스템 설계","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-05","ko\u002F2.project\u002F2.brobean\u002F5.brobean-dev-log-05",{"title":214,"path":215,"stem":216,"icon":20},"[BroBean] BroBean 프로젝트 #6 씨앗 심기와 밭 가꾸기 기능 설계","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-06","ko\u002F2.project\u002F2.brobean\u002F6.brobean-dev-log-06",{"title":218,"path":219,"stem":220,"icon":20},"[BroBean] BroBean 프로젝트 #7 성장 일지와 나무 키우기 화면 구현","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-07","ko\u002F2.project\u002F2.brobean\u002F7.brobean-dev-log-07",{"title":222,"path":223,"stem":224,"icon":20},"[BroBean] BroBean 프로젝트 #8 수확 정산으로 한눈에 보는 소비 흐름 - 소비 리포트 & 정산 화면 구현","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-08","ko\u002F2.project\u002F2.brobean\u002F8.brobean-dev-log-08",{"title":226,"path":227,"stem":228,"icon":20},"[BroBean] BroBean 프로젝트 #9 알림부터 마이페이지까지 - 사용자 편의 기능과 개인 농장 설정 화면 구현","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-09","ko\u002F2.project\u002F2.brobean\u002F9.brobean-dev-log-09",{"title":230,"path":231,"stem":232,"icon":20},"[BroBean] BroBean 프로젝트 #10 로그인부터 파트너 초대까지 - 계정 인증과 커플 연결 화면 구현","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-10","ko\u002F2.project\u002F2.brobean\u002F910.brobean-dev-log-10",{"title":234,"path":235,"stem":236,"icon":20},"[BroBean] BroBean 프로젝트 #11 개인과 커플을 모두 위한 모드 분리 - Pinia 기반 개인\u002F커플 모드 전환 구현","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-11","ko\u002F2.project\u002F2.brobean\u002F911.brobean-dev-log-11",{"title":238,"path":239,"stem":240,"icon":20},"[BroBean] BroBean 프로젝트 #12 인증 상태 복구와 Nuxt Plugin 실행 순서 제어","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-12","ko\u002F2.project\u002F2.brobean\u002F912.brobean-dev-log-12",{"title":242,"path":243,"stem":244,"icon":20},"[BroBean] BroBean 프로젝트 #13 개인·커플 모드와 가계부 API 구현 - 쿼리 성능을 다시 돌아보다","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-13","ko\u002F2.project\u002F2.brobean\u002F913.brobean-dev-log-13",{"title":246,"path":247,"stem":248,"icon":20},"[BroBean] BroBean 프로젝트 #14 순환 참조 오류를 ObjectProvider로 해결하기","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-14","ko\u002F2.project\u002F2.brobean\u002F914.brobean-dev-log-14",{"title":250,"path":251,"stem":252,"icon":20},"[BroBean] BroBean 프로젝트 #15 JPA 페이지네이션 적용, Page와 Slice의 차이","\u002Fko\u002Fproject\u002Fbrobean\u002Fbrobean-dev-log-15","ko\u002F2.project\u002F2.brobean\u002F915.brobean-dev-log-15",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":33},"Error (트러블슈팅)","emojione:stop-sign","\u002Fko\u002Ftrouble-shooting","ko\u002F3.trouble-shooting",[259],{"title":137,"icon":138,"path":260,"stem":261,"children":262,"page":33},"\u002Fko\u002Ftrouble-shooting\u002Fbrolog","ko\u002F3.trouble-shooting\u002F1.brolog",[263],{"title":264,"path":265,"stem":266,"icon":20},"[Nuxt Content] Nuxt Icon 오류 해결과 Custom Collection 기반 오프라인 아이콘 구성","\u002Fko\u002Ftrouble-shooting\u002Fbrolog\u002Fnuxt-icon-restricted-network-troubleshooting","ko\u002F3.trouble-shooting\u002F1.brolog\u002F1.nuxt-icon-restricted-network-troubleshooting",{"id":268,"title":30,"body":269,"date":1425,"description":1426,"extension":1427,"links":1428,"meta":1429,"navigation":1436,"path":31,"seo":1437,"stem":32,"__hash__":1440},"docs_ko\u002Fko\u002F1.note\u002F0.spring\u002F4.java-year-month.md",{"type":270,"value":271,"toc":1423},"minimark",[272,1419],[273,274,276,281,290,328,331,334,342,345,351,359,366,369,373,382,390,392,430,433,439,442,447,453,459,464,467,469,473,476,498,501,531,534,572,575,600,603,608,618,620,624,629,632,712,714,720,723,729,736,738,742,750,821,824,827,893,896,953,956,959,965,968,970,974,987,989,1022,1025,1056,1059,1062,1134,1137,1139,1143,1149,1155,1157,1226,1229,1231,1235,1241,1244,1250,1253,1262,1265,1274,1277,1284,1290,1292,1296,1304,1307,1388,1391,1394,1400,1406,1409,1416],"u-page-card",{":spotlight":275},"true",[277,278,280],"h1",{"id":279},"java-yearmonth로-월-단위-날짜를-다루는-방법","📖 Java YearMonth로 월 단위 날짜를 다루는 방법",[282,283,284,285,289],"p",{},"Java에서 날짜를 다룰 때 대부분 ",[286,287,288],"code",{},"LocalDate","를 먼저 떠올리게 된다.",[291,292,297],"pre",{"className":293,"code":294,"language":295,"meta":296,"style":296},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","LocalDate date = LocalDate.now();\n","java","",[286,298,299],{"__ignoreMap":296},[300,301,304,307,311,315,318,321,325],"span",{"class":302,"line":303},"line",1,[300,305,288],{"class":306},"spNyl",[300,308,310],{"class":309},"sTEyZ"," date ",[300,312,314],{"class":313},"sMK4o","=",[300,316,317],{"class":309}," LocalDate",[300,319,320],{"class":313},".",[300,322,324],{"class":323},"s2Zo4","now",[300,326,327],{"class":313},"();\n",[282,329,330],{},"하지만 모든 상황에서 일(day)까지 필요한 것은 아니다.",[282,332,333],{},"예를 들어 가계부에서:",[291,335,340],{"className":336,"code":338,"language":339,"meta":296},[337],"language-text","2026년 8월 지출 내역\n2026년 8월 수입 내역\n2026년 8월 저축 내역\n","text",[286,341,338],{"__ignoreMap":296},[282,343,344],{},"을 조회한다고 하면 실제로 필요한 값은:",[291,346,349],{"className":347,"code":348,"language":339,"meta":296},[337],"2026-08\n",[286,350,348],{"__ignoreMap":296},[282,352,353,354,358],{},"이라는 ",[355,356,357],"strong",{},"연도와 월","이다.",[282,360,361,362,365],{},"이럴 때 사용할 수 있는 클래스가 ",[286,363,364],{},"YearMonth","다.",[367,368],"hr",{},[277,370,372],{"id":371},"yearmonth란","🔎 YearMonth란?",[282,374,375,377,378,381],{},[286,376,364],{},"는 Java 8부터 제공되는 ",[286,379,380],{},"java.time"," 패키지의 날짜 타입으로,",[383,384,385],"blockquote",{},[282,386,387],{},[355,388,389],{},"특정 연도와 월을 표현하기 위한 객체",[282,391,365],{},[291,393,395],{"className":293,"code":394,"language":295,"meta":296,"style":296},"YearMonth yearMonth = YearMonth.of(2026, 8);\n",[286,396,397],{"__ignoreMap":296},[300,398,399,401,404,406,409,411,414,417,421,424,427],{"class":302,"line":303},[300,400,364],{"class":306},[300,402,403],{"class":309}," yearMonth ",[300,405,314],{"class":313},[300,407,408],{"class":309}," YearMonth",[300,410,320],{"class":313},[300,412,413],{"class":323},"of",[300,415,416],{"class":313},"(",[300,418,420],{"class":419},"sbssI","2026",[300,422,423],{"class":313},",",[300,425,426],{"class":419}," 8",[300,428,429],{"class":313},");\n",[282,431,432],{},"위 값은:",[291,434,437],{"className":435,"code":436,"language":339,"meta":296},[337],"2026년 8월\n",[286,438,436],{"__ignoreMap":296},[282,440,441],{},"을 의미한다.",[282,443,444,446],{},[286,445,288],{},"가:",[291,448,451],{"className":449,"code":450,"language":339,"meta":296},[337],"2026-08-18\n",[286,452,450],{"__ignoreMap":296},[282,454,455,456,458],{},"처럼 연도, 월, 일을 표현한다면 ",[286,457,364],{},"는:",[291,460,462],{"className":461,"code":348,"language":339,"meta":296},[337],[286,463,348],{"__ignoreMap":296},[282,465,466],{},"처럼 연도와 월만 표현한다.",[367,468],{},[277,470,472],{"id":471},"️-기본-사용법","🛠️ 기본 사용법",[282,474,475],{},"현재 연도와 월을 가져올 수도 있다.",[291,477,479],{"className":293,"code":478,"language":295,"meta":296,"style":296},"YearMonth currentMonth = YearMonth.now();\n",[286,480,481],{"__ignoreMap":296},[300,482,483,485,488,490,492,494,496],{"class":302,"line":303},[300,484,364],{"class":306},[300,486,487],{"class":309}," currentMonth ",[300,489,314],{"class":313},[300,491,408],{"class":309},[300,493,320],{"class":313},[300,495,324],{"class":323},[300,497,327],{"class":313},[282,499,500],{},"특정 연도와 월을 지정할 수도 있다.",[291,502,504],{"className":293,"code":503,"language":295,"meta":296,"style":296},"YearMonth month = YearMonth.of(2026, 8);\n",[286,505,506],{"__ignoreMap":296},[300,507,508,510,513,515,517,519,521,523,525,527,529],{"class":302,"line":303},[300,509,364],{"class":306},[300,511,512],{"class":309}," month ",[300,514,314],{"class":313},[300,516,408],{"class":309},[300,518,320],{"class":313},[300,520,413],{"class":323},[300,522,416],{"class":313},[300,524,420],{"class":419},[300,526,423],{"class":313},[300,528,426],{"class":419},[300,530,429],{"class":313},[282,532,533],{},"문자열에서 변환하는 것도 가능하다.",[291,535,537],{"className":293,"code":536,"language":295,"meta":296,"style":296},"YearMonth month =\n    YearMonth.parse(\"2026-08\");\n",[286,538,539,548],{"__ignoreMap":296},[300,540,541,543,545],{"class":302,"line":303},[300,542,364],{"class":306},[300,544,512],{"class":309},[300,546,547],{"class":313},"=\n",[300,549,551,554,556,559,561,564,568,570],{"class":302,"line":550},2,[300,552,553],{"class":309},"    YearMonth",[300,555,320],{"class":313},[300,557,558],{"class":323},"parse",[300,560,416],{"class":313},[300,562,563],{"class":313},"\"",[300,565,567],{"class":566},"sfazB","2026-08",[300,569,563],{"class":313},[300,571,429],{"class":313},[282,573,574],{},"반대로 문자열로 변환하면:",[291,576,578],{"className":293,"code":577,"language":295,"meta":296,"style":296},"String value = month.toString();\n",[286,579,580],{"__ignoreMap":296},[300,581,582,585,588,590,593,595,598],{"class":302,"line":303},[300,583,584],{"class":306},"String",[300,586,587],{"class":309}," value ",[300,589,314],{"class":313},[300,591,592],{"class":309}," month",[300,594,320],{"class":313},[300,596,597],{"class":323},"toString",[300,599,327],{"class":313},[282,601,602],{},"결과:",[291,604,606],{"className":605,"code":348,"language":339,"meta":296},[337],[286,607,348],{"__ignoreMap":296},[282,609,610,611,613,614,617],{},"이처럼 ",[286,612,364],{},"는 ",[286,615,616],{},"yyyy-MM"," 형태의 월 데이터를 표현하기에 적합하다.",[367,619],{},[277,621,623],{"id":622},"해당-월의-시작일과-마지막-날-구하기","📅 해당 월의 시작일과 마지막 날 구하기",[282,625,626,628],{},[286,627,364],{},"를 실무에서 사용할 때 가장 유용한 기능 중 하나가 특정 월의 날짜 범위를 계산하는 것이다.",[282,630,631],{},"예를 들어:",[291,633,635],{"className":293,"code":634,"language":295,"meta":296,"style":296},"YearMonth ym = YearMonth.parse(\"2026-08\");\n\nLocalDate startDate = ym.atDay(1);\nLocalDate endDate = ym.atEndOfMonth();\n",[286,636,637,662,668,693],{"__ignoreMap":296},[300,638,639,641,644,646,648,650,652,654,656,658,660],{"class":302,"line":303},[300,640,364],{"class":306},[300,642,643],{"class":309}," ym ",[300,645,314],{"class":313},[300,647,408],{"class":309},[300,649,320],{"class":313},[300,651,558],{"class":323},[300,653,416],{"class":313},[300,655,563],{"class":313},[300,657,567],{"class":566},[300,659,563],{"class":313},[300,661,429],{"class":313},[300,663,664],{"class":302,"line":550},[300,665,667],{"emptyLinePlaceholder":666},true,"\n",[300,669,671,673,676,678,681,683,686,688,691],{"class":302,"line":670},3,[300,672,288],{"class":306},[300,674,675],{"class":309}," startDate ",[300,677,314],{"class":313},[300,679,680],{"class":309}," ym",[300,682,320],{"class":313},[300,684,685],{"class":323},"atDay",[300,687,416],{"class":313},[300,689,690],{"class":419},"1",[300,692,429],{"class":313},[300,694,696,698,701,703,705,707,710],{"class":302,"line":695},4,[300,697,288],{"class":306},[300,699,700],{"class":309}," endDate ",[300,702,314],{"class":313},[300,704,680],{"class":309},[300,706,320],{"class":313},[300,708,709],{"class":323},"atEndOfMonth",[300,711,327],{"class":313},[282,713,602],{},[291,715,718],{"className":716,"code":717,"language":339,"meta":296},[337],"startDate\n→ 2026-08-01\n\nendDate\n→ 2026-08-31\n",[286,719,717],{"__ignoreMap":296},[282,721,722],{},"여기서 중요한 점은 월마다 마지막 날짜가 다르다는 것이다.",[291,724,727],{"className":725,"code":726,"language":339,"meta":296},[337],"2월 → 28일 또는 29일\n4월 → 30일\n6월 → 30일\n8월 → 31일\n",[286,728,726],{"__ignoreMap":296},[282,730,731,732,735],{},"직접 마지막 날짜를 계산할 필요 없이 ",[286,733,734],{},"atEndOfMonth()","가 해당 연도의 윤년 여부까지 고려해서 마지막 날짜를 반환한다.",[367,737],{},[277,739,741],{"id":740},"localdate와-함께-사용하기","🧩 LocalDate와 함께 사용하기",[282,743,744,746,747,749],{},[286,745,364],{}," 자체에는 일(day)이 없기 때문에 실제 날짜를 다뤄야 하는 시점에서는 ",[286,748,288],{},"로 변환해서 사용할 수 있다.",[291,751,753],{"className":293,"code":752,"language":295,"meta":296,"style":296},"YearMonth ym = YearMonth.of(2026, 8);\n\nLocalDate firstDay = ym.atDay(1);\nLocalDate lastDay = ym.atEndOfMonth();\n",[286,754,755,779,783,804],{"__ignoreMap":296},[300,756,757,759,761,763,765,767,769,771,773,775,777],{"class":302,"line":303},[300,758,364],{"class":306},[300,760,643],{"class":309},[300,762,314],{"class":313},[300,764,408],{"class":309},[300,766,320],{"class":313},[300,768,413],{"class":323},[300,770,416],{"class":313},[300,772,420],{"class":419},[300,774,423],{"class":313},[300,776,426],{"class":419},[300,778,429],{"class":313},[300,780,781],{"class":302,"line":550},[300,782,667],{"emptyLinePlaceholder":666},[300,784,785,787,790,792,794,796,798,800,802],{"class":302,"line":670},[300,786,288],{"class":306},[300,788,789],{"class":309}," firstDay ",[300,791,314],{"class":313},[300,793,680],{"class":309},[300,795,320],{"class":313},[300,797,685],{"class":323},[300,799,416],{"class":313},[300,801,690],{"class":419},[300,803,429],{"class":313},[300,805,806,808,811,813,815,817,819],{"class":302,"line":695},[300,807,288],{"class":306},[300,809,810],{"class":309}," lastDay ",[300,812,314],{"class":313},[300,814,680],{"class":309},[300,816,320],{"class":313},[300,818,709],{"class":323},[300,820,327],{"class":313},[282,822,823],{},"이를 활용하면 특정 월의 검색 범위를 쉽게 만들 수 있다.",[282,825,826],{},"예를 들어 QueryDSL에서 가계부 데이터를 조회한다면:",[291,828,830],{"className":293,"code":829,"language":295,"meta":296,"style":296},"YearMonth ym = YearMonth.parse(month);\n\nLocalDate startDate = ym.atDay(1);\nLocalDate endDate = ym.atEndOfMonth();\n",[286,831,832,853,857,877],{"__ignoreMap":296},[300,833,834,836,838,840,842,844,846,848,851],{"class":302,"line":303},[300,835,364],{"class":306},[300,837,643],{"class":309},[300,839,314],{"class":313},[300,841,408],{"class":309},[300,843,320],{"class":313},[300,845,558],{"class":323},[300,847,416],{"class":313},[300,849,850],{"class":309},"month",[300,852,429],{"class":313},[300,854,855],{"class":302,"line":550},[300,856,667],{"emptyLinePlaceholder":666},[300,858,859,861,863,865,867,869,871,873,875],{"class":302,"line":670},[300,860,288],{"class":306},[300,862,675],{"class":309},[300,864,314],{"class":313},[300,866,680],{"class":309},[300,868,320],{"class":313},[300,870,685],{"class":323},[300,872,416],{"class":313},[300,874,690],{"class":419},[300,876,429],{"class":313},[300,878,879,881,883,885,887,889,891],{"class":302,"line":695},[300,880,288],{"class":306},[300,882,700],{"class":309},[300,884,314],{"class":313},[300,886,680],{"class":309},[300,888,320],{"class":313},[300,890,709],{"class":323},[300,892,327],{"class":313},[282,894,895],{},"그리고:",[291,897,899],{"className":293,"code":898,"language":295,"meta":296,"style":296},".where(\n    transaction.date.between(\n        startDate,\n        endDate\n    )\n)\n",[286,900,901,911,928,936,941,947],{"__ignoreMap":296},[300,902,903,905,908],{"class":302,"line":303},[300,904,320],{"class":313},[300,906,907],{"class":323},"where",[300,909,910],{"class":313},"(\n",[300,912,913,916,918,921,923,926],{"class":302,"line":550},[300,914,915],{"class":309},"    transaction",[300,917,320],{"class":313},[300,919,920],{"class":309},"date",[300,922,320],{"class":313},[300,924,925],{"class":323},"between",[300,927,910],{"class":313},[300,929,930,933],{"class":302,"line":670},[300,931,932],{"class":309},"        startDate",[300,934,935],{"class":313},",\n",[300,937,938],{"class":302,"line":695},[300,939,940],{"class":309},"        endDate\n",[300,942,944],{"class":302,"line":943},5,[300,945,946],{"class":313},"    )\n",[300,948,950],{"class":302,"line":949},6,[300,951,952],{"class":313},")\n",[282,954,955],{},"처럼 사용할 수 있다.",[282,957,958],{},"즉,",[291,960,963],{"className":961,"code":962,"language":339,"meta":296},[337],"사용자가 선택한 월\n        ↓\nYearMonth\n        ↓\n월의 시작일 \u002F 마지막 날 계산\n        ↓\nLocalDate 범위\n        ↓\nDB 날짜 조회\n",[286,964,962],{"__ignoreMap":296},[282,966,967],{},"라는 흐름을 만들 수 있다.",[367,969],{},[277,971,973],{"id":972},"yearmonth의-장점","🔄 YearMonth의 장점",[282,975,976,978,979,982,983,986],{},[286,977,364],{},"를 사용하면 단순히 ",[286,980,981],{},"int year",", ",[286,984,985],{},"int month","를 따로 관리하는 것보다 의도가 명확해진다.",[282,988,631],{},[291,990,992],{"className":293,"code":991,"language":295,"meta":296,"style":296},"int year = 2026;\nint month = 8;\n",[286,993,994,1010],{"__ignoreMap":296},[300,995,996,999,1002,1004,1007],{"class":302,"line":303},[300,997,998],{"class":306},"int",[300,1000,1001],{"class":309}," year ",[300,1003,314],{"class":313},[300,1005,1006],{"class":419}," 2026",[300,1008,1009],{"class":313},";\n",[300,1011,1012,1014,1016,1018,1020],{"class":302,"line":550},[300,1013,998],{"class":306},[300,1015,512],{"class":309},[300,1017,314],{"class":313},[300,1019,426],{"class":419},[300,1021,1009],{"class":313},[282,1023,1024],{},"보다:",[291,1026,1028],{"className":293,"code":1027,"language":295,"meta":296,"style":296},"YearMonth month =\n    YearMonth.of(2026, 8);\n",[286,1029,1030,1038],{"__ignoreMap":296},[300,1031,1032,1034,1036],{"class":302,"line":303},[300,1033,364],{"class":306},[300,1035,512],{"class":309},[300,1037,547],{"class":313},[300,1039,1040,1042,1044,1046,1048,1050,1052,1054],{"class":302,"line":550},[300,1041,553],{"class":309},[300,1043,320],{"class":313},[300,1045,413],{"class":323},[300,1047,416],{"class":313},[300,1049,420],{"class":419},[300,1051,423],{"class":313},[300,1053,426],{"class":419},[300,1055,429],{"class":313},[282,1057,1058],{},"가 **\"2026년 8월이라는 하나의 월을 표현하고 있다\"**는 의미가 더 명확하다.",[282,1060,1061],{},"또한 날짜 계산을 직접 구현하지 않아도 Java Time API가 제공하는 기능을 활용할 수 있다.",[291,1063,1065],{"className":293,"code":1064,"language":295,"meta":296,"style":296},"month.atDay(1);\n\nmonth.atEndOfMonth();\n\nmonth.plusMonths(1);\n\nmonth.minusMonths(1);\n",[286,1066,1067,1081,1085,1095,1099,1114,1118],{"__ignoreMap":296},[300,1068,1069,1071,1073,1075,1077,1079],{"class":302,"line":303},[300,1070,850],{"class":309},[300,1072,320],{"class":313},[300,1074,685],{"class":323},[300,1076,416],{"class":313},[300,1078,690],{"class":419},[300,1080,429],{"class":313},[300,1082,1083],{"class":302,"line":550},[300,1084,667],{"emptyLinePlaceholder":666},[300,1086,1087,1089,1091,1093],{"class":302,"line":670},[300,1088,850],{"class":309},[300,1090,320],{"class":313},[300,1092,709],{"class":323},[300,1094,327],{"class":313},[300,1096,1097],{"class":302,"line":695},[300,1098,667],{"emptyLinePlaceholder":666},[300,1100,1101,1103,1105,1108,1110,1112],{"class":302,"line":943},[300,1102,850],{"class":309},[300,1104,320],{"class":313},[300,1106,1107],{"class":323},"plusMonths",[300,1109,416],{"class":313},[300,1111,690],{"class":419},[300,1113,429],{"class":313},[300,1115,1116],{"class":302,"line":949},[300,1117,667],{"emptyLinePlaceholder":666},[300,1119,1121,1123,1125,1128,1130,1132],{"class":302,"line":1120},7,[300,1122,850],{"class":309},[300,1124,320],{"class":313},[300,1126,1127],{"class":323},"minusMonths",[300,1129,416],{"class":313},[300,1131,690],{"class":419},[300,1133,429],{"class":313},[282,1135,1136],{},"처럼 월 단위 계산도 자연스럽게 처리할 수 있다.",[367,1138],{},[277,1140,1142],{"id":1141},"월-단위-데이터에서-활용하기","🧭 월 단위 데이터에서 활용하기",[282,1144,1145,1146,1148],{},"특히 다음과 같은 기능에서 ",[286,1147,364],{},"를 활용하기 좋다.",[291,1150,1153],{"className":1151,"code":1152,"language":339,"meta":296},[337],"월별 가계부 조회\n\n월별 통계\n\n월별 매출 조회\n\n월별 정산\n\n월별 리포트\n\n월별 예산\n\n월별 지출 분석\n",[286,1154,1152],{"__ignoreMap":296},[282,1156,631],{},[291,1158,1160],{"className":293,"code":1159,"language":295,"meta":296,"style":296},"YearMonth current = YearMonth.now();\n\nYearMonth next = current.plusMonths(1);\nYearMonth previous = current.minusMonths(1);\n",[286,1161,1162,1179,1183,1205],{"__ignoreMap":296},[300,1163,1164,1166,1169,1171,1173,1175,1177],{"class":302,"line":303},[300,1165,364],{"class":306},[300,1167,1168],{"class":309}," current ",[300,1170,314],{"class":313},[300,1172,408],{"class":309},[300,1174,320],{"class":313},[300,1176,324],{"class":323},[300,1178,327],{"class":313},[300,1180,1181],{"class":302,"line":550},[300,1182,667],{"emptyLinePlaceholder":666},[300,1184,1185,1187,1190,1192,1195,1197,1199,1201,1203],{"class":302,"line":670},[300,1186,364],{"class":306},[300,1188,1189],{"class":309}," next ",[300,1191,314],{"class":313},[300,1193,1194],{"class":309}," current",[300,1196,320],{"class":313},[300,1198,1107],{"class":323},[300,1200,416],{"class":313},[300,1202,690],{"class":419},[300,1204,429],{"class":313},[300,1206,1207,1209,1212,1214,1216,1218,1220,1222,1224],{"class":302,"line":695},[300,1208,364],{"class":306},[300,1210,1211],{"class":309}," previous ",[300,1213,314],{"class":313},[300,1215,1194],{"class":309},[300,1217,320],{"class":313},[300,1219,1127],{"class":323},[300,1221,416],{"class":313},[300,1223,690],{"class":419},[300,1225,429],{"class":313},[282,1227,1228],{},"처럼 이전 달과 다음 달을 쉽게 계산할 수 있다.",[367,1230],{},[277,1232,1234],{"id":1233},"️-yearmonth를-사용하지-않는-것이-좋은-경우","⚠️ YearMonth를 사용하지 않는 것이 좋은 경우",[282,1236,1237,1238,1240],{},"반대로 시간까지 필요한 경우에는 ",[286,1239,364],{},"가 적합하지 않다.",[282,1242,1243],{},"예:",[291,1245,1248],{"className":1246,"code":1247,"language":339,"meta":296},[337],"2026-08-18 14:30:00\n",[286,1249,1247],{"__ignoreMap":296},[282,1251,1252],{},"처럼 날짜와 시간이 필요한 경우에는:",[291,1254,1256],{"className":293,"code":1255,"language":295,"meta":296,"style":296},"LocalDateTime\n",[286,1257,1258],{"__ignoreMap":296},[300,1259,1260],{"class":302,"line":303},[300,1261,1255],{"class":306},[282,1263,1264],{},"또는 시간대까지 고려해야 한다면:",[291,1266,1268],{"className":293,"code":1267,"language":295,"meta":296,"style":296},"ZonedDateTime\n",[286,1269,1270],{"__ignoreMap":296},[300,1271,1272],{"class":302,"line":303},[300,1273,1267],{"class":306},[282,1275,1276],{},"등을 사용하는 것이 적합하다.",[282,1278,1279,1280,1283],{},"즉 Java Time API에서는 ",[355,1281,1282],{},"표현하려는 데이터의 범위에 맞는 타입을 선택하는 것","이 중요하다.",[291,1285,1288],{"className":1286,"code":1287,"language":339,"meta":296},[337],"연도만\n→ Year\n\n연도 + 월\n→ YearMonth\n\n날짜\n→ LocalDate\n\n날짜 + 시간\n→ LocalDateTime\n\n시간대 포함 날짜 + 시간\n→ ZonedDateTime\n",[286,1289,1287],{"__ignoreMap":296},[367,1291],{},[277,1293,1295],{"id":1294},"마무리","🎯 마무리",[282,1297,1298,1300,1301,358],{},[286,1299,364],{},"는 특별히 복잡한 클래스는 아니지만, ",[355,1302,1303],{},"월 단위 데이터를 다룰 때 의도를 명확하게 표현할 수 있는 유용한 타입",[282,1305,1306],{},"특히:",[291,1308,1310],{"className":293,"code":1309,"language":295,"meta":296,"style":296},"YearMonth ym =\n    YearMonth.parse(\"2026-08\");\n\nLocalDate startDate =\n    ym.atDay(1);\n\nLocalDate endDate =\n    ym.atEndOfMonth();\n",[286,1311,1312,1320,1338,1342,1350,1365,1369,1377],{"__ignoreMap":296},[300,1313,1314,1316,1318],{"class":302,"line":303},[300,1315,364],{"class":306},[300,1317,643],{"class":309},[300,1319,547],{"class":313},[300,1321,1322,1324,1326,1328,1330,1332,1334,1336],{"class":302,"line":550},[300,1323,553],{"class":309},[300,1325,320],{"class":313},[300,1327,558],{"class":323},[300,1329,416],{"class":313},[300,1331,563],{"class":313},[300,1333,567],{"class":566},[300,1335,563],{"class":313},[300,1337,429],{"class":313},[300,1339,1340],{"class":302,"line":670},[300,1341,667],{"emptyLinePlaceholder":666},[300,1343,1344,1346,1348],{"class":302,"line":695},[300,1345,288],{"class":306},[300,1347,675],{"class":309},[300,1349,547],{"class":313},[300,1351,1352,1355,1357,1359,1361,1363],{"class":302,"line":943},[300,1353,1354],{"class":309},"    ym",[300,1356,320],{"class":313},[300,1358,685],{"class":323},[300,1360,416],{"class":313},[300,1362,690],{"class":419},[300,1364,429],{"class":313},[300,1366,1367],{"class":302,"line":949},[300,1368,667],{"emptyLinePlaceholder":666},[300,1370,1371,1373,1375],{"class":302,"line":1120},[300,1372,288],{"class":306},[300,1374,700],{"class":309},[300,1376,547],{"class":313},[300,1378,1380,1382,1384,1386],{"class":302,"line":1379},8,[300,1381,1354],{"class":309},[300,1383,320],{"class":313},[300,1385,709],{"class":323},[300,1387,327],{"class":313},[282,1389,1390],{},"처럼 사용하면 특정 월의 날짜 범위를 간단하게 계산할 수 있다.",[282,1392,1393],{},"월별 데이터를 조회할 때:",[291,1395,1398],{"className":1396,"code":1397,"language":339,"meta":296},[337],"2026 + 8\n\n↓\n\nYearMonth\n\n↓\n\n2026-08-01 ~ 2026-08-31\n\n↓\n\nDB 조회\n",[286,1399,1397],{"__ignoreMap":296},[282,1401,1402,1403],{},"와 같은 구조로 연결할 수 있기 때문에 가계부, 통계, 정산처럼 ",[355,1404,1405],{},"월 단위 조회가 많은 서비스에서 특히 유용하다.",[282,1407,1408],{},"결국 날짜를 다룰 때 중요한 것은 하나의 날짜 타입을 모든 상황에 사용하는 것이 아니라,",[383,1410,1411],{},[282,1412,1413],{},[355,1414,1415],{},"내가 표현하려는 시간의 범위에 맞는 타입을 선택하는 것",[282,1417,1418],{},"이다.v",[1420,1421,1422],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":296,"searchDepth":550,"depth":550,"links":1424},[],"2026-09-01","Java의 YearMonth를 활용해 연도와 월을 표현하고 특정 월의 시작일과 마지막 날을 계산하는 방법을 정리합니다.","md",null,{"tags":1430,"image":1435},[1431,364,288,1432,1433,1434],"Java","Date","날짜","Java Time","\u002Fimages\u002FjavaSpring-thumbnail.png",{"icon":20},{"title":1438,"description":1439},"Java YearMonth 사용법 - 월 단위 날짜 처리와 날짜 범위 계산","Java YearMonth의 특징과 기본 사용법, LocalDate와의 차이, 특정 월의 시작일과 마지막 날을 계산하는 방법을 예제와 함께 정리합니다.","JwP3epY8wXTg1cKaPV2MNu9Rb_6ArY8dLc7oncB3GnE",[1442,1444],{"title":26,"path":27,"stem":28,"description":1443,"icon":20,"children":-1},"JPA의 @PersistenceContext가 무엇을 의미하는지부터 EntityManager와 영속성 컨텍스트의 관계, 엔티티 생명주기, Dirty Checking, Flush, Transaction과의 관계까지 정리합니다.",{"title":41,"path":42,"stem":43,"description":1445,"icon":20,"children":-1},"비동기 요청 결과를 구조 분해하고 객체 형태로 매핑하는 JavaScript 데이터 처리 방식 분석",1789947611424]