728x90
반응형

Webserver 개발할 때 Database 나 Redis 등은 필수로 사용하게 된다. 이 때 API로 들어오는 데이터(DTO)를 Database에 저장되는 실제 Model로 복사하는 경우가 매번 발생하게 된다. 이때마다 chain이나 별도 function을 만들어서 복사를 할 수 없다. 왜냐하면 반복해서 넣어야 하는 동일한 코드가 너무 많기 때문이다. 

 

이를 해결하기 위해서 ModelMapper를 사용한다. ObjectMapping을 쉽게 해주는 Library라고 보면 된다.

Applications often consist of similar but different object models, where the data in two models may be similar but the structure and concerns of the models are different. Object mapping makes it easy to convert one model to another, allowing separate models to remain segregated.

ModelMapper의 목적은 아래와 같다. 

The goal of ModelMapper is to make object mapping easy, by automatically determining how one object model maps to another, based on conventions, in the same way that a human would - while providing a simple, refactoring-safe API for handling specific use cases.

Object mapping을 자동으로 이름이나 자료형을 가지고 판단하여 수행을 해준다. 반복된 코드를 줄여주기 때문에 효율적이고 휴먼에러는 줄여주는 역할도 한다고 하겠다. 

 

Dependency 추가

ModelMapper를 사용하기 위해서는 우선 Dependecy를 추가한다.  이 글에서는 2.4.4 버전을 사용한다. 

글을 쓰는 시점에서 최신 버전은 3.0.0 이다. 
<properties>
	<modelMapper.version>2.4.4</modelMapper.version>
</properties>

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>${modelMapper.version}</version>
</dependency>

 

ModelMapper Configuration 추가

Default option으로 사용해도 큰 문제는 없지만, 난 MatchStrategies 를 Strict 하게 하도록 하였고, Null value가 Object에 있어도 Mapping이 되도록 설정하였다. 

@Configuration
public class ModelMapperConfig {
    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT).setSkipNullEnabled(true);

        return modelMapper;
    }
}

 

Usage

사용방법은 간단하다. 아래의 예제는 ModelMapper object를 사용하였는데 위 설정으로 Bean에 등록을 하였으니 Dependecy Injection 으로 사용해도 된다. 

 

Order & OrderDTO

class Order {
  Customer customer;
  Address billingAddress;
}

class Customer {
  Name name;
}

class Name {
  String firstName;
  String lastName;
}

class Address {
  String street;
  String city;
}

class OrderDTO {
  String customerFirstName;
  String customerLastName;
  String billingStreet;
  String billingCity;
}
ModelMapper modelMapper = new ModelMapper();
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);

위와 같이 2개의 Model이 있고 Order model로 생성된 order object를 사용하여 OrderDTO object를 생성하는 코드이다. 

놀라운 점은 하위 Object의 variable까지 Mapping 시킨다는 점이다. 

 

앞으로의 코드에서 많이 사용되는 부분이라 우선 정리하였다. 

728x90
반응형
728x90
반응형

Spring boot application을 실행해보면 아래와 같은 기본적인 banner가 보여진다. 

 

이것은 기본적으로 Spring boot dependecy에 추가되어 있는 banner이다. 하지만, 변경을 하고 싶다면 변경이 가능하다. 

Microservice의 service는 각자의 이름이 있으므로 그 이름으로 보여지는 것이 더 좋지 않을까?

 

그래서 바꿔보겠다.

 

감사하게도 Online Spring Boot Banner Generator 라는 사이트가 있고 우리는 여기 안에 있는 폰트로 Banner의 내용을 채워볼 것이다. 

 

우선 banner.txt. 파일을 `src/main/resources` 아래에 생성한다. 다음 위 사이트로 가서 원하는 이름으로 Banner 내용을 만든다.

일단 기본 Banner Font로 간단하게 생성하였다. 

 

아래의 표시된 내용을 복사하여 banner.txt 로 옮긴다. 그리고 수행해보면 Banner가 변경된 것을 알 수 있다. 

 ,---.                           ,--.
