🧠 AI 브레인스토밍 플랫폼 개발 일지 - Day 1

날짜: 2024년 (프로젝트 시작)
진행자: AI 코칭 + 개발자
목표: Spring Boot + Python LLM 기반 브레인스토밍 웹 플랫폼


📝 오늘의 진행 사항

1️⃣ 프로젝트 초기 설정

  • ✅ Spring Boot 3.5.7 프로젝트 생성 (start.spring.io)
  • ✅ Gradle 빌드 설정
  • ✅ Java 17 설정
  • ✅ YAML 설정 파일 선택 (가독성 우선)

선택한 Dependencies:

- Spring Web (REST API)
- Spring Data JPA (ORM)
- MySQL Driver (운영용)
- H2 Database (개발용) ← 추가
- Lombok (보일러플레이트 제거)
- Spring Security (OAuth2 준비)
- OAuth2 Client (구글/카카오/네이버 로그인)
- Validation (입력 검증)
- Spring Boot Actuator (모니터링)

2️⃣ 개발 환경 구축

  • ✅ H2 인메모리 DB 설정 (빠른 개발/테스트)
  • ✅ Spring Security 임시 비활성화 (개발 편의성)
  • ✅ JPA 설정 (자동 DDL, SQL 로깅)
  • ✅ 서버 정상 실행 확인 (http://localhost:8080)

3️⃣ 아키텍처 설계

┌─────────────────┐
│  사용자 브라우저  │
└────────┬────────┘
         │
┌────────▼────────────────────┐
│  Spring Boot (Java)         │
│  - OAuth 로그인             │
│  - 아이디어 CRUD            │
│  - Python API 연동          │
└────────┬────────────────────┘
         │
┌────────▼────────────────────┐
│  Python FastAPI             │
│  - LLM 브레인스토밍 엔진    │
│  - Ephemeral RAG            │
└─────────────────────────────┘

4️⃣ ERD 설계 (v1.0)

User (사용자)
  ├─ 1:N → Idea (아이디어)
  └─ 1:N → Inquiry (문의/게시판)

테이블 구조:

  • User: OAuth2 로그인 정보, 프로필
  • Idea: 브레인스토밍 결과물 (JSON 저장)
  • Inquiry: 관리자 문의 (CRUD 연습용)

💡 주요 학습 내용

1. Spring Security 6.x 람다 DSL

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) {
    http
        .authorizeHttpRequests(auth -> auth
            .anyRequest().permitAll()  // 개발 단계
        )
        .csrf(csrf -> csrf.disable());  // REST API용
    return http.build();
}

포인트: Spring Security 6.0부터 람다 체이닝 방식이 표준

2. CSRF (Cross-Site Request Forgery)

  • 공격 원리: 로그인된 사용자 권한을 악용한 위조 요청
  • 방어: CSRF 토큰 검증
  • REST API: JWT/Bearer Token 사용 시 불필요 → disable

3. H2 vs MySQL 전략

# 개발: H2 (빠름, 설치 불필요)
spring:
  datasource:
    url: jdbc:h2:mem:brainstorm

# 운영: MySQL (Docker/AWS)
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/brainstorm

4. BaseEntity 패턴 (상속)

@MappedSuperclass  // 테이블 생성 안 함
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @CreatedDate
    private LocalDateTime createdAt;
    
    @LastModifiedDate
    private LocalDateTime updatedAt;
}

장점:

  • 모든 엔티티에서 재사용
  • 자동 시간 관리
  • 코드 중복 제거

5. DDD 기반 패키지 구조

domain/
  ├─ user/
  │   ├─ entity/
  │   ├─ repository/
  │   ├─ service/
  │   └─ controller/
  ├─ idea/
  └─ inquiry/
global/
  ├─ entity/ (BaseEntity)
  ├─ config/ (Security)
  └─ exception/

특징: 도메인별 응집도 높음, 기능 추가/삭제 용이


🤔 의사결정 과정

Q1. Maven vs Gradle?

선택: Gradle ✅
이유: 개발자가 익숙함, 빌드 속도 빠름

Q2. Properties vs YAML?

선택: YAML ✅
이유:

  • 계층 구조 명확
  • OAuth2 설정 시 가독성 좋음
  • 환경별 설정 분리 쉬움

Q3. MySQL 바로 vs H2 먼저?

선택: H2 먼저 ✅
이유:

  • 설치 불필요
  • 빠른 개발/테스트
  • 나중에 MySQL로 전환 쉬움 (설정만 변경)

Q4. Session 테이블 필요?

선택: 불필요 ✅
이유: Python의 Ephemeral RAG가 세션 관리, Spring은 최종 결과물만 저장

Q5. Inquiry 테이블 추가?

선택: 추가 ✅
이유: CRUD 패턴 연습, 실전 기능


🐛 트러블슈팅

Issue 1: MySQL 없어서 실행 안 됨

문제: spring-boot-starter-data-jpa + mysql-connector가 MySQL 연결 시도
해결: H2 의존성 추가 + application.yaml 설정
교훈: 개발 단계에서는 H2가 편함

Issue 2: Spring Security 기본 로그인 화면

문제: 모든 요청이 로그인 페이지로 리다이렉트
해결: SecurityConfig에서 .anyRequest().permitAll()
교훈: 개발 단계에서는 Security 최소화


📊 현재 상태

프로젝트 진행률: ████░░░░░░ 10%

완료:
✅ 프로젝트 생성
✅ 개발 환경 설정
✅ 아키텍처 설계
✅ ERD 설계

진행 중:
⏳ 없음 (내일 시작)

예정:
📋 ERD 다이어그램 작성
📋 엔티티 클래스 생성
📋 Repository 생성

🎯 내일 할 일 (Day 2)

필수

  1. ERD 다이어그램 작성 (draw.io / ERDCloud)
  2. 폴더 구조 생성 (domain, global)
  3. BaseEntity 구현
  4. Enum 클래스 작성 (Role, OAuth2Provider, IdeaStatus, InquiryStatus)
  5. User 엔티티 작성
  6. Idea 엔티티 작성
  7. Inquiry 엔티티 작성
  8. Repository 인터페이스 작성

선택 (시간 되면)

  • 간단한 컨트롤러로 CRUD 테스트
  • H2 콘솔에서 테이블 확인

🔗 참고 자료


💬 회고

😊 잘한 점

  • H2로 빠르게 개발 환경 구축
  • DDD 구조로 확장성 확보
  • Inquiry 테이블 추가로 CRUD 연습 기회 마련

😅 아쉬운 점

  • 아직 코드를 직접 작성하지 않음 (내일부터!)
  • ERD를 다이어그램으로 그리지 못함

🎓 배운 점

  • Spring Security 6.x 람다 DSL 표준화
  • CSRF 개념과 REST API에서의 불필요성
  • BaseEntity 상속 패턴의 효율성
  • H2 개발 → MySQL 운영 전환 전략

🚀 Day 2에서 만나요!

+ Recent posts