Skip to content

BE 코드 컨벤션

Sangjin Yoon edited this page Oct 30, 2024 · 1 revision

airbnb 코드 스타일 컨벤션

파일명 & 폴더명

  • 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로 변경
}

📚 개발 일지

개발일지 펼쳐보기
개발일지 펼쳐보기
개발일지 펼쳐보기
개발일지 펼쳐보기
개발일지 펼쳐보기
개발일지 펼쳐보기
개발일지 펼쳐보기

🗄️ 문서 보관함

📚 회의록
1주차
2주차
3주차
4주차
5주차
6주차
📆 데일리 스크럼
1주차
2주차
3주차
4주차
5주차
6주차
📝 그룹 회고
  • 1주차 그룹회고
  • 2주차 그룹회고
  • 4주차 그룹회고
  • 📝 멘토링 일지

    📒 릴리즈 노트

    🧑‍🧑‍🧒‍🧒 팀 및 커뮤니티

    About Team Watchducks

    📢 발표 자료

    1️⃣ 1주차: 기획 현황

    2️⃣ 2주차: 발표자료

    3️⃣ 3주차: 발표자료

    4️⃣ 4주차: 발표자료

    5️⃣ 5주차: 발표자료

    6️⃣ 6주차: 최종 발표 ✨

    Clone this wiki locally