'   .-'   ,---.   ,---.   ,---.  `--'  ,---.  ,--,--,
`.  `-.  | .-. : (  .-'  (  .-'  ,--. | .-. | |      \
.-'    | \   --. .-'  `) .-'  `) |  | ' '-' ' |  ||  |
`-----'   `----' `----'  `----'  `--'  `---'  `--''--'

 
Powered by Spring Boot 2.6.2

 

하지만 자세히 살펴보면 한 줄이 표시되지 않고 있다. 바로 아래의 내용이다. 

${application.title} ${application.version}

이 부분을 표시하기 위해서는 application.properties나 application.yaml 파일에 해당 내용을 등록시켜주면 된다. 

 

Spring Initializr로 생성하면 `application.properties`로 디폴트로 생성되는데, 개인적으로 Yaml이 편해 application.yaml로 파일명을 변경하였다. 

 

Banner 정보 표시를 위해서 최종적으로는 아래와 같이 수정하였다. 

banner.txt

 ,---.                           ,--.
'   .-'   ,---.   ,---.   ,---.  `--'  ,---.  ,--,--,
`.  `-.  | .-. : (  .-'  (  .-'  ,--. | .-. | |      \
.-'    | \   --. .-'  `) .-'  `) |  | ' '-' ' |  ||  |
`-----'   `----' `----'  `----'  `--'  `---'  `--''--'

${server.title} ${server.version}
Powered by Spring Boot ${spring-boot.version}

application.yaml

# server
server:
  title: spring-micro-session
  version: '@project.version@'
  port: 8180

 

최종 결과물! 원하는대로 표시되었다. 

 

728x90
반응형
728x90
반응형

Spring boot project를 생성하는 방법에 대해서 간략하게 공유하고자 한다. 

 

IDE 선택

Project를 생성하기에 앞서 어떠한 나는 어떤 IDE를 사용하는지 간단히 공유해볼까 한다. 난 Software Quality Engineer와 DevOps 업무를 하다보니 여러가지 언어를 사용하여 프로젝트를 진행하였고, 그러다 보니 이런저런 IDE를 많이 사용하게 되었다. 

 

1. Java / Scala Project

   Java 나 Scala로 개발을 한다면 JetBrain사의 Intellij가 아주 편리하다. Java를 타겟으로 개발된 IDE 이다 보니, 자동완성이나 Lombok, Spring boot annotation 등 많은 부분을 편리하고 쉽게 개발이 가능하다. Maven, Kotlin, SBT 등 여러가지 Dependency management, Build, Packaging 환경도 쉽게 설정 및 테스트가 가능하다.

 

2.  Python Project

   Python의 경우 JetBrain 사의 PyCharm 을 사용하거나 Visual Studio Code를 사용한다. 요즘 vscode로 왠만한 개발을 다할 수 있어서 하나만 사용해도 크게 문제가 없으나, Intellij에 익숙해진 나는 PyCharm이 편리했다. 

 

3. 그 외

  그 외의 Project로 Jenkins Pipeline을 위한 Groovy, Kubernetes 배포를 위한 Yaml (Helm Chart 포함), C++ 개발은 Visual Studio Code를 사용하고 있다. 

 

현재 Project가 Python이 주력이 아니기 때문에 PyCharm은 거의 쓰고 있지 않고 Intellj 와 vscode는 활발하게 사용하고 있는 중이다. 

개인적으로 Spring boot Project는 Intellij가 최고인 것 같다. 

 

Spring Boot Project 시작

Spring boot Project를 생성하는 방법은 Manual로 Java Project를 만들어서 Dependency와 Plugin을 처음부터 추가하는 방법과 Spring Initializr 를 사용하여 몇가지 Dependency를 추가한 후 초기 프로젝트를 생성하는 방법이다. 

 

우선 Spring Initializr로 생성하는 방법은 여기로 접속하고 아래와 같이 간략하게 정보를 입력한다. 

Spring Initializr

위와 같이 간단하게 설정 후 `Generate` 버튼을 누르면 Java Project를 다운로드 할 수 있다.

spring-boot-session.zip
0.06MB

 

아래는 위의 Tool로 생성하였을 때 생성된 pom.xml이다. 

위에 첨부된 프로젝트를 열면 기본 프로젝트 생성 끝이다. 

프로젝트를 열어보면 아래와 같은 Project Tree구조가 나온다. (.gitignore 및 LICENCE는 이 프로젝트를 Github에 등록하면서 생성하였다.)

 

먼저 Project를 시작하면 Dependency를 Download 해야한다. 

Intellij의 오른편의 Maven Menu를 열고 "Reload All Maven Project" 를 클릭한다.  (Reload 모양의 버튼이다.)

 

Dependency가 완료되면 프로젝트를 실행해볼 수 있다. SpringBootSessionApplication.java 파일에서 마우스 오른쪽 버튼을 누르고 아래 메뉴를 선택한다. 

실행을 해보면 아래와 같이 서비스가 시작되는 것을 확인할 수 있다. 

 

오늘은 간단하게 Spring boot Project를 만드는 것을 알아보았다. 앞으로 이 프로젝트를 베이스로 코드는 추가해 나가고자 한다. 

현재 auth project는 코드가 어느정도 들어가 있는 상태이지만 session project는 이제 시작이므로 이 프로젝트에 추가되는 정보들을 가지고 포스트를 이어나가고자 한다. 

728x90
반응형

+ Recent posts