Skip to content

arago07/Botanify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

110 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

img_5.png

Botanify

  • ์‹๋ฌผ ์„ฑ์žฅ ๊ธฐ๋ก & ์ •๋ณด ๊ณต์œ  ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค

๐ŸŒฑ ๋ชฉ์ฐจ

๐Ÿ’โ€โ™€๏ธ ์„œ๋น„์Šค ์†Œ๊ฐœ

๐Ÿ—“๏ธ ๊ฐœ๋ฐœ๊ธฐ๊ฐ„: 2024.12.02 ~ 2025.01.07
๐Ÿชด Botanify

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

๐ŸŽฅ ์‹œ์—ฐ์˜์ƒ

๐Ÿ”ง ๊ธฐ์ˆ  ์Šคํƒ

๐Ÿ’ป Backend

โš™๏ธ DevOps & Infrastructure

๐Ÿ›  Development & Database

๐Ÿ” Testing & Monitoring

๐Ÿ”Œ External Services

๐ŸŽจ Design & Collaboration

โš™๏ธ ํ”„๋กœ์ ํŠธ ์„ค์น˜ ๋ฐ ์‹คํ–‰๋ฒ•

1. ํ•„์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ

ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ์ „์— ์•„๋ž˜ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Java 17 ์ด์ƒ
  • MySQL 8.0
  • Docker
  • Git
  • IDE (IntelliJ, Eclipse ๋“ฑ)

2. ํ”„๋กœ์ ํŠธ ํด๋ก 

$git clone https://github.com/sparta-Sounganization/Botanify.git
$cd Botanify

3. ํŒŒ์ผ ์„ค์ •

src/main/resources/application.yml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ๊ธฐํƒ€ ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.

Details
spring:
  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect
  jackson:
    time-zone: Asia/Seoul

  # mySQL Configuration
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${์‚ฌ์šฉ์ž์˜_mySQL_์—”๋“œํฌ์ธํŠธ}
    username: ${mySQL_์‚ฌ์šฉ์ž_์ด๋ฆ„}
    password: ${mySQL_์‚ฌ์šฉ์ž_์•”ํ˜ธ}

  # JWT Configuration
  jwt:
    secret:
      key: ${base64๋กœ_์•”ํ˜ธํ™”๋œ_JWT_๋น„๋ฐ€_ํ‚ค}
      expiration: 3600000 # 1์‹œ๊ฐ„

  # Google OAuth2 Configuration
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: {Google_Client_ID}
            client-secret: {Google_Client_๋น„๋ฐ€_ํ‚ค}
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope:
              - profile
              - email

  # Redis Configuration
  redis:
    master:
      port: 6379
      host: ${์‚ฌ์šฉ์ž์˜ Redis ํด๋ผ์ด์–ธํŠธ ์—”๋“œํฌ์ธํŠธ}
    verification:
      ttl: 300  # 5๋ถ„
      max-attempts: 5
      attempts-ttl: 3600 # 1์‹œ๊ฐ„

  # Email Configuration
  mail:
    host: smtp.gmail.com
    port: 587
    username: ${์„œ๋น„์Šค_์ด๋ฉ”์ผ_๋ฐœ์‹ _์ด๋ฆ„}
    password: ${์„œ๋น„์Šค_์ด๋ฉ”์ผ_๋ฐœ์‹ _์•”ํ˜ธ}
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

# ============= ^ Spring ^ ============= v External v =============



# Global Logging Configuration
logging:
  level:
    org.springframework.security: INFO
    com.sounganization.botanify: DEBUG
    org.springframework.web: DEBUG
    io.github.resilience4j.circuitbreaker: DEBUG



# S3 Configuration
aws:
  s3:
    bucket: ${S3_๋ฒ„ํ‚ท_์ด๋ฆ„}
    endpoint: ${S3_๋ฒ„ํ‚ท_PUT_์—”๋“œํฌ์ธํŠธ}
    gateway: ${S3_๋ฒ„ํ‚ท_GET_๊ฒŒ์ดํŠธ์›จ์ด}
  access-key: ${S3_์ธ์ฆ_ํ‚ค}
  secret-key: ${S3_๋น„๋ฐ€_ํ‚ค}



# Monitoring Configuration
management:
  endpoints:
    web:
      exposure:
        include: circuitbreakers, health, info, prometheus



# Kakao API Configuration
kakao:
  api:
    key: ${kakao_์ธ์ฆ_ํ‚ค}
    base-url: ${kakao_์—”๋“œํฌ์ธํŠธ}



# weather API Configuration
weather:
  api:
    key: ${weather_์ธ์ฆ_ํ‚ค}
    base-url: ${weather_์—”๋“œํฌ์ธํŠธ}



# CircuitBreaker Configuration
resilience4j:
  circuitbreaker:
    instances:
      weatherService:
        slidingWindowType: COUNT_BASED # ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํƒ€์ž…
        slidingWindowSize: 10 # ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํฌ๊ธฐ
        minimumNumberOfCalls: 5 # ์ตœ์†Œ ํ˜ธ์ถœ ์ˆ˜
        failureRateThreshold: 50 # ์‹คํŒจ์œจ ์ž„๊ณ„๊ฐ’
        waitDurationInOpenState: 10s # ์—ด๋ฆผ ์ƒํƒœ ๋Œ€๊ธฐ ์‹œ๊ฐ„ (10์ดˆ)
        permittedNumberOfCallsInHalfOpenState: 3 # ๋ฐ˜์—ด๋ฆผ ์ƒํƒœ ํ˜ธ์ถœ ์ˆ˜
        slowCallRateThreshold: 100 # ๋А๋ฆฐ ํ˜ธ์ถœ ๋น„์œจ ์ž„๊ณ„๊ฐ’
        slowCallDurationThreshold: 3s # ๋А๋ฆฐ ํ˜ธ์ถœ ์ง€์† ์‹œ๊ฐ„ (3์ดˆ)



# plant API Configuration
nongsaro:
  api:
    base-url: ${nongsaro_์—”๋“œํฌ์ธํŠธ}
    key: ${nongsaro_์ธ์ฆ_ํ‚ค}



# OneSignal Configuration
onesignal:
  app-id: ${onesignal_app_id}
  rest-api-key: ${rest_api_key}

4. Docker

Docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MySQL ๋ฐ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$docker-compose up -d

5. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ

Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

$./gradlew build

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

$./gradlew clean build

5. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ƒ์„ฑ๋œ .jar ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ build > libs์— ๋งŒ๋“ค์–ด์ง„ jar ํŒŒ์ผ ์‹คํ–‰

$java -jar Botanify-0.0.1-SNAPSHOT.jar

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ

img_6.png

ERD

img_7.jpeg

API

์œ„ ๋งํฌ์—์„œ API ์—”๋“œํฌ์ธํŠธ, ์š”์ฒญ/์‘๋‹ต ์˜ˆ์ œ, ๊ทธ๋ฆฌ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์„ ํ™•์ธํ•˜๊ณ  Postman์—์„œ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  1. ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ
์ด๋ฏธ์ง€ 1 ์ด๋ฏธ์ง€ 2 ์ด๋ฏธ์ง€ 2
๋ฉ”์ธ ํšŒ์›๊ฐ€์ž… ๋กœ๊ทธ์ธ
  • ๋ฉ”์ธ: ์ธ๊ธฐ ๊ฒŒ์‹œ๊ธ€์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋กœ๊ทธ์ธ ํ›„์—๋Š” ์ธ๊ธฐ๊ธ€๊ณผ ์ž์‹ ์˜ ์‹๋ฌผ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํšŒ์›๊ฐ€์ž…/ ๋กœ๊ทธ์ธ: ์‚ฌ์šฉ์ž๋Š” ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ , ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์‹๋ฌผ ๊ด€๋ฆฌ
์ด๋ฏธ์ง€ 1 ์ด๋ฏธ์ง€ 2 ์ด๋ฏธ์ง€ 2 ์ด๋ฏธ์ง€ 2
์‹๋ฌผ ๋“ฑ๋ก ๋ฐ ๊ด€๋ฆฌ ์‹๋ฌผ ์„ฑ์žฅ ๊ธฐ๋ก ์‹๋ฌผ ์ •๋ณด ์กฐํšŒ ์‹๋ฌผ ๊ด€๋ฆฌ ์•Œ๋ฆผ
  • ์‹๋ฌผ ๋“ฑ๋ก ๋ฐ ๊ด€๋ฆฌ: ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์‹๋ฌผ์„ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹๋ฌผ ์ •๋ณด ์กฐํšŒ: ๊ณ„์ ˆ๋ณ„ ๊ด€์ˆ˜ ์ •๋ณด, ์Šต๋„ ๋“ฑ์˜ ์‹๋ฌผ์˜ ๊ด€๋ฆฌ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์‹๋ฌผ ์„ฑ์žฅ ๊ธฐ๋ก: ์‹๋ฌผ์˜ ์„ฑ์žฅ ์ผ์ง€ ๋ฐ ์‚ฌ์ง„์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹๋ฌผ ๊ด€๋ฆฌ ์•Œ๋ฆผ: ๋ฌผ ์ฃผ๊ธฐ ์•Œ๋ฆผ, ๋น„๋ฃŒ ์•Œ๋ฆผ ๋“ฑ ์•Œ๋ฆผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
