-
Notifications
You must be signed in to change notification settings - Fork 3
BE 코드 컨벤션
Sangjin Yoon edited this page Oct 30, 2024
·
1 revision
-
기본 골조는 Airbnb 코드 스타일을 적용
[GitHub - airbnb/javascript: JavaScript Style Guide](https://github.com/airbnb/javascript?tab=readme-ov-file#objects)
- kebap-case: 단어 구분자는 하이픈
-
로 작성 - 역할/계층은 닷
.
으로 구분
src/
├── user/
│ ├── dto/
│ │ ├── create-user.dto.ts
│ │ └── update-user-profile.dto.ts
│ ├── entities/
│ │ └── user.entity.ts
│ ├── user.controller.ts
│ ├── user.service.ts
│ └── user.module.ts
│
├── auth/
│ ├── guards/
│ │ └── jwt-auth.guard.ts
│ ├── strategies/
│ │ └── local-auth.strategy.ts
│ └── auth.service.ts
│
├── product/
│ ├── interfaces/
│ │ └── product-item.interface.ts
│ ├── product-category.controller.ts # 복합 단어는 하이픈으로 구분
│ └── product-inventory.service.ts
│
└── common/
├── filters/
│ └── http-exception.filter.ts
├── middleware/
│ └── request-logger.middleware.ts
└── pipes/
└── validation.pipe.ts
PascalCase: 첫 글자 대문자, 이후 대문자로 단어 구분
// user.controller.ts
export class UserController {
// ...
}
// product-category.controller.ts
export class ProductCategoryController {
// ...
}
// create-user.dto.ts
export class CreateUserDto {
// ...
}
camelCase: 첫 글자 소문자, 이후 대문자로 단어 구분
- 줄임말을 지양하고 책임을 명확하게 작성
- 명사로 작성
// Good Examples
class GoodExample {
// 명확한 명사 사용
private firstName: string;
private lastName: string;
private emailAddress: string;
private birthDate: Date;
private phoneNumber: string;
private membershipStatus: string;
private registrationDate: Date;
private lastLoginDateTime: Date;
// 불리언 변수는 is, has, can 등으로 시작
private isActive: boolean;
private isEmailVerified: boolean;
private hasSubscription: boolean;
private canAccessPremium: boolean;
// 배열은 복수형 명사
private userPreferences: string[];
private orderHistory: Order[];
private shippingAddresses: Address[];
private paymentMethods: PaymentMethod[];
// 객체는 명확한 의미를 가진 명사
private currentLocation: Location;
private personalInformation: UserProfile;
private subscriptionPlan: SubscriptionPlan;
private accountSettings: AccountSettings;
}
// Bad Examples - 이렇게 하지 마세요
class BadExample {
// ❌ 줄임말 사용
private fn: string; // ⭕️ firstName으로 변경
private pwd: string; // ⭕️ password로 변경
private addr: string; // ⭕️ address로 변경
private tel: string; // ⭕️ phoneNumber로 변경
// ❌ 모호한 이름
private data: any; // ⭕️ userData로 변경
private info: string; // ⭕️ userInformation으로 변경
private temp: number; // ⭕️ temporaryCount로 변경
private obj: object; // ⭕️ configurationObject로 변경
// ❌ 불필요한 접두사/접미사
private strName: string; // ⭕️ name으로 변경
private arrItems: any[]; // ⭕️ items로 변경
private objUser: object; // ⭕️ user로 변경
private boolFlag: boolean;// ⭕️ isEnabled로 변경
}
camelCase: 첫 글자 소문자, 이후 대문자로 단어 구분
- 줄임말을 지양하고 책임을 명확하게 작성
- 동사로 시작
class UserService {
// Create 관련 메소드 - 동사: create, register, generate
async createUser(userData: UserDto): Promise<User> {}
async registerNewMember(memberData: MemberDto): Promise<Member> {}
async generateTemporaryPassword(): Promise<string> {}
// Read 관련 메소드 - 동사: get, find, retrieve, search
async getUserById(id: number): Promise<User> {}
async findUsersByEmail(email: string): Promise<User[]> {}
async retrieveActiveMembers(): Promise<Member[]> {}
async searchUsersByName(name: string): Promise<User[]> {}
// Update 관련 메소드 - 동사: update, modify, change, set
async updateUserProfile(userId: number, profileData: ProfileDto): Promise<User> {}
async modifyEmailAddress(userId: number, newEmail: string): Promise<void> {}
async changePassword(userId: number, newPassword: string): Promise<void> {}
async setPreferences(userId: number, preferences: PreferencesDto): Promise<void> {}
// Delete 관련 메소드 - 동사: delete, remove, deactivate
async deleteAccount(userId: number): Promise<void> {}
async removeProfilePicture(userId: number): Promise<void> {}
async deactivateUser(userId: number): Promise<void> {}
// 검증 관련 메소드 - 동사: validate, verify, check
async validateEmailFormat(email: string): Promise<boolean> {}
async verifyPassword(userId: number, password: string): Promise<boolean> {}
async checkDuplicateUsername(username: string): Promise<boolean> {}
// 처리/변환 관련 메소드 - 동사: process, convert, transform
async processPayment(paymentData: PaymentDto): Promise<PaymentResult> {}
async convertToMembershipPoints(amount: number): Promise<number> {}
async transformUserData(userData: UserDto): Promise<UserResponse> {}
}
class OrderService {
// ⭕️ Good Examples - 명확한 동사와 목적
async createOrder(orderData: OrderDto): Promise<Order> {}
async calculateTotalAmount(items: OrderItem[]): Promise<number> {}
async processPayment(orderId: number, paymentData: PaymentDto): Promise<PaymentResult> {}
async validateDeliveryAddress(address: AddressDto): Promise<boolean> {}
async updateOrderStatus(orderId: number, status: OrderStatus): Promise<void> {}
async cancelOrder(orderId: number, reason: string): Promise<void> {}
async generateOrderInvoice(orderId: number): Promise<Invoice> {}
async sendOrderConfirmation(orderId: number): Promise<void> {}
// ❌ Bad Examples - 이렇게 하지 마세요
async proc(data: any): Promise<any> {} // ⭕️ processOrder로 변경
async updOrd(id: number): Promise<void> {} // ⭕️ updateOrder로 변경
async getData(): Promise<any> {} // ⭕️ getOrderDetails로 변경
async chk(): Promise<boolean> {} // ⭕️ checkOrderStatus로 변경
async handleStuff(): Promise<void> {} // ⭕️ handleOrderProcessing로 변경
}
🔗 Project Links
📦 Repository •
🌐 Live Site •
📚 Wiki •
📋 Team Notion
📞 Contact & Support
✉️ Email: watchducks3535@gmail.com • 🐛 Create Issue • 🕒 Updated: 2024-12-03