Skip to content

prgrms-be-devcourse/NBE6-8-2-Team03

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

14 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

devcourse-NBE6-8-2-Team03 - TodoDuk

NBE6-8-2-Team03 ์‚ฌ์ด๋ณด์ด์ฆˆ

๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

TodoDuk์€ ๊ฐœ์ธ ๋ฐ ํŒ€ ํ• ์ผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. Spring Boot๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ REST API ๋ฐฑ์—”๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ• ์ผ ๊ด€๋ฆฌ, ํŒ€ ํ˜‘์—…, ๋ผ๋ฒจ๋ง, ์•Œ๋ฆผ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›  ์ฃผ์š” ๊ธฐ์ˆ  ์Šคํƒ

  • Backend: Spring Boot 3.5.4, JPA/Hibernate, Spring Security
  • Database: H2 (๊ฐœ๋ฐœํ™˜๊ฒฝ)
  • Authentication: JWT + API Key
  • Scheduler: Quartz
  • API Documentation: Swagger/OpenAPI 3

Backend (Spring Boot)

  • Framework: Spring Boot 3.5.3
  • Language: Java 21
  • Database: H2 (๊ฐœ๋ฐœ), MySQL (์šด์˜ ์ง€์›)
  • Cache: Redis (ํ† ํฐ ์ €์žฅ์†Œ)
  • Security: Spring Security + JWT
  • Documentation: SpringDoc OpenAPI 3.x (Swagger)
  • Build Tool: Gradle 8.14.3 (Kotlin DSL)

Frontend (Next.js)

  • Framework: Next.js 15.4.1
  • Language: TypeScript
  • Styling: Tailwind CSS 4.0
  • State Management: Zustand
  • HTTP Client: Axios
  • UI Components: Radix UI, Lucide React
  • Dev Tools: ESLint, Prettier

DevOps & Tools

  • CI/CD: GitHub Actions
  • API Generation: swagger-typescript-api
  • Development: Docker (Redis)

๐Ÿ—๏ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ


graph TB
    subgraph "Client Layer"
        WEB[Web Browser/Frontend]
    end
    
    subgraph "API Gateway"
        CORS[CORS Handler]
        AUTH[Authentication Filter]
        CTRL[Spring Controllers]
    end
    
    subgraph "Business Logic Layer"
        US[User Service]
        TS[Team Service]
        TMS[TeamMember Service]
        TLS[TodoList Service]
        TOS[Todo Service]
        LS[Label Service]
        TLS2[TodoLabel Service]
        RS[Reminder Service]
        NS[Notification Service]
    end
    
    subgraph "Data Access Layer"
        UR[User Repository]
        TR[Team Repository]
        TMR[TeamMember Repository]
        TLR[TodoList Repository]
        TOR[Todo Repository]
        LR[Label Repository]
        TLSR[TodoLabel Repository]
        RR[Reminder Repository]
        NR[Notification Repository]
        TAR[TodoAssignment Repository]
    end
    
    subgraph "External Systems"
        QUARTZ[Quartz Scheduler]
        JWT[JWT Token Service]
        FILE[File Upload Service]
    end
    
    subgraph "Database"
        H2[(H2 Database)]
    end
    
    WEB --> CORS
    CORS --> AUTH
    AUTH --> CTRL
    
    CTRL --> US
    CTRL --> TS
    CTRL --> TMS
    CTRL --> TLS
    CTRL --> TOS
    CTRL --> LS
    CTRL --> TLS2
    CTRL --> RS
    CTRL --> NS
    
    US --> UR
    TS --> TR
    TMS --> TMR
    TLS --> TLR
    TOS --> TOR
    LS --> LR
    TLS2 --> TLSR
    RS --> RR
    NS --> NR
    TS --> TAR
    
    UR --> H2
    TR --> H2
    TMR --> H2
    TLR --> H2
    TOR --> H2
    LR --> H2
    TLSR --> H2
    RR --> H2
    NR --> H2
    TAR --> H2
    
    RS --> QUARTZ
    US --> JWT
    US --> FILE
Loading

๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ERD

