[Gradle] 라이브러리 만들고 사용하기(Maven Local Repository)

Bobby·2021년 9월 25일
3

즐거운 개발일지

목록 보기
9/22
post-thumbnail
post-custom-banner

1. Preview

  • 개발을 하다보면 효율적으로 누군가 만들어 놓은 라이브러리들을 가져다 쓴다.
  • 자바(스프링)으로 개발을 한다면 보통 빌드 툴(Gradle, Maven)을 사용하여 라이브러리 관리를 한다.
  • 원격 저장소(MavenCentral, Jcenter, google, ...etc)에서 필요한 라이브러리들을 다운받아서 로컬 저장소(Gradle : ~/.gradle 폴더, Maven : ~/.m2 폴더)에 저장한다.
  • 로컬 저장소에서 찾고 없으면 원격 저장소에서 다운 받는다.
  • gradle 프로젝트 예)
  • 나만의 라이브러리를 만들어서 프로젝트에 재사용 해보자.

2. 라이브러리 만들기

  • 라이브러리를 만들어 로컬 저장소에 저장한다.

Gradle 프로젝트 생성

  • GroupId : org.example
  • ArtifactId : mapper
  • version : 1.0

ModelMapper.java

  • 간단하게 객체 타입 변경하는 mapper를 만들어보자.
package org.example.mapper;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ModelMapper {

    public <R, T> T map(R resource, Class<T> target) {
        T instance = null;
        try {
            // 변환 할 객체 생성
            instance = target.getConstructor().newInstance();
            Field[] declaredFields = resource.getClass().getDeclaredFields();
            Method[] declaredMethods = target.getDeclaredMethods();
            for (Field field : declaredFields) {
                field.setAccessible(true); // private 접근
                for (Method method : declaredMethods) {
                    String setter = setterMethod(field.getName());
                    // 같은 필드명 있으면 값 넣기
                    if (method.getName().equals(setter)) {
                        try {
                            method.invoke(instance, field.get(resource));
                        } catch (IllegalAccessException | InvocationTargetException e) {
                            e.printStackTrace();
                        }
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return instance;
    }

    // setter method name
    private String setterMethod(String fieldName) {
        return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
    }
}

Maven Local Repository에 저장하기

  • Gradle 설정에서 maven 로컬 저장소를 사용하도록 한다.

build.gradle

  • maven 로컬 저장소를 사용하므로 빌드된 파일은 ~./m2 폴더에 저장된다.
plugins {
    id 'java'
    id 'maven-publish' // maven 사용
}

group 'org.example'
version '1.0'

publishing {
    publications {
        maven(MavenPublication) {
            
            // groupId, artifactId, version을 따로 지정하지 않으면 처음 생성할 때 지정한 기본설정으로 생성한다. (생략가능)
            groupId = 'org.example'
            artifactId = 'mapper'
            version = '1.0'

            from components.java
        }
    }
}

빌드하기

  • gradle wrapper 이용
	./gradlew clean publishToMavenLocal  

  • .m2 폴더 아래 저장된 것을 확인 할 수 있다.

3. 라이브러리 사용하기

  • 위에서 만든 라이브러리를 사용해 본다.

Gradle 프로젝트 생성

  • GroupId : org.example
  • ArtifactId : test
  • version : 1.0-SNAPSHOT

Build.gradle

  • maven 로컬 저장소를 사용하도록 지정 : mavenLocal()
plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenLocal() // 로컬 저장소 사용
    mavenCentral() // 원격 저장소
}

dependencies {
    // {groupId}:{artifactId}:{version}
    implementation 'org.example:mapper:1.0'

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

test {
    useJUnitPlatform()
}
  • 라이브러리 확인

테스트

UserEntity.java

  • 변환 전 객체
public class UserEntity {

    private Long id;
    private String username;
    private String password;

    public UserEntity(Long id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    
    // getter
   
}

UserDto.java

  • 변환 할 객체
public class UserDto {

    private Long id;
    private String username;
    
    @Override
    public String toString() {
        return "UserDto{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
    
    // getter, setter
    
}

테스트 코드

public class MapperTest {

    @Test
    void mapper_test() {
        UserEntity userEntity = new UserEntity(1L, "kim", "1234");
        ModelMapper modelMapper = new ModelMapper();

        UserDto userDto = modelMapper.map(userEntity, UserDto.class);

        Assertions.assertEquals(1L, userDto.getId());
        Assertions.assertEquals("kim", userDto.getUsername());
        System.out.println("userDto = " + userDto);
    }
}
  • 결과

코드


4. 참고

profile
물흐르듯 개발하다 대박나기
post-custom-banner

0개의 댓글