Skip to content

๐Ÿฆ๋ฐ•์ง€์› ๐Ÿฑ์‹ ๋ฏผ๊ฒฝ ๐Ÿปโ€โ„๏ธ์ด์˜ˆ์› ๐Ÿผ์ด์ค€๊ทœ ๐Ÿฏ์กฐ์œคํƒœ ๐ŸฆŠํ™ฉ์ˆ˜๋ฏผ

Notifications You must be signed in to change notification settings

emily9949/GROO

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

240 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŒณ Groo

โ€œ๊ฐ์ •์„ ์‹ฌ๊ณ , ๊ฐ์ •์œผ๋กœ ์ž๋ผ๋Š” ๋‚˜๋งŒ์˜ ์ˆฒ.โ€

ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๊ฐ์ • ๊ธฐ๋ก์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ, ๊ฐœ์ธํ™”๋œ ๊ฐ์„ฑ ๋‹ค์ด์–ด๋ฆฌ ์„œ๋น„์Šค ๊ทธ๋ฃจ (Groo)


๐Ÿ“ฎ ๋ชฉ์ฐจ



๐Ÿก ์„œ๋น„์Šค ์‹œ์—ฐ

๋‹ค๋ฅธ ํ™”๋ฉด ๊ตฌ๊ฒฝํ•˜๊ธฐ

๐Ÿ๏ธ ๋žœ๋”ฉ ํŽ˜์ด์ง€

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-05-04 แ„‹แ…ฉแ„’แ…ฎ 1 41 56

๐ŸŒด ๋กœ๊ทธ์ธ ํ™”๋ฉด

image

๐ŸŒฟ ๋ฉ”์ธ ํŽ˜์ด์ง€

image

โ›ณ๏ธ ๊ฐ์ •์ผ๊ธฐ ์ž‘์„ฑํ•˜๊ธฐ

image
๐ŸŒณ ๊ฐ์ •์ผ๊ธฐ ์ž‘์„ฑํ•˜๊ธฐ ๋”๋ณด๊ธฐ ๐ŸŒณ image image image image

โ˜บ๏ธ ์ฆ๊ฑฐ์›€ -> ๋ˆˆ ๋‚ด๋ฆฌ๋Š” ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ณ€๊ฒฝ image

๐ŸŒณ ์š”์•ฝํ•ด์„œ ๋ณด๊ธฐ


๐Ÿ€ ๊ฐ์ •์ผ๊ธฐ ๋‹ค์‹œ๋ณด๊ธฐ

image
๐ŸŒณ ๊ฐ์ •์ผ๊ธฐ ๋‹ค์‹œ๋ณด๊ธฐ ๋”๋ณด๊ธฐ ๐ŸŒณ image

my_items

create_invite_link

accept_invice_page

image




๐Ÿš€ Team X1 ๐Ÿš€

ํ™ฉ์ˆ˜๋ฏผ ์‹ ๋ฏผ๊ฒฝ ์ด์˜ˆ์› ์กฐ์œคํƒœ ์ด์ค€๊ทœ ๋ฐ•์ง€์›



๐ŸŒฑ ๊ธฐํš ์˜๋„

์šฐ๋ฆฌ๋Š” ํ•˜๋ฃจ์—๋„ ์—ฌ๋Ÿฌ ๊ฐ์ •์„ ๊ฒช์ง€๋งŒ, ๊ทธ ๊ฐ์ •๋“ค์ด ์ง€๋‚˜๊ฐ„ ์ž๋ฆฌ์—๋Š” ์ข…์ข… ์•„๋ฌด๊ฒƒ๋„ ๋‚จ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Groo๋Š” ๋ฐ”๋กœ ์ด ์ˆœ๊ฐ„๋“ค์„ ๋†“์น˜์ง€ ์•Š๊ณ , ๊ฐ์ •์„ ๊ธฐ๋กํ•˜๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ ์ž ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ์ผ๊ธฐ์žฅ์„ ๋„˜์–ด, Groo๋Š” ๊ฐ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ผ๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, AI๊ฐ€ ๊ฐ์ •์„ ๋ถ„์„ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ •์›์„ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋Š” ์ž์—ฐ ์š”์†Œ(๊ฝƒ, ๋‚˜๋ฌด, ๋‚ ์”จ ๋“ฑ)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ‘œํ˜„๋œ ๊ฐ์ •์€ โ€˜ํ•˜๋ฃจ์น˜ ๋งˆ์Œโ€™์„ ๋‹ด์€ ์ž‘์€ ์ •์›์ด ๋˜๊ณ , ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ํ•˜๋‚˜์˜ ๊ฐœ์ธ์ ์ธ ๊ฐ์ •์˜ ์ˆฒ์œผ๋กœ ํ™•์žฅ๋˜์–ด ๊ฐ‘๋‹ˆ๋‹ค.

Groo๋Š” ์œ„๋กœ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ์Šค์Šค๋กœ์˜ ๊ฐ์ •๊ณผ ๋งˆ์Œ ์ƒํƒœ๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ํ‘œํ˜„ํ•˜๋Š” ์ผ์ƒ์˜ ๋ฃจํ‹ด์ด ๋˜๊ธฐ๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ •์€ ์ข‹๊ณ  ๋‚˜์จ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์กด์žฌ ์ž์ฒด๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ฏฟ์Œ ์•„๋ž˜ ์Šฌํ””, ๊ธฐ์จ, ๋ถˆ์•ˆ, ์„ค๋ ˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐ์ •์„ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ธฐ๋กํ•˜๊ณ  ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

๋˜ํ•œ ์‚ฌ์šฉ์ž๋Š” ํ˜ผ์ž๋งŒ์˜ ์ •์›์„ ๊ฐ€๊ฟ€ ์ˆ˜๋„ ์žˆ๊ณ , ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์ˆฒ์„ ๋งŒ๋“ค์–ด ์„œ๋กœ์˜ ๊ฐ์ •์„ ๊ณต์œ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ Groo๋Š” โ€œ๊ฐ์ •์˜ ํ‘œํ˜„โ€๊ณผ โ€œ์ •์„œ์  ์—ฐ๊ฒฐโ€, ๋‘ ๊ฐ€์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹จ ํ•œ ์ค„์˜ ์ผ๊ธฐ๋ผ๋„ ๊ดœ์ฐฎ์•„์š”. ๊ทธ๋‚ ์˜ ๊ฐ์ •์ด ํ•˜๋‚˜์˜ ๋‚˜๋ฌด๊ฐ€ ๋˜์–ด, ๋‹น์‹ ์˜ ์ •์›์— ์ž๋ž๋‹ˆ๋‹ค. ๐ŸŒฑ



๐Ÿ“ฆ CI/CD

์•„ํ‚คํ…์ฒ˜

์•„ํ‚คํ…์ฒ˜ ๋ณด๊ธฐ

image

jenkins ํŒŒ์ดํ”„๋ผ์ธ ์ฝ”๋“œ

์ฝ”๋“œ ๋ณด๊ธฐ
pipeline {
  agent any

  tools {
      gradle 'gradle'
      jdk 'openJDK17'
  }

  environment {
      GITHUB_URL = 'https://github.com/x1-company/be14-4th-x1-GROO-BE.git'
  }

  stages {
      stage('Preparation') {
          steps {
              script {
                  if (isUnix()) {
                      sh 'docker --version'
                  } else {
                      bat 'docker --version'
                  }
              }
          }
      }

      stage('Checkout & Inject Secrets') {
          steps {
              git branch: 'feature/roy/CICD', url: "${env.GITHUB_URL}"
              withCredentials([file(credentialsId: 'x1_groo_boot-yml', variable: 'APP_YML_PATH')]) {
                  script {
                      if (isUnix()) {
                          sh "mkdir -p ./src/main/resources"
                          sh "cp $APP_YML_PATH ./src/main/resources/application.yml"
                      } else {
                          bat 'if not exist src\\main\\resources mkdir src\\main\\resources'
                          bat 'copy %APP_YML_PATH% src\\main\\resources\\application.yml'
                      }
                  }
              }
          }
      }

      stage('Source Build') {
          steps {
              script {
                  if (isUnix()) {
                      sh "chmod +x ./gradlew"
                      sh "./gradlew clean build"
                  } else {
                      bat "gradlew.bat clean build"
                  }
              }
          }
      }

      stage('Container Build and Push') {
          steps {
              script {
                  withCredentials([usernamePassword(credentialsId: 'DOCKERHUB_PASSWORD', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
                      if (isUnix()) {
                          sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASS}"
                          sh "docker build -t ${DOCKER_USER}/x1_groo_boot:latest ."
                          sh "docker push ${DOCKER_USER}/x1_groo_boot:latest"
                      } else {
                          bat "docker login -u %DOCKER_USER% -p %DOCKER_PASS%"
                          bat "docker build -t ${DOCKER_USER}/x1_groo_boot:latest ."
                          bat "docker push ${DOCKER_USER}/x1_groo_boot:latest"
                      }
                  }
              }
          }
      }

      stage('Run Container') {
          steps {
              script {
                  def containerName = "x1_groo_boot_container"
                  def imageName = "cxzaqq/x1_groo_boot:latest"

                  if (isUnix()) {
                      sh "docker ps -q --filter 'name=${containerName}' | grep -q . && docker rm -f ${containerName} || echo 'No existing container to remove'"
                      sh "docker run -d --name ${containerName} -p 8080:8080 ${imageName}"
                  } else {
                      bat """
                          FOR /F %%i IN ('docker ps -q --filter "name=${containerName}"') DO docker rm -f %%i
                          docker run -d --name ${containerName} -p 8080:8080 ${imageName}
                          docker ps
                          docker logs ${containerName}
                      """
                  }
              }
          }
      }
  }

  post {
      always {
          script {
              // application.yml ์‚ญ์ œ
              if (isUnix()) {
                  sh 'rm -f ./src/main/resources/application.yml'
                  sh 'docker logout'
              } else {
                  bat 'del /F /Q src\\main\\resources\\application.yml'
                  bat 'docker logout'
              }
          }
      }
      success {
          echo 'Pipeline succeeded!'
      }
      failure {
          echo 'Pipeline failed!'
      }
  }
}

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

๋งํฌ ๋ณด๊ธฐ

https://www.youtube.com/watch?v=IFBZyXVenWU



๐Ÿ“š ๋ฌธ์„œ

ERD

ERD Cloud KakaoTalk_Photo_2025-05-03-15-44-48
ERD ์ƒ์„ธ๋ณด๊ธฐ
erDiagram
    user {
        INT id PK
        VARCHAR email
        VARCHAR oauth_provider
        VARCHAR oauth_id
        VARCHAR password
        DATETIME created_at
        VARCHAR role
        DATETIME birth
        VARCHAR nickname
        BOOLEAN is_deleted
    }

    background {
        INT id PK
        VARCHAR name
        VARCHAR image_url
    }

    category {
        INT id PK
        VARCHAR category
    }

    item {
        INT id PK
        VARCHAR name
        VARCHAR image_url
        INT category_id FK
        VARCHAR emotion
    }

    forest {
        INT id PK
        VARCHAR name
        VARCHAR month
        BOOLEAN is_public
        INT background_id FK
        INT user_id FK
    }

    user_item {
        INT id PK
        INT item_id FK
        INT user_id FK
        INT total_count
        INT placed_count
        INT forest_id FK
    }

    shared_forest {
        INT id PK
        INT user_id FK
        INT forest_id FK
    }

    mailbox {
        INT id PK
        VARCHAR content
        DATETIME created_at
        BOOLEAN is_deleted
        INT user_id FK
        INT forest_id FK
    }

    announcement {
        INT id PK
        INT admin_id FK
        VARCHAR title
        TEXT content
        DATETIME created_at
    }

    diary {
        INT id PK
        DATETIME created_at
        DATETIME updated_at
        TEXT content
        BOOLEAN is_published
        INT user_id FK
        INT forest_id FK
        VARCHAR weather
    }

    diary_emotion {
        INT id PK
        INT weight
        INT diary_id FK
        VARCHAR emotion
    }

    placement {
        INT id PK
        DECIMAL position_x
        DECIMAL position_y
        INT user_id FK
        INT user_item_id FK
    }

    item }o--|| category : belongs_to
    forest }o--|| background : uses
    forest }o--|| user : owned_by
    user_item }o--|| user : owned_by
    user_item }o--|| item : contains
    user_item }o--|| forest : placed_in
    shared_forest }o--|| user : viewer
    shared_forest }o--|| forest : shared_from
    mailbox }o--|| user : written_by
    mailbox }o--|| forest : posted_in
    announcement }o--|| user : created_by
    diary }o--|| user : written_by
    diary }o--|| forest : related_to
    diary_emotion }o--|| diary : analyzed_from
    placement }o--|| user : placed_by
    placement }o--|| user_item : uses
Loading

์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ

์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ ๋ณด๊ธฐ แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-05-04 00 06 32

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ณด๊ธฐ แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-05-04 00 08 24

๊ฐ์ •/๋‚ ์”จ ๊ด€๋ จ ERD ๊ตฌ์กฐ ๋ฆฌํŒฉํ† ๋ง

๊ฐ์ •/๋‚ ์”จ ํ…Œ์ด๋ธ” ์ œ๊ฑฐ ๋ฐ ๊ตฌ์กฐ ๋‹จ์ˆœํ™” ์ด์œ 

์™ผ์ชฝ: ๊ตฌ์กฐ ์ดˆ๊ธฐ ์„ค๊ณ„ | ์˜ค๋ฅธ์ชฝ: ๋ฆฌํŒฉํ† ๋ง ์ดํ›„ ๊ตฌ์กฐ

Groo ์„œ๋น„์Šค ์ดˆ์•ˆ์—์„œ๋Š” ๊ฐ์ •(emotion)๊ณผ ๋‚ ์”จ(weather) ์ •๋ณด๋ฅผ ๊ฐ๊ฐ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•˜๋‹ค ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋ฌถ์–ด, ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ์ €์žฅํ•œ ๋’ค ํ•ด๋‹น ๊ฐ์ •์— ๋”ฐ๋ฅธ ๋‚ ์”จ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„์˜€์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ์„œ๋น„์Šค ํ๋ฆ„๊ณผ ์šด์˜ ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:

  • ๊ฐ์ •๊ณผ ๋‚ ์”จ์˜ ์ข…๋ฅ˜๋Š” ์‚ฌ์ „์— ์ •์˜๋œ ๊ณ ์ •๊ฐ’
  • ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ๊ฐ์ • ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ ์”จ์™€ 1:1 ๋งคํ•‘
  • ๋ถ„์„ ๊ฒฐ๊ณผ๋Š” ์ผ๊ธฐ ๋“ฑ๋ก ์‹œ์ ์— ํ•œ ๋ฒˆ๋งŒ ๋ฐ˜์˜๋˜๊ณ , ์ˆ˜์ • ์‹œ์—๋Š” ์žฌ๋ถ„์„๋˜์ง€ ์•Š์Œ

๋˜ํ•œ ๊ฐ์ • ์ถ”์ถœ์— ์‚ฌ์šฉ๋˜๋Š” AI ๋ชจ๋ธ์€ ๋ฌธ์žฅ์˜ ๊ธธ์ด๋‚˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜์— ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๊ณ ,์ด๋กœ ์ธํ•ด ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€๋Šฅํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ํŒ๋‹จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ๊ณ ๋ คํ•ด, ๊ฐ์ •๊ณผ ๋‚ ์”จ ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐฑ์—”๋“œ ๋กœ์ง ๋‚ด ์ƒ์ˆ˜ ๊ธฐ๋ฐ˜ Map<String, String> ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ถ„์„๋œ ๊ฐ์ • ๊ฒฐ๊ณผ๋งŒ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ํ˜„์‹ค์ ์ธ ์„œ๋น„์Šค ์šด์˜ ๋ชฉ์ ์— ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด์— ๋”ฐ๋ผ ๊ด€๋ จ ํ…Œ์ด๋ธ”์€ ERD์—์„œ ์ œ๊ฑฐํ–ˆ๊ณ , ๊ฐ์ •-๋‚ ์”จ ๋งคํ•‘์€ ์ฝ”๋“œ ์ƒ์—์„œ ์ง์ ‘ ์ •์˜๋œ Map ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๋ถ„์„ ๊ฒฐ๊ณผ๋Š” DTO ๊ฐ์ฒด ๋‚ด์— ๊ฐ„๋‹จํžˆ ๋‹ด์•„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ์ „์ฒด ๊ตฌ์กฐ๋Š” ๊ฐ„๊ฒฐํ•ด์กŒ๊ณ , ์ฒ˜๋ฆฌ ์†๋„ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ์„ฑ๋„ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.



๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

FRONTEND

HTML5 CSS3 JavaScript Vue.js

BACKEND

Java Spring Boot Spring JPA Hibernate MyBatis Spring Security JWT

DB

MariaDB MyBatis Redis

DESIGN

Figma

TOOL

Git GitHub VS Code IntelliJ IDEA Notion



๐Ÿ“ ๊ฐœ์ธ ํšŒ๊ณ 

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

โ€˜์ผ๊ธฐ๋ฅผ ์“ฐ๊ณ , ๊ทธ ๊ฐ์ •์— ๋”ฐ๋ผ ์ˆฒ์„ ๊พธ๋ฏผ๋‹คโ€™๋Š” ์ฝ˜์…‰ํŠธ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด UI ์„ค๊ณ„์— ๋งŽ์€ ๊ณ ๋ฏผ์„ ์Ÿ์•˜์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋ฅผ ์ฃผ๋กœ ๊ณต๋ถ€ํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„์€ ๋‹ค์†Œ ๋‚ฏ์„ค์—ˆ์ง€๋งŒ, ํŒ€์›๋“ค๊ณผ ์ˆ˜์ฐจ๋ก€ ํšŒ์˜๋ฅผ ๊ฑฐ์ณ ์˜๊ฒฌ์„ ์กฐ์œจํ•œ ๋์— ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ฌผ์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ํฌ๊ฒŒ ๋А๋‚€ ์ ์€ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์˜ ์ค‘์š”์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ๋ถ„ํžˆ ์ •๋ฆฌํ•˜์ง€ ์•Š์€ ์ฑ„ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ, ์ค‘๊ฐ„์— ๋‹ค์‹œ ์ •์˜ ๋‹จ๊ณ„๋กœ ๋˜๋Œ์•„๊ฐ€์•ผ ํ–ˆ๊ณ , ์ด์— ๋”ฐ๋ผ ์ฝ”๋“œ ์ˆ˜์ •์€ ๋ฌผ๋ก  ๋ชจ๋ธ๋ง ์„ค๊ณ„๋„ ์ผ๋ถ€ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ์ • ๊ด€๋ฆฌ๊ฐ€ ๋ฏธํกํ–ˆ๋˜ ํƒ“์— ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ–ˆ๋˜ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ ์ œ์™ธํ•˜๊ฒŒ ๋œ ์ ๋„ ์•„์‰ฌ์›€์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” MyBatis์™€ JPA๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„์™€ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ ๊ณผ์ •์—์„œ๋Š” ๋ฐฑ์—”๋“œ์—์„œ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ์—๋Ÿฌ ์‘๋‹ต ์„ค๊ณ„ ๋•๋ถ„์— ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ ์˜ค๋ฅ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ ์ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

2์ฃผ๋ผ๋Š” ์งง์€ ๊ธฐ๊ฐ„ ์•ˆ์— ๊ธฐํš๋ถ€ํ„ฐ ๊ฐœ๋ฐœ, ๋ฐฐํฌ๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์„ ๋งˆ์น˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์•˜์ง€๋งŒ, ํŒ€์›๋“ค์˜ ํ—Œ์‹ ๊ณผ ํ˜‘๋ ฅ์ด ์žˆ์—ˆ๊ธฐ์— ๋๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐค๋‚ฎ์—†์ด ๋” ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๊ณ , ์„œ๋กœ๋ฅผ ๋ฐฐ๋ คํ•˜๋ฉฐ ๋‹ฌ๋ ค์˜จ ํŒ€์›๋“ค ๋•๋ถ„์— ์ค‘๊ฐ„์— ์ง€์น  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ํž˜์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์™„์„ฑ๋„ ๋†’์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ํ”„๋กœ์ ํŠธ ์‹œ์—ฐ ๋‚  ๋‹ค๋ฅธ ํŒ€์œผ๋กœ๋ถ€ํ„ฐ ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฑด, ์ „์ ์œผ๋กœ ๋ชจ๋“  ํŒ€์›์ด ๊ฐ์ž์˜ ์—ญํ• ์— ์ตœ์„ ์„ ๋‹คํ•ด ๋ชฐ๋‘ํ•ด์ค€ ๋•๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒ€์›๋“ค์—๊ฒŒ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ, ๋ชจ๋‘ ์ˆ˜๊ณ  ๋งŽ์•˜๋‹ค๋Š” ๋ง์„ ๊ผญ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด์˜ˆ์› ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋ถ€์Šคํ˜•์‹์œผ๋กœ ์‹œ์—ฐ์„ ์—ผ๋‘์— ๋‘๊ณ , ์‚ฌ๋žŒ๋“ค์˜ ์ด๋ชฉ์„ ์ง‘์ค‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ์‹œ๊ฐ์ ์œผ๋กœ ํฅ๋ฏธ๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ui์ ์œผ๋กœ ์‹ ๊ฒฝ์„ ๋งŽ์ด ์“ด ๊ฒฐ๊ณผ, ๋ˆˆ๊ธธ์„ ๋„๋Š” ์™„์„ฑ๋„ ๋†’์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ๋ง์— ์‹œ๊ฐ„์„ ๋งŽ์ด ํˆฌ์žํ•ด ๊ฐœ๋ฐœ์— ํ• ์• ํ•  ์‹œ๊ฐ„์ด ์ ์–ด ๊ฑฑ์ •์ด ์žˆ์—ˆ์ง€๋งŒ ํŒ€์›๋“ค์˜ ์—„์ฒญ๋‚œ ์ง‘์ค‘๋ ฅ๊ณผ ์‹คํ–‰๋ ฅ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์†Œํ™”ํ•ด๋‚ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋А๊ผˆ๋˜ ๊ฑด, ํ•ญ์ƒ ๋ชจ๋ธ๋ง๊ณผ UI๋ฅผ ๊ตฌ์ƒํ•˜๋Š” ๊ณผ์ •์ด ๊ฐ€์žฅ ์–ด๋ ต๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ž ์ƒ๊ฐํ•˜๋Š” ํ™”๋ฉด๊ณผ ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์„ ํ•˜๋‚˜์˜ ๋ฐฉํ–ฅ์œผ๋กœ ํ†ตํ•ฉํ•˜๊ณ  ์กฐ์œจํ•ด ๋‚˜๊ฐ€๋Š” ์ผ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ต๊ณ  ์„ฌ์„ธํ•œ ์ž‘์—…์ธ์ง€ ํ•œ๋ฒˆ ๋” ๊นจ๋‹ฌ์•˜๋˜ ์‹œ๊ฐ„์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง์€ ๊ทธ๋Ÿฐ ์ƒํ™ฉ ์†์—์„œ ์ ๊ทน์ ์œผ๋กœ ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ฑฐ๋‚˜, ์กฐ์œจ์„ ์ฃผ๋„ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ถ„๋ช…ํžˆ ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋” ์ ๊ทน์ ์œผ๋กœ ์†Œํ†ตํ•˜๊ณ , ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋๊นŒ์ง€ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๊ณ  ๋ฉ‹์ง„ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ ์šฐ๋ฆฌ ํŒ€ ๋„ˆ๋ฌด ์ž๋ž‘์Šค๋Ÿฝ๊ณ  ๊ฐ์‚ฌํ•˜๋‹ค๋Š” ๋ง์„ ์ „๋‹ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด์ค€๊ทœ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋ฐœํ‘œ ํ˜•์‹์ด ์•„๋‹Œ, ๋ถ€์Šค๋ฅผ ํ†ตํ•ด ์„œ๋กœ์˜ ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณด๋Š” ํ˜•์‹์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์ œ ์„ ์ •๋ถ€ํ„ฐ ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‚ฌ์šฉ์ž์˜ ์ง์ ‘์ ์ธ ์ฐธ์—ฌ๊ฐ€ ์ค‘์š”ํ•œ ํ˜•ํƒœ์˜€๊ธฐ์—, ๊ธฐํš ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ํ”„๋ก ํŠธ์—”๋“œ ์š”์†Œ์— ๋งŽ์€ ์‹ ๊ฒฝ์„ ์ผ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ํฌ๋งํ•˜๋Š” ์šฐ๋ฆฌ ํŒ€์ด ๊ณผ์—ฐ ์ด๋Ÿฐ ๋ฐฉํ–ฅ์ด ๋งž๋Š”๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋„ ํ•จ๊ป˜ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ๋ง์„ ๋งˆ์น˜๊ณ  ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ์ฐฉ์ˆ˜ํ–ˆ์„ ๋•Œ, ์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ต๋‹ค๋Š” ๊ฑธ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํ…Œ์ด๋ธ” ์ˆ˜๋Š” ์ ์—ˆ์ง€๋งŒ, ๊ณ ๋ คํ•ด์•ผ ํ•  ๋กœ์ง์ด ๋งŽ์•„ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ดํ›„์—๋„ ๋ฐ˜๋ณต์ ์ธ ์ˆ˜์ • ์ž‘์—…์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ฃผ๋กœ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๋งก์•„ ๊ฐœ๋ฐœํ–ˆ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ MyBatis์™€ SQL์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•œ์ธต ๊นŠ์–ด์กŒ๋‹ค๋Š” ์ ์—์„œ ์˜๋ฏธ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด์ „๊ณผ ๋‹ฌ๋ฆฌ ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์—ฐ๋™ํ•ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•ด ์ž‘์—…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋Šฅ๋งŒ ์ •์ƒ ๋™์ž‘ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ฒด๊ฐํ–ˆ๊ณ , ์ด ๊ฒฝํ—˜์ด ํฐ ๊นจ๋‹ฌ์Œ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” S3 ์„œ๋ฒ„์™€ Redis ์„œ๋ฒ„๋„ ํ™œ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ „๊นŒ์ง€๋Š” ์ด๋ฆ„์กฐ์ฐจ ๋‚ฏ์„ค์—ˆ๋˜ ๊ธฐ์ˆ ๋“ค์ด์—ˆ์ง€๋งŒ, ์ง์ ‘ ์ ์šฉํ•ด๋ณด๋ฉฐ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ํ•œ์ธต ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋œป๊นŠ์€ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋ฉ”์ธ ํ™”๋ฉด์„ ์œคํƒœ์™€ ํ•จ๊ป˜ ๋‚˜๋ˆ  ๋‹ด๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ์ „๋‹ฌ๋œ weather ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด 7๊ฐœ์˜ ๋‚ ์”จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์„œ๋น„์Šค์—์„œ ์ฐจ์ง€ํ•˜๋Š” ๋น„์ค‘์ด ํฐ ๊ธฐ๋Šฅ์ด๊ธฐ๋„ ํ•˜๊ณ  UI์˜ ์™„์„ฑ๋„์— ๋”ฐ๋ผ ์ „์ฒด ์„œ๋น„์Šค์˜ ์ธ์ƒ์ด ๋‹ฌ๋ผ์ง€๋Š” ๋งŒํผ ๋” ์—ด์‹ฌํžˆ ๋ชฐ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ ์”จ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์—ˆ์„ ๋•Œ ๋А๋‚€ ์„ฑ์ทจ๊ฐ์€ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ์ „์ฒด๋ฅผ ํ†ตํ‹€์–ด ๊ฐ€์žฅ ์ปธ๋˜ ์ˆœ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ธฐ ์ž‘์„ฑ ์‹œ์—๋Š” OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๊ฐ์ • ๋ถ„์„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜๋งŒ ์žˆ๋˜ ์ €์—๊ฒŒ๋Š” ๋งค์šฐ ์‹ ์„ ํ•œ ๋„์ „์ด์—ˆ์Šต๋‹ˆ๋‹ค. Fine-tuning๊นŒ์ง€ ์ง์ ‘ ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด ๋”์šฑ ์ •ํ™•ํ•œ ๋ถ„์„ ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ, ๊ด€๋ จ ์ง€์‹ ๋ถ€์กฑ์œผ๋กœ ํฌ๊ธฐํ•˜๊ฒŒ ๋œ ์ ์€ ์•„์‰ฌ์›€์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด, AI ์ „๋ฌธ๊ฐ€์™€ ํ•จ๊ป˜ ์œตํ•ฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ๋„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ํ•œ ํŒ€์›๋“ค์—๊ฒŒ ๊นŠ์€ ๊ฐ์‚ฌ๋ฅผ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์งง์€ ์‹œ๊ฐ„, ๋†’์€ ๊ฐ•๋„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„œ๋กœ๋ฅผ ๋ฐฐ๋ คํ•˜๋ฉฐ ๋๊นŒ์ง€ ํ•จ๊ป˜ํ•ด์ค€ ํŒ€์›๋“ค์ด ์—†์—ˆ๋‹ค๋ฉด ์ ˆ๋Œ€ 2๋“ฑ์ด๋ผ๋Š” ๊ฐ’์ง„ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. AI๋ฅผ ๋„๋งก์•„์ฃผ๊ณ  ๊ฐ๊ฐ์ ์ธ ๋””์ž์ธ ์ž‘์—…์— ๋”ํ•ด ๋ฐฑ์—”๋“œ ๋ฆฌ๋ทฐ๊นŒ์ง€ ๊ผผ๊ผผํžˆ ์ง„ํ–‰ํ•ด์ค€ ์ˆ˜๋ฏผ์ด, ์ผ๊ธฐ ๊ธฐ๋Šฅ์„ ์™„์„ฑ๋„ ๋†’๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  OpenAI API ์—ฐ๋™์„ ๋„๋งก์•„์ค€ ์ง€์›์ด, ์™„๋ฒฝํ•œ Figma ๋””์ž์ธ๊ณผ ํ•จ๊ป˜ ํŒ€ ๋ถ„์œ„๊ธฐ๋ฅผ ์ด๋Œ๋ฉฐ ๋กœ๊ทธ์ธ๊ณผ ์šฐ์ •์˜ ์ˆฒ์ด๋ผ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋ฌต๋ฌตํžˆ ๋งก์•„์ค€ ๋ฏผ๊ฒฝ์ด, ์ตœ์ ์˜ AI API๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ ์ง์ ‘ ์ ์šฉํ•ด๋ณด๊ณ , git ์ถฉ๋Œ์ด ๋งŽ์„ ์ˆ˜๋ฐ–์— ์—†๋˜ ์ƒํ™ฉ์—์„œ ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ ์ฐจ๋ก€์— ๋ณ‘ํ•ฉ์„ ํ•˜์—ฌ ํž˜๋“ค์—ˆ์„ ํ…๋ฐ ๋ฌต๋ฌตํžˆ ๋ณ‘ํ•ฉ๊ณผ ์žฌ๊ฐœ๋ฐœ์„ ๋ฐ˜๋ณตํ•ด์ค€ ์˜ˆ์›์ด, ๊ธฐํš๋ถ€ํ„ฐ ๊ฐœ๋ฐœ, ๋ฐฐํฌ๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์„ ์ด๊ด„ํ•˜๋ฉฐ ํŒ€์˜ ๋ฒ„ํŒ€๋ชฉ ์—ญํ• ์„ ํ•ด์ฃผ๊ณ  ํŒ€์›๋“ค์˜ ์ˆ˜๋งŽ์€ ์งˆ๋ฌธ์„ ๋ฐ›์•„์ฃผ๋ฉฐ ๋ณธ์ธ ๊ฐœ๋ฐœ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋„๋ฉ”์ธ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์‹ ๊ฒฝ ์จ์ค€ ์œคํƒœ์—๊ฒŒ ์ง„์‹ฌ์œผ๋กœ ๊ณ ๋ง™๋‹ค๋Š” ๋ง์„ ์ „ํ•˜๋ฉฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ ๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค.
์กฐ์œคํƒœ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ํ˜ผ์ž์˜€๋‹ค๋ฉด ๊ฒฐ์ฝ” ํ•ด๋‚ผ ์ˆ˜ ์—†์—ˆ์„ ๋งŒํผ, ํŒ€์˜ ํž˜์ด ์–ผ๋งˆ๋‚˜ ํฐ์ง€๋ฅผ ์˜จ์ „ํžˆ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋˜ ์†Œ์ค‘ํ•œ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.
์ฃผ์ œ ์ž์ฒด๋„ ํฅ๋ฏธ๋กœ์›Œ ์ฆ๊ฒ๊ฒŒ ๋ชฐ์ž…ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํŒ€์›๋“ค ๋ชจ๋‘ ๊ฐ์ž ๋งก์€ ์—ญํ• ์„ ์ž๋ฐœ์ ์œผ๋กœ ์ฐพ์•„์„œ ๋Šฅ๋™์ ์œผ๋กœ ์›€์ง์—ฌ์ค€ ๋•๋ถ„์— ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜ผ์ž ์ฝ”๋”ฉ์„ ๊ณต๋ถ€ํ•˜๋˜ ์‹œ์ ˆ๊ณผ ๋น„๊ตํ•˜๋ฉด, ํ•จ๊ป˜ ํ˜‘์—…ํ•˜๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์˜๊ฒฌ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ณผ์ •์ด ํ›จ์”ฌ ๋” ์ฆ๊ฒ๊ณ  ๋ชฐ์ž…๊ฐ ์žˆ๊ฒŒ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ถ€์กฑํ•œ ์‹œ๊ฐ„ ์†์—์„œ ๋ฐค๋‚ฎ ์—†์ด ์ž‘์—…ํ•˜๋˜ ํ”ผ๊ณคํ•˜๊ณ  ์˜ˆ๋ฏผํ•œ ์ƒํ™ฉ ์†์—์„œ๋„, ์„œ๋กœ๋ฅผ ๋ฐฐ๋ คํ•˜๊ณ  ์›ƒ์Œ์„ ์žƒ์ง€ ์•Š์œผ๋ฉฐ ๋๊นŒ์ง€ ํŒ€์›Œํฌ๋ฅผ ์ง€์ผœ๋‚˜๊ฐ„ ์ ์ด ๋งค์šฐ ์ธ์ƒ ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•œ ๋ฒˆ์€ ๋„ˆ๋ฌด ์ง€์ณ์„œ ๋งˆ์Œ์ด ๊บพ์ผ ๋ป”ํ•œ ์ˆœ๊ฐ„๋„ ์žˆ์—ˆ์ง€๋งŒ, ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค โ€œํ•  ์ˆ˜ ์žˆ๋‹คโ€๊ณ  ๊ฒฉ๋ คํ•ด์ฃผ๊ณ  ๋ฌต๋ฌตํžˆ ์ž๊ธฐ ํ•  ์ผ์„ ํ•ด๋‚˜๊ฐ€๋Š” ํŒ€์›๋“ค์˜ ๋ชจ์Šต์— ํž˜์„ ์–ป์–ด, ์ € ์—ญ์‹œ ๋‹ค์‹œ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฌด์—‡๋ณด๋‹ค ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœํ•œ ๊ณผ์ œ๋ฅผ ๋„˜์–ด์„œ, ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค์— ๊ฐ€๊นŒ์šด ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์™”๋‹ค๋Š” ์ ์—์„œ ํฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ , ์•ž์œผ๋กœ๋„ ๊ธฐ๋Šฅ์„ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๊ณ  ๊ณ ๋„ํ™”ํ•˜์—ฌ ์‹ค์ œ ์„œ๋น„์Šค๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์‚ผ์•˜์Šต๋‹ˆ๋‹ค.
์ •๋ง ๊ฐ’์ง€๊ณ  ๋œป๊นŠ์€ ์‹œ๊ฐ„์ด์—ˆ์œผ๋ฉฐ, ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•จ๊ป˜ํ•ด์ค€ ํŒ€์›๋“ค์—๊ฒŒ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ์˜ ๋งˆ์Œ์„ ์ „ํ•ฉ๋‹ˆ๋‹ค.
์ตœ์ข… ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฌ๊ณ , ํŒ€์›๋“ค ๋ชจ๋‘ ๊ฑด๊ฐ•ํ•˜๊ธธ ๋ฐ”๋ผ๋ฉฐ ๋งˆ์นฉ๋‹ˆ๋‹ค.
ํ™ฉ์ˆ˜๋ฏผ 2์ฃผ๋ผ๋Š” ์งง์€ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ธฐํš๋ถ€ํ„ฐ ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ, ๋ฐฐํฌ๊นŒ์ง€ ์ „ ๊ณผ์ •์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด ์ •๋ง ๋งŽ์€ ์„ฑ์žฅ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋˜ ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ฐ˜์— ๊ธฐํš์— ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ์ง€๋งŒ, ์š”๊ตฌ์‚ฌํ•ญ์€ ๊ณ„์†ํ•ด์„œ ๋ฐ”๋€Œ์—ˆ๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋””์ž์ธ๊ณผ ๋ชจ๋ธ๋ง๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์€ ์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„๊ธฐ๋กœ three.js, babylon.js ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ง์ ‘ ์ ์šฉํ•ด๋ณด๋ฉด์„œ ํ”„๋ก ํŠธ ์ชฝ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋„ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, OpenAI๋ฅผ ํ™œ์šฉํ•œ ๊ฐ์ • ์ผ๊ธฐ ๋ถ„์„ ๋กœ์ง์„ ํŒ€์›๊ณผ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๋ฉด์„œ REST API์™€ ๋ฐฑ์—”๋“œ ํ๋ฆ„์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๋•๋ถ„์— ๊ฐœ๋ฐœ์ž๋กœ์„œ ํ•œ์ธต ๋” ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ๋ถ€์กฑํ•œ ์ ๋„ ๋งŽ์ง€๋งŒ, ์˜ˆ์ „๋ณด๋‹ค ๊ฐœ๋ฐœ ์†๋„๋„ ๋นจ๋ผ์ง€๊ณ  ์ž์‹ ๊ฐ๋„ ๋ถ™์€ ์ œ ๋ชจ์Šต์„ ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ๋„ ๋งŽ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค, ์ด ํ”„๋กœ์ ํŠธ๋Š” ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ํ–ˆ๊ธฐ์— ๊ฐ€๋Šฅํ–ˆ๋˜ ๊ฒฐ๊ณผ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜ผ์ž์˜€๋‹ค๋ฉด ์ ˆ๋Œ€ 2์ฃผ ์•ˆ์— ์ด ์ •๋„ ์„œ๋น„์Šค๋ฅผ ์™„์„ฑํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ˜‘์—…์˜ ์ค‘์š”์„ฑ๊ณผ ํŒ€์›Œํฌ์˜ ํž˜์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์•ž์œผ๋กœ๋„ ํ•จ๊ป˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์†Œ์ค‘ํ•จ์„ ์žŠ์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•ด ๋‚˜๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์กฐ์œคํƒœ

  • ํ”„๋กœ์ ํŠธ์—์„œ ๋งก์€ ๋ถ€๋ถ„

    • ์•„์ดํ…œ ๋ฐฐ์น˜ ๊ด€๋ จ API ๊ฐœ๋ฐœ
    • ๋ฐฉ๋ช…๋ก ๊ด€๋ จ API ๊ฐœ๋ฐœ
    • S3 ์„ค์ •
    • RDS ์„ค์ •
  • ์ž˜ํ•œ ์ 

    • ํž˜๋“  ์ผ์ • ์†์—์„œ๋„ ์„œ๋กœ ์›ƒ์Œ์„ ์žƒ์ง€ ์•Š๊ณ , ๊ฐ์ž์˜ ์—ญํ• ์— ์ฑ…์ž„๊ฐ์„ ๊ฐ€์ง€๊ณ  ๋๊นŒ์ง€ ํ˜‘๋ ฅํ•ด ๋‚˜๊ฐ”๋‹ค๋Š” ์ ์ด ์ธ์ƒ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
      ํŒ€์›Œํฌ์™€ ๊ธ์ •์ ์ธ ๋ถ„์œ„๊ธฐ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋๊นŒ์ง€ ๋Œ๊ณ  ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋˜ ํฐ ์›๋™๋ ฅ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์•„์‰ฌ์šด ์ 

    • ์ž‘์—… ์ค‘ ํŒŒ์ผ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€๋ฅผ ๋‚˜๋ˆด์ง€๋งŒ, ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๊นŒ์ง€ ๋ถ„๋ฆฌ๋˜๋ฉด์„œ ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํŒŒ์ผ ์ˆ˜๊ฐ€ ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค.
      ํ–ฅํ›„์—๋Š” ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ๊ณตํ†ต ํŒŒ์ผ์€ ์ ์ ˆํžˆ ๋ชจ์•„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ž์œผ๋กœ์˜ ๊ฐœ์„  ๋ฐฉํ–ฅ

    • placement ํ…Œ์ด๋ธ”์— scale๊ณผ z_index ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ์•„์ดํ…œ ๋ฐฐ์น˜ ์‹œ ํฌ๊ธฐ ์กฐ์ ˆ ๋ฐ ์•ž๋’ค ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
      ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ดํ…œ์„ ๋”์šฑ ์ž์œ ๋กญ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ๋ฐฐ์น˜์˜ ํ‘œํ˜„๋ ฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ด์ค€๊ทœ

  • ํ”„๋กœ์ ํŠธ์—์„œ ๋งก์€ ๋ถ€๋ถ„

    • (BE) ๋ฉ”์ธ ํ™”๋ฉด์—์„œ ํ•„์š”ํ•œ ์ˆฒid์— ๋”ฐ๋ฅธ ์ƒ์„ธ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • (BE) ์ˆฒ์˜ ๊ณต๊ฐœ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • (FE) ๋กœ๊ทธ์ธ ์ดํ›„ ๋ณด์—ฌ์งˆ ๋ฉ”์ธ ํ™”๋ฉด ๊ตฌํ˜„
    • (FE) ๋‚ ์”จ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„
    • (FE) AI ๊ฐ์ •๋ถ„์„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ๋‚ ์”จ ์ปดํฌ๋„ŒํŠธ ํ˜ธ์ถœ ๋กœ์ง ๊ตฌํ˜„
  • ์ž˜ํ•œ ์ 

    • ๋ฉ”์ธ ํ™”๋ฉด์— ํ•ด๋‹นํ•˜๋Š” ๋ณต์žกํ•œ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์•ผ ํ•˜๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•จ.
    • ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ๋‚ ์”จ ๋ฐ˜์˜ ๊ธฐ๋Šฅ์„ ์˜ค๋ฅ˜ ์—†์ด ์ž˜ ๋งŒ๋“ค์—ˆ์Œ.
    • ๋‚ ์”จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋‚ ์”จ๋“ค๋„ ์žˆ์—ˆ์ง€๋งŒ, ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ง„์„ ์—ฐ์†์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜, ์†๋„ยท๋ฐ๊ธฐยทํˆฌ๋ช…๋„ ๋“ฑ์„ ์กฐ์ ˆํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•ด UI ์ธก๋ฉด์—์„œ ์‚ฌ์šฉ์ž์˜ ํฅ๋ฏธ๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•จ.
  • ์•„์‰ฌ์šด ์ 

    • ์ฃผ๋กœ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜์—ฌ ๋งŒ๋“ค์–ด์„œ JPA ํ™œ์šฉ์„ ๊ฑฐ์˜ ํ•ด๋ณด์ง€ ๋ชป ํ–ˆ๋‹ค.
    • SNS ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•˜์—ฌ ์‹คํŒจํ–ˆ๋‹ค. ์ถ”ํ›„ ๋ฆฌํŒฉํ† ๋ง๊ณผ์ •์—์„œ ์ถ”๊ฐ€ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.
    • Fine-Tuning์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ์—ˆ๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ์ •ํ™•๋„ ๋†’์€ ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด ๋‚ผ ์ˆ˜ ์žˆ์—ˆ์„ ํ…๋ฐ ์ด๋ฅผ ํ•˜์ง€ ๋ชป ํ•ด ๊ฐ์ • ๋ถ„์„์˜ ์ •ํ™•๋„๊ฐ€ ์กฐ๊ธˆ ์•„์‰ฌ์› ๋‹ค.
    • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ํ•œ ํ›„ ์ˆ˜์ •ํ•˜๋Š” ์ผ์ด ๋งŽ์•˜์Œ. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ดํ•ด๋„์™€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์ข€ ๋” ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐ€์•ผํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.
  • ์•ž์œผ๋กœ์˜ ๊ฐœ์„  ๋ฐฉํ–ฅ

    • ๊ฐœ๋ฐœ ํ•˜๊ธฐ์— ์•ž์„œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋†’์ด๊ณ  ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํŒŒ์•…์„ ์ฒ ์ €ํ•˜๊ฒŒ ํ•ด์•ผ๊ฒ ๋‹ค.
    • ํ”„๋ก ํŠธ์—”๋“œ ๊ณต๋ถ€๋ฅผ ์ข€ ๋” ํ•ด์„œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•จ์— ์žˆ์–ด ํŒ€์›๋“ค์—๊ฒŒ ๋„์›€์„ ์ฃผ๊ณ ์‹ถ๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ํ™ฉ์ˆ˜๋ฏผ

  • ํ”„๋กœ์ ํŠธ์—์„œ ๋งก์€ ๋ถ€๋ถ„

    • Figma๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค ์ „๋ฐ˜์˜ย UI/UX ๊ธฐํš ๋ฐ ์„ค๊ณ„
    • OpenAI API๋ฅผ ํ™œ์šฉํ•œย ์ผ๊ธฐ ๊ฐ์ • ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋žœ๋ค ์•„์ดํ…œ ์ถ”์ฒœ ๊ธฐ๋Šฅย ๊ฐœ๋ฐœ
    • ์ผ๊ธฐ ์ˆ˜์ • ๊ธฐ๋Šฅ ๋ฐย ๋‚ ์งœยท๊ธฐ๊ฐ„ ๊ธฐ๋ฐ˜ ๊ฐ์ • ์ผ๊ธฐ ์กฐํšŒ ๊ธฐ๋Šฅย ๊ตฌํ˜„
    • LottieFilesย ๊ธฐ๋ฐ˜์˜ ๊ฐ์ • ๋ถ„์„ ์ง„ํ–‰ ์ค‘ย ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ˜์‘ํ˜• ์‚ฌ์ด๋“œ๋ฐ” ์ปดํฌ๋„ŒํŠธย ๊ฐœ๋ฐœ ๋ฐ Vue.js ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์„ค์ •
    • ๋‚ ์งœ ๊ธฐ๋ฐ˜ ์ผ๊ธฐ ์ž‘์„ฑ ๋ฐ ๊ฐ์ • ๋ถ„์„ ํ™”๋ฉด UI ๊ฐœ๋ฐœ
  • ์ž˜ํ•œ ์ 

    • AI ๊ฐ์ • ๋ถ„์„ API์˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๊ณ ๋ คํ•ดย Lottie ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€, ์‚ฌ์šฉ์ž ์ดํƒˆ์„ ๋ฐฉ์ง€ํ•˜๊ณ  UX ํ–ฅ์ƒ ์œ ๋„
    • Figma ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ๋””์ž์ธ ์ผ๊ด€์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ ํ™•๋ณด
    • ์ผ๊ธฐ ๋“ฑ๋ก โ†’ ๊ฐ์ • ๋ถ„์„ โ†’ ์•„์ดํ…œ ์ถ”์ฒœ ๋ฐ ์ €์žฅ๊นŒ์ง€์˜ ํ๋ฆ„์„ย ๋‹จ์ผ API ํ”Œ๋กœ์šฐ๋กœ ๊ตฌํ˜„, ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฝํ—˜ ์ œ๊ณต
  • ์•„์‰ฌ์šด ์ 

    • ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„ย Figma ์„ค๊ณ„ ์ˆ˜์ •์ด ์žฆ๊ณ  ํŒ€์› ๊ฐ„ UI ํ•ฉ์˜์— ์‹œ๊ฐ„์ด ์†Œ์š”๋จ
    • ๊ธฐํš์— ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์–ด ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•ด ์•„์‰ฌ์›€์ด ๋‚จ์Œ
    • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถ€์กฑํ•ดย ์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ ์•„์‰ฌ์›€
    • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„๋ฅผ ๋†“์ณ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ ์ค‘๋ณต ๋ฐœ์ƒ
  • ์•ž์œผ๋กœ์˜ ๊ฐœ์„  ๋ฐฉํ–ฅ

    • ๋งˆ๊ฐ๊ธฐํ•œ์— ์ด‰๋ฐ•ํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•˜์ง€ ์•Š๊ณ , ์‹œ๊ฐ„์  ์—ฌ์œ ๋ฅผ ๋‘๊ณ  ์—ฌ์œ ๋กญ๊ฒŒ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋˜๊ณ ์‹ถ๋‹ค.
    • ํŒ€์›๋“ค์˜ PR ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๋‹ค ๊ผผ๊ผผํ•˜๊ฒŒ ๊ฒ€ํ† ํ•  ๊ฒƒ
    • ๋ชจ๋ธ๋ง ๋ถ€๋ถ„์—์„œ ์ข€ ๋” ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•˜์—ฌ, ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฐ ํšจ์œจ์„ ๊ณ ๋ คํ•œ ๋ชจ๋ธ๋ง ์„ค๊ณ„๋ฅผ ์ฃผ๋„ํ•ด ๋ณด๊ณ ์‹ถ๋‹ค.

About

๐Ÿฆ๋ฐ•์ง€์› ๐Ÿฑ์‹ ๋ฏผ๊ฒฝ ๐Ÿปโ€โ„๏ธ์ด์˜ˆ์› ๐Ÿผ์ด์ค€๊ทœ ๐Ÿฏ์กฐ์œคํƒœ ๐ŸฆŠํ™ฉ์ˆ˜๋ฏผ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 98.4%
  • Other 1.6%