This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 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
This repository was archived by the owner on Jul 30, 2026. It is now read-only.

Repository files navigation

🎙️ WhyLog Back-End

프로젝트 소개

회의에서 커밋까지, 의사결정 맥락을 추적하는 실시간 음성 회의 협업 플랫폼 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해, "왜 이렇게 개발했는가"의 맥락을 남깁니다.

WhyLog

주요 기능

  • 실시간 다자간 음성 회의: WebRTC(LiveKit SFU) 기반으로 여러 참가자가 동시에 음성으로 회의를 진행합니다.
  • 실시간 자막 & 채팅: 발화 내용을 발화자별로 구분해 실시간 자막으로 표시하고, 채팅 메시지를 브로드캐스트합니다.
  • 회의 기록 및 분석: 발화 기록을 저장하고 텍스트 기반으로 회의 내용을 분석합니다.
  • GitHub 연동 — 의사결정 추적: 회의에서 나온 논의·결정을 GitHub 커밋/PR과 연결해 개발 맥락을 추적합니다.
  • 팀 · 회의 관리: 팀을 구성하고, 팀 단위로 회의를 생성·진행·종료합니다.
  • 파일 업로드: AWS S3 기반 파일·이미지 업로드를 지원합니다.
  • 인증: JWT 기반 로그인 및 접근 제어를 제공합니다.

기술 스택

  • Language: Java 17
  • Framework: Spring Boot, Spring Security, Spring Data JPA, Spring AOP
  • Real-time: WebSocket, WebRTC (LiveKit SFU)
  • Auth: JWT (jjwt)
  • Database: MySQL, Redis
  • Storage: AWS S3
  • Integration: GitHub API (org.kohsuke)
  • API Docs: Swagger (springdoc-openapi)
  • Logging: Log4j2
  • Build Tool: Gradle
  • Deploy: AWS

서버 아키텍처

Group 12
  • REST API — 인증, 팀·회의 관리, 회의 생성·종료, LiveKit 접속 토큰(rtc-token) 발급, GitHub 연동
  • WebSocket — 참가자 동기화, 채팅, 실시간 자막, 입·퇴장 이벤트 브로드캐스트
  • LiveKit SFU (외부) — 실시간 음성 스트림 중계. 백엔드는 미디어에 관여하지 않고 접속 토큰만 발급합니다.
  • 실시간 자막은 클라이언트 STT 텍스트를 WebSocket으로 수신해 참가자에게 브로드캐스트합니다.

API 문서

  • Swagger UI: /swagger-ui/index.html (springdoc-openapi)

프로젝트 구조

도메인형

  • 각 도메인 패키지는 엔티티, DTO, 컨트롤러, 서비스, 리포지토리 등 하위 패키지를 포함
  • Base package: com.whylog.server
src/
└── main/
└── java/com/whylog/server
├── ServerApplication.java
├── global/ # config, apiPayload, common (공통 응답·예외·설정)
├── auth/ # 인증 · JWT
├── member/ # 회원
├── team/ # 팀
├── meeting/ # 회의 생성 · 상태 · 참가자
├── chat/ # 채팅 · 자막 메시지
└── ... # (실제 도메인 폴더로 교정)

위 트리는 예시입니다. 실제 도메인 폴더 이름으로 교정하세요.

Branch Strategy

  • main: 배포 가능한 최종 코드만 관리합니다.
  • develop: 완성된 기능을 지속적으로 병합하는 브랜치입니다.
  • {type}/{기능 요약}: 기능 개발용 브랜치입니다. (예: feat/meeting)

Commit Convention

커밋 타입을 접두로 사용합니다. (예: feat: 회의 생성 기능 구현)

TypeDescription
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor코드 리팩토링
test테스트 코드, 리팩토링 테스트 코드 추가
chore패키지 매니저 수정, 그 외 기타 수정 (예: .gitignore)
designCSS 등 사용자 UI 디자인 변경
comment필요한 주석 추가 및 변경
rename파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
remove파일을 삭제하는 작업만 수행한 경우
init프로젝트 초기 세팅
merge브랜치 merge
!BREAKING CHANGE커다란 API 변경의 경우
!HOTFIX급하게 치명적인 버그를 고쳐야 하는 경우

Pull Request (PR)

  • 본인을 Assignee로 지정하고, 팀원 1명 이상의 승인을 받은 뒤 develop 브랜치로 머지합니다.
  • 관련 이슈가 있다면 연결합니다.

👥 Members

김준용팀원2
김준용유진
유저·실시간회의·팀깃·결정사항·적용사항

About

WhyLog BE 레포지토리입니다.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages