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);
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;
}
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'
}
group 'org.example'
version '1.0'
publishing {
publications {
maven(MavenPublication) {
groupId = 'org.example'
artifactId = 'mapper'
version = '1.0'
from components.java
}
}
}
빌드하기
./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 {
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;
}
}
UserDto.java
public class UserDto {
private Long id;
private String username;
@Override
public String toString() {
return "UserDto{" +
"id=" + id +
", username='" + username + '\'' +
'}';
}
}
테스트 코드
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. 참고