백엔드기술/스프링프레임워크

Container Driven Development 시작하기

RevFactory 2021. 1. 30. 00:27

Container Driven Development 는 컨테이너화 된 환경 내에서 코드를 작성, 실행 및 테스트하는 개발 Flow이다. 컨테이너를 사용하면 애플리케이션의 빌드 및 패키징에 적용하며 자동화된 테스트를 비롯해 개발, Stage, Production에 단일 된 Artifact를 제공함으로써 전통적인 work flow에서 발생할 수 있는 많은 문제를 해결한다. 특히 환경차이 때문에 발생하는 문제와 버그가 최소화된다. 또한 빌드, 테스트, 배포 전반에 걸쳐 자동화된 프로세스 구축이 가능해지는데 이는 더 빠른 속도로 지속적 배포가 가능하게 한다.

 

 

컨테이너는 OS 수준에서 CPU, 메모리, Storage, 네트워크 리소스를 가상화한다. 민감한 프로세스는 하나의 논리적 Sandbox로 격리될 수 있으며, 시스템에서 실행 중인 다른 프로세스에 표시되지 않는다. 이러한 격리는 런타임 환경을 단순화하고 동일한 호스트를 사용할 수 있는 유사한 애플리케이션 간의 의도하지 않는 상호 작용을 방지하는 데 도움이 된다.


컨테이너는 Dockerfile을 사용하여 빌드하는 것이 일반적인데, 동일한 Dockerfile에서 빌드된 모든 이미지가 동일하게 작동함을 보장한다. 이미지별로 버전을 지정할 수 있으며, 여러 컨테이너에 걸쳐있는 복잡한 애플리케이션의 구성 요소를 정확하게 정의한다. 코드 변경 시 푸시 이벤트에 연결하여 새 컨테이너 이미지 빌드를 자동화할 수 있는데, 이는 지속적 통합 및 배포 파이프라인을 통해 엄격한 테스트를 통과시키고 새 버전의 배포 속도를 높일 수 있게 한다.


이처럼 컨테이너 기반의 개발은 개발자의 생산성을 향상할 뿐만 아니라 조직의 운영 및 프로세스를 표준화하는데 도움을 준다. 애플리케이션이 컨테이너에 패키징 되면 운영 팀이 테스트를 진행하고, Stage 단계를 거쳐 Production 까지 이동하는데 표준화되고 훨씬 쉬워진다.


Spring Boot는 2.3 버젼에서 훨씬 쉬운 방법으로 Docker 이미지를 만들 수 있는 새로운 기능이 추가되었다. 로컬환경에서 테스트 환경, Production 에 이르기까지 애플리케이션이 동일한 환경에서 실행되도록 보장하게 된다. 특히 Spring Boot DevTools 은 Docker 를 이용한 로컬 개발시에 더 나은 개발환경을 제공한다.

 

Gradle 프로젝트 기준으로 설명을 해보자면, build 방식에 bootBuildImage 가 추가가 된 것을 확인할 수 있는데, 로컬에서 Docker 데몬을 활성화 한 상태에서 해당 빌드를 수행하게 되면 개발중인 애플리케이션의 Docker 이미지가 생성이 된다. 

 

일반적으로 도커 이미지를 생성하고 난 후에 코드 변경사항이 생기면 다시 도커 이미지를 빌드하고 도커에 올려야 하지만 DevTool 은 프로젝트가 빌드되었을때 실시간으로 도커에 변경사항을 반영해 준다.

 

우선 DevTools 를 디펜던시에 추가를 하고, 프로퍼티에서 remote secret 를 지정한다.

spring:
	devtools.remote:secret=secret_code
    

그리고 아래와 같이 build.gradle 에 classpath 를 추가해준다.

allprojects {
	afterEvaluate {
		bootJar {
			classpath configurations.developmentOnly
		}
	}
}

빌드된 도커 이미지를 실행하고 확인한다.

docker run --tty --publish 8080:8080 docker-devtool:0.0.1-SNAPSHOT
$ curl http http://localhost:8080
Hello World

 

IDE에 아래와 같은 Remote Application 을 생성하여 실행한다.

이제 코드를 변경하고 빌드를 수행해보면 도커에 바로 반영이 되는 것을 확인 할 수 있다.

$ curl http http://localhost:8080
Hello Universe

 

자, 이제 로컬에서도 Container 기반의 개발환경을 통해 개발을 시작해보자.

 

 

Reference

 

Creating Docker Images With Spring Boot https://youtu.be/1w1Jv9qssqg

oak-tree.tech/blog/container-driven-development

 

Container Driven Development

Revolutionizing software development one box at a time

oak-tree.tech

blog.s1h.org/docker-tdd/

 

Test Driven Development for Docker Images

Given the ability to customise the runtime environment, responsibility for providing and maintaining a proper environment shifts from IT-Ops towards developers. Fortunate enough, we can apply well-known methods to make this effort less tedious: automated t

blog.s1h.org

www.slideshare.net/OshaneMrRebirth/container-driven-development-193273979

 

Container Driven Development

Typically, we first write and test our applications and then work on containerizing them right before shipping or deployment. For most of us, the first time ou…

www.slideshare.net