# 미림 수습 학습 플랫폼 설정
# 학습 포인트: 설정값은 코드에 안 박고 여기(그리고 환경변수)에 둡니다.
# ${환경변수:기본값} — 환경변수가 있으면 그 값을, 없으면 기본값(로컬 개발용)을 씁니다.
spring:
  application:
    name: mirim-backend
  datasource:
    url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:mirim}
    username: ${DB_USER:mirim}
    password: ${DB_PASSWORD:mirim123}
  jpa:
    hibernate:
      # 학습 포인트: ddl-auto: update의 의미 —
      # 앱이 뜰 때 Hibernate가 엔티티(@Entity 클래스)와 실제 테이블을 비교해서
      # 없는 테이블/컬럼을 자동으로 만들어 준다(CREATE/ALTER를 대신 실행).
      # 개발 단계에선 편하지만 운영에선 위험하다:
      #  - 컬럼 삭제/이름 변경은 반영하지 못해 엔티티와 테이블이 조용히 어긋난다.
      #  - 어떤 DDL이 언제 실행됐는지 기록이 남지 않아 되돌리기가 불가능하다.
      # 운영에선 validate(검증만)로 바꾸고 Flyway 같은 마이그레이션 도구로 스키마를 관리한다.
      ddl-auto: update   # 개발 단계: 엔티티에 맞춰 테이블 자동 생성/수정
    # open-in-view: 화면 렌더링이 끝날 때까지 DB 커넥션을 물고 있는 기능. REST API 서버에선
    # 커넥션 낭비일 뿐이라 끈다. (끄면 LAZY 로딩은 반드시 @Transactional 안에서 끝내야 한다)
    open-in-view: false
    properties:
      hibernate:
        format_sql: true

server:
  port: 8080
  error:
    # 학습 포인트: 스프링 기본값은 에러 응답에 message를 "안 싣는" 것이다(never).
    # 우리는 ResponseStatusException에 한국어 사유("이미 사용 중인 아이디입니다" 등)를
    # 정성껏 담는데, 이 설정이 없으면 그 문구가 클라이언트에 전달되지 않아
    # 프론트의 err.response.data?.message가 항상 undefined였다(사용자는 두루뭉술한
    # 폴백 문구만 봄). always로 켜서 서버가 쓴 안내가 화면까지 닿게 한다.
    # 주의: 예외 메시지가 노출되므로, 예외에는 내부 정보(SQL, 경로 등)를 담지 말 것.
    include-message: always
  servlet:
    session:
      timeout: 8h        # 하루 근무 동안 로그인 유지
      cookie:
        # 학습 포인트: 세션 쿠키에 붙이는 3대 보안 플래그. 세션 방식 인증에선 필수다.
        http-only: true            # JS(document.cookie)로 못 읽는다 → XSS로 세션 탈취 방어
        secure: ${COOKIE_SECURE:false}  # HTTPS로만 쿠키 전송(운영은 true). 로컬(http)은 false여야 로그인됨
        same-site: strict          # 다른 사이트에서 온 요청엔 쿠키를 안 붙인다 → CSRF 방어의 핵심

# 텔레그램 알림 (TelegramNotifier) — 학생 가입·제출을 멘토 텔레그램으로.
# 학습 포인트: 둘 다 비어 있으면 알림 기능이 통째로 꺼진다. 로컬 개발에선 아무것도
# 설정하지 않아도 앱이 그대로 돈다 — "설정이 없으면 기능이 꺼지는" 안전한 기본값 설계.
# 실제 토큰은 운영 서버 .env에만 둔다(절대 git에 넣지 않는다!).
telegram:
  bot-token: ${TELEGRAM_BOT_TOKEN:}
  chat-id: ${TELEGRAM_CHAT_ID:}

logging:
  level:
    # 학습 포인트: 개발은 DEBUG로 자세히, 운영은 INFO로. 로그도 자원이고, 과한 로그는 비용·노이즈다.
    dev.awesomedev.mirim: ${LOG_LEVEL:DEBUG}
