Giter Site home page Giter Site logo

mangurl's Introduction

mangurl

TL;DR

  • URL 단축 서비스입니다.
  • 여기에서 사용할 수 있습니다.
  • 다른 기술 스택으로 변경중입니다. 현재 셔비스를 사용할 수 없습니다.

프로젝트 구조

  .
  ├── src
  │   ├── main
  │   │   ├── java/.../mangurl
  │   │   │   ├── application
  │   │   │   ├── inboundadapter
  │   │   │   ├── outboundadapter
  │   │   │   ├── config
  │   │   │   ├── lib
  │   │   │   └── MangurlApplication.java
  │   │   └── resources
  │   │       ├── mangurl
  │   │       ├── templates/app.html
  │   │       └── application.yml
  │   └── test/java/.../mangurl
  ├── docker
  ├── .github/workflows
  └── build.gradle
  • src/main/java/.../mangurl/application: 도메인 모듈을 담당합니다. 도메인 모듈은 외부와 주고받는 메시지를 모두 인터페이스로 선언해야 합니다.
      application
      └── url  # 단축 URL을 만들고 원본 URL을 찾는 역할을 담당하는 모듈입니다.
          ├── inboundport   # 외부에서 도메인 모듈과 협력하기 위한 메시지 인터페이스를 담당하는 모듈입니다.
          ├── service       # inbound port로 선언한 인터페이스 구현을 담당하는 모듈입니다.
          └── outboundport  # 도메인 모듈에서 외부 객체와 협력하기 위한 메시지 인터페이스를 담당하는 모듈입니다.
    
  • src/main/java/.../mangurl/inboundadapter: 외부 입력을 받아 도메인 서비스를 호출하는 컨트롤러를 담당하는 모듈입니다.
      inboundadapter
      ├── api       # REST API 컨트롤러를 담당하는 모듈입니다.
      ├── app       # 웹 클라이언트용 컨트롤러를 담당하는 모듈입니다.
      └── shorturl  # 단축 URL을 리다이렉트하는 컨트롤러를 담당하는 모듈입니다.
    
  • src/main/java/.../mangurl/outboundadapter: outboundport 구현체를 담당하는 모듈입니다.
  • src/main/java/.../mangurl/config: 설정 객체를 담당하는 모듈입니다.
  • src/main/java/.../mangurl/lib: 외부 라이브러리 객체를 담당하는 모듈입니다.
  • src/main/java/.../mangurl/MangurlApplication.java: 메인 메소드를 선언한 메인 클래스입니다.
  • src/main/resources/mangurl: 개별 설정 파일을 보관합니다. 설정 파일은 YAML 형식으로 작성합니다.
  • src/main/resources/templates/app.html: 웹 클라이언트 페이지입니다.
  • src/main/resources/application.yml: 프로젝트 루트 설정 파일입니다. Profile을 선언하고 개별 설정 파일을 연결합니다.
  • src/test/java/.../mangurl: 단위 테스트를 담당하는 모듈입니다.
  • docker: 도커 컴포즈 설정 파일을 보관합니다. 필요한 환경을 디렉터리로 만들고 디렉터리 안에 compose.yaml 파일을 만듭니다.
      docker
      ├── local
      │   └── compose.yaml
      └── local-container
          └── compose.yaml
    
  • .github/workflows: GitHub Action에서 실행할 Workflow를 선언한 파일을 보관합니다.
      .github/workflows
      ├── deploy.yml    # 도커 이미지를 빌드하고 AWS ECR에 푸시합니다.
      └── pr-check.yml  # GitHub PR이 열리면 단위 테스트를 실행합니다.
    
  • build.gradle: Gradle 빌드 설정 파일입니다. 디펜던시 목록을 추가하거나 Task 설정을 편집할 수 있습니다.

시스템 구성

시스템 구성도

개발 규칙

  • main 브랜치는 항상 실행할 수 있는 상태를 유지합니다.
  • 코드 변경은 항상 브랜치를 생성하여 작업한 후 GitHub PR을 통해 main 브랜치에 병합합니다.

