Skip to content

[Dev] 로컬 환경 구성 방법

Bear edited this page May 26, 2023 · 1 revision

프로젝트 로컬 환경 구성 방법

로컬 프로젝트 빌드 시 도커 환경 구성 방법

1. build.gradleapplication.yml 설정

1.1 build.gradle 설정

  • AVRO 스키마 사용 모듈 설정

Downloader 모듈쪽 build.gradle 을 보면 아래와 같은 태스크가 등록되어있음을 확인할 수 있다.

... (중략) ...

def configureJar = tasks.register("configureJar") {
    it.doLast {
        tasks.jar.exclude(
                configurations.additionalSchema
                        .findAll { it.name.endsWith("jar") }
                        .collect { File file ->
                            new ZipFile(file).entries()
                                    .findAll { it.name.endsWith(".class") }
                                    .collect { it.name }
                        }
                        .flatten() as Iterable<String>
        )
    }
    it.dependsOn(tasks.classes)
}

tasks.named("jar") {
    it.dependsOn(configureJar)
}

... (중략) ...

먼저 이 태스크는 AVRO 스키마를 사용하는 모듈에서 사용할 수 있으며, 이 태스크를 통해서 AVRO 모듈에 존재하는 AVRO 스키마파일을 -> JAVA POJO로 변환해주는 역할을 한다. 그리고, 이 POJO 파일을 AVRO의 namespace 영역에 해당하는 패키지 구조에 떨어진다.

이를 통해서 카프카 AVRO 직렬화 & 역직렬화를 수행할 수 있다.

  • application.yml 설정
####################################################################################################
## local
####################################################################################################
spring:
  config:
    activate:
      on-profile: local

  kafka:
    topic: test
    bootstrap-servers: localhost:9092
    properties:
      schema:
        registry:
          url: http://localhost:8085

    producer:
      acks: -1

    consumer:
      group-id: reactive_consumer_group
      enable-auto-commit: false
      auto-commit-interval: 10
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer

다운로드 모듈 쪽에는 위와 같은 local Profile 설정이 존재하는데 이를 통해서 카프카 프로듀서, 컨슈머 설정 등을 수행할 수 있다. 이때, 부트스트랩서버나 레지스트리는 도커 인프라를 활용한다 가정, 위와 같이 localhost로 둔다.

2. IDE 설정

위에서는 AVRO 태스크 정의 및 application.yml에 관련해서 보았다. 현재, 빌드 시점에 도커 컴포즈 파일을 동작하게끔 태스크를 등록해둔 상태여서 이를 통해서 작업할 수 있다.

이 태스크는 루트 모듈에 정의되어있다.

... (중략) ...
dockerCompose {
        kafkaStack {
            executable = '/usr/local/bin/docker-compose-v1'
            dockerExecutable = '/usr/local/bin/docker'
            dockerComposeWorkingDirectory = project.file("$rootDir")

            stopContainers = false
            projectName = 'kafka_local_infra'
            projectNamePrefix = 'kafka_stack_'
            useComposeFiles = [
                    "$infraGithubCloneTargetDir/$kafkaStackPath"
            ]
            systemProperty 'spring.profiles.active', findProperty('spring.profiles.active') ?: 'local'
            isRequiredBy(bootRun)
        }

        mongoDBStack {
            executable = '/usr/local/bin/docker-compose-v1'
            dockerExecutable = '/usr/local/bin/docker'
            dockerComposeWorkingDirectory = project.file("$rootDir")

            stopContainers = false
            projectName = 'mongo_local_infra'
            projectNamePrefix = 'mongo_stack_'
            useComposeFiles = [
                    "$infraGithubCloneTargetDir/$mongoStackPath"
            ]
            systemProperty 'spring.profiles.active', findProperty('spring.profiles.active') ?: 'local'
            isRequiredBy(bootRun)
        }
    }

    task cloneInfraRepo {
        doFirst {
            def folderPath = "$infraGithubCloneTargetDir"
            if (file(folderPath).exists()) {
                delete(file(folderPath))
            }
        }

        doLast {
            def grgit = Grgit.clone(
                    dir: "$infraGithubCloneTargetDir",
                    uri: "$infraGithubRepoUrl"
            )
        }
    }
... (중략) ...

이 태스크는 Infrastrucutre 레포에서 클론을 땡겨받고, 해당 인프라 폴더에서 실제 도커를 동작하는 작업을 수행한다. 이를 IDE 상에서 동작하기 위해서는 아래의 설정이 필요하다.

Screenshot 2023-05-26 at 15 44 27

위와 같이 edit configuration을 클릭한다.

Screenshot 2023-05-26 at 15 51 59

그 이후에 Modify Options를 선택한다.

Screenshot 2023-05-26 at 15 52 40

이 후 add before launch task를 클릭한다.

Screenshot 2023-05-26 at 15 53 20

그 다음에 Run gradle task를 클릭한다.

Screenshot 2023-05-26 at 15 54 25

이 후에 위와 같이 각 서브모듈에서 동작할 dockerCompose 태스크를 추가한다. 주의할 점은 루트 모듈의 dockerComposeUp을 가져오게 될 경우에 모든 서브 프로젝트에 반영되서 빌드 시간이 엄청 느려진다. 따라서, 각 어플리케이션 동작에 해당하는 서브모듈의 태스크로 등록한다.

Screenshot 2023-05-26 at 15 56 21

위와 같이 설정하면 IDE Run 시에 도커 컴포즈가 동작하고 어플리케이션이 구동되는 것을 확인할 수 있다.