자바 웹 프로젝트 #1 application.properties

Dear·2025년 7월 10일

TIL

목록 보기
59/74

💙 DB 설정

// resources/application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/aibe2?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=DB아이디
spring.datasource.password=비밀번호

  • useSSL=false : SSL 없이 접속하겠다는 의미 (기본값은 true). 인증서 없이 접속할 때 오류 방지
  • serverTimezone=UTC : serverTimezone은 서버 시간대가 뭔지 명확히 알려주는 옵션으로 MySQL 서버 시간대를 UTC로 명시적으로 지정해 타임존 경고 방지
  • allowPublicKeyRetrieval=true : 서버의 RSA 공개키를 클라이언트가 요청할 수 있게 허용 (MySQL 8 이상에서 필요)

MySQL 8.x 이상에서는 보안 강화를 위해 기본 SSL 연결 및 공개키 요구 사항이 생겼다.
명시적으로 옵션을 주지 않으면 JDBC 드라이버가 경고 또는 예외를 던질 수 있다.

타임존 경고 방지

MySQL과 Java(Spring Boot) 사이의 타임존(Timezone) 불일치를 방지

MySQL은 내부적으로 타임존 정보를 저장하고, JDBC 드라이버는 자바의 타임존과 비교하려 한다. 하지만 MYSQL 서버 설정에 타임존이 명확하지 않으면
The server time zone value 'KST' is unrecognized or represents more than one time zone.
같은 경고나 에러가 뜰 수 있다.

해결방법

spring.datasource.url=jdbc:mysql://localhost:3306/aibe2?serverTimezone=UTC
JDBC가 MySQL 서버의 타임존을 UTC(세계 표준시)로 간주하도록 명시하게 된다.

RSA 공개키

비대칭 암호화 알고리즘 중 하나로, 두 개의 키(열쇠)를 사용한다.

키 종류설명
🔓 공개키 (Public Key)누구나 볼 수 있음
🔐 개인키 (Private Key)오직 서버만 가짐 (비밀!)
  1. 클라이언트가 서버의 공개키를 받아옴
  2. 비밀번호를 공개키로 암호화해서 보냄
  3. 서버는 자신의 개인키로만 복호화해서 확인

MySQL 8부터는 기본 인증 방식이 caching_sha2_password로 바뀌었다.
이 인증 방식은 비밀번호를 안전하게 전송하기 위해 RSA 공개키를 사용해 암호화한다. 하지만 클라이언트(JDBC)는 이 공개키를 서버에서 직접 받아와야만 비밀번호 암호화해 전송할 수 있다.
기본설정에서는 서버가 클라이언트에게 공개키를 넘겨주는 걸 허용하지 않아
allowPublicKeyRetrieval=true 설정이 필요하다.

SSL (Secure Sockets Layer)

데이터를 암호화해서 안전하게 통신하는 기술

https://로 접속할 때 자동으로 SSL을 사용한다.
주소창의 🔒 자물쇠 표시 = SSL 적용됨

SSL vs RSA

구분SSLRSA 공개키
목적통신 전체를 암호화특정 데이터(예: 비밀번호)만 암호화
범위전체 트래픽제한된 정보 (로그인 등)
사용 방식인증서 기반공개키 기반
MySQL에서useSSL=true로 설정allowPublicKeyRetrieval=true로 공개키 요청 가능

💙 DB 콘솔 출력 설정

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type.descriptor.sql=trace
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
  • spring.jpa.properties.hibernate.show_sql=true
    실행되는 SQL 쿼리를 콘설에 출력한다.
    운영 환경에서는 보안과 성능을 위해 꺼두는 것이 좋다.

  • spring.jpa.properties.hibernate.format_sql=true
    출력되는 SQL을 보기 좋게 포맷한다. (show_sql=true필수)

  • logging.level.org.hibernate.type.descriptor.sql=trace
    Hibernate가 SQL에 바인딩하는 파라미터 값까지 로그에 출력한다.
    예시 로그 : binding parameter [1] as [VARCHAR] - [abc123]

  • spring.jpa.hibernate.ddl-auto=update
    애플리케이션 시작 시, DB 테이블을 자동 생성하거나 변경한다.
    설정 값

    설정 값설명
    none아무 작업도 하지 않음
    create기존 테이블 삭제 후 새로 생성
    create-drop애플리케이션 종료 시 테이블 삭제
    update변경된 부분만 반영 (개발 환경에서 많이 사용)
    validate스키마 일치 여부만 검증, 변경은 하지 않음
  • spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
    Hibernate가 사용할 dB의 SQL 방언(dialect)을 지정한다.
    MySQL8Dialect는 MySQL 8 버전에 최적화된 SQL문법이다.

💙 파일 업로드 설정

spring.servlet.multipart.maxFileSize=20MB
spring.servlet.multipart.maxRequestSize=100MB

itemImgLocation=D:/shop/item
uploadPath=file:///D:/shop/
  • maxFileSize=20MB
    단일 파일 최대 업로드 용량을 20MB로 제한한다.
  • maxRequestSize=100MB
    전체 요청의 최대 용량을 100MB로 제한한다.
    한 번에 여러 파일을 업로드할 경우 총합이 100MB를 넘으면 업로드 실패
  • itemImgLocation
    서버에서 이미지 파일을 저장하는 실제 경로이다.
    이 값은 @Value("${itemImgLocation}") 같은 식으로 서비스 클래스에서 주입받아 사용한다.
  • uploadPath
    업로드한 이미지를 웹에서 접근할 수 있도록 매핑할 루트 경로이다.
    file:///D:/shop/ 형식으로 써야 Spring이 실제 파일 시스템 경로로 인식한다.
    사용자가 업로드한 파일을 /images/item1.jpg로 접근할 때, 내부적으로는 D:/shop/item/item1.jpg에 매핑될 수 있게 사용한다.

🤍 회고

수업 시간에 만들었던 프로젝트를 복습하며 직접 다시 구현해보려 한다.
그에 앞서, 프로젝트의 기본 설정들을 다시 한 번 점검하고 정리해보았다.

profile
친애하는 개발자

0개의 댓글