ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로젝트 기본 설정
    이커머스 devops/국비교육 2025. 11. 15. 22:27

    1. Docker - mysql

    docker 실행 및 mysql 데이터베이스 설정

    docker run --name spring-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=spring_db -d mysql:8.0
    • -name spring-mysql : 컨테이너의 이름을 spring-mysql로 지정
    • p 3306:3306 : 로컬 머신의 3306번 포트와 컨테이너의 3306번 포트 연결
    • e MYSQL_ROOT_PASSWORD=root : MySQL의 root 계정 비밀번호를 root로 설정
    • e MYSQL_DATABASE=spring_db : 컨테이너 생성 시 spring_db라는 이름의 데이터베이스를 미리 생성
    • d: 컨테이너를 백그라운드에서 실행합니다

     

     

     

     

    application.yaml 설정

    spring:
      # 데이터베이스 연결 설정
      datasource:
        url: jdbc:mysql://localhost:3306/spring_db?useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
    
      # JPA 및 Hibernate 설정
      jpa:
        hibernate:
          # ddl-auto: 애플리케이션 실행 시 스키마(테이블) 처리 전략
          # none: 아무 작업도 하지 않음 (운영 환경 추천)
          # create: 기존 테이블 삭제 후 다시 생성
          # update: 변경된 부분만 반영
          ddl-auto: none 
        properties:
          hibernate:
            # MySQL 8 버전에 맞는 Dialect(방언) 설정
            dialect: org.hibernate.dialect.MySQL8Dialect
    
    # 로깅 레벨 설정
    logging:
      level:
        # Hibernate가 실행하는 SQL 쿼리를 DEBUG 레벨로 로그에 출력
        org.hibernate.SQL: DEBUG
    
    # 내장 웹 서버 설정
    server:
      port: 8080
    • 스프링 부트 애플리케이션을 실행 시 Docker로 실행 중인 MySQL 데이터베이스에 자동 연결

     

     

     

     

    2. Flyway: 데이터베이스 스키마 버전 관리

    Flyway 동작 원리

    • Flyway의 핵심은 flyway_schema_history라는 메타데이터 테이블
      • 애플리케이션이 실행되면 Flyway는 DB에 flyway_schema_history 테이블이 있는지 확인하고 없으면 자동으로 생성
      • 설정한 마이그레이션 파일 위치를 스캔하여 SQL 파일 목록을 읽어온다
      • lyway_schema_history 테이블의 기록과 SQL 파일 목록을 비교하여, 아직 실행되지 않은 새로운 버전의 SQL 파일을 찾는다
      • 새로운 SQL 파일들을 버전 순서대로 DB에 실행한다
      • 실행이 성공하면 해당 파일의 버전, 이름, 실행 시간 등의 정보를 flyway_schema_history 테이블에 기록한다
    • 이 과정을 통해 어떤 변경사항이 언제 적용되었는지 추적하며 항상 최신 버전의 DB 스키마를 유지한다

     

     

    build.gradle 추가

    dependencies {
        implementation 'org.flywaydb:flyway-core'
        implementation 'org.flywaydb:flyway-mysql'
    }

     

     

    마이그레이션 SQL 파일 작성

    -- src/main/resources/db/migration/V1__init_table.sql
    CREATE TABLE example (
        id BIGINT NOT NULL AUTO_INCREMENT,
        name VARCHAR(255),
        PRIMARY KEY (id)
    );
    • Flyway는 V<버전>__<설명>.sql 형식의 파일명을 규칙으로 사용한다
    • 파일은 src/main/resources/db/migration 경로에 위치

     

     

    application.yml 추가

    spring:
      flyway:
        enabled: true # Flyway 활성화
        # 마이그레이션 파일 위치 지정 (기본값)
        locations: classpath:db/migration
    • 애플리케이션 실행시 Flyway가 SQL 파일을 읽어 데이터베이스에 자동으로 테이블 생성한다
     
     
     

    3. HikariCP를 이용한 DB 커넥션 풀 관리

    HikariCP의 역할
    • HikariCP는 Spring Boot 2.0부터 기본으로 채택된 매우 빠르고 안정적인 커넥션 풀 라이브러리
    • 개발자가 별도 설정을 하지 않아도 Spring Boot가 자동으로 HikariCP를 설정하여 최적의 성능을 제공한다
     

     

     

    HikariCP의 장단점

    • 장점
      • 압도적인 성능 : 바이트 코드 조작, Lock 최소화 등 저수준 최적화를 통해 다른 어떤 커넥션 풀보다 빠르며 대규모 트래픽 상황에서 큰 차이를 만든다
      • 높은 안정성과 신뢰성 : 커넥션 누수(Leak)를 방지하고, 유휴 커넥션을 효과적으로 관리하는 등 안정성에 초점을 맞춰 설계
      • 간결한 구성
      • 활발한 유지보수
    • 단점 
      • 제한적인 고급 기능
      • 복잡한 내부 구조

     

     

    Application.yml 추가

    spring:
      datasource:
        hikari:
          maximum-pool-size: 10  # 최대 커넥션 개수
          connection-timeout: 30000 # 커넥션을 얻기 위해 대기하는 최대 시간 (ms)
          max-lifetime: 1800000 # 커넥션의 최대 수명 (ms)

     

     

    4. Undertow: 경량 웹 서버로 교체하기

    build.gradle 추가

    dependencies {
        // 기존 Tomcat 의존성 제외
        implementation('org.springframework.boot:spring-boot-starter-web') {
            exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
        }
        // Undertow 의존성 추가
        implementation 'org.springframework.boot:spring-boot-starter-undertow'
    }
    • Undertow : 가볍고 성능이 뛰어난 웹 서버
    • 기본 내장 웹 서버인 Tomcat보다 적은 리소스를 사용하면서 높은 요청 처리량을 제공하여 고성능이 요구되는 환경에 적합하다

     

     

     

     

    5. MapStruct: 객체 매핑 자동화

    build.gradle 추가

    dependencies {
        implementation 'org.mapstruct:mapstruct:1.5.5.Final'
        annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
    }

     

     

    Mapper 인터페이스 작성 예제

    @Mapper(componentModel = "spring") // MapStruct가 생성할 구현체를 스프링 Bean으로 등록
    public interface UserMapper {
    
        // 필드명이 다를 경우 @Mapping으로 직접 지정
        @Mapping(source = "email", target = "emailAddress")
        UserDto toDto(UserEntity entity);
    
        // 필드명이 같다면 별도 매핑 없이 자동으로 변환
        UserEntity toEntity(UserDto dto);
    }
    • @Mapper(componentModel = "spring") : 컴파일 시점에 MapStruct가 이 인터페이스의 구현체를 자동으로 생성하며, 이를 스프링 컨테이너에 Bean으로 등록한다
    • @Mapping(source = "...", target = "...") : UserEntity의 email 필드를 UserDto의 emailAddress 필드로 매핑하도록 지정하며 필드명이 동일한 경우에는 이 어노테이션을 생략해도 자동으로 매핑된다
    728x90
Designed by Tistory.