erDiagram
    Users ||--o{ TodoLists : has
    Users ||--o{ TeamMembers : belongs_to
    Users ||--o{ Labels : owns
    Users ||--o{ Notifications : receives
    
    Teams ||--o{ TeamMembers : has
    Teams ||--o{ TodoLists : contains
    Teams ||--o{ TodoAssignments : manages
    
    TodoLists ||--o{ Todos : contains
    
    Todos ||--o{ TodoLabels : has
    Todos ||--o{ Reminders : scheduled
    Todos ||--o{ TodoAssignments : assigned_to
    
    Labels ||--o{ TodoLabels : applied_to
    
    Users {
        int id PK
        string userEmail UK
        string password
        string nickName
        boolean isAdmin
        string profileImgUrl
        string apiKey UK
        datetime createDate
        datetime modifyDate
    }
    
    Teams {
        int id PK
        string teamName
        string description
        datetime createDate
        datetime modifyDate
    }
    
    TeamMembers {
        int id PK
        int user_id FK
        int team_id FK
        enum role
        datetime joinedAt
        datetime createDate
        datetime modifyDate
    }
    
    TodoLists {
        int id PK
        string name
        string description
        int user_id FK
        int team_id FK
        datetime createDate
        datetime modifyDate
    }
    
    Todos {
        int id PK
        string title
        string description
        boolean isCompleted
        int priority
        datetime startDate
        datetime dueDate
        int todoList_id FK
        datetime createDate
        datetime modifyDate
    }
    
    Labels {
        int id PK
        string name
        string color
        datetime createDate
        datetime modifyDate
    }
    
    TodoLabels {
        int id PK
        int todo_id FK
        int label_id FK
        datetime createDate
        datetime modifyDate
    }
    
    Reminders {
        int id PK
        int todo_id FK
        datetime remindAt
        string method
        datetime createDate
        datetime modifyDate
    }
    
    Notifications {
        int id PK
        int user_id FK
        string title
        string description
        string url
        boolean isRead
        datetime createDate
        datetime modifyDate
    }
    
    TodoAssignments {
        int id PK
        int todo_id FK
        int assigned_user_id FK
        int team_id FK
        datetime assignedAt
        enum status
        datetime createDate
        datetime modifyDate
    }
Loading

๐Ÿ”„ ์‹œ์Šคํ…œ ํ”Œ๋กœ์šฐ์ฐจํŠธ

์‚ฌ์šฉ์ž ์ธ์ฆ ํ”Œ๋กœ์šฐ

flowchart TD
    START([์‹œ์ž‘]) --> LOGIN{๋กœ๊ทธ์ธ ์š”์ฒญ}
    LOGIN -->|ํšŒ์›๊ฐ€์ž…| REGISTER[ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ]
    LOGIN -->|๋กœ๊ทธ์ธ| AUTH[์ธ์ฆ ์ฒ˜๋ฆฌ]
    
    REGISTER --> SAVE_USER[์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ]
    SAVE_USER --> GEN_API[API Key ์ƒ์„ฑ]
    GEN_API --> SUCCESS_REG[ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต]
    
    AUTH --> CHECK_USER{์‚ฌ์šฉ์ž ์กด์žฌ ํ™•์ธ}
    CHECK_USER -->|์—†์Œ| FAIL[๋กœ๊ทธ์ธ ์‹คํŒจ]
    CHECK_USER -->|์กด์žฌ| CHECK_PWD{๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ}
    
    CHECK_PWD -->|ํ‹€๋ฆผ| FAIL
    CHECK_PWD -->|๋งž์Œ| GEN_TOKEN[Access Token ์ƒ์„ฑ]
    GEN_TOKEN --> SET_COOKIE[์ฟ ํ‚ค ์„ค์ •]
    SET_COOKIE --> SUCCESS_LOGIN[๋กœ๊ทธ์ธ ์„ฑ๊ณต]
    
    SUCCESS_REG --> END([์ข…๋ฃŒ])
    SUCCESS_LOGIN --> END
    FAIL --> END
Loading

TODO ๊ด€๋ฆฌ ํ”Œ๋กœ์šฐ

flowchart TD
    START([Todo ๊ด€๋ฆฌ ์‹œ์ž‘]) --> ACTION{์•ก์…˜ ์„ ํƒ}
    
    ACTION -->|Todo ์ƒ์„ฑ| CREATE_TODO[Todo ์ƒ์„ฑ]
    ACTION -->|Todo ์ˆ˜์ •| UPDATE_TODO[Todo ์ˆ˜์ •]
    ACTION -->|Todo ์‚ญ์ œ| DELETE_TODO[Todo ์‚ญ์ œ]
    ACTION -->|์™„๋ฃŒ ์ฒ˜๋ฆฌ| TOGGLE_TODO[์™„๋ฃŒ ์ƒํƒœ ํ† ๊ธ€]
    ACTION -->|๋‹ด๋‹น์ž ์ง€์ •| ASSIGN_TODO[๋‹ด๋‹น์ž ์ง€์ •]
    
    CREATE_TODO --> GET_TODOLIST{TodoList ํ™•์ธ}
    GET_TODOLIST -->|์—†์Œ| CREATE_TODOLIST[TodoList ์ƒ์„ฑ]
    GET_TODOLIST -->|์žˆ์Œ| SAVE_TODO[Todo ์ €์žฅ]
    CREATE_TODOLIST --> SAVE_TODO
    SAVE_TODO --> SUCCESS1[Todo ์ƒ์„ฑ ์„ฑ๊ณต]
    
    UPDATE_TODO --> FIND_TODO{Todo ์กด์žฌ ํ™•์ธ}
    FIND_TODO -->|์—†์Œ| NOT_FOUND[Todo ์—†์Œ]
    FIND_TODO -->|์žˆ์Œ| CHECK_PERMISSION{์ˆ˜์ • ๊ถŒํ•œ ํ™•์ธ}
    CHECK_PERMISSION -->|๊ถŒํ•œ ์—†์Œ| PERM_FAIL[๊ถŒํ•œ ์‹คํŒจ]
    CHECK_PERMISSION -->|๊ถŒํ•œ ์žˆ์Œ| UPDATE_DATA[Todo ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ]
    UPDATE_DATA --> SUCCESS2[Todo ์ˆ˜์ • ์„ฑ๊ณต]
    
    DELETE_TODO --> FIND_TODO2{Todo ์กด์žฌ ํ™•์ธ}
    FIND_TODO2 -->|์—†์Œ| NOT_FOUND
    FIND_TODO2 -->|์žˆ์Œ| CHECK_DELETE_PERM{์‚ญ์ œ ๊ถŒํ•œ ํ™•์ธ}
    CHECK_DELETE_PERM -->|๊ถŒํ•œ ์—†์Œ| PERM_FAIL
    CHECK_DELETE_PERM -->|๊ถŒํ•œ ์žˆ์Œ| DELETE_LABELS[์—ฐ๊ด€ ๋ผ๋ฒจ ์‚ญ์ œ]
    DELETE_LABELS --> DELETE_ASSIGNMENTS[๋‹ด๋‹น์ž ์ •๋ณด ์‚ญ์ œ]
    DELETE_ASSIGNMENTS --> DELETE_TODO_DATA[Todo ๋ฐ์ดํ„ฐ ์‚ญ์ œ]
    DELETE_TODO_DATA --> SUCCESS3[Todo ์‚ญ์ œ ์„ฑ๊ณต]
    
    ASSIGN_TODO --> CHECK_TEAM_MEMBER{ํŒ€ ๋ฉค๋ฒ„ ํ™•์ธ}
    CHECK_TEAM_MEMBER -->|์•„๋‹˜| TEAM_FAIL[ํŒ€ ๋ฉค๋ฒ„ ์•„๋‹˜]
    CHECK_TEAM_MEMBER -->|๋งž์Œ| CREATE_ASSIGNMENT[๋‹ด๋‹น์ž ์ง€์ •]
    CREATE_ASSIGNMENT --> SUCCESS4[๋‹ด๋‹น์ž ์ง€์ • ์„ฑ๊ณต]
    
    SUCCESS1 --> END([์ข…๋ฃŒ])
    SUCCESS2 --> END
    SUCCESS3 --> END
    SUCCESS4 --> END
    NOT_FOUND --> END
    PERM_FAIL --> END
    TEAM_FAIL --> END
Loading

ํŒ€ํŒ€ ๊ด€๋ฆฌ ํ”Œ๋กœ์šฐ

flowchart TD
    START([ํŒ€ ๊ด€๋ฆฌ ์‹œ์ž‘]) --> AUTH_CHECK{์ธ์ฆ ํ™•์ธ}
    AUTH_CHECK -->|์‹คํŒจ| AUTH_FAIL[์ธ์ฆ ์‹คํŒจ]
    AUTH_CHECK -->|์„ฑ๊ณต| ACTION{์•ก์…˜ ์„ ํƒ}
    
    ACTION -->|ํŒ€ ์ƒ์„ฑ| CREATE_TEAM[ํŒ€ ์ƒ์„ฑ]
    ACTION -->|ํŒ€ ์ˆ˜์ •| MODIFY_TEAM[ํŒ€ ์ •๋ณด ์ˆ˜์ •]
    ACTION -->|๋ฉค๋ฒ„ ๊ด€๋ฆฌ| MEMBER_MGMT[๋ฉค๋ฒ„ ๊ด€๋ฆฌ]
    ACTION -->|ํŒ€ ์‚ญ์ œ| DELETE_TEAM[ํŒ€ ์‚ญ์ œ]
    
    CREATE_TEAM --> SAVE_TEAM[ํŒ€ ์ •๋ณด ์ €์žฅ]
    SAVE_TEAM --> CREATE_LEADER[์ƒ์„ฑ์ž๋ฅผ ๋ฆฌ๋”๋กœ ์ถ”๊ฐ€]
    CREATE_LEADER --> SUCCESS1[ํŒ€ ์ƒ์„ฑ ์„ฑ๊ณต]
    
    MODIFY_TEAM --> CHECK_LEADER{๋ฆฌ๋” ๊ถŒํ•œ ํ™•์ธ}
    CHECK_LEADER -->|๊ถŒํ•œ ์—†์Œ| PERM_FAIL[๊ถŒํ•œ ์‹คํŒจ]
    CHECK_LEADER -->|๊ถŒํ•œ ์žˆ์Œ| UPDATE_TEAM[ํŒ€ ์ •๋ณด ์—…๋ฐ์ดํŠธ]
    UPDATE_TEAM --> SUCCESS2[์ˆ˜์ • ์„ฑ๊ณต]
    
    MEMBER_MGMT --> MEMBER_ACTION{๋ฉค๋ฒ„ ์•ก์…˜}
    MEMBER_ACTION -->|๋ฉค๋ฒ„ ์ถ”๊ฐ€| ADD_MEMBER[๋ฉค๋ฒ„ ์ถ”๊ฐ€]
    MEMBER_ACTION -->|์—ญํ•  ๋ณ€๊ฒฝ| CHANGE_ROLE[์—ญํ•  ๋ณ€๊ฒฝ]
    MEMBER_ACTION -->|๋ฉค๋ฒ„ ์ œ๊ฑฐ| REMOVE_MEMBER[๋ฉค๋ฒ„ ์ œ๊ฑฐ]
    
    ADD_MEMBER --> CHECK_EMAIL{์ด๋ฉ”์ผ ์กด์žฌ ํ™•์ธ}
    CHECK_EMAIL -->|์—†์Œ| EMAIL_FAIL[์‚ฌ์šฉ์ž ์—†์Œ]
    CHECK_EMAIL -->|์žˆ์Œ| ADD_TO_TEAM[ํŒ€์— ์ถ”๊ฐ€]
    ADD_TO_TEAM --> SUCCESS3[๋ฉค๋ฒ„ ์ถ”๊ฐ€ ์„ฑ๊ณต]
    
    DELETE_TEAM --> CHECK_DELETE_AUTH{์‚ญ์ œ ๊ถŒํ•œ ํ™•์ธ}
    CHECK_DELETE_AUTH -->|๊ถŒํ•œ ์—†์Œ| PERM_FAIL
    CHECK_DELETE_AUTH -->|๊ถŒํ•œ ์žˆ์Œ| REMOVE_ASSIGNMENTS[๋‹ด๋‹น์ž ์ •๋ณด ์‚ญ์ œ]
    REMOVE_ASSIGNMENTS --> REMOVE_TODOLISTS[ํŒ€ ํ• ์ผ๋ชฉ๋ก ์‚ญ์ œ]
    REMOVE_TODOLISTS --> REMOVE_TEAM_DATA[ํŒ€ ๋ฐ์ดํ„ฐ ์‚ญ์ œ]
    REMOVE_TEAM_DATA --> SUCCESS4[ํŒ€ ์‚ญ์ œ ์„ฑ๊ณต]
    
    SUCCESS1 --> END([์ข…๋ฃŒ])
    SUCCESS2 --> END
    SUCCESS3 --> END
    SUCCESS4 --> END
    AUTH_FAIL --> END
    PERM_FAIL --> END
    EMAIL_FAIL --> END
Loading

Use Case ๋‹ค์ด์–ด๊ทธ๋žจ

graph LR
    subgraph "Actors"
        U[User]
        TL[Team Leader]
        TM[Team Member]
        SYS[System]
    end
    
    subgraph "Authentication & User Management"
        UC1[Register Account]
        UC2[Login/Logout]
        UC3[View Profile]
        UC4[Update Profile]
        UC5[Upload Profile Image]
    end
    
    subgraph "Todo Management"
        UC6[Create Todo]
        UC7[Update Todo]
        UC8[Delete Todo]
        UC9[Mark Complete]
        UC10[View Todos]
        UC11[Filter Todos]
    end
    
    subgraph "Todo List Management"
        UC12[Create Todo List]
        UC13[Update Todo List]
        UC14[Delete Todo List]
        UC15[View Todo Lists]
    end
    
    subgraph "Label Management"
        UC16[Create Label]
        UC17[Apply Labels to Todo]
        UC18[Remove Labels]
        UC19[View Labels]
    end
    
    subgraph "Team Management"
        UC20[Create Team]
        UC21[Update Team Info]
        UC22[Delete Team]
        UC23[View Team Details]
        UC24[Add Team Member]
        UC25[Remove Team Member]
        UC26[Change Member Role]
        UC27[View Team Stats]
    end
    
    subgraph "Team Todo Management"
        UC28[Create Team Todo]
        UC29[Assign Todo to Member]
        UC30[Unassign Todo]
        UC31[View Team Todos]
        UC32[Track Assignment History]
    end
    
    subgraph "Reminder & Notification"
        UC33[Create Reminder]
        UC34[Delete Reminder]
        UC35[View Reminders]
        UC36[Receive Notifications]
        UC37[Mark Notification Read]
        UC38[Schedule Reminder Job]
    end
    
    %% User relationships
    U --> UC1
    U --> UC2
    U --> UC3
    U --> UC4
    U --> UC5
    U --> UC6
    U --> UC7
    U --> UC8
    U --> UC9
    U --> UC10
    U --> UC11
    U --> UC12
    U --> UC13
    U --> UC14
    U --> UC15
    U --> UC16
    U --> UC17
    U --> UC18
    U --> UC19
    U --> UC33
    U --> UC34
    U --> UC35
    U --> UC36
    U --> UC37
    
    %% Team Leader relationships
    TL --> UC20
    TL --> UC21
    TL --> UC22
    TL --> UC24
    TL --> UC25
    TL --> UC26
    
    %% Team Member relationships
    TM --> UC23
    TM --> UC27
    TM --> UC28
    TM --> UC29
    TM --> UC30
    TM --> UC31
    TM --> UC32
    
    %% System relationships
    SYS --> UC38
Loading

๋ณด์•ˆ ์•„ํ‚คํ…์ณ

flowchart TD
    REQUEST[ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ] --> CORS_CHECK[CORS ๊ฒ€์ฆ]
    CORS_CHECK --> AUTH_FILTER[์ธ์ฆ ํ•„ํ„ฐ]
    
    AUTH_FILTER --> PERMIT_CHECK{์ธ์ฆ ๋ถˆํ•„์š” ๊ฒฝ๋กœ?}
    PERMIT_CHECK -->|Yes| CONTROLLER[์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰]
    PERMIT_CHECK -->|No| TOKEN_CHECK[ํ† ํฐ ํ™•์ธ]
    
    TOKEN_CHECK --> HEADER_CHECK{Authorization ํ—ค๋”?}
    HEADER_CHECK -->|Yes| EXTRACT_HEADER[ํ—ค๋”์—์„œ ํ† ํฐ ์ถ”์ถœ]
    HEADER_CHECK -->|No| COOKIE_CHECK[์ฟ ํ‚ค์—์„œ ํ† ํฐ ์ถ”์ถœ]
    
    EXTRACT_HEADER --> VALIDATE_TOKEN{ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ}
    COOKIE_CHECK --> VALIDATE_TOKEN
    
    VALIDATE_TOKEN -->|Valid AccessToken| SET_AUTH[Security Context ์„ค์ •]
    VALIDATE_TOKEN -->|Invalid AccessToken| API_KEY_CHECK[API Key๋กœ ์‚ฌ์šฉ์ž ์กฐํšŒ]
    VALIDATE_TOKEN -->|No Token| UNAUTHORIZED[์ธ์ฆ ์‹คํŒจ]
    
    API_KEY_CHECK -->|Found| GENERATE_NEW[์ƒˆ AccessToken ์ƒ์„ฑ]
    API_KEY_CHECK -->|Not Found| UNAUTHORIZED
    
    GENERATE_NEW --> SET_COOKIE[์ฟ ํ‚ค ์„ค์ •]
    SET_COOKIE --> SET_AUTH
    
    SET_AUTH --> CONTROLLER
    UNAUTHORIZED --> ERROR_RESPONSE[401 ์—๋Ÿฌ ์‘๋‹ต]
    
    CONTROLLER --> RESPONSE[์‘๋‹ต ๋ฐ˜ํ™˜]
Loading

๐Ÿ“Š ์ฃผ์š” ๋น„์ฆˆ๋‹ˆ์Šค ํ”Œ๋กœ์šฐ

ํŒ€ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ

  1. ํŒ€ ์ƒ์„ฑ: ์‚ฌ์šฉ์ž๊ฐ€ ํŒ€์„ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฆฌ๋” ๊ถŒํ•œ ๋ถ€์—ฌ
  2. ๋ฉค๋ฒ„ ์ดˆ๋Œ€: ๋ฆฌ๋”๋งŒ ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ (์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜)
  3. ๊ถŒํ•œ ๊ด€๋ฆฌ: ๋ฆฌ๋”๋Š” ๋ฉค๋ฒ„ ์—ญํ•  ๋ณ€๊ฒฝ ๋ฐ ์ œ๊ฑฐ ๊ฐ€๋Šฅ
  4. ํŒ€ ์‚ญ์ œ: ๋งˆ์ง€๋ง‰ ๋ฆฌ๋”๋Š” ์ œ๊ฑฐ ๋ถˆ๊ฐ€, ํŒ€ ์‚ญ์ œ ์‹œ ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์—ฐ์‡„ ์‚ญ์ œ

ํ• ์ผ ํ• ๋‹น ์‹œ์Šคํ…œ

  1. ๊ฐœ์ธ ํ• ์ผ: ์‚ฌ์šฉ์ž ๊ฐœ๋ณ„ ๊ด€๋ฆฌ
  2. ํŒ€ ํ• ์ผ: ํŒ€ ๋ฉค๋ฒ„๋งŒ ์ƒ์„ฑ/์ˆ˜์ • ๊ฐ€๋Šฅ
  3. ํ• ์ผ ํ• ๋‹น: ํŒ€ ๋ฉค๋ฒ„๋ฅผ ํ• ์ผ์— ๋‹ด๋‹น์ž๋กœ ์ง€์ •
  4. ํ• ๋‹น ๊ธฐ๋ก: ๋ชจ๋“  ํ• ๋‹น ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ถ”์  ๋ฐ ์ด๋ ฅ ๊ด€๋ฆฌ

์•Œ๋ฆผ ์‹œ์Šคํ…œ

  1. ๋ฆฌ๋งˆ์ธ๋” ์„ค์ •: ํ• ์ผ์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ ์„ค์ •
  2. ์Šค์ผ€์ค„๋ง: Quartz๋ฅผ ํ†ตํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์‹คํ–‰
  3. ์•Œ๋ฆผ ์ƒ์„ฑ: ์˜ˆ์ •๋œ ์‹œ๊ฐ„์— ์•Œ๋ฆผ ์ž๋™ ์ƒ์„ฑ
  4. ์•Œ๋ฆผ ๊ด€๋ฆฌ: ์‚ฌ์šฉ์ž๋ณ„ ์•Œ๋ฆผ ์กฐํšŒ ๋ฐ ์ฝ์Œ ์ฒ˜๋ฆฌ


๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ์‚ฌ์šฉ์ž ์ธ์ฆ: JWT + API Key ๊ธฐ๋ฐ˜ ๋ณด์•ˆ ์‹œ์Šคํ…œ
  • ๊ฐœ์ธ ํ• ์ผ ๊ด€๋ฆฌ: CRUD, ์šฐ์„ ์ˆœ์œ„, ๋งˆ๊ฐ์ผ, ์™„๋ฃŒ ์ƒํƒœ ๊ด€๋ฆฌ
  • ํŒ€ ํ˜‘์—…: ํŒ€ ์ƒ์„ฑ, ๋ฉค๋ฒ„ ๊ด€๋ฆฌ, ์—ญํ•  ๊ธฐ๋ฐ˜ ๊ถŒํ•œ ์ œ์–ด
  • ํŒ€ ํ• ์ผ ๊ด€๋ฆฌ: ํŒ€์› ๊ฐ„ ํ• ์ผ ๊ณต์œ  ๋ฐ ๋‹ด๋‹น์ž ์ง€์ •
  • ๋ผ๋ฒจ๋ง: ์ƒ‰์ƒ ๊ธฐ๋ฐ˜ ๋ผ๋ฒจ๋กœ ํ• ์ผ ๋ถ„๋ฅ˜
  • ๋ฆฌ๋งˆ์ธ๋”: ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ ์Šค์ผ€์ค„๋ง
  • ํŒŒ์ผ ์—…๋กœ๋“œ: ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ

๐Ÿ”ง ๊ธฐ์ˆ ์  ํŠน์ง•

  • RESTful API: ํ‘œ์ค€ REST ์•„ํ‚คํ…์ฒ˜
  • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ: Spring์˜ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ผ๊ด€๋œ ์˜ค๋ฅ˜ ์‘๋‹ต
  • ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ: Bean Validation์„ ํ†ตํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
  • CORS ์ง€์›: ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ์•ˆ์ „ํ•œ ํ†ต์‹ 
  • API ๋ฌธ์„œํ™”: Swagger/OpenAPI 3 ์ž๋™ ๋ฌธ์„œ ์ƒ์„ฑ

branch ๊ทœ์น™

ํƒœ๊ทธ ์ข…๋ฅ˜

  • feature: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (feature)
  • fix: ๋ฒ„๊ทธ ์ˆ˜์ •
  • chore: ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์•„๋‹Œ ๋นŒ๋“œ, ์„ค์ •, ๋ฌธ์„œ ์ˆ˜์ • ๋“ฑ ์žก์ผ์„ฑ ์ž‘์—…
  • docs: ๋ฌธ์„œ ์ˆ˜์ •
  • style: ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ ๋“ฑ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ด€๋ จ ๋ณ€๊ฒฝ
  • refactor: ๋ฆฌํŒฉํ† ๋ง (๊ธฐ๋Šฅ ๋ณ€ํ™” ์—†์ด ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ )
  • test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์ˆ˜์ •
  • perf: ์„ฑ๋Šฅ ๊ฐœ์„  [๊ธฐ์ˆ  ๋ถ„์•ผ] / [์ž‘์—… ์ข…๋ฅ˜] / [์ด์Šˆ๋„˜๋ฒ„]-[๊ตฌํ˜„ ๊ธฐ๋Šฅ] Ex) be/feature/1-login ์—ฌ๊ธฐ์„œ ์ด์Šˆ ๋„˜๋ฒ„๋Š” git issue ๋“ฑ๋ก ์‹œ ๋‚˜์˜ค๋Š” ์ˆซ์ž๋กœ ํ•œ๋‹ค
image (4) ### commit ๊ทœ์น™ ์•ž์— [BE], [FE] ๋กœ ๊ตฌ๋ถ„ํ•ด์ฃผ๊ธฐ ```bash //[**๋ณธ์ธ ์˜์—ญ**] **commit ์ข…๋ฅ˜** : commit ๋‚ด์šฉ **[FE] feature: ๋กœ๊ทธ์ธ ํ™”๋ฉด ์ถ”๊ฐ€** //front ์˜์—ญ feat(์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€)์—์„œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ **[BE] fix :f** //backend ์˜์—ญ fix(๋ฒ„๊ทธ ์ˆ˜์ •)์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•จ //ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด ์˜ˆ์‹œ git commit -m โ€œ[FE] feat: ๋กœ๊ทธ์ธ ํ™”๋ฉด ์ถ”๊ฐ€โ€ ``` ### **ํ˜‘์—…๊ทœ์น™** 1. ์ž‘์—… ์ „, Issues์— ์ž์‹ ์˜ ์ž‘์—…์„ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”. ๋ฐฑ์—”๋“œ ์ž‘์—…์˜ ๊ฒฝ์šฐ -> [BE] ์ด์Šˆ์ด๋ฆ„ 2. ์ž‘์—…์€ main ๋ธŒ๋žœ์น˜๊ฐ€ ์•„๋‹Œ ์ž‘์—…์šฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”. 3. ์ž‘์—… ์ง„ํ–‰์ค‘ ์ปค๋ฐ‹์„ ์ง„ํ–‰์‹œ, ์•„๋ž˜์˜ Commit Message Convention์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”. 4. ์ž‘์—…์—์„œ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹ ์ง„ํ–‰ ํ›„,ย `git pull origin main --rebase`๋ฅผ ํ†ตํ•ด ์ž‘์—… ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹ ํ™”๋ฅผ ์œ ์ง€ํ•ด์ฃผ์„ธ์š”. 5. ์ž‘์—…์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ์ž‘์—…์„ ๋ธŒ๋žœ์น˜์— push ํ›„ main branch์™€ Squash merge ํ•ด์ฃผ์„ธ์š”. 6. merge ํ›„์—๋Š” ๋ธŒ๋Ÿฐ์น˜๋ฅผ ์‚ญ์ œํ•ด์ฃผ์‹œ๊ณ ,ย `git fetch --prune`์„ ํ†ตํ•ด ๋กœ์ปฌ์— ๋‚จ์•„์žˆ๋Š” ์›๊ฒฉ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ด์ฃผ์„ธ์š”. ### PR ๊ทœ์น™ 1. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ branch ์ƒ์„ฑ ํ›„, ์ž‘์„ฑํ•˜๊ธฐ 2. `main` branch์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ๋งŒ pr์„ ํ†ตํ•œ ๋ณ‘ํ•ฉ ์š”์ฒญ 3. pr์„ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฆฌ๋ทฐ ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ `draft pull request ์‚ฌ์šฉ`(reviewer๊ฐ€ ํ™•์ธํ•ด๋„ ๋ณ‘ํ•ฉ ์•ˆ๋˜๋‹ˆ ๋งˆ์Œ ํŽธํžˆ ์‚ฌ์šฉ๊ฐ€๋Šฅ) ### ์–ด๋…ธํ…Œ์ด์…˜ ๊ทœ์น™ ์ €ํฌ ์–ด๋…ธํ…Œ์ด์…˜ ์ž‘์„ฑํ•  ๋•Œ ๋ฐฐ์น˜ ์ˆœ์„œ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์–˜๊ธฐํ•˜์ž๋ฉด ์ผ๋‹จ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ‹€์€ ์•„๋ž˜ ๊ทœ์น™์„ ์ง€์ผœ์ฃผ์„ธ์š” ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฐ์น˜ ๊ด€๋ก€ (ํด๋ž˜์Šค ๋ ˆ๋ฒจ) 1. Lombok ์–ด๋…ธํ…Œ์ด์…˜: @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor, @Builder ๋“ฑ์€ ํด๋ž˜์Šค ์ „์ฒด์— ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ๊ฐ€์žฅ ๋จผ์ €(๋งจ ์œ„) ์ž‘์„ฑ 2. Spring/Framework ์–ด๋…ธํ…Œ์ด์…˜: @Component, @Service, @Controller, @RestController ๋“ฑ์ด ์žˆ๋‹ค๋ฉด Lombok ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ”๋กœ ์•„๋ž˜์— ๋ฐฐ์น˜ 3. JPA Entity ์–ด๋…ธํ…Œ์ด์…˜: @Entity, @Table ๋“ฑ์€ Lombok, Spring/Framework ๋‹ค์Œ์— ๋ฐฐ์น˜ 4. ๊ณตํ†ต ์„ค์ • ์–ด๋…ธํ…Œ์ด์…˜: ์ฃผ๋กœ @RequestMapping์ฒ˜๋Ÿผ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ณตํ†ต ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‘ก๋‹ˆ๋‹ค. 5. ๋ฌธ์„œํ™”/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์–ด๋…ธํ…Œ์ด์…˜: Swagger/OpenAPI์˜ @Ta... 1. Lombok ์–ด๋…ธํ…Œ์ด์…˜: @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor, @Builder ๋“ฑ์€ ํด๋ž˜์Šค ์ „์ฒด์— ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ๊ฐ€์žฅ ๋จผ์ €(๋งจ ์œ„) ์ž‘์„ฑ 2. Spring/Framework ์–ด๋…ธํ…Œ์ด์…˜: @Component, @Service, @Controller, @RestController ๋“ฑ์ด ์žˆ๋‹ค๋ฉด Lombok ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ”๋กœ ์•„๋ž˜์— ๋ฐฐ์น˜ 3. JPA Entity ์–ด๋…ธํ…Œ์ด์…˜: @Entity, @Table ๋“ฑ์€ Lombok, Spring/Framework ๋‹ค์Œ์— ๋ฐฐ์น˜ 4. ๊ณตํ†ต ์„ค์ • ์–ด๋…ธํ…Œ์ด์…˜: ์ฃผ๋กœ @RequestMapping์ฒ˜๋Ÿผ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ณตํ†ต ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‘ก๋‹ˆ๋‹ค. 5. ๋ฌธ์„œํ™”/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์–ด๋…ธํ…Œ์ด์…˜: Swagger/OpenAPI์˜ @Ta...

About

NBE6-8-2-Team03

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5