1. JMapper Framework란?
JMapper Framework는 Java Bean에서 Java Bean Mapper로 주석 및 / 또는 XML을 사용하여 데이터를 동적으로 전달할 수 있습니다.
- 대상 객체 생성 및 보강
- 특정 논리를 매핑에 적용
- XML 파일 자동 관리
- 1 대 N 및 N 대 1 관계 구현
- 명시 적 전환 구현
- 상속 된 구성 적용
JMapper는 Javassist 프레임 워크를 기반으로하며, 이 프레임 워크의 성능은 성능 저하없이 다량 화, 동적 맵핑, 다중 관계형 맵핑, 상속 된 맵핑 및 기타 기능을 적용 할 수 있는 기능임.
2. Maven
<dependency>
<groupId>com.googlecode.jmapper-framework</groupId>
<artifactId>jmapper-core</artifactId>
<version>1.6.0.1</version>
</dependency>
3. 일반적인 사용방법(1대1 매핑)
//Source Model
public class User {
private long id;
private String email;
private LocalDate birthDate;
}
//Destination Model
public class UserDto {
private long id;
private String username;
}
JMapper는 Source Model을 Destination Model로 동적으로 변환시키는 기능을 한다.
즉, User 클래스의 데이터를 UserDto 클래스의 속성으로 동적으로 매핑해서 클래스를 변환시키는 이야기다.
API, Annotation, XML 총 3가지 방법으로 JMapper 등록이 가능한데, 이 중에서 Annotaion과 XML을 사용하도록 한다.
//Destination Model에 Annotation 추가
public class UserDto {
@JMap
private long id;
@JMap("email")
private String username;
}
id 필드는 소스 bean과 동일한 이름으로 대상 필드 이름을 제공할 필요가 없음.
username 필드의 경우 User 클래스의 email 필드에 해당한다고 언급해야 함.
그 다음 소스 및 대상 Bean을 JMapper로 전달하면 됨.
public void givenUser_whenUseAnnotation_thenConverted(){
JMapper<UserDto, User> userMapper = new JMapper<>(UserDto.class, User.class);
User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20));
UserDto result = userMapper.getDestination(user);
System.out.println("USER : " + result);
System.out.println("USERDTO : " + user);
}
4. Global Mapping
소스 Bean과 대상 Bean 모두에 동일한 이름을 가진 여러 필드가 있는 경우 글로벌 맵핑을 활용할 수 있다.
만약 id와 email의 두개의 필드를 가진 새로운 클래스가 있다고 가정한다.
@JGlobalMap
public class UserEmailDto {
private long id;
private String email;
// standard constructor, getters, setters
}
User의 id,email 필드와 UserEmailDto의 id, email 필드 이름이 동일하기 때문에 @JMap으로 명시할 필요 없이 @JGlobalMap으로 매핑이 가능하다.
public void givenUser_whenUseApiGlobal_thenConverted() {
JMapper< UserEmailDto, User> userMapper= new JMapper<>(
UserEmailDto.class, User.class);
User user = new User(
1L,"john@test.com", LocalDate.of(1980,8,20));
UserEmailDto result = userMapper.getDestination(user);
}
5. Custom Conversions
JMapper를 사용하여 사용자 정의 변환(=>Custom Conversions)을 사용하는 방법이다.
사용자 정의 변환이 무엇이냐면, User를 예로 들어서 birthdate 생일에 대한 필드가 존재한다.
일반적으로 생각해보았을때, 생일을 가지고 그 사람의 나이를 계산할 수 있다.
이때 Custom Conversions을 사용해서 동적으로, 자동적으로 생일의 데이터를 가지고 그 사람의 나이를 구하는 함수를 JMapper를 통해 매핑시키는 것이다.
일단 UserDto 클래스에 age와 conversion함수를 추가한다.
public class UserDto {
@JMap
private long id;
@JMap("email")
private String username;
@JMap("birthDate")
private int age;
@JMapConversion(from={"birthDate"}, to={"age"})
public int conversion(LocalDate birthDate){
return Period.between(birthDate, LocalDate.now()).getYears();
}
}
- User의 birthDate를 UserDto의 int age 필드로 매핑시킨다.
- 이때 타입이 다르기 때문에 @JMapConversion을 통해 from과 to를 매핑해서 LocalDate 타입을 받아서 int를 리턴하는 함수를 정의한다.
- LocalDate로 현재 나이를 계산해서 리턴한다.
public void whenUseAnnotationExplicitConversion_thenConverted(){
JMapper<UserDto, User> userMapper = new JMapper<>(
UserDto.class, User.class);
User user = new User(
1L,"john@test.com", LocalDate.of(1980,8,20));
UserDto result = userMapper.getDestination(user);
}
매핑 시키면 자동적으로 나이가 계산이 된다.
6. Relational Mapping(1대 다 매핑)
지금까지의 매핑은 Destination Model에 어노테이션을 사용해 매핑을 했는데, Relational Mapping을 사용하면 Source Model에 어노테이션을 사용해 매핑을 할 수 있다.
예를 들어 Source=User, Destination=UserDto1,UserDto2 클래스가 있다고 가정하자.
public class User {
private long id;
private String email;
}
public class UserDto1 {
private long id;
private String username;
}
public class UserDto2 {
private long id;
private String email;
}
이때 어노테이션을 User에게 사용한다.
public class User {
@JMap(classes = {UserDto1.class, UserDto2.class})
private long id;
@JMap(
attributes = {"username", "email"},
classes = {UserDto1.class, UserDto2.class})
private String email;
}
public void givenUser_whenUseAnnotation_thenConverted(){
RelationalJMapper<User> relationalMapper
= new RelationalJMapper<>(User.class);
User user = new User(1L,"john@test.com");
UserDto1 result1 = relationalMapper
.oneToMany(UserDto1.class, user);
UserDto2 result2= relationalMapper
.oneToMany(UserDto2.class, user);
}
관계형 매핑을 사용하면 손쉽고 직관적이게 1대N의 클래스를 매핑할 수 있는 장점이 있다.
'Java > JMapper' 카테고리의 다른 글
[Java] JMapper .jar 파일 다운로드 방법 (0) | 2020.05.20 |
---|---|
[Java] Dozer Mapper 사용 방법 (0) | 2020.03.24 |