Skip to content

Commit

Permalink
오픈소스 프로젝트 전환 완료 (#446)
Browse files Browse the repository at this point in the history
  • Loading branch information
limehee authored Aug 5, 2024
1 parent 4d71404 commit ed08ac3
Show file tree
Hide file tree
Showing 22 changed files with 982 additions and 269 deletions.
59 changes: 33 additions & 26 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,40 @@
# Contribution Guidelines
# 기여 지침
KGU C-Lab 서버 프로젝트에 관심을 가져주셔서 감사합니다. 커뮤니티의 모든 구성원들이 효과적으로 기여할 수 있도록 다음의 절차와 규칙을 준수하여 주시기 바랍니다.

KGU C-Lab 서버 프로젝트에 관심을 가져주셔서 감사합니다! 커뮤니티의 모든 구성원들이 기여할 수 있도록 다음의 절차와 규칙을 준수하여 기여해 주시기 바랍니다.
- [한국어](CONTRIBUTING.md)
- [English](CONTRIBUTING_EN.md)

## Getting Started
## 시작하기
1. 프로젝트 저장소를 개인 계정으로 포크합니다.
2. 포크한 저장소를 로컬 시스템으로 클론합니다: `git clone https://github.com/[your-username]/clab-server.git`.
3. 새로운 작업 브랜치를 생성합니다: `git checkout -b [new branch name]`.

1. 프로젝트를 포크하여 개인 계정으로 복사합니다.
2. `git clone [포크한 저장소 URL]`을 통해 로컬 시스템으로 클론합니다.
3. `git checkout -b [새 브랜치 이름]`으로 새로운 작업 브랜치를 생성합니다.

## Working Rules

- 작업은 최소 기능 단위로 이슈를 생성하여 진행합니다.
## 작업 규칙
- 작업할 최소 기능 단위로 이슈를 생성합니다.
- 목표 이슈, 명세 이슈, 작업 이슈의 순서로 이슈를 구성합니다.
- 이슈 번호를 참조하여 `feature/#이슈번호` 형식의 브랜치를 만듭니다.
- 커밋 메시지는 `feat: [기능 설명] (#이슈번호)` 형식으로 작성합니다.

## Pull Requests

- PR의 타이틀은 간결하고 명확하게 작성합니다.
- PR 본문에는 변경된 내용의 체인지로그를 문장형으로 작성합니다.
- 관련 이슈 번호를 참조하고, 필요한 경우 리뷰어를 태그합니다.

## Code Review

- 메인테이너 또는 프로젝트 관리자가 리뷰를 진행한 후, 수정이 필요하다고 판단될 경우 피드백을 제공합니다.
- 이슈 번호를 참조하여 `feat/#이슈번호` 형식의 브랜치를 만듭니다.
- 다음과 같은 커밋 메시지 형식을 사용합니다:
- **feat**: 새로운 기능 추가.
- 예시: `feat(기능): [기능 설명]`
- **refactor**: 새로운 기능이나 버그 수정 없이 코드 리팩토링.
- 예시: `refactor(모듈): [리팩토링 설명]`
- **fix**: 버그 수정.
- 예시: `fix(이슈): [버그 수정 설명]`
- **hotfix**: 긴급하게 적용해야 하는 즉시 수정.
- 예시: `hotfix(이슈): [긴급 수정 설명]`
- **chore**: 일반적인 작업 및 유지보수.
- 예시: `chore(작업): [작업 설명]`

## 풀 리퀘스트 (Pull Requests)
- 간결하고 명확한 PR 제목을 작성합니다.
- PR 설명에 변경된 내용을 상세히 기술합니다.
- 관련된 이슈 번호를 참조하고, 필요한 경우 리뷰어를 태그합니다.

## 코드 리뷰
- 메인테이너 또는 프로젝트 관리자가 리뷰를 진행합니다. 수정이 필요한 경우 피드백을 제공합니다.
- 피드백에 따른 수정 사항이 있을 경우, 해당 브랜치에 추가 커밋을 통해 수정합니다.

## Merging

- PR이 승인되고 모든 체크가 완료되면, 메인테이너에 의해 `master` 브랜치로 병합됩니다.
## 병합 (Merging)
- PR이 승인되고 모든 체크가 완료되면, 메인테이너에 의해 `develop` 브랜치로 병합됩니다.

프로젝트에 기여해 주셔서 다시 한번 감사드리며, 여러분의 소중한 기여가 이 커뮤니티를 더욱 풍부하게 만들 것입니다.
프로젝트에 기여해 주셔서 감사드리며, 여러분의 기여가 이 커뮤니티의 발전에 큰 도움이 될 것입니다.
40 changes: 40 additions & 0 deletions CONTRIBUTING_EN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Contribution Guidelines
Thank you for your interest in the KGU C-Lab Server Project. Please follow these steps and rules to ensure that all community members can contribute effectively.

- [한국어](CONTRIBUTING.md)
- [English](CONTRIBUTING_EN.md)

## Getting Started
1. Fork the project repository to your personal account.
2. Clone the forked repository to your local system using `git clone https://github.com/[your-username]/clab-server.git`.
3. Create a new working branch with `git checkout -b [new branch name]`.

## Working Rules
- Create issues for each minimum feature unit you plan to work on.
- Follow the order: goal issue, specification issue, and task issue.
- Create a branch using the format `feat/#issueNumber` referencing the issue number.
- We use the following commit message formats:
- **feat**: Introducing new features.
- Example: `feat(feature): [description of the feature]`
- **refactor**: Code refactoring without adding new features or fixing bugs.
- Example: `refactor(module): [description of the refactoring]`
- **fix**: Fixing a bug.
- Example: `fix(issue): [description of the fix]`
- **hotfix**: Immediate fixes that need to be applied urgently.
- Example: `hotfix(issue): [description of the hotfix]`
- **chore**: Routine tasks and maintenance.
- Example: `chore(task): [description of the task]`

## Pull Requests
- Write concise and clear PR titles.
- Include a changelog in the PR description that details the changes made.
- Reference the relevant issue number and tag reviewers if necessary.

## Code Review
- Maintainers or project managers will review the PR. If changes are needed, they will provide feedback.
- If there are any changes required based on the feedback, make the necessary updates with additional commits to the branch.

## Merging
- Once the PR is approved and all checks are complete, it will be merged into the `develop` branch by a maintainer.

Thank you for contributing to the project. Your contributions greatly enhance and strengthen our community.
221 changes: 162 additions & 59 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,169 @@
# C-Lab Page Server

# C-Lab Server
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
[![Spring Boot Gradle CI](https://github.com/KGU-C-Lab/clab-server/actions/workflows/spring-boot-gradle-ci.yml/badge.svg)](https://github.com/KGU-C-Lab/clab-server/actions/workflows/spring-boot-gradle-ci.yml)

경기대학교 개발보안동아리 C-Lab의 공식 백엔드 시스템입니다.

해당 프로젝트는 C-Lab의 활동을 지원하고, 회원들 간의 소통을 원활하게 하기 위해 개발되었습니다.

## Contributors

- [한국어](README.md)
- [English](README_EN.md)

## 프로젝트 개요
C-Lab Server 프로젝트는 경기대학교 개발보안 동아리 C-Lab을 위한 플랫폼으로 시작되었습니다. 그러나 현재는 이를 넘어, 유사한 플랫폼을 만들고자 하는 사람들에게 유용한 참고 자료가 되는 것을 목표로 하고 있습니다. 이러한 이유로, 우리는 모든 코드와 다양한 서버 관련 설정을 공개하고 있으며, 다양한 노력과 실험을 통해 코드 품질을 지속적으로 향상시키고자 합니다.

또한, 우리는 사용자가 신뢰할 수 있는 안전한 플랫폼을 만들기 위해 노력하고 있습니다. 이를 위해 한국인터넷진흥원(KISA)이 제공하는 '[소프트웨어 개발 보안 가이드](https://www.kisa.or.kr/2060204/form?postSeq=5&lang_type=KO&page=1)'를 준수하고자 합니다. 우리는 항상 피드백을 받을 준비가 되어 있으며, 다양한 의견과 제안을 적극적으로 반영하려고 노력합니다.

백엔드 시스템뿐만 아니라 프론트엔드 시스템도 모두 공개되어 있습니다. 관심이 있으신 분들은 [여기](https://github.com/KGU-C-Lab/clab.page)에서 프론트엔드 리포지토리도 확인해보세요.

현재 서비스되고 있는 페이지는 [여기](https://www.clab.page/)에서 확인할 수 있습니다.

## 프로젝트 목적 및 기능
C-Lab Server 프로젝트는 동아리 활동을 지원하고 회원 간의 원활한 소통을 촉진하기 위해 통합 서비스를 제공합니다.

- **회원 관리**: 멤버스 페이지를 통해 동아리 운영에 필요한 핵심 기능을 제공하며, 학습 관리 시스템, 도서 대출, 재정 관리 등을 포함합니다.
- **협업 및 참여**: 개인 및 그룹 일정 관리, 개인 클라우드 저장 공간, 커뮤니티 기능, 채용 공고 및 실적 취합 기능 등을 통해 회원들의 참여와 협력을 증진합니다.
- **효율성과 편의성**: 사용자 편의성과 동아리 운영의 효율성을 높이는 다양한 기능을 하나의 플랫폼에서 제공하여 동아리의 일상적인 관리를 간소화합니다.

## 요구 사항
- [Docker](https://docs.docker.com/engine/install/)[Docker Compose](https://docs.docker.com/compose/install/) 설치
- Linux 기반 OS 권장
- Windows의 경우 [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) 사용

## 시작하기
### 리포지토리 클론
로컬 시스템에 리포지토리를 클론합니다.
```bash
git clone https://github.com/KGU-C-Lab/clab-server.git
cd clab-server
```

### Docker Compose 설정
Docker Compose 파일은 `infra` 디렉토리에 있습니다. 다음 단계에 따라 컨테이너를 설정하고 실행합니다.

### 참고 사항
- 컨테이너 데이터를 유지하려면 필요한 디렉토리를 생성하고 권한을 설정하세요.

```bash
# 데이터를 유지하려는 경우에만 실행
sudo mkdir -p /infra/nginx /infra/jenkins /infra/redis/data /infra/postgresql/data
sudo chown -R $(whoami):$(whoami) /infra
```

- 환경 변수를 설정하세요 (.env 파일을 이용할 수도 있습니다).

```bash
# 환경 변수 설정
export REDIS_PASSWORD=your_redis_password
export POSTGRES_USER=your_postgres_username
export POSTGRES_PASSWORD=your_postgres_password
```

### Docker Compose 실행
Docker Compose를 실행하여 컨테이너를 시작합니다.

```bash
cd infra
docker-compose up -d # 또는 'docker compose up -d'
```

### Spring Boot 애플리케이션 구성
컨테이너를 시작한 후, `src/main/resources/application.yml` 파일을 구성합니다. `${}` 자리 표시자를 실제 값으로 변경합니다.

### 애플리케이션 실행
모든 구성이 완료되면 Spring Boot 애플리케이션을 실행합니다.

```bash
./gradlew bootRun
```

### 추가 정보
- Docker 및 Docker Compose 설치: [Get Docker](https://docs.docker.com/get-docker/)
- WSL2 설치 및 설정: [Install WSL2](https://learn.microsoft.com/en-us/windows/wsl/install)
- Spring Boot 공식 문서: [Spring Boot Docs](https://spring.io/projects/spring-boot)

## 프로젝트 구조
```markdown
api/
├── category/
│ ├── domain/
│ │ ├── adapter/
│ │ │ ├── in/
│ │ │ │ ├── web/
│ │ │ └── out/
│ │ │ ├── persistence/
│ │ ├── application/
│ │ │ ├── dto/
│ │ │ ├── event/
│ │ │ ├── port/
│ │ │ │ ├── in/
│ │ │ │ └── out/
│ │ │ ├── service/
│ │ └── domain/
└── external/
│ ├── category/
│ │ ├── domain/
│ │ │ ├── application/
│ │ │ │ ├── port/
│ │ │ │ └── service/
└── global/
│ ├── auth/
│ ├── common/
│ ├── config/
│ ├── exception/
│ ├── handler/
│ ├── util/
```

### 아키텍처
이 프로젝트는 포트 앤 어댑터([헥사고날](https://en.wikipedia.org/wiki/Hexagonal_architecture_(software))) 아키텍처 패턴에 따라 구조화되어 있습니다. 이 아키텍처는 명확한 관심사 분리를 통해 코드베이스를 모듈화하고, 테스트 가능하며, 유지보수가 용이하도록 합니다.

### 패키지 구성
이 프로젝트의 패키지는 package-private 관례를 사용하여 구성되어 있습니다. 이를 통해 구현 세부 사항을 캡슐화하고, 필요한 구성 요소만 노출하여 모듈성과 유지보수성을 향상시킬 수 있습니다.

### `domain`
- **adapter**: 외부 시스템과의 상호작용을 담당하는 어댑터들이 위치합니다. 여기에는 웹 인터페이스를 처리하는 `in` 어댑터와 데이터베이스와의 상호작용을 처리하는 `out` 어댑터가 포함됩니다.
- **in**: 외부에서 들어오는 요청을 처리합니다. 예를 들어, HTTP 요청을 처리하는 컨트롤러가 포함됩니다.
- **out**: 외부 시스템과의 상호작용을 처리합니다. 예를 들어, 데이터베이스와의 연동을 처리하는 어댑터가 포함됩니다.
- **application**: 도메인 로직을 처리하는 서비스와 포트가 위치합니다. DTO(Data Transfer Object)와 이벤트도 이 계층에 포함됩니다.
- **dto**: 요청과 응답을 처리하는 DTO 클래스들이 위치합니다. DTO는 데이터 전송을 위한 객체로, 계층 간 데이터 교환을 담당합니다.
- **event**: 도메인 이벤트와 관련된 클래스들이 위치합니다. 도메인 이벤트는 비즈니스 로직에서 발생하는 중요한 사건을 나타냅니다.
- **port**: 인바운드 및 아웃바운드 포트 인터페이스를 정의합니다.
- **in**: 애플리케이션 외부에서 들어오는 요청을 처리하는 인터페이스입니다.
- **out**: 외부 시스템이나 데이터베이스로의 요청을 처리하는 인터페이스입니다.
- **service**: 인바운드 포트 인터페이스를 구현하는 서비스 클래스들이 위치합니다. 서비스 클래스는 비즈니스 로직을 구현하고, 필요한 경우 아웃바운드 포트를 호출합니다.
- **domain**: 애플리케이션의 핵심 비즈니스 로직과 규칙을 정의하는 도메인 모델이 위치합니다. 도메인 모델은 엔티티(Entity), 밸류 객체(Value Object), 애그리게잇(Aggregate) 등을 포함합니다.

### `external`
- **category**: 특정 도메인과 관련된 클래스들이 위치합니다. 외부 시스템과 상호작용하는 로직이 포함됩니다.
- **domain**: 각 도메인에 대한 비즈니스 로직과 규칙을 정의합니다.
- **application**: 도메인에 대한 애플리케이션 로직을 처리합니다.
- **port**: 도메인 외부에서 들어오는 요청을 처리하는 인바운드 포트와, 도메인 내부에서 외부 시스템으로의 요청을 처리하는 아웃바운드 포트를 정의합니다.
- **service**: 인바운드 포트 인터페이스를 구현하는 서비스 클래스들이 위치합니다.

### `global`
- **auth**: 인증 관련 기능을 처리하는 클래스가 포함됩니다.
- **common**: 여러 도메인에서 공통적으로 사용되는 유틸리티 클래스가 포함됩니다.
- **config**: 프로젝트의 설정 관련 클래스가 포함됩니다.
- **exception**: 전역적인 예외 처리 로직을 담당하는 클래스가 포함됩니다.
- **handler**: 예외 및 특정 상황에 대한 핸들러를 정의하는 클래스가 포함됩니다.
- **util**: 일반적인 유틸리티 기능을 제공하는 클래스가 포함됩니다.

## 시스템 아키텍처 다이어그램
![System-Architecture-Diagram](images/System-Architecture-Diagram.png)

## 모니터링 서비스 다이어그램
![Monitoring-Services-Diagram](images/Monitoring-Services-Diagram.png)

## Entity-Relationship 다이어그램
> **참고**: 실제 데이터베이스 설계는 외래키를 사용하지 않지만, 시각적으로 표현하기 위해 다이어그램에서는 외래키 연결이 표시됩니다.
![Entity-Relationship-Diagram](images/Entity-Relationship-Diagram.png)

## 라이선스
이 프로젝트는 GNU 일반 공중 사용 허가서(GPL) v3.0에 따라 라이선스가 부여됩니다. 자세한 내용은 [LICENSE](https://github.com/KGU-C-Lab/clab-server?tab=GPL-3.0-1-ov-file#readme) 파일을 확인하세요.

## 기여자
<a href="https://github.com/KGU-C-Lab/clab-server/graphs/contributors">
<img src="https://contrib.rocks/image?repo=KGU-C-Lab/clab-server" />
</a>

## Tech Stack

- **Spring Boot**: 웹 및 애플리케이션 개발을 위한 프레임워크.
- **Spring Security**: 인증 및 권한 부여를 위한 보안 프레임워크.
- **Spring Data JPA**: 데이터 접근 계층을 위한 JPA.
- **QueryDSL**: 복잡한 쿼리 작성을 단순화.
- **PostgreSQL**: 주 데이터베이스로 사용.
- **Redis**: 캐싱 및 JWT 관리를 위해 사용.
- **Thymeleaf**: 메일 전송을 위한 템플릿 엔진.
- **IPInfo**: IP 주소 기반 위치 정보 조회.
- **Google Authenticator**: 2단계 인증을 위한 라이브러리.
- **Slack API**: 각종 보안 알림을 위해 사용.
- **Swagger**: API 문서 자동화.

## Project Structure

### Domain
각 도메인은 독립적인 기능을 담당하는 클래스들로 구성됩니다.

각 도메인 폴더 내부에는 다음과 같은 하위 구조를 가집니다:

- `api`: REST API를 통해 외부 요청을 처리합니다.
- `application`: 핵심 비즈니스 로직을 수행합니다.
- `dao`: 데이터베이스의 CRUD 작업을 담당합니다.
- `domain`: 도메인 객체를 정의합니다.
- `dto`: 계층 간 데이터 교환을 위한 객체를 정의합니다.
- `exception`: 도메인별 예외 상황을 처리합니다.

### Global
`global` 폴더에는 프로젝트 전반에 걸쳐 공통적으로 사용되는 클래스들이 포함됩니다.

- `auth`: 인증 관련 기능을 수행합니다.
- `common`: 여러 도메인에서 공통적으로 사용되는 유틸리티 클래스를 제공합니다.
- `config`: 프로젝트의 설정 관련 클래스를 모아둡니다.
- `exception`: 전역적인 예외 처리 로직을 담당합니다.
- `handler`: 예외 및 특정 상황에 대한 핸들러를 정의합니다.
- `util`: 일반적인 유틸리티 기능을 제공합니다.
- `validation`: 유효성 검증을 위한 클래스를 포함합니다.

## Database Schema

![absent](https://github.com/KGU-C-Lab/clab-server/assets/85067003/4b8e66ab-f7fc-49b7-85a0-cb27b32a0436)

## License

이 프로젝트는 GNU 일반 공중 사용 허가서(GPL) v3.0에 따라 라이선스가 부여됩니다.

## Contributing

본 프로젝트에 기여하고자 하시는 분은 다음의 가이드라인을 따라주세요.

## 기여하기
이 프로젝트에 기여하려면 다음 단계를 따라주세요.
[CONTRIBUTING.md](CONTRIBUTING.md)
Loading

0 comments on commit ed08ac3

Please sign in to comment.