최근 사내에서 라이브러리를 개발하여 이를 이야기해 보려 한다.
현재 팀이 운영하는 api의 특성상 해당 api를 이용하는 client에게 api를 제공하는 것보다는 라이브러리를 제공하는 것이 업무에 더 효율적이라는 판단이 들어 팀은 라이브러리를 제공하기로 결정했다. 여기서 말하는 효율에는 관리(사용자에 따른 로그, 오류, 기타 데이터..), 생산성(클라이언트 측, 서버 측 모두 포함)을 의미한다.
이제 라이브러리를 만들고 업로드하는 과정을 간단하게 살펴보자.
먼저, 사내에는 Nexus라는 사설 레포지토리가 존재한다. Nexus는 가장 인기있는 레포지토리 매니저 오픈소스로 jar 뿐만 아니라 다양한 포맷을 지원한다.
로컬 개발환경에서 Nexus는 도커 컨테이너로 띄웠으며 아래와 같은 도커 컴포즈로 실행했다. 이미지는 klo2k/nexus 를 이용했는데, mac os와의 호환성 때문이다. 직접 nexus를 설치해도 되고 적당한 도커 이미지를 선택해도 될 것이다.(다른 이미지는 안 써봐서.. 아마도..!?)
version: "3.8"
services:
# docker-compose --example nexus up -d
nexus:
profiles:
- example
platform: linux/arm64
image: klo2k/nexus3:3.29.2-02
container_name: nexus-example
restart: always
environment:
- TZ=Asia/Seoul
ports:
- '8183:8081'
volumes:
- .system/docker-data/nexus/data:/nexus-data
기본 포트는 8081 포트인데, 호스트의 8183 포트에 컨테이너 내부의 8081 포트를 연결했다.
이후 로그인을 하고 비밀번호를 변경하는 과정을 거치면 다음의 화면이 보인다. 최초 비밀번호는 컨테이너 내부의 nexsus-data 경로 어딘가에 있을 것이다.
이후 바로 넥서스에 라이브러리를 업로드 해도 되지만, 개발 편의상 다음의 배포 덮어쓰기 설정을 해주는 것이 좋다.(Allow redeploy)
아래 화면이 찾기 어렵다면 경로는 다음과 같다.
http://localhost:8183/#admin/repository/repositories:maven-releases
아래는 넥서스에 퍼블리시 또는 임포트 하기 위한 기본 gradle 설정이다. (groupId, artifactId는 집단의 규칙에 맞춰 적당한 값을 넣으면 된다.)
plugins {
id 'java'
id 'maven-publish'
}
group = 'org.example'
version = '1.0.0'
repositories {
mavenCentral()
maven {
url http://localhost:8183/repository/maven-releases
credentials {
username admin
password 1234
}
allowInsecureProtocol = true
}
}
publishing {
repositories {
maven {
if (version.toString().endsWith('SNAPSHOT')) {
url http://localhost:8183/repository/maven-snapshots
} else {
url http://localhost:8181/repository/maven-releases
}
credentials {
username admin
password 1234
}
allowInsecureProtocol = true
}
}
publications {
maven(MavenPublication) {
groupId = 'org.example.dykim'
artifactId = 'hello'
from components.java
}
}
}
dependencies {
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
implementation 'org.example.dykim:hello:1.1.0@jar'
implementation 'org.apache.commons:commons-lang3:3.14.0'
}
test {
useJUnitPlatform()
}
이제 나의 코드를 넥서스에 올려보자. 코드는 아래와 같이 작성했다.
package org.example;
public class Hello {
public String run(String s) {
return "Hello, " + s;
}
}
프로젝트 빌드 후 ./gradlew publish를 수행하거나 인텔리제이를 이용할 경우 오른쪽 코끼리 모양의 그레이들 태스크 중 publish를 클릭하면 된다.
아래와 같이 내가 방금 업로드 한 jar 파일이 넥서스 레포지토리에 보이는 것을 확인할 수 있다.
이제 이 jar 파일은 해당 넥서스 리포지토리에 접근 권한이 있는 사용자들은 다운로드할 수 있다.
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.example.Hello;
@Slf4j
public class Sample {
public static void main(String[] args) {
Hello hello = new Hello();
log.info(hello.run("히히"));
}
}
plugins {
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
repositories {
mavenCentral()
maven {
url NEXUS_RELEASE_URL
credentials {
username NEXUS_USER_NAME
password NEXUS_PASSWORD
}
allowInsecureProtocol = true
}
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.example.dykim:hello:1.1.0@jar'
}
tasks.named('test') {
useJUnitPlatform()
}
아래와 같이 내가 배포한 라이브러리의 로그가 잘 찍히는 것을 확인할 수 있다.