개발 환경 구축 및 실행

  • JDK 17 이 필요합니다. 이곳에서 다운받아 설치하거나 편한 방법으로 설치해 주세요.
  • DynamoDB에 연결하거나 도커 이미지를 빌드하기 위해 도커가 필요합니다. 가이드에서 자기 환경에 맞는 방법에 따라 설치해 주세요.

Gradle Wrapper를 사용하기 때문에 Gradle 을 직접 설치할 필요가 없습니다. 프로젝트 루트 경로에서 아래 명령어를 사용할 수 있습니다.

  • 실행
    ./gradlew bootRun
  • 테스트
    ./gradlew test
  • 빌드
    ./gradlew bootJar
    이후 아래 명령어로 실행할 수 있습니다.
    java -jar ./build/libs/mangurl-<version>.jar
  • 도커 이미지 빌드
    ./gradlew bootBuildImage

Spring Profile 설정

  • src/main/resources/application.ymlspring.profiles.active 항목을 원하는 profile로 변경합니다.
  • 실행할 때 SPRING_PROFILES_ACTIVE 환경변수에 원하는 profile을 설정합니다.
    SPRING_PROFILES_ACTIVE=dev ./gradlew bootRun

지원하는 Profile

  • local: 로컬에서 개발할 때 사용합니다. http://localhost:8000 에 로컬 DynamoDB가 실행 중이어야 합니다. docker/local/compose.yaml 로 실행할 수 있습니다.
  • local-container: 빌드한 도커 이미지를 로컬에서 실행할 때 사용합니다. docker/local-container/compose.yaml 로 실행할 수 있습니다.
  • test: 테스트할 때 사용합니다.
  • dev: 개발용 DynamoDB에 연결할 때 사용합니다. AWS IAM Credentials 가 필요합니다. 담당자에게 문의하세요.
  • prod: 프로덕션 환경에서 사용합니다. 해당 Profile 파일은 접근이 제한된 S3에 보관합니다.

로컬 DynamoDB

  • DynamoDB는 도커를 사용해 로컬에서 실행할 수 있습니다.
  • 실행
    cd docker/<profile>
    docker compose up
  • 종료
    cd docker/<profile>
    docker compose down

테스트 전략

  • 단위 테스트와 통합 테스트(예정)를 진행합니다.
  • PR을 생성하면 자동으로 GitHub Action 에서 단위 테스트를 실행합니다. 테스트 결과는 PR에 자동으로 기록됩니다. 테스트를 통과해야 머지할 수 있습니다.

단위 테스트

  • 실행
    ./gradlew test
  • 객체의 가장 작은 책임 단위로 작성합니다.
  • Spring에 의존하지 않게 작성합니다.

통합 테스트 (예정)

  • 커스텀 Gradle Task를 생성할 예정입니다.
  • 통합 테스트 Task는 verify에 포함될 예정입니다.
  • 릴리즈 과정에서 실행할 예정입니다.

배포

DEPLOY GitHub Action으로 배포할 수 있습니다. Action 실행 권한이 필요한 경우 담당자에게 문의하세요.

AWS ECR에 푸시할 수 있는 AWS IAM Credentials가 있다면 로컬에서 도커 이미지를 빌드해서 직접 푸시할 수 있습니다. 도커와 AWS CLI 가 필요합니다.

  • src/main/resources/mangurl/ 아래의 모든 설정 파일을 삭제해주세요. 공통 설정인 application.yml을 제외하고 도커 이미지에 직접 설정 파일이 포함되지 않게 주의해주세요.
  • AWS CLI를 사용해 AWS ECR에 대해 도커 클라이언트를 인증합니다.
    aws ecr get-login-password --region <region> --profile <profile> | docker login --username AWS --password-stdin <ecr 주소>
  • 도커 이미지를 빌드합니다. AWS ECR에 맞는 태그를 추가로 설정합니다.
    ./gradlew bootBuildImage -Ptag=<ecr 주소/ecr 리포지토리 이름:프로젝트 버전>
    현재 프로젝트 버전은 아래 명령어로 출력할 수 있습니다.
    ./gradlew -q printVersion
  • 빌드한 도커 이미지를 AWS ECR에 푸시합니다.
    docker push <빌드한 도커 이미지 이름:버전>

API 엔드포인트 목록 및 사용

Swagger 문서로 API 사용법을 제공하고 있습니다.

단축 URL 사용

  • 브라우저 주소창에 생성한 단축 URL 주소를 입력해주세요. 또는 가장 편한 방법으로 단축 URL로 HTTP 요청을 보내주세요.
  • 단축 URL에 대한 응답 코드는 302 Found 입니다. 원본 URL은 Location 헤더에서 확인할 수 있습니다.
  • 등록되지 않은 단축 URL에 대해서는 404 Not Found 코드를 응답합니다.

mangurl's People

Contributors

daengdaenglee avatar

Watchers

 avatar

mangurl's Issues

설정 파일 분리

개요

  • origin-local.yml
  • repository-inmemory.yml
  • repository-dynamodb-local.yml
  • repository-dynamodb-dev.yml
  • aws-local.yml
  • aws-local-container.yml
  • aws-dev.yml

도커 이미지 빌드 및 푸시

개요

  • AWS 세팅
    • ECR 에 이미지 올릴 수 있는 IAM 사용자 추가
      • 이름 : Mangurl-Deployer
      • 권한:
        • Mangurl-ECR-PushImage
        • ECS task 관련?
  • GitHub 세팅
    • GitHub Action 에서 도커 이미지 빌드하고 ECR 에 업로드하는 workflow 작성
    • IAM 사용자의 엑세스 키 발급받아서 GitHub Secrets 에 등록, workflow 에서 사용하도록 설정

prod 환경 추가

개요

  • prod 프로필 그룹 추가
  • mangurl-prod 프로필 추가, 활성화
  • mangurl/prod.yml 설정 연결
  • 실제 설정 파일은 ECS 에서 연결할 예정

S3 클라이언트 생성 코드를 lib 패키지 아래로 이동

개요

  • 스프링 빈 형태로 관리
  • 실제 사용할 땐 직접 호출하고 조립하는 형태
  • AwsCredentials 도 RepositoryType 처럼 config 패키지 아래로 분리 -> S3 클라이언트 생성 팩토리 함수의 인자
    aws 패키지에서 제공하는 AwsCredentials 인터페이스 사용

웹 클라이언트 화면 만들기

개요

  • HTTP Form 방식으로 일단 구현

개발 노트

  • 첫 화면 + Form 제출 후 결과 화면 2개 제작
  • POST Form 제출 -> redirect -> GET 방식으로 제작

입력, 출력할 때 URL 에 대해 encode 처리

개요

  • 저장할 때 URL#toURI 가능한지 검사 -> 실패하면 오류 메세지 보여주기
  • redirect 할 때 URL#toURI#toASCIIString 로 encode 해서 처리
  • 웹 화면에 보여줄 때는 원본으로, 링크에는 encode 한 값으로 처리

dev 환경 추가

개요

  • 서버는 로컬에서 실행
  • DynamoDB 는 AWS 에 세팅한 MangurlDev-UrlEntry 사용

URL 단축 서비스 개발

개요

  • 원본 URL 을 입력으로 받으면 매핑된 단축 URL 코드를 반환한다.
  • 필요한 경우 새로 저장하고, 데이터가 있는 경우 재사용한다.

URL 단축 기능 개발

개요

  • 도메인 기능만 우선 개발합니다.
  • 웹 요청을 처리하고, 데이터를 저장하는 부분은 지금 단계에서는 개발하지 않습니다.

개발 항목

  • URL 해시 함수 개발
  • 해시값을 Base62 로 인코딩하는 함수 개발
  • Base62 로 인코딩한 값에서 앞에서 7자리 뽑아내는 단축 함수 개발, 앞의 두 기능 이용
  • 단위 테스트 작성

Separate FE Project

Overview

  • Separate frontend application (/mangurl-ui) using Next.js (Only CSR)

In-Memory URL 데이터 저장소 만들기

개요

  • DB 서비스 도입 전, In-Memory 에서 동작하는 데이터 저장소 만들기

내용

  • 단축 URL 코드와 원본 URL 쌍을 저장
  • 단축 URL 코드로 원본 URL 을 찾을 수 있어야 함
  • 원본 URL 로 단축 URL 코드를 찾을 수 있어야 함

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.