백엔드 개발/API · 아키텍처 설계
DTO → Command → UseCase 패턴으로 본 구조적 백엔드 설계
2025.05.26
최근 프로젝트에서 Spring을 활용해 Item 등록 기능을 Clean Architecture 방식으로 설계해보았습니다. 이 구조가 왜 효과적인지, 어떤 방식으로 구성되었는지를 직접 정리해봅니다. 1. 전체 구조의 목적Controller → DTO → UseCase(Command) → Domain(Entity) + Factory → Repository → DBSpring에서는 역할 분리를 명확히 하여 테스트 용이성과 유지보수성을 높이는 것이 핵심입니다.각 계층은 다음과 같은 목적을 가집니다:Controller: HTTP 요청/응답 처리DTO: 외부 입력을 안전하게 감싸는 구조Command: 내부 유스케이스 전용 입력 모델UseCase: 실제 기능 로직의 진입점Entity: DB와 매핑되는 도메인 객체Fa..
백엔드 개발/API · 아키텍처 설계
SOLID 원칙 완벽 이해와 실전 적용: 리팩토링 전후 코드로 배우는 객체 지향 설계 전략
2025.05.22
SOLID란?SOLID 원칙은 객체 지향 설계에서 유지보수성과 확장성을 높이기 위한 다섯 가지 핵심 원칙이다. Robert C. Martin(일명 Uncle Bob)이 정리한 이 원칙들은 실제로도 많은 OOP 기반 시스템에서 코드 품질과 구조 개선에 기여한다.내가 직접 설계하고 리팩토링한 인증 서비스(auth-service)와 결제 서비스(escrow-service)에도 이 원칙들을 적용하며 실무적 감각을 쌓았다. S - 단일 책임 원칙 (Single Responsibility Principle, SRP)정의: 하나의 클래스는 하나의 책임만 가져야 한다.효과: 변경의 이유가 하나뿐이므로 코드 수정 시 다른 기능에 영향을 주지 않음.예시 적용RegisterUserUsecase / LoginUserUseca..
백엔드 개발
Spring Boot에서 Java record를 활용한 DTO 설계법 (feat. JSON 직렬화)
2025.05.18
Spring Boot에서 Java record를 DTO로 사용하는 방법Spring Boot 프로젝트에서 데이터를 주고받는 DTO(Data Transfer Object)를 정의할 때, Java 16부터 정식 도입된 record를 활용하면 더 간결하고 명확한 코드를 작성할 수 있습니다. 본 글에서는 record란 무엇인지, DTO로 사용할 때의 장점과 주의사항을 정리합니다.record란 무엇인가?record는 Java에서 불변 데이터 구조를 간결하게 표현할 수 있도록 도입된 키워드입니다. 흔히 DTO처럼 데이터를 담기만 하는 클래스에 적합합니다.public record UserDTO(String name, int age) {}위 한 줄의 코드는 다음과 같은 클래스와 동일한 기능을 합니다:public clas..
백엔드 개발/예외 처리 · 에러 설계
Jest 백엔드 테스트 완전 정리 – mock 실전 예제로 배우기
2025.05.09
Jest 완전 정복: 백엔드 개발자를 위한 실전 가이드본 글은 Jest를 처음 사용하는 신입 백엔드 개발자를 위해 작성되었습니다. 실전 예제와 함께 Jest의 핵심 개념과 테스트 작성 방법, mock 처리까지 모두 다룹니다. Jest란?Jest는 JavaScript/TypeScript 환경에서 가장 많이 사용되는 테스트 프레임워크입니다.Facebook에서 개발단위 테스트, 통합 테스트, mocking 모두 지원Zero-config로 시작 가능TypeScript와도 매우 잘 호환됨 기본 구조// src/sum.tsexport const sum = (a: number, b: number) => a + b;// src/tests/sum.spec.tsimport { sum } from '../sum';descr..
백엔드 개발/API · 아키텍처 설계
UserFactory로 객체 생성 책임을 분리한 이유 – SRP 기반 설계 적용기
2025.05.09
UserFactory에서 'new User()' vs '{ ...dto } as User' 어떤 게 더 좋을까?"객체 생성 시 new User()로 명시적으로 생성할지, 아니면 return { ...dto, ... } as User로 간결하게 처리할지 고민된다면, 이 글이 방향을 잡는 데 도움이 될 거예요." 상황: Factory를 도입했는데 객체 생성 방식이 고민된다auth-service를 use-case 기반으로 리팩토링하면서 UserFactory를 도입했습니다. 그런데 다음 두 가지 방식 중 어떤 게 더 좋은 방식일까 고민이 생겼습니다방식 A: Spread + Type Assertionreturn { ...dto, password: hashedPassword, privacyAgreementD..