Skip to content
@3-tier-mini-project

3-tier-mini-docker-project

๐Ÿณ ์นด์นด์˜คํด๋ผ์šฐ๋“œ์Šค์ฟจ์—์„œ ์ง„ํ–‰ํ•œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ 3-tier mini project ๐Ÿณ

3-Tier multi-container ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ

๐Ÿณ ํ”„๋กœ์ ํŠธ ๋ชฉ์ 

๊ฐ„๋‹จํ•œ 3-Tier ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ณ  multi-container๋กœ ๊ตฌ์ถ•ํ•ด๋ณด์ž!

  • ๋ชฉํ‘œ: docker ๋™์ž‘ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ, container ๊ฐ„์˜ ํ†ต์‹  ์ดํ•ดํ•˜๊ธฐ

๐Ÿณ APP ์„ค๋ช…

  • ์ฃผ์ œ: ๋กค๋ง ํŽ˜์ดํผ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ๊ธฐ๋Šฅ: ๋กค๋ง ํŽ˜์ดํผ ์ž‘์„ฑยท์กฐํšŒยท์‚ญ์ œ ๊ฐ€๋Šฅ
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ:
    • ํ”„๋ก ํŠธ์—”๋“œ:
      • node.js 17-slim
      • axios 0.19.0
    • ๋ฐฑ์—”๋“œ:
      • Springboot version 2.7.3
      • Java version openjdk version "11.0.11"
    • DB:
      • MySQL 5.7

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-28 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 42 18



