보통 Maven의 장점과 Ant의 장점을 합쳐 놓은 빌드 툴로 불리우는데 XML대신 Groovy DSL로 작성되어 라인수가 훨씬 적고 task단위로 만들어 실행 할 수 있으며 개발자가 필요한 빌드로직을 조합하여 사용 가능합니다. 그리고 Gradle Wrapper를 사용하여 Gradle이 설치되지 않은 환경에서도 빌드 가능합니다.
설치방법
Gradle 수동설치 링크에서 Install 설치파일을 다운받아 풀고 GRADLE_HOME, 실행파일 경로를 PATH에 잡아주면 됩니다.
추가로 윈도우 환경에서 UTF-8 빌드환경을 만들기 위해 아래와 같이 GRADLE_OPTS을 설정합니다.
GRADLE_OPTS="-Dfile.encoding=UTF-8"
초기화하기(cmd)
명령어를 통해 gradle을 초기화 하는 방법은 아래와 같습니다.
$ gradle init --type java-library
type값은 basic, java-library, pom, groovy-library, scala-library가 있습니다.
위와 같이 실행하면 gradle의 기본 설정 생성과 함께 src 기본폴더가 생성됩니다.(자세한 구조는 아래 IDE에서…)
초기화하기(IntelliJ)
Gradle타입의 새 프로젝트를 선택하고 Next를 클릭합니다.
GroupId, ArtifactId를 선택하고 Next를 클릭합니다.
필요한 선택항목을 선택 후 Next를 클릭합니다.
Use auto-import : dependency 추가시 자동으로 import하는 옵션입니다.
Create directories for empty content roots automatically : 이 항목을 선택하면 자동으로 src폴더와 하위 구조가 생성됩니다.
Use default gradle wrapper : Gradle Wrapper를 생성해줍니다.(gradlew.bat …)
Use gradle wrapper task configuration : Gradle Wrapper를 task를 통해 실행할 수 있도록 스크립트를 만듭니다.
Use local gradle distribution : 로컬에 설치한 gradle경로를 잡아줍니다.
선택후 Finish를 누르면 다음과 같이 gradle기반 JavaProject가 생성됩니다.
일반적인 서비스 구성이 위와 같은 상황에서 Client가 늘어날 경우 웹 서버나 DB서버에서 병목현상이 발생할 수 있으며 병목지점별로 해결 방안이 필요합니다.
Web서버 확장
Web서버가 stateless한 구조일 경우 아래와 같이 다수의 Web서버를 두어 부하를 분산 시킬 수 있습니다.
stateful : 서버쪽에 client와 server의 연속된 동작 상태정보를 저장하는 형태
stateless : 서버쪽에 client와 server의 연속된 동작 상태정보를 저장하는 않는 형태
DB 확장
DB구성이 위와 같을 경우 성능향상을 위해 “Scale Up”과 “Scale Out”을 고려해 볼 수 있습니다.
scale up : 장비의 성능을 높여 성능향상
scale out : 장비의 개수를 늘려 성능향상
DB Read/Write 분리,분산
대부분의 서비스는 Read가 Write보다 대략 7:3, 8:2비율로 더 많은데 이럴때 Read/Write DB를 분리하면 DB서버의 부하를 줄일 수 있습니다.
일반적으로 Master DB를 Write, Replication되는 Slave DB를 Read로 사용하는데 기본적으로 4대로 구성합니다.
Master : Write
Slave 1,2,3 : Read
1번서버 장애시 2번서버는 서비스를 하며 3번 서버는 서비스를 중단하고 1번서버 복구를 위한 DB복사를 진행해야합니다.
서비스중인 DB에서 복사시 부하가 가중되므로 여분의 DB가 필요합니다.
Eventual Consistency
Master의 내용을 Slave로 Replication하는 과정은 동기/비동기 방식이 있는데 비동기식일 경우 데이터 불일치가 발생할 수 있습니다.
불일치하더라도 시간이 지나면 데이터가 같아지는데 이를 “Eventual Consistency”라고 합니다.
데이터 일관성이 중요한 경우 Read를 분리할때 위와 같은 문제점을 인지해야합니다.
Read/Write DB 분기방식으로는 아래와 같은 방법이 있습니다.
DBProxy 서버를 이용
프록시 서버가 쿼리를 분석하여 select시는 Read서버, 그 외엔 Master서버로 분기해줍니다.
MySql Proxy, MaxScale …
MySql Replication Jdbc Driver 사용
Jdbc Driver상에서 내부적으로 readonly 옵션에 따라 Master/Slave장비를 선택해줍니다.