[GitHub Clone] 06. 커밋 그래프 시각화 (Mermaid.js vs GitGraph.js)
·
Java | Spring/GitHub Clone Project
들어가며이 글에서는 커밋 정보를 DAG(유향 비순환 그래프) 형태로 시각화하기 위해 Mermaid.js, GitGraph.js 두 가지 도구를 활용한 구현 과정을 공유합니다.브라우저 기반 Git 구조 표현을 통해 커밋 흐름을 직관적으로 확인할 수 있도록 구성했습니다. 흐름 요약DB → 커밋 + 브랜치 조인 쿼리 실행Java Builder → Mermaid 문자열 or GitGraph JSON 생성Spring Controller → 요청 처리 및 응답 반환JavaScript → AJAX 호출 및 콜백 연결mermaid.js / gitgraph.js → 브라우저 렌더링 DAG 구조 설계 기반커밋 테이블(`tb_commit`)에는 `parentCommitSeq`, `mergeFromCommitSeq` 를 통해..
[GitHub Clone] 05. 커밋 / 머지 / 리베이스 기능 구현
·
Java | Spring/GitHub Clone Project
들어가며이 글에서는 GitHub 클론 프로젝트에서 구현한 커밋 등록, 브랜치 병합 (Merge), 리베이스 (Rebase) 기능의 핵심 구조와 처리 흐름을 정리합니다.DAG 기반의 브랜치-커밋 구조를 바탕으로, Git 의 동작을 단순화해 웹 애플리케이션에서 표현했습니다. 커밋 도메인 구조커밋 테이블과 브랜치 테이블 간 관계`tb_branch` : `tb_commit` = 1:N브랜치는 커밋이 없을 수도 있고, 하나 이상의 커밋을 가질 수 있다커밋 도메인 주요 컬럼 설명`BRANCH_SEQ` : 해당 커밋이 속한 브랜치의 ID`PARENT_COMMIT_SEQ` : 이전 커밋의 ID. 일반적인 커밋 흐름 연결을 위한 필드`MERGE_FROM_COMMIT_SEQ` : 병합(Merge) 시 사용된 다른 부모 커..
[GitHub Clone] 04. 그룹 / 프로젝트 / 브랜치 도메인 설계 및 CRUD 구현
·
Java | Spring/GitHub Clone Project
들어가며이 글에서는 GitHub 클론의 핵심 데이터 구조인 그룹(Group) - 프로젝트(Project) - 브랜치(Branch) 도메인 설계와 CRUD 구현 과정을 정리합니다.각 도메인의 관계를 먼저 ERD로 확인하고, 기능별 CRUD 흐름을 간단히 소개하겠습니다. 도메인 구조 개요회원 테이블과 그룹 관련 테이블 간 관계`tb_member` : `tb_group` = 1:N회원은 그룹을 소유하지 않을 수도 있고, 하나 이상의 그룹을 소유할 수 있다`tb_group` : `tb_group_member` = 1:N하나의 그룹은 최소 1명 또는 여러 명(N) 의 관계를 가질 수 있다`tb_member` : ` tb_group_member ` = 1:1각 `tb_group_member` 는 정확히 하나의 회원..
[GitHub Clone] 03. 회원 기능 및 로그인 (Session → Spring Security)
·
Java | Spring/GitHub Clone Project
들어가며GitHub 클론 프로젝트에서는 복잡한 OAuth 나 소셜 로그인 없이, 기본적인 회원 관리 + 로그인/로그아웃 흐름만을 구현했습니다.최초에는 세션 기반 로그인을 적용하고, 이후 구조 확장을 고려해 Spring Security 기반 처리로 전환했습니다. 간단한 흐름 요약사용자 회원가입`Member` 엔티티를 DB에 저장비밀번호는 `BCrypt` 를 사용해 해시 처리 후 저장로그인 시 사용자 정보 조회`BCrypt` 의 `matches()` 활용하여 비밀번호 일치 여부 확인Session 기반 로그인사용자 정보 세션 저장Spring Security 적용세션 직접 조작 대신 로그아웃 처리만 유지 회원 기능 구현DB ERD Diagram회원 기능 패키지/클래스 생성src└── main ├── jav..
[GitHub Clone] 02. 프로젝트 구조 및 초기 설정
·
Java | Spring/GitHub Clone Project
들어가며이 글에서는 GitHub 클론 프로젝트의 전체 폴더 구조, 주요 설정 파일 (Spring, MyBatis, Security 등)을 소개하고, 각 구성 요소가 어떤 역할을 하는지 정리하겠습니다. 기술 스택 구분 기술 설명 백엔드Spring Boot프로젝트 기반 프레임워크ORMMyBatisSQL 중심 ORM보안Spring Security인증/인가 구현DBMariaDB데이터 저장프론트JS, jQuery, Ajax클라이언트 요청 처리시각화GitGraph.js, Mermaid.js커밋 그래프 구현 전체 패키지 구조간략한 전체 패키지 구성src└── main ├── java │ └── com.example │ ├── core │ └── javastudy ..
[GitHub Clone] 01. 프로젝트 소개 및 기술 스택 정리
·
Java | Spring/GitHub Clone Project
프로젝트 개요이 프로젝트는 GitHub의 주요 기능을 Spring Boot 기반으로 클론하며 Git 저장소 구조, 브랜치/커밋 처리 로직, 커밋 그래프 시각화 등을 학습하는 데 목적이 있습니다. 기능 범위로그인 / 회원가입 : Spring Security 를 이용한 기본 로그인Repository / Branch / Commit 관리 : 실제 Git처럼 레포지토리 생성, 브랜치 관리, 커밋 등록 기능 제공Git DAG 구조 설계 : 커밋 간의 부모-자식 관계를 방향성 있는 비순환 그래프(DAG)로 모델링GitGraph.js / Mermaid.js를 통한 커밋 그래프 시각화 : 커밋 흐름을 시각적으로 표현하여 Git 구조를 직관적으로 표Git Contribution (깃 잔디) 시각화 : 날짜별 커밋 수 데..
[Spring] RedirectAttributes 인터페이스
·
Java | Spring
리다이렉트 (Redirect) 방식리다이렉트 방식 : GET 방식 → 리다이렉트 실행 이전에 수행된 모델 데이터는 소멸함리다이렉트 방법으로도 데이터를 전달할 수 있음 : GET 의 쿼리 스트링URL 에 노출되는 단점 존재→ 스프링에서 제공하는 RedirectAttributes 인터페이스 RedirectAttributes 인터이스모델의 기능을 그대로 확장 (extends) + 도움 메소드 추가리다이렉트가 발생하기 전에 모든 플래시 속성을 세션에 복사리다이렉션 이후에는 저장된 플래시 속성을 세션에서 모델로 이동헤더에 파라미터 붙이지 않기 때문에 URL 에 노출되지 않음`http://localhost:8080/board/list?result=success` → URL 에 노출되는 파라미터 : 보안에 취약@Po..
[Java] 제네릭의 공변성
·
Java | Spring
제네릭 (Generics) [Java] 제네릭 (Generics)Generics// 제네릭 이전ArrayList numberList = new ArrayList();numberList.add(10); // OknumberList.add("20"); // String 을 추가해도 컴파일 에러가 발생하지 않음 // ClassCastException (형변환 에러) 발생Integer i = (Integer)list.getjackinquantico.tistory.com 자바의 공변성 / 반공변성변성 (Variance) : 타입의 상속 계층 관계에서 서로 다른 타입 간에 어떤 관계가 있는지 나타내는 지표공변성 (Covariance) : 서로 다른 타입 간에 함께 변할 수 있다는 특징ex) `S`가 `T`의 하위 ..
[Spring] 스프링 Validation 의 Errors 와 BindingResult
·
Java | Spring
Errors`org.springframework.validation.Errors` 인터페이스특정 개체에 대한 데이터 바인딩 및 유효성 검사 오류에 대한 정보를 저장하고 노출필드 이름은 일반적으로 대상 객체의 속성 명단일 스레드 지원 Errors (Spring Framework 6.2.3 API)Stores and exposes information about data-binding and validation errors for a specific object. Field names are typically properties of the target object (for example, "name" when binding to a customer object). Implementations may als..
[Spring] Interceptor 와 request.getInputStream()
·
Java | Spring
HttpServletRequestWrapper 커스텀interceptor, filter 등에서 getInputStream() 을 통해 한 번 request 바디 내용을 읽어들이면이후에 다른 filter 나 controller 에서 해당 내용을 읽을 수 없음 (일회용)⇒ 해당 내용을 저장해서 가지고 있다가 여러 번 반복해서 부를 수 있도록HttpServletRequestWrapper 를 상속받은 MyRequestWrapper 정의 MyRequestWrapperHttpServletRequestWrapper 상속생성자에서 request 의 Inputstream 을 읽어와서 전역 변수에 저장읽어들인 메시지 내용을 반복해서 제공할 수 있도록 `getInputStream()` 과 `getReader()` 오버라이딩..