๐Ÿณ 3-Tier multi container ์„ค๊ณ„๋„

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-28 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 49 26

  • network๋ฅผ rollging-fe-be์™€ rolling-be-db๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ frontend์™€ db๊ฐ„์˜ ํ†ต์‹ ์„ ๋ง‰๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์ ‘๊ทผ์€ frontend์—๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ํ†ตํ•ด ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ๋Š” DB ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ํ†ตํ•ด ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿณ docker ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•œ 3-Tier multi-container ๊ตฌ์ถ•

  1. ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ
    1. ํ”„๋ก ํŠธ์—”๋“œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    # git clone
    cd /LABs
    git clone https://github.com/RamSSi/docker-project-front.git
    
    # ์†Œ์ŠคํŒŒ์ผ ํ™•์ธ
    cd docker-project-front/
    ls
    app.js  package.json  package-lock.json  public
    
    # Dockerfile ์ž‘์„ฑ
    vi Dockerfile
    
    # Dockerfile ๋‚ด์šฉ
    FROM node:17-slim
    WORKDIR /home/node
    COPY ./ ./
    RUN npm -y install
    EXPOSE 3000
    CMD ["npm","run","start"]
    
    # Dockerfile์„ ํ†ตํ•œ image build ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
    docker build --tag node-front:1.0 .
    
    # ์ด๋ฏธ์ง€ ํ™•์ธ
    docker images
    REPOSITORY                          TAG             IMAGE ID       CREATED          SIZE
    node-front                          1.0             21b1d57d9e0d   20 minutes ago   252MB
    
    1. ๋ฐฑ์—”๋“œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
     ## MySQL ## 
    
     # MySQL 5.7๋ฒ„์ „ ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ
     docker pull mysql:5.7
    
     ## Springboot ##
     # git clone
     git clone https://github.com/krr3804/RollingPaper.git
     cd RollingPaper/
    
     # Dockerfile ์ž‘์„ฑ
     vi Dockerfile
     FROM openjdk:11-jdk AS builder
     COPY ./rollingpaper/gradlew .
     COPY ./rollingpaper/gradle gradle
     COPY ./rollingpaper/build.gradle .
     COPY ./rollingpaper/settings.gradle .
     COPY ./rollingpaper/src src
    
     RUN chmod +x ./gradlew
     RUN ./gradlew bootJar
    
     FROM openjdk:11-jdk
     COPY --from=builder build/libs/*.jar app.jar
    
     EXPOSE 8080
     ENTRYPOINT ["java", "-jar", "/app.jar"]
    
     # ์ž‘์„ฑํ•œ Dockerfile์„ ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œ
     docker build -t springboot-mysql:1.0 .
    
     # ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
     docker images | grep mysql
     springboot-mysql                1.0             d37a0d6bd0a6   About a minute ago   694MB
     mysql                           5.7             daff57b7d2d1   4 weeks ago          430MB
  2. ๋„คํŠธ์›Œํฌ ์ƒ์„ฑ
# ๋„คํŠธ์›Œํฌ ์ƒ์„ฑ 
docker network create rolling-fe-be
docker network create rolling-be-db
  1. ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
    1. ๋ฐฑ์—”๋“œ & DB ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
    # MySQL ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ธฐ
    docker run -d --rm --name rolling-db \
    -p 13306:3306 \
    --network rolling-be-db \
    -e MYSQL_ROOT_PASSWORD=9999 \
    -e MYSQL_DATABASE=paperdb \
    -e MYSQL_USER=user \
    -e MYSQL_PASSWORD=user \
    mysql:5.7 \
    --character-set-server=utf8 \
    --collation-server=utf8_general_ci
    
    
    # MySQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ
    docker ps
    3cb87d609671   mysql:5.7    "docker-entrypoint.sโ€ฆ"   2 minutes ago   Up 2 minutes   33060/tcp, 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp  rolling-db
    
    
    ## 2. Springboot ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ํ•˜๊ธฐ
    
    # ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰
    docker run -d --rm --name rolling-server \
    -p 8080:8080 \
    --network rolling-be-db \
    springboot-mysql:1.0
    
    
    # fe๊ณผ be bridge์— ์—ฐ๊ฒฐ
    docker network connect rolling-fe-be rolling-server
    
    
    # ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
    docker ps
    CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS                    PORTS                                                    NAMES
    76b78f06be34   springboot-mysql:1.0              "java -jar /app.jar"     4 seconds ago    Up 3 seconds              0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                rolling-server
    f616b0ac8345   mysql:5.7                         "docker-entrypoint.sโ€ฆ"   9 seconds ago    Up 7 seconds              33060/tcp, 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp   rolling-db
    1. ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
    # frontend ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ธฐ
    docker run -d --name rolling-front -p 3000:3000 --network rolling-fe-be node-front:1.0
    
    # ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
    docker ps



๐Ÿณ docker-compose.yaml์„ ํ†ตํ•œ 3-Tier multi-container ๊ตฌ์ถ•

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-28 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 50 13


Q. docker-compose๋ž€?๐Ÿค“

Docker Compose๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋œ ๋„๊ตฌ๋กœ ๋‹จ์ผ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘ ์‹คํ–‰ ๋˜๋Š” ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋œ ๋„๊ตฌ -NHN cloud-

์—ฌ๋Ÿฌ๋ฒˆ์˜ docker ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด docker-compose.yaml ํŒŒ์ผ์„ ํ†ตํ•ด ํ•œ๋ฒˆ์— n๊ฐœ์˜ container๋“ค์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. yaml ํŒŒ์ผ ํ˜•์‹์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— container ์‹คํ–‰ ์˜ต์…˜์„ ๊ฐ€๋…์„ฑ ๋›ฐ์–ด๋‚˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. docker-compose.yaml ์ž‘์„ฑ
version: '3.8'

services:
 mysql:
  image: mysql:5.7-debian
  container_name: rolling-db
  environment:
   MYSQL_ROOT_PASSWORD: pass123
   MYSQL_DATABASE: paperdb
   MYSQL_ROOT_HOST: '%' # to allow root connecting from any address.
   MYSQL_USER: user
   MYSQL_PASSWORD: user
  ports:
   - '13306:3306'
  networks:
   - rolling-be-db
	restart: always
  command:
   - --character-set-server=utf8
   - --collation-server=utf8_general_ci

 springboot:
  image: springboot-mysql:1.0
  container_name: rolling-server
  restart: always
  depends_on:
   - mysql
  ports:
   - '8080:8080'
  environment:
   SPRING_DATASOURCE_URL: jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul
   SPRING_DATASOURCE_USERNAME: user
   SPRING_DATASOURCE_PASSWORD: user

  networks:
   - rolling-be-db
   - rolling-fe-be
 

 front:
  image: node-front:1.0
  container_name: rolling-front
  restart: always
  depends_on:
   - springboot
  ports:
   - '3000:3000'
  networks:
   - rolling-fe-be

networks:
 rolling-be-db: {}
 rolling-fe-be: {}
  1. docker-compose.yaml ํŒŒ์ผ ์‹คํ–‰
docker-compose up



๐Ÿณ ๊ฐ„๋‹จํ•œ nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ตฌํ˜„ํ•˜๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-28 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11 28 12

  1. docker-compose.yaml ํŒŒ์ผ ์ž‘์„ฑ
version: '3.8'

services:
  mysql:
    image: mysql:5.7-debian
    container_name: rolling-db
    environment:
      MYSQL_ROOT_PASSWORD: pass123
      MYSQL_DATABASE: paperdb
      MYSQL_ROOT_HOST: '%'
      MYSQL_USER: user
      MYSQL_PASSWORD: user
    ports:
    - '13306:3306'
    networks:
    - rolling-be-db
    restart: always
    command:
    - --character-set-server=utf8
    - --collation-server=utf8_general_ci

  springboot:
    image: springboot-mysql:1.0
    scale: 3
    depends_on:
    - mysql
    ports:
    - '8081-8083:8080'
    restart: always
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul
      SPRING_DATASOURCE_USERNAME: user
      SPRING_DATASOURCE_PASSWORD: user

    networks:
    - rolling-be-db

  nginx:
    image: nginx:1.21.5-alpine
    container_name: rolling-server
    restart: always
    depends_on:
    - springboot
    ports:
    - '8080:80'
    volumes:
    - ./proxy/nginx.conf:/etc/nginx/nginx.conf

    networks:
    - rolling-be-db
    - rolling-fe-be

  front:
    image: node-front:1.0
    container_name: rolling-front
    depends_on:
    - nginx
    ports:
    - '3000:3000'
    restart: always
    networks:
    - rolling-fe-be

networks:
  rolling-be-db: {}
  rolling-fe-be: {}
  1. nginx.conf ํŒŒ์ผ ์„ค์ •
# proxy ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir proxy

# proxy ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— nginx.conf ํŒŒ์ผ ์ƒ์„ฑ
cd proxy
vi nginx.conf

# nginx.conf ๋‚ด์šฉ
events { worker_connections 1024; }
http{
        upstream rolling-server {   # upstream์˜ ์ด๋ฆ„์„ rolling-server๋กœ ์„ค์ •

			  # ์ง€์ •ํ•˜๊ณ  ์‹ถ์€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค ํƒ€์ž…(=๋ถ€ํ•˜๋ถ„์‚ฐํƒ€์ž…,์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์ ์–ด์ค€๋‹ค. (๊ธฐ๋ณธ: ๋ผ์šด๋“œ ๋กœ๋นˆ)

			  # ํด๋ผ์ด์–ธํŠธ๊ฐ€ Nginx๋กœ ์š”์ฒญ ์‹œ ์šฐํšŒ์‹œ์ผœ ์ค„ ์„œ๋ฒ„ ์ •๋ณด(172.17.0.1์€ docker0์˜ IP)
        server  172.17.0.1:8081;
        server  172.17.0.1:8082;
        server  172.17.0.1:8083;
        }
        server {
                listen *:8080  default_server;   # ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ
        location / {
                proxy_pass http://rolling-server;   # ์„ค์ •ํ•œ upstream์œผ๋กœ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
                }
        }
}
  1. docker-compose.yaml ํŒŒ์ผ ์‹คํ–‰
cd ..
docker-compose up



๐Ÿณ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-28 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11 30 37

  1. ํŒ€์› ๋ชจ๋‘๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์ ์–ด์„œ ํ”„๋ก ํŠธ์—”๋“œ ์„ค๊ณ„์™€ ๊ตฌํ˜„์— ๋งŽ์€ ์‹œ๊ฐ„์ด ํ• ์• ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์–ธ๊ธ‰ํ•  ๋„คํŠธ์›Œํฌ์— ๊ด€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด node.js์—์„œ ejs๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. html, css, javascript๋กœ ๊ตฌ์„ฑํ•œ frontend์—์„œ container ๋ช…์„ ํ†ตํ•ด backend container์™€ ํ†ต์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ frontend์—์„œ ํ†ต์‹ ์˜ ์ฃผ์ฒด๋Š” client side์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ frontend์˜ ๊ตฌ์„ฑ์„ node.js์˜ express ๋ฏธ๋“ค์›จ์–ด๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ์™€ ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํ†ต์‹  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ DB -> SpringBoot -> nginx -> frontend ์ˆœ์œผ๋กœ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์•ž์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์šฐ์„  ์‹คํ–‰๋˜์–ด์•ผ ํ›„์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ ‘์† ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. depends_on ์„ค์ •์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜์˜€์œผ๋‚˜ ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ์˜ application์ด ์™„์ „ํžˆ ์‹คํ–‰๋˜๊ธฐ ๊นŒ์ง€ 10~15์ดˆ ์ •๋„์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— depends on ์„ค์ •์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ ‘์† ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. shell script๋ฅผ ํ†ตํ•ด Backend Container์˜ ์ƒ์„ฑ์— ์ง€์—ฐ์„ ์ฃผ๊ฑฐ๋‚˜, Backend Container์—๊ฒŒ restart=always option์„ ๋ถ€์—ฌํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์—ฌ, ์ €ํฌ๋Š” ํ›„์ž์˜ ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜์—ฌ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ตฌ์ถ•์„ ๋ชฉํ‘œ๋กœ ์žก์•˜์œผ๋‚˜, ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ถ€ํ„ฐ ์–ด๋ ค์›€์„ ๋งŽ์ด ๊ฒช์–ด ์›ํ•˜๋Š” ์„ฑ๋Šฅ์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๊ตฌ์ถ•์€ ํ•˜์ง€ ๋ชปํ•˜์—ฌ ์ด ์ ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.



๐Ÿณ TEAM

์ด๋ฆ„ ์—ญํ• 
๊ฐ•์•„๋žŒ frontend OPS
๊น€์„์ฃผ backend OPS
๊น€์˜ˆ์ง€ loadbalancer OPS
๋ฐ•๊ฒฝ์ˆ˜ frontend OPS
์ง€์œ ๋ฆฌ backend OPS

Pinned Loading

  1. rollingpaper-back rollingpaper-back Public

    Java

  2. rollingpaper-front rollingpaper-front Public

    JavaScript

Repositories

Showing 3 of 3 repositories
  • 3-tier-mini-project/rollingpaper-backโ€™s past year of commit activity
    Java 0 0 0 0 Updated Oct 16, 2022
  • .github Public

    ๐Ÿณ ์นด์นด์˜คํด๋ผ์šฐ๋“œ์Šค์ฟจ์—์„œ ์ง„ํ–‰ํ•œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ 3-tier mini project ๐Ÿณ

    3-tier-mini-project/.githubโ€™s past year of commit activity
    0 0 0 0 Updated Oct 16, 2022
  • 3-tier-mini-project/rollingpaper-frontโ€™s past year of commit activity
    JavaScript 0 0 0 0 Updated Sep 28, 2022

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