์ด๋ฏธ์ง€ 1 ์ด๋ฏธ์ง€ 2
์ฑ„ํŒ… ๊ฒŒ์‹œํŒ
  • ์ฑ„ํŒ… ๊ธฐ๋Šฅ: ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ 1:1 ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ: ์‚ฌ์šฉ์ž ๊ฐ„ ์ •๋ณด ๊ณต์œ  ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ๋™์„ ์œ„ํ•œ ๊ฒŒ์‹œํŒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘จโ€๐Ÿ’ป Developer

์ด๋ฆ„ ์—ญํ•  ๋‹ด๋‹น ์—…๋ฌด GitHub Blog link
์žฅ์žฌํ˜ ํŒ€์žฅ ๐Ÿ“ Diary Service
- ์„ฑ์žฅ ์ผ์ง€ CRUD ๊ธฐ๋Šฅ ๊ตฌํ˜„
๐Ÿ“ท Image
- S3 ํ™œ์šฉ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
๐ŸŒฑ ์‹๋ฌผ๊ด€๋ฆฌ
- ์‹๋ฌผ OPEN API ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ์‹๋ฌผ OPEN API ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์ฒ˜๋ฆฌ
๐Ÿ“ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ดˆ์•ˆ ์ž‘์„ฑ
GitHub Link Blog link
๊น€๋™์ฃผ ๋ถ€ํŒ€์žฅ ๐Ÿง‘โ€๐Ÿ’ป ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ
- ์ด๋ฉ”์ผ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- Google ์†Œ์…œ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- Security ์ธ์ฆ/์ธ๊ฐ€
๐ŸŒฆ๏ธ ๋‚ ์”จ ์„œ๋น„์Šค
- ์ง€๋„ API, ๋‚ ์”จ API ์—ฐ๋™ ๋ฐ ๋‚ ์”จ ์ •๋ณด ์ œ๊ณต ๊ธฐ๋Šฅ ๊ตฌํ˜„
๐Ÿณ Docker Compose
- Docker Compose ํ™˜๊ฒฝ ์„ค์ •
๐Ÿ”„ CI/CD
- Jenkins๋ฅผ ํ™œ์šฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
GitHub Link Blog link
๊ณ ์•„๋ผ ํŒ€์› ๐ŸŒฑ ํ’ˆ์ข… ์„œ๋น„์Šค
- ํ’ˆ์ข… CRUD ๊ธฐ๋Šฅ ๊ตฌํ˜„
๐Ÿ“ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ์ปค๋ฒ„๋ฆฌ์ง€ ์ฒดํฌ
๐ŸŒฆ๏ธ ๋‚ ์”จ ์„œ๋น„์Šค
- ์œ„๋„/๊ฒฝ๋„ ์ขŒํ‘œ ์ˆ˜์ง‘
GitHub Link Blog link
๋ฆฌ์นธ์†Œ์„ฑ (LIKANE SO SOUNG) ํŒ€์› โœ‰๏ธ User Email Authentication
- ํšŒ์›๊ฐ€์ž… ์‹œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ ์ธ์ฆ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
๐Ÿ‘ฅ Community Service
- ์ธ๊ธฐ ๊ฒŒ์‹œ๊ธ€ ์บ์‹ฑ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
- ๋Œ“๊ธ€๊ณผ ๋‹ต๊ธ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- 1:1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์‹œ์Šคํ…œ ๊ตฌ์ถ•
๐ŸŒฑ ์‹๋ฌผ ๊ด€๋ฆฌ
- ์‹๋ฌผ push ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
GitHub Link Blog link
์ง€๋ฏผ์ง€ ํŒ€์› ๐Ÿ‘ฅ Community Service
- ๊ฒŒ์‹œํŒ CRUD ๊ธฐ๋Šฅ ๊ตฌํ˜„
- ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ์ˆ˜ ์–ด๋ทฐ์ง• ๋ฐฉ์ง€ ๋กœ์ง ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
๐ŸŒฑ ์‹๋ฌผ๊ด€๋ฆฌ
- ์‹๋ฌผ Open API ์—ฐ๋™ ๋ฐ ์‹๋ฌผ ์ •๋ณด ๊ฒ€์ƒ‰ ๋ฐ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„
๐Ÿ”„ CI/CD
- Jenkins๋ฅผ ํ™œ์šฉํ•œ CI ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
GitHub Link Blog link

About

final project in the bootcamp(sparta)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors