기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

[Java] JMapper 사용 방법
Java/JMapper

[Java] JMapper 사용 방법

2020. 3. 23. 17:12
반응형

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();
    }
}

 

  1.     User의 birthDate를 UserDto의 int age 필드로 매핑시킨다.
  2.     이때 타입이 다르기 때문에 @JMapConversion을 통해 from과 to를 매핑해서 LocalDate 타입을 받아서 int를 리턴하는 함수를 정의한다.
  3.     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
    'Java/JMapper' 카테고리의 다른 글
    • [Java] JMapper .jar 파일 다운로드 방법
    • [Java] Dozer Mapper 사용 방법
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바