Why the Bronze Age Collapsed
hacker-news-frontpage
192 points · 102 comments · by AnodicElegy
Балл: 51.23Уверенность: 46%
ПодробнееЗагружаем каталог…
НАВИГАТОР ПО ВОЗМОЖНОСТЯМ ИИ
Найдите свой ИИ-инструмент. Бесплатный доступ, пробные периоды и кредиты — в одном месте.
hacker-news-frontpage
192 points · 102 comments · by AnodicElegy
Балл: 51.23Уверенность: 46%
Подробнееvelog
Trong nhung nam gan day, giai tri truc tuyen da tro thanh mot phan quen thuoc trong cuoc song cua nhieu nguoi. Su phat trien cua Internet va dien thoai thong minh giup nguoi dung co the truy cap cac nen tang truc tuyen nhanh hon va de dang hon. Thay vi phai den mot dia diem cu the, nguoi dung co the su dung may tinh hoac dien thoai de tim kiem nhieu noi dung giai tri khac nhau. Trong so cac tu khoa duoc quan tam, sunwin la mot cai ten thuong duoc tim kiem boi nhung nguoi muon tim hieu ve giai tri truc tuyen. Tuy nhien, truoc khi su dung bat ky nen tang nao, nguoi dung nen tim hieu thong tin can than. Cac yeu to nhu giao dien, toc do truy cap, bao mat tai khoan, dieu khoan su dung va cac quy dinh lien quan deu can duoc xem xet. Viec hieu ro thong tin truoc khi bat dau se giup nguoi dung co trai nghiem chu dong hon. Tong quan ve Sunwin Sunwin la mot tu khoa duoc nhieu nguoi quan tam khi tim kiem cac nen tang giai tri truc tuyen. Trong moi truong Internet hien nay, nguoi dung thuong uu tien nhung dich vu co giao dien don gian va de truy cap tren nhieu thiet bi. Mot nen tang truc tuyen tot can cung cap thong tin ro rang va sap xep cac noi dung theo tung khu vuc. Dieu nay giup nguoi moi de dang lam quen voi giao dien va tim thay cac chuc nang ma ho dang quan tam. Thong tin va tinh nang cua mot nen tang co the thay doi theo thoi gian. Vi vay, nguoi dung nen kiem tra thong tin moi nhat tu nguon chinh thuc truoc khi dang ky tai khoan hoac su dung dich vu. Giao dien de su dung Giao dien la mot trong nhung yeu to dau tien ma nguoi dung nhin thay khi truy cap mot trang web. Neu giao dien duoc thiet ke ro rang, nguoi dung co the tim kiem thong tin nhanh hon. Mot giao dien don gian khong co nghia la thieu tinh nang. Dieu quan trong la cac khu vuc can thiet duoc bo tri hop ly. Menu, nut chuc nang va cac danh muc nen de nhin va de hieu. Toc do tai trang cung anh huong den trai nghiem. Neu trang web tai qua cham, nguoi dung co the gap kho khan trong qua trinh truy cap. Do do, kha nang phan hoi nhanh la mot yeu to nen duoc quan tam. Su dung Sunwin tren dien thoai Dien thoai thong minh hien nay duoc su dung pho bien de truy cap Internet. Nhieu nguoi lua chon dien thoai vi thiet bi nay nho gon va co the su dung o nhieu noi khi co ket noi mang. Khi tim hieu sunwin, nguoi dung co the xem xet kha nang hien thi tren man hinh dien thoai. Mot trang web duoc toi uu tot se tu dong dieu chinh noi dung theo kich thuoc man hinh. Cac nut chuc nang can du lon de nguoi dung co the thao tac de dang. Van ban cung nen ro rang va khong bi che khuất tren man hinh nho. Nguoi dung nen su dung trinh duyet moi va ket noi Internet on dinh. Dieu nay co the giup han che mot so loi trong qua trinh truy cap. Tim hieu dieu khoan su dung Truoc khi tao tai khoan, nguoi dung nen doc ky dieu khoan cua nen tang. Nhieu nguoi thuong bo qua buoc nay vi muon bat dau su dung nhanh. Tuy nhien, dieu khoan co the chua nhieu thong tin quan trong. Noi dung dieu khoan co the bao gom yeu cau ve do tuoi, dieu kien tai khoan, quyen cua nguoi dung va nhung gioi han cua dich vu. Hieu ro cac dieu nay se giup nguoi dung tranh duoc nhung van de khong mong muon. Neu co thong tin nao khong ro, nguoi dung nen tim them thong tin truoc khi tiep tuc. Khong nen dong y voi mot dieu khoan ma ban than chua hieu ro. Bao mat thong tin tai khoan Bao mat tai khoan la mot van de quan trong khi su dung dich vu truc tuyen. Nguoi dung nen tao mat khau kho doan va khong su dung cung mot mat khau cho nhieu tai khoan. Khong nen chia se mat khau voi nguoi khac. Neu nhan duoc tin nhan yeu cau cung cap thong tin dang nhap, nguoi dung nen kiem tra nguon gui truoc khi lam theo huong dan. Nguoi dung cung nen tranh dang nhap tai khoan tren may tinh cong cong. Neu bat buoc phai su dung thiet bi cua nguoi khac, can dang xuat sau khi hoan thanh. Lua chon noi dung giai tri phu hop Moi nguoi co so thich khac nhau khi su dung cac nen tang truc tuyen. Vi vay, nguoi dung nen lua chon noi dung phu hop voi nhu cau cua minh. Giai tri truc tuyen nen duoc xem la mot hoat dong thu gian. Khong nen danh qua nhieu thoi gian cho cac hoat dong tren Internet den muc anh huong den cong viec, hoc tap hoac gia dinh. Neu nen tang co cac noi dung co yeu to may rui, nguoi dung can hieu rang ket qua khong the duoc du doan mot cach chac chan. Khong nen xem cac hoat dong nay la cach kiem tien dam bao. Su dung co trach nhiem Su dung co trach nhiem la dieu quan trong khi tham gia cac hoat dong giai tri truc tuyen. Nguoi dung nen dat ra gioi han ve thoi gian va chi phi truoc khi bat dau. Neu su dung tien cho giai tri, chi nen su dung khoan tien phu hop voi kha nang tai chinh ca nhan. Khong nen vay tien hoac su dung tien danh cho cac nhu cau quan trong. Khi nhan thay viec su dung bat dau anh huong den cuoc song hang ngay, nguoi dung nen tam dung va danh thoi gian cho cac hoat dong khac. Viec duy tri can bang se giup giai tri van la mot phan tich cuc cua cuoc song. Kiem tra thong tin truoc khi su dung Tren Internet co rat nhieu bai viet va thong tin ve cac nen tang giai tri. Tuy nhien, khong phai tat ca cac thong tin deu chinh xac. Nguoi dung nen tham khao nhieu nguon khac nhau thay vi chi dua vao mot bai viet. Cac thong tin tu nguon chinh thuc thuong la noi nen duoc uu tien khi kiem tra dieu kien va quy dinh. Ngoai ra, nguoi dung nen tim hieu cac quy dinh phap luat tai khu vuc minh dang sinh song. Neu mot dich vu khong duoc phep tai noi ban song, khong nen tim cach vuot qua cac han che. Ket luan Sunwin la mot tu khoa duoc quan tam trong linh vuc giai tri truc tuyen. Tuy nhien, viec lua chon mot nen tang phu hop khong nen chi dua vao ten goi hoac muc do pho bien. Nguoi dung nen xem xet giao dien, kha nang truy cap, bao mat, dieu khoan va cac quy dinh truoc khi su dung. Dong thoi, viec quan ly thoi gian va chi phi cung rat quan trong. Khi tim hieu thong tin can than va su dung cac dich vu truc tuyen mot cach co trach nhiem, nguoi dung co the co trai nghiem tot hon va han che nhung rui ro khong can thiet.
Балл: 54.4Уверенность: 49%
Подробнееvelog
처음에는 프로젝트가 끝난 뒤 패키지 구조를 다시 정리하는 정도로 생각했다. 하지만 전체 코드를 다시 확인하면서 패키지 위치뿐만 아니라 문서, 네이밍, 코드 작성 기준까지 서로 다른 부분이 보였다. 그래서 1차 리팩토링에서는 기존 동작을 최대한 유지하면서 프로젝트 전체를 같은 기준으로 읽을 수 있게 만드는 것 까지를 범위로 잡았다. 1. 1차 리팩토링에서 한 것 구분 Before After 최상위 구조 기능과 기술 패키지 혼재 기능 소유권 중심으로 정리 기능 내부 구조 기능마다 서로 다른 기준 presentation / application / domain / infrastructure 기준 Kafka / Redis / WebSocket 기술 중심으로 분산 사용하는 기능의 infrastructure 로 이동 Restaurant restaurant , sharedtable , timeslot 분리 Restaurant 소유 하위 기능으로 정리 Outbox 공통 처리와 기능 코드 혼재 공통 Core와 기능별 처리 분리 Security / Member 일부 책임 분산 auth , member 소유권 정리 DTO 역할 구분이 일정하지 않음 Request / Response / Command / Result / Model 외부 기술 경계 Reader / Verifier / Port / Adapter 혼재 Port / Adapter 기준 정리 생성자 주입 일부 수동 생성자 잔존 @RequiredArgsConstructor 기준 Lombok 사용 기준 불명확 허용 범위 명시 Logging 자유로운 메시지 형식 event=... 기준 주석 역할 설명과 작업 흔적 혼재 코드로 알 수 없는 WHY 중심 docs 현재 기준과 과거 기록 혼재 역할별 구조와 현재 기준 문서 정리 AI 작업 방식 작업마다 Context와 진행 방식 차이 Agent Workflow와 단계별 Context 기준 결국 이번 작업은 단순히 폴더를 옮기는 것에서 끝나지 않았다. 기능 소유권 ↓ 패키지 책임 ↓ 네이밍 ↓ 코드 작성 기준 ↓ 문서 기준 ↓ AI 작업 방식 까지 프로젝트를 다시 읽을 수 있는 기준을 정리했다. 2. 기존 동작은 유지했다 1차 리팩토링에서는 구조를 정리하면서 비즈니스 동작까지 같이 변경하지 않도록 범위를 제한했다. 유지한 영역 결과 API Mapping / HTTP 계약 유지 DB / JPA Mapping 유지 Transaction / Propagation 유지 Lock 유지 Kafka Topic / Consumer Group 유지 Outbox Event 계약 유지 Security / WebSocket 주요 동작 유지 최종적으로 전체 Build와 Test도 다시 수행했다. 검증 결과 Root Test 881 PASS / 64 SKIP / 0 FAIL Lambda Test 11 PASS / 0 FAIL clean build PASS Production Java package/path 402개 불일치 0 패키지와 코드 작성 방식은 크게 바뀌었지만 기존 동작을 변경하는 리팩토링은 이번 범위에서 분리했다. 3. 구조를 정리하니 다음 문제가 보였다 1차 리팩토링을 하면서 오히려 다음에 손봐야 할 부분이 더 명확하게 보였다. 남은 설계 부채 확인할 내용 도메인 간 직접 의존 다른 기능의 Repository / Entity 직접 참조 Application 의존 방향 Presentation DTO 직접 참조 Service 책임 Service / Facade / Domain Service 경계 Reservation / Payment / TimeSlot 기능 간 협력 방식 Reservation / Notification 직접 Service 의존 Admin Query Repository 의존 방향 Outbox 공통 Core와 도메인 계약의 결합 Event / Kafka 메시지 계약과 처리 책임 Transaction / Lock 실제 비즈니스 경계 재검토 AI 기능 전처리 / Rule / Provider 의존 방향 이 부분들은 패키지 위치를 바꾸는 것보다 실제 설계를 변경하는 작업에 가깝다. 따라서 1차 리팩토링에 같이 넣지 않고 2차 리팩토링 대상으로 분리했다. 4. 1차 리팩토링 종료 이번 단계의 범위는 여기까지로 정했다. 1차 리팩토링 패키지 구조 ↓ 기능 소유권 ↓ 네이밍 / 코드 작성 기준 ↓ 문서 정리 ↓ 전역 Audit ↓ 회귀 검증 ↓ 완료 처음부터 완벽한 구조를 만드는 것보다, 현재 구조를 같은 기준으로 정리하고, 그 과정에서 발견한 더 깊은 설계 문제는 다음 단계로 분리한다. 는 방식으로 진행했다. 이제 패키지 위치와 작성 기준을 정리하는 작업은 마무리했다. 다음부터는 이번 과정에서 기록해둔 설계 부채를 기준으로 도메인 간 의존성과 Service 책임부터 다시 확인해보려고 한다.
Балл: 54.37Уверенность: 49%
Подробнееvelog
1. 오늘의 한 줄 요약 MSA는 단순히 애플리케이션을 잘게 나누는 기술이 아니라, 비즈니스 경계에 따라 독립 배포 가능한 서비스를 만들고 게이트웨이·서비스 디스커버리·설정 관리·메시징·관측·CI/CD 같은 외부 지원 체계로 운영 복잡성을 감당하는 아키텍처다. 2. 배운 내용 핵심 개념: 모놀리식 아키텍처는 UI, 비즈니스 로직, 데이터 접근과 배포 단위를 하나로 묶는다. 구현·탐색·디버깅·배포가 단순하고 내부 함수 호출이라 빠르지만, 결합도가 높고 일부 변경도 전체 빌드·테스트·배포가 필요하며 기술 선택과 선택적 확장에 제약이 있다. MSA는 사용자·상품·주문·결제·배송처럼 비즈니스 능력과 경계가 분명한 단위로 서비스를 분리한다. 각 서비스는 독립적으로 개발·배포·확장하고 전용 데이터 저장소와 적합한 언어를 선택할 수 있지만, 네트워크 지연·분산 추적·배포 자동화·장애 격리·데이터 일관성이라는 새 문제가 생긴다. 클라우드 네이티브 애플리케이션의 핵심 축은 마이크로서비스, CI/CD, DevOps, 컨테이너다. 자동 확장, 회복 탄력성, 카오스 엔지니어링, 지속적 배포가 변화에 강한 시스템을 만든다. 12-Factor는 코드베이스, 명시적 의존성, 설정 분리, 외부 backing service, 빌드·릴리스·실행 분리, stateless 프로세스, 포트 바인딩, 동시성, 빠른 시작·종료, 환경 동등성, 로그 스트림, 관리 프로세스를 강조한다. API First·Telemetry·인증/인가, Observability·Containerization·Automation도 보완 원칙으로 소개됐다. MSA 표준 구성은 비즈니스 로직인 이너 아키텍처와 이를 지원하는 아우터 아키텍처로 나뉜다. 아우터에는 API Gateway, Service Mesh/Discovery, Config Store, Runtime/Container, Backing Service, Telemetry, CI/CD가 포함된다. API Gateway는 단일 진입점에서 라우팅·로드 밸런싱·정책·인증을 처리한다. Service Discovery(Eureka)는 서비스의 IP와 포트를 등록·탐색·갱신해 주소 하드코딩을 없앤다. 동기 통신은 REST API처럼 응답을 기다리고, 비동기 통신은 Kafka/RabbitMQ 같은 메시지 브로커에 발행(Publish)하고 구독(Subscribe)한다. 서비스별 DB 때문에 단일 트랜잭션을 걸기 어려워 Saga와 보상 트랜잭션으로 실패한 앞 단계의 작업을 되돌리고 최종적 일관성을 허용한다. REST API는 URI에 복수형 명사로 리소스를 표현하고 HTTP 메서드로 행위를 표현한다. GET은 조회, POST는 생성, PUT은 전체 수정, PATCH는 일부 수정, DELETE는 삭제이며, 적절한 상태 코드와 일관된 엔드포인트를 사용하고 민감정보를 URI에 넣지 않는다. 새롭게 알게 된 점: MSA 도입 여부는 유행이 아니라 변화 빈도, 독립 생명주기, 독립 확장성, 장애 격리, 외부 의존성 단순화, polyglot 기술 선택이 실제로 필요한지로 판단해야 한다. 스케일 아웃은 같은 서비스 인스턴스 수를 늘려 요청량을 분산하고, 스케일 업은 한 인스턴스의 CPU·메모리 사양을 높인다. MSA의 장점은 부하가 몰린 서비스만 선택적으로 스케일 아웃할 수 있다는 점이다. VM은 하이퍼바이저 위에 게스트 OS까지 가지지만 컨테이너는 호스트 커널을 공유하고 실행 영역만 격리하므로 더 가볍고 빠르게 확장된다. Docker 이미지는 설계도, 실행된 결과는 컨테이너에 대응한다. 프레임워크와 라이브러리의 핵심 차이는 제어의 주체다. 라이브러리는 내 코드가 호출하지만 프레임워크는 정해진 구조와 생명주기 안에서 내 코드를 호출한다. 헷갈렸던 점: MSA라고 항상 더 좋은 것은 아니다. 작은 서비스나 강한 실시간 일관성이 중요한 영역에서는 모놀리스가 더 단순하고 빠를 수 있고, 필요하면 두 방식을 섞은 하이브리드 구조도 가능하다. 서비스 메시를 단일 제품으로 보기 쉽지만, 강의에서는 서비스 간 통신에 필요한 디스커버리·라우팅·로드 밸런싱·인증·회복 탄력성·암호화 같은 공통 기능을 묶은 인프라 계층이라는 추상 개념으로 설명했다. CI의 범위는 코드 병합만이 아니라 자동 빌드와 테스트까지이고, CD는 전달(Delivery) 또는 배포(Deployment) 자동화로 이어진다. 3. 실습 / 적용 직접 해본 것: 강의 구성도에서 요청 흐름을 클라이언트 → API Gateway → 라우팅/로드 밸런싱 → 마이크로서비스 → 서비스별 DB 로 추적하고, Service Discovery와 Config Store가 이 흐름을 어떻게 지원하는지 정리했다. REST 엔드포인트를 /users , /users/{id} 처럼 설계하고 GET·POST·PUT·PATCH·DELETE에 CRUD 동작을 대응시켰다. 개발환경 준비 항목으로 IntelliJ IDEA, Git, Postman, JDK 17 이상, Maven을 확인하고 java -version , git --version , mvn -version 으로 설치 상태를 검사하는 절차를 정리했다. 결과: MSA의 장점만 나열하는 수준을 넘어, 서비스 분리로 생긴 운영 복잡성을 어떤 아우터 아키텍처가 해결하는지 한 흐름으로 설명할 수 있게 됐다. Postman이 UI 없이 REST API의 메서드·헤더·본문·응답을 시험하는 도구이고, Maven의 bin 경로를 PATH에 넣어야 어느 디렉터리에서나 mvn 을 실행할 수 있다는 점을 확인했다. 4. 문제와 해결 막힌 부분: 서비스마다 DB가 분리되면 한 번의 로컬 트랜잭션으로 전체 작업을 원자적으로 되돌릴 수 없고, 서비스 주소도 인스턴스 증감과 재배포로 계속 바뀐다. 해결 방법: 분산 데이터 변경은 Saga와 보상 트랜잭션으로 실패 이전의 완료 작업을 반대로 실행하며 최종적 일관성을 맞춘다. 동적 주소 문제는 각 서비스가 Eureka 같은 Service Discovery에 자신을 등록하고 Gateway와 다른 서비스가 레지스트리 정보를 주기적으로 갱신하도록 해결한다. 5. 다음에 할 일 IntelliJ에서 Spring Boot 3.5 / Java 17 이상 프로젝트를 만들고 Maven 빌드와 실행을 터미널에서 재현하기 /users REST API를 만들고 Postman으로 CRUD, 상태 코드, PUT/PATCH 차이를 검증하기
velog
문제 설명 문자열 s 에 포함된 p 와 y 의 개수를 비교하는 문제이다. p 와 y 의 개수가 같으면 true 다르면 false 대소문자는 구분하지 않는다. p , y 가 모두 없다면 개수가 0으로 같으므로 true 이다. 접근 방법 방법 1. p , y 의 개수를 각각 저장 문자열을 처음부터 확인하면서 p 가 나오면 pCount 를 증가시키고, y 가 나오면 yCount 를 증가시킨다. 마지막에 두 변수의 값이 같은지 비교한다. pCount == yCount 방법 2. 하나의 count 로 비교 p 가 나오면 +1 , y 가 나오면 -1 을 한다. p → +1 y → -1 p, y의 개수를 각각 저장하는 풀이 최종 코드 class Solution { boolean solution(String s) { // 대소문자 구분을 없애기 위해 모두 소문자로 변환 s = s.toLowerCase(); int pCount = 0; int yCount = 0; // 문자열을 처음부터 확인 for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (ch == 'p') { pCount++; } else if (ch == 'y') { yCount++; } } // p와 y의 개수가 같으면 true return pCount == yCount; } } 하나의 count로 비교하는 풀이 최종 코드 class Solution { boolean solution(String s) { int count = 0; // s.charAt(i)는 문자열을 글자 한글자 씩 쪼개서 가져옴 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == 'p' || c == 'P') { count++; } else if (c == 'y' || c == 'Y') { count--; } } return count == 0; } } 실행 결과
Балл: 54.37Уверенность: 49%
Подробнееvelog
Spring Boot 환경에서 웹 서버의 기초 구조를 배우고, 메모 데이터를 처리하는 간단한 CRUD(Create, Read, Update, Delete) API의 전체적인 흐름을 구현해 보았습니다. 각 코드가 왜 이렇게 작성되어야 하는지 강의를 통해 이해한 원리와, 개발 과정에서 겪은 시행착오를 솔직하게 정리합니다. 1. 오늘의 학습 키워드 Spring Boot | 웹 애플리케이션 서버 구동을 위한 초기 설정 방식 이해 Spring MVC | 컨트롤러와 주소 매핑의 기본 개념 DTO Pattern | 클라이언트와 서버가 데이터를 안전하게 주고받기 위한 객체 분리 방식 Entity (Data Encapsulation) | 데이터 보호를 위해 객체 스스로 값을 통제하는 원본 객체 CRUD Controller | 데이터 처리 목적에 따른 POST , GET , PUT , DELETE 규칙 적용 2. 핵심 소스코드 분석 및 역할 정리 📌 Spring Boot | @SpringBootApplication import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringPrepareApplication { public static void main(String[] args) { SpringApplication.run(SpringPrepareApplication.class, args); } } 자바 메인 메서드를 실행하는 것만으로 @SpringBootApplication 어노테이션이 하위 폴더 전체를 자동으로 훑어 컴포넌트 스캔을 수행합니다. 이 과정에서 웹 컨트롤러 등 필요한 부품들을 자동으로 찾아 메모리에 등록하고, 과거 스프링처럼 복잡한 XML 설정 파일 없이 내장 웹 서버(Tomcat)까지 스스로 구동하여 외부 통신 인프라를 한 번에 구축해 주므로 매우 편리했습니다. 📌 Spring MVC | Controller & Mapping @RestController // HTML 파일이 아닌 JSON 텍스트를 반환하는 @ResponseBody 전용 API 엔드포인트 @RequestMapping("/api") // 컨트롤러 하위의 모든 엔드포인트 주소 앞에 공통으로 붙는 접두사 경로 지정 public class MemoController { // 특정 단일 자원을 식별할 때 유용한 경로 변수 방식 // EX) http://localhost:8080/api/memos/20261001 @GetMapping("/memos/{id}") public Long getResourceById(@PathVariable Long id) { return id; } // 조건에 따라 자원을 필터링 할 때 유용한 쿼리 파라미터 방식 // EX) http://localhost:8080/api/memos?keyword=MVC @GetMapping("/memos") public String getResourcesByQuery(@RequestParam(required = false) String keyword) { if (keyword == null) { return "keyword is null."; } return keyword; } } @Controller 는 외부 웹 브라우저의 HTTP 요청을 가장 전면에서 받아 알맞은 자바 코드로 연결하는 안내 창구와 같은 역할을 합니다. 경로 변수인 @PathVariable 단일 자원의 식별에, 쿼리 피라미터인 @RequestParam 은 자원을 필터링 할 때 유용합니다. 클래스 상단에 @RequestMapping 을 선언해 주소 코드의 중복을 줄일 수 있었습니다. 다만 실제 네이버나 유튜브 주소창을 관찰해보면 고유 ID를 쿼리 파라미터로 넘기는 경우도 있고, 자원 간의 계층 관계를 표현할 때는 경로 변수를 여러 번 쓰기도 한다는 예외적인 구조도 있으므로, "식별은 경로 변수, 검색은 쿼리"라는 편협한 사고에 갇히지 않도록 주의해야겠습니다. 📌 DTO Pattern // 클라이언트가 보낸 JSON 데이터를 수신하는 객체 @Getter public class MemoRequestDto { private String username; private String contents; } // 클라이언트에게 반환할 데이터만 담는 응답 전용 객체 @Getter public class MemoResponseDto { private Long id; private String username; private String contents; // 내부 핵심 Entity가 외부 네트워크망에 노출되는 것을 막기 위한 변환 생성자 public MemoResponseDto(Memo memo) { this.id = memo.getId(); this.username = memo.getUsername(); this.contents = memo.getContents(); } } DTO(Data Transfer Object) 는 클라이언트 화면과 서버 내부 데이터베이스 객체(Entity) 사이에서 독립적인 데이터 교환 창구 역할을 합니다. 화면 요구사항 때문에 필드 이름이 바뀌더라도 내부 핵심 비즈니스 로직이나 데이터베이스 테이블 구조를 직접 건드릴 필요가 없어집니다. 덕분에 데이터를 주고받을 때 외부 변화가 서버 내부 코드에 영향을 주지 않아, 각 계층을 독립적이고 안전하게 유지보수할 수 있습니다. 📌 Entity (Data Encapsulation) @Getter @Setter @NoArgsConstructor // 기본 생성자 자동 생성 public class Memo { private Long id; private String username; private String contents; // 수신한 RequestDto 데이터를 기반으로 객체 초기화 public Memo(MemoRequestDto requestDto) { this.username = requestDto.getUsername(); this.contents = requestDto.getContents(); } // 객체 내부에서 필드를 변경하도록 통제 public void update(MemoRequestDto requestDto) { this.username = requestDto.getUsername(); this.contents = requestDto.getContents(); } } 객체지향 프로그래밍의 핵심 원칙 중 하나인 데이터 캡슐화( Data Encapsulation )는 단순히 데이터를 저장하는 역할에 그치지 않고, 객체 스스로가 생성자 및 update() 메서드 인터페이스를 내장하여 자기 데이터의 변경 권한을 안전하게 통제하는 방식입니다. 📌 CRUD Controller @RestController @RequestMapping("/api") public class MemoController { // 임시 인메모리 저장소 private final Map<Long, Memo> memoList = new HashMap<>(); // Create: 메모 등록 API @PostMapping("/memos") public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) { // RequestDto -> Entity Memo memo = new Memo(requestDto); // ID 자동 생성 Long maxId = memoList.size() > 0 ? Collections.max(memoList.keySet()) + 1 : 1; memo.setId(maxId); // 메모리 저장 memoList.put(memo.getId(), memo); // Entity -> ResponseDto MemoResponseDto memoResponseDto = new MemoResponseDto(memo); return memoResponseDto; } // Read: 메모 목록 조회 API @GetMapping("/memos") public List<MemoResponseDto> getMemos() { // Map 데이터를 List로 변환하여 반환 List<MemoResponseDto> responseList = memoList.values().stream() .map(MemoResponseDto::new).toList(); return responseList; } // Update: 기존 메모 수정 API @PutMapping("/memos/{id}") public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) { // 메모리 존재 여부 확인 if(memoList.containsKey(id)) { Memo memo = memoList.get(id); memo.update(requestDto); // 엔티티 수정 메서드 호출 return memo.getId(); } else { throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다."); } } // Delete: 메모 삭제 API @DeleteMapping("/memos/{id}") public Long deleteMemo(@PathVariable Long id) { // 메모리 존재 여부 확인 if(memoList.containsKey(id)) { memoList.remove(id); // 메모리 데이터 삭제 return id; } else { throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다."); } } } 데이터 처리 목적에 맞춰 HTTP 표준 메서드( POST , GET , PUT , DELETE )를 구현했습니다. 특히 수정이나 삭제 처리를 할 때 코드를 실행하기 앞서, containsKey() 를 통해 해당 자원이 실재하는지 검증한 후 예외( IllegalArgumentException )를 발생시켜 방어적인 설계 흐름을 배웠습니다. 테스트 환경 내에서 HTTP 요청을 주고받으며 데이터가 수신, 변환, 저장, 응답되는 전체 CRUD API의 생생한 흐름을 눈으로 직접 검증해 보며 웹 백엔드 서버의 구체적인 연동 프로세스를 확인할 수 있었습니다. 3. 개발 과정에서의 시행착오와 해결 방법 ❌ Issue 1. POST 요청 시 데이터가 모두 null로 저장되는 현상 문제 상황 : 포스트맨으로 @PostMapping 엔드포인트에 JSON 데이터를 정상적으로 실어 보냈으나, 서버 저장 결과 확인 시 값이 바인딩되지 않고 전부 null 로 적재됨. 원인 및 해결 : 외부에서 던지는 JSON 문자열을 자바 객체의 필드로 파싱하려면 DTO 계층에 데이터를 읽어오는 @Getter 가 필수로 작동해야 함을 확인했습니다. 또한 컨트롤러 메서드 매개변수 앞에 HTTP 바디 데이터를 객체로 매핑해 주는 @RequestBody 가 누락되어 발생한 현상이었으며, 두 코드를 추가하여 데이터가 정상적으로 수신되도록 해결했습니다. ❌ Issue 2. 수정/삭제 요청 시 타깃 자원을 찾지 못하는 400/404 에러 문제 상황 : 특정 메모를 고치기 위해 /api/memos/1 주소로 요청을 보냈으나 주소를 찾지 못하는 404 에러나 매개변수가 맞지 않는 400 에러가 발생함. 원인 및 해결 : URL 경로에 박아 넣은 {id} 플래그 주소와 메서드 파라미터의 명칭을 매치해 주기 위해 변수 앞에 @PathVariable 지시어가 누락되어 발생한 라우팅 오류였습니다. 엔드포인트 경로 변수 명칭과 자바 매개변수를 1:1로 매핑해 주어 매커니즘을 통일시켜 해결했습니다. ❌ Issue 3. Entity 객체 생성 시 기본 생성자가 없어 발생하는 컴파일/구동 에러 문제 상황 : Memo 엔티티 내부에 DTO를 받아 초기화하는 커스텀 생성자를 수동으로 선언하자마자, 잘 구동되던 프레임워크 초기화나 JSON 데이터 변환 과정에서 인스턴스 생성 실패 에러가 발생함. 원인 및 해결 : 자바에서 매개변수가 있는 생성자를 수동으로 만들면 컴파일러가 기본 생성자를 자동으로 추가하지 않는다는 점을 놓친 것이 원인이었습니다. 스프링 부트 라이브러리들이 객체를 정상 생성할 수 있도록 @NoArgsConstructor 를 엔티티 클래스 상단에 추가하여 구동 오류를 해결했습니다. 4. 앞으로의 학습 계획 현재 구현한 메모장 CRUD 코드는 자바의 HashMap 자료구조를 활용해 데이터를 컴퓨터의 임시 메모리에만 보관하고 있습니다. 이로 인해 서버를 껐다 켜면 작성했던 모든 메모 데이터가 증발하는 휘발성 한계가 존재합니다. 내일은 오늘 연동 테스트를 마친 MySQL 데이터베이스의 SQL 데이터 정의어( CREATE TABLE )와 조작어( INSERT ) 문법을 학습할 예정입니다. 이를 통해 오늘 구현해 둔 가이드 프로젝트의 임시 메모리 저장 방식을 영구 저장 방식으로 전환하고, 데이터의 유실 문제를 안전하게 해결하는 데이터베이스 마이그레이션을 직접 수행해 보는 것을 다음 목표로 삼겠습니다.
velog
이번에는 파일 압축과 찾기, 시스템 설정에 대해 배운다. xz, bz2, gz, zip등 확장명이 존재한다. 지금껏 zip만 있는 줄 알았는데 다양한 압축 명령이 존재하는 것을 알았다. 압축 명령에 따라 다음과 같은 압축 알고리즘과 압축률 / 속도 차이가 있다. gzip: 빠르고 가장 흔함. 압축률은 무난함. bzip2: gzip보다 보통 더 잘 줄이지만 느림. xz: 압축률이 가장 좋은 편이지만 압축하는 데 시간이 더 오래 걸림. zip: 윈도우/맥/리눅스에서 모두 쓰기 편하고 여러 파일을 묶어서 압축하기 쉬움. 우리가 자주 사용하는 ZIP은 호환성이 좋은 포맷인데 압축을 진행하다보면 OS간 호환이 잘 안되는 경우가 있다. 이는 ZIP이 운영체제간 전달 포맷으로는 호환성이 좋지만, ZIP 안의 내용까지 자동으로 OS 호환되게 만들어주는 건 아니다. 리눅스에서는 압축과 묶기 명령을 원칙적으로 구분한다. 묶기는 여러 파일을 하나로 묶는 도구이다. 압축은 용량을 작게 압축하는 것이다. 우리가 GUI에서 하는 압축은 보통 묶기 + 압축을 한번에 해주는 것이라 생각하면 된다. 압축하기를 하면 압축되어 하나의 파일로 만들어지는 것을 우리는 일상적으로 압축하기라 부른다. 사실 진짜 압축하기만 한다면, 여러 파일을 대상으로 압축하기를 했을 때 압축된 여러 파일이 생기는 것이다. 또한 우리는 기본적으로 압축하기를 실행했을 때 원본 파일을 그대로 둔 채 새로운 압축파일을 생성하는데, 리눅스는 기본적으로 원본 파일을 삭제하고 새로운 압축파일로 생성한다고 한다. 어쨌든 tar는 묶기 명령어다.
Балл: 54.37Уверенность: 49%
ПодробнееAIタグが付けられた新着記事 - Qiita
私はCodexの最初の題材として、ブラウザで開ける小さなWebページを選びました。この記事ではNode.jsのダウンロード、Codex CLIのインストール、CrazyRouterの設定、HTMLファイルの作成を順番に説明します。 1. Node.jsをダウンロードして...
Балл: 57.4Уверенность: 54%
ПодробнееAIタグが付けられた新着記事 - Qiita
『リーダブルコード』第2章のテーマは、名前に情報を詰め込むこと。変数名や関数名が、それ自体で意味を説明できるようにするという話だ。 第1章の読書感想はこちら: 第2章は6つの観点に分かれている。 6つの観点 一つ目は、明確な単語を選ぶこと。たとえば GetPage ...
Балл: 57.4Уверенность: 54%
ПодробнееAIタグが付けられた新着記事 - Qiita
1. はじめに 最近、X(ex-Twitter)で、@super_bonochin さんが WorkIQ を理解しるための、とても素晴らしい動画を作成してくださいました。とてもわかりやすい動画ですので、ぜひご覧ください。 Work IQ のさらに深掘り 今日は、W...
Балл: 57.38Уверенность: 54%
ПодробнееAIタグが付けられた新着記事 - Qiita
Cloud-Burnout-Predictor: 個人開発者のための「破産を防ぐ」ローカル完結型コスト監視アーキテクチャ 技術の進化により、誰もがLLM(大規模言語モデル)APIやサーバーレスインフラを手軽に活用できる時代になった。しかし、それに伴い個人開発者や小規模チ...
Балл: 57.36Уверенность: 54%
ПодробнееReadhub
诺基亚与芬兰卫星初创公司 Iceye 宣布合作开发适用于欧洲的卫星通信系统,计划 2028 年起每年最多发射 50 颗低地球轨道卫星。该系统由卫星和地面终端组成,与现有陆基通信网络协同,基于欧洲技术打造,相关设备均由使用国拥有和控制,作为军用、商业网络的补充,为国防、应急等场景提供高吞吐量、低延迟的自主通信能力,避免依赖境外服务商。当前欧洲多国正加快建设自主卫星能力,欧盟已扩充 IRIS2 主权卫星计划,波兰也在推进相关主权卫星通信项目。Iceye 当前正提升卫星产能,经营状况良好,诺基亚此前已作为战略投资者参与其融资,同时自身也在拓展传统移动网络外的卫星设备等业务。受 Starlink 竞争影响,部分欧美电信运营商正洽谈组建联盟竞标卫星频谱,布局卫星直连手机服务。
Балл: 57.22Уверенность: 54%
ПодробнееБалл: 54.37Уверенность: 49%
Балл: 54.37Уверенность: 49%