Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Nadab Backend

Nadab 서비스 소개

사용자의 일상 답변을 바탕으로 AI 일간·주간·월간·유형 리포트를 생성하고, 친구·소셜 상호작용과 운영 기능을 제공하는 Spring Boot 백엔드 서버입니다.


서비스 링크


기술 스택

구분기술
LanguageJava 21
FrameworkSpring Boot 3.5.7, Spring Security, Spring Data JPA
DatabasePostgreSQL, Flyway
AISpring AI, OpenAI, Google Gemini
InfrastructureAWS EC2, S3, KMS, Firebase Cloud Messaging
API / ViewSwagger/OpenAPI, Thymeleaf
TestJUnit 5, Mockito, AssertJ, Testcontainers
Build / CI/CDGradle, GitHub Actions

주요 기능

  • OAuth 및 이메일 기반 인증, JWT 토큰 관리
  • 오늘의 질문과 답변 기록, 이미지 처리
  • AI 기반 일간·주간·월간·유형 리포트 생성
  • 친구, 피드 공유, 댓글, 좋아요, 신고·차단
  • 푸시 알림, 이메일 인증, 알림 설정
  • 앱 버전, 사용자 통계 등 관리자 기능
  • 사용자 지갑 및 크리스탈 이력 관리

로컬 개발 환경 설정

1. 저장소 클론

git clone https://github.com/DevKor-github/nadab-BE.git
cd nadab-BE

커밋 도구를 사용하려면 Node.js를 설치한 뒤 패키지를 설치합니다.

npm install

2. JDK 설정

  • JDK 21을 설치합니다.
  • IntelliJ에서 프로젝트 루트 또는 build.gradle을 프로젝트로 엽니다.
  • Project SDK와 Gradle JVM을 JDK 21로 설정합니다.

3. PostgreSQL 준비

로컬 PostgreSQL에 사용할 데이터베이스를 생성합니다. 애플리케이션 시작 시 Flyway가 src/main/resources/db/migration의 마이그레이션을 자동 적용하며, Hibernate는 스키마를 validate 모드로 검증합니다.


테스트

단위 테스트는 JUnit 5, Mockito, AssertJ를 사용합니다. 데이터베이스 통합 테스트는 PostgreSQL Testcontainers를 사용하므로 Docker Desktop이 실행 중이어야 합니다.

# 전체 테스트
.\gradlew.bat test
# 단일 테스트 클래스
.\gradlew.bat test --tests "com.devkor.ifive.nadab.domain.auth.application.AuthServiceV2Test"

develop 브랜치 대상 Pull Request에는 GitHub Actions가 전체 테스트를 자동 실행합니다.


배포 환경

  • develop 브랜치 push: 개발 EC2 자동 배포
  • main 브랜치 push: 운영 EC2 자동 배포
  • GitHub Actions에서 JDK 21로 실행 JAR을 빌드합니다.
  • 빌드 산출물을 SCP로 EC2에 전송하고 프로필별 환경 변수를 주입해 애플리케이션을 재시작합니다.
  • PostgreSQL, S3, KMS, Firebase 및 외부 AI API는 환경별 자격 증명으로 연동합니다.

배포 관련 secret은 GitHub Environment의 dev, prod 설정에서 관리하며 저장소에 직접 기록하지 않습니다.


브랜치 전략

  • main: 운영 배포 브랜치
  • develop: 개발 통합 및 개발 서버 배포 브랜치
  • 기능 개발 브랜치: feat/*, fix/*, refactor/*, chore/* 등 작업 목적에 맞게 생성

기능 브랜치는 develop을 기준으로 작업하고 Pull Request를 통해 병합합니다. 운영 반영은 develop에서 검증된 변경을 main으로 병합해 진행합니다.


프로젝트 구조

src
├─ main
│ ├─ java/com/devkor/ifive/nadab
│ │ ├─ domain # 비즈니스 도메인
│ │ └─ global # 공통 설정, 보안, 예외, 인프라, 유틸리티
│ └─ resources
│ ├─ db/migration # Flyway 마이그레이션
│ ├─ templates # 관리자·통계 Thymeleaf 화면
│ └─ application*.yml
└─ test
└─ java/com/devkor/ifive/nadab
└─ infra # Testcontainers 및 테스트 빌더

각 도메인은 기능에 따라 다음 계층을 조합합니다.

  • api: Controller와 요청·응답 DTO
  • application: 유스케이스, 트랜잭션, 이벤트, 스케줄러
  • core: Entity, Repository, Domain Service, 내부 모델
  • infra: 외부 AI API, 스토리지 등 외부 연동 구현

공통 설정과 여러 도메인이 함께 사용하는 기능은 global에 둡니다. 데이터베이스 스키마 변경은 JPA 설정에 의존하지 않고 Flyway 마이그레이션으로 관리합니다.


커밋 컨벤션

Conventional Commits 기반의 commitlint, Husky, Commitizen을 사용합니다.

<type>(<scope>): <subject>
<body>

Type

Type설명
feat새로운 기능 추가
fix버그 수정
docs문서 변경
chore빌드·설정 등 기타 작업
style동작에 영향을 주지 않는 스타일 변경
refactor기능 변경 없는 구조 개선
test테스트 추가 또는 보완
perf성능 개선
ciCI/CD 설정 변경
revert이전 커밋 되돌리기

Scope

허용 scope는 다음과 같습니다.

admin, auth, user, ai, report, moderation, search, stats,
friend, social, notify, infra, db, global
  • subject는 변경 내용을 한국어로 간결하게 작성합니다.
  • subject 끝에 마침표를 붙이지 않습니다.
  • 맥락이 필요한 변경은 body에 무엇을 바꿨고 왜 바꿨는지 작성합니다.
  • scope는 생략할 수 있지만, 사용할 경우 허용 목록 중 하나를 선택해야 합니다.
# 직접 작성
git commit -m "feat(report): 월간 리포트 조회 기능 추가"# Commitizen 프롬프트 사용
npm run commit

참고

  • 마이그레이션: src/main/resources/db/migration
  • CI/CD: .github/workflows

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages