Skip to content

About

사용자가 직접 판결을 내려보고 AI·실제 판결과 비교하면서, 판결이 왜 그렇게 내려졌는지를 스스로 생각해보게 하는 체험형 서비스

Resources

Stars

11 stars

Watchers

0 watching

Forks

Repository files navigation

내Law남불

당신이 판사라면, 어떤 판결을 내리겠습니까?

사용자가 사건을 단계별로 읽고 직접 판결을 내린 뒤, AI 판결과 실제 판결을 같은 판단 요소로 비교해 보는 서비스다. AIBE7 최종 프로젝트 Team2가 만든다.

MVP는 로그인 없이, 대표 사건 1건으로 아래 흐름을 끝까지 체험하는 것이다. (MVP 정의서)

사전 판단 → 단계별 사건 확인 → 직접 판결 → AI 판결 → 실제 판결 → 세 판결 비교

기술 스택

구분 내용
Backend Java 17, Spring Boot 4.1.1 (Web MVC · Data JPA · Validation), Gradle
DB PostgreSQL 17, Flyway(스키마 마이그레이션)
Frontend HTML + JavaScript, Vite
CI GitHub Actions

자세한 구성과 선택 이유는 기술 스택 정리를 본다.

폴더 구조

폴더 내용
backend/ Spring Boot API 서버, 로컬 개발용 PostgreSQL(docker-compose.yml), DB 마이그레이션 · 개발용 시드
frontend/ 화면 (자세한 내용은 frontend/README.md)
docs/ 기획 · 설계 문서 (문서 목차)
tools/ai-judgment/ AI 판결 오프라인 생성 · 검수 도구 (README)
.github/workflows/ CI 워크플로우 (README)

로컬 실행

백엔드

JDK 17이 필요하다. 기본 JDK가 17이 아니면 JAVA_HOME을 17로 지정한 뒤 실행한다.

cd backend
docker compose up -d      # PostgreSQL 컨테이너(lawnambul-postgres, 5432) 실행
./gradlew bootRun         # 서버 실행 (기본 8080, 시작할 때 Flyway가 스키마 · 시드를 넣는다)

./gradlew bootRun은 시드 위치를 자동으로 정한다(BE-28, backend/build.gradle). 환경변수를 따로 줄 필요가 없다.

  • 기본 bootRun 설정에서는 개발용 가상 사건 시드(db/seed)를 함께 넣는다. FLYWAY_LOCATIONS를 직접 지정하면 지정한 위치만 사용하므로, 가상 사건 시드도 사용하려면 classpath:db/seed를 포함한다. (시드 설명)
  • 실제 대표 사건은 비공개 저장소 서브모듈(backend/private-seed)에 SQL이 있으면 자동으로 넣는다(BE-17). 접근 권한이 없으면 빈 폴더로 남고, 가상 사건만으로 그대로 개발할 수 있다.
  • 시작할 때 [bootRun] Flyway 위치(...) · [bootRun] 실제 사건 시드: 포함 / 없음 두 줄이 찍힌다. 실제 사건이 안 보이면 이 줄부터 확인한다. (FLYWAY_LOCATIONS를 직접 지정했으면 포함 여부를 판정하지 않고 지정한 위치를 그대로 쓴다고만 찍힌다.)
  • 위치를 직접 정하고 싶으면 FLYWAY_LOCATIONS를 주면 그 값을 그대로 쓴다. (예: 스키마만 FLYWAY_LOCATIONS=classpath:db/migration ./gradlew bootRun)
# 실제 사건을 보려면 저장소 루트에서 처음 한 번 (권한 필요)
git submodule update --init backend/private-seed

⚠️ git pull은 서브모듈을 갱신하지 않는다. 공개 저장소가 서브모듈 커밋을 올렸다면(예: R__20 재판부 판결 · R__30 AI 판결 추가) pull 뒤에 git submodule update --init backend/private-seed를 다시 실행해야 한다. 그렇지 않으면 예전 커밋의 시드만 들어가고, bootRun은 SQL이 하나라도 있으면 "포함"으로 찍어 오류 없이 뜬다. 이때 실제 사건에서 GET /api/v1/cases/{id}/experience/judgments/ai · /judgments/court가 500(IllegalStateException, 공개 사건인데 AI · 재판부 판결 row가 없음)을 낸다. 아래로 확인한다. (BE-29)

git submodule status backend/private-seed   # 맨 앞이 '-'(미초기화) 또는 '+'(커밋 불일치)이면 위 update 명령 실행
ls backend/private-seed/seed                # R__10 · R__20 · R__30 세 파일이 있어야 한다

서브모듈을 맞춘 뒤 bootRun을 다시 띄우면 Flyway가 새 시드를 반복 마이그레이션(R__)으로 적용한다. DB를 비울 필요는 없다.

이 자동 설정은 로컬 실행(bootRun)에만 적용된다. 운영(jar · Docker) · 테스트는 application.yml 기본값(스키마만)을 그대로 쓴다.

⚠️ IDE에서 실행할 때는 BackendApplication의 ▶ 버튼(main 클래스 실행) 대신 Gradle 창의 Tasks > application > bootRun을 쓴다. main 클래스로 실행하면 Gradle을 거치지 않아 자동 설정이 적용되지 않고 application.yml 기본값(스키마만)으로 떠서, 새 DB라면 사건이 하나도 없다. 꼭 main 클래스로 실행해야 하면 실행 구성의 환경변수에 FLYWAY_LOCATIONS를 직접 넣는다.

  • 서브모듈 안의 파일을 공개 저장소의 다른 위치(db/seed 등)로 복사하지 않는다. 공개 저장소의 커밋 메시지 · PR · Jira 댓글에도 사건 내용(형량 · 판단 요소 · 사실관계)을 쓰지 않는다.
  • 서브모듈은 src/main/resources 밖에 있어 jar에 들어가지 않고, backend/.dockerignore로 Docker 빌드에서도 뺀다.

로컬 DB를 비우고 처음부터 다시 만들려면 docker compose down -v && docker compose up -d를 실행한다. (볼륨이 삭제된다)

테스트는 실제 PostgreSQL에 연결하므로 DB를 먼저 띄운 뒤 실행한다.

./gradlew test

접속 정보는 환경변수로 바꾼다. 값이 없으면 로컬 docker-compose.yml 기본값을 쓴다. (backend/src/main/resources/application.yml)

이름 기본값 설명
DB_URL jdbc:postgresql://localhost:5432/lawnambul DB 접속 주소
DB_USERNAME lawnambul DB 계정 (로컬 전용 값)
DB_PASSWORD lawnambul DB 비밀번호 (로컬 전용 값)
DDL_AUTO validate Hibernate 스키마 처리 방식 (스키마는 Flyway로만 바꾼다)
FLYWAY_LOCATIONS classpath:db/migration (bootRun은 자동: 가상 시드 + 실제 사건이 있으면 포함) 마이그레이션 위치. 주면 bootRun 자동 설정보다 우선한다. 가상 시드는 classpath:db/seed, 실제 사건은 filesystem:./private-seed/seed
SWAGGER_ENABLED false Swagger UI · OpenAPI 문서 노출. 로컬 · 개발에서만 true로 켠다 (/swagger-ui/index.html, /v3/api-docs)

운영 DB 계정은 이 저장소에 적지 않고 실행할 때 환경변수로만 넘긴다. 시드는 운영에 넣지 않는다.

프론트엔드

cd frontend
npm install
npm run dev     # http://localhost:5173 (/api 요청은 localhost:8080 백엔드로 프록시)

API 없이 화면만 확인하려면 개발 서버를 켠 뒤 http://localhost:5173/preview.html을 연다. 자세한 내용은 frontend/README.md와 목 API 설명을 본다.

문서

문서 내용
문서 목차 모든 문서의 역할과 읽는 순서
API 명세서 경로 · 요청 · 응답 · 에러 코드
ERD 테이블 · 제약 · 예시 데이터
정보 구조 화면 목록과 흐름

협업 규칙

작업은 Jira 이슈로 시작하고, 브랜치 · 커밋 · PR 이름에 이슈 키(BE-15, FE-8 등)를 넣는다. 자세한 규칙은 Git 컨벤션, 코드 규칙은 코드 컨벤션을 따른다.

항목 형식 예
브랜치 feature/{ISSUE-KEY}-{작업내용} feature/BE-15-login-api
커밋 영어카테고리 : ISSUE-KEY 한글 설명 feat : BE-15 로그인 API 구현
PR 제목 [ISSUE-KEY] 작업 내용 [BE-15] 로그인 API 구현

About

사용자가 직접 판결을 내려보고 AI·실제 판결과 비교하면서, 판결이 왜 그렇게 내려졌는지를 스스로 생각해보게 하는 체험형 서비스

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages