๐งModelMapper
Java์์ ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์. ํนํ DTO์ VO ๊ฐ์ ๋ณํ ์์
์ ์๋ํํ์ฌ, ๋ณต์กํ ๋งคํ ๋ก์ง์ ์์ฑํ ํ์ ์์ด ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์์.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
modelMapper.map(source, Destination.class)
ModelMapper ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ๋ณํ ํ ๋ ์ฌ์ฉ๋๋ ๋ฉ์๋์.
์์ค ๊ฐ์ฒด(source)์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๋ค ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋์ ํด๋์ค(Destination)์ ์๋ก์ด ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ๋ฐํํจ.
๐งModelMapper ์ค์
๐งConfiguration ๊ฐ์ฒด๋ฅผ ํตํด ์ด๋ฃจ์ด์ง
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
.setMatchingStrategy(MatchingStrategies.STRICT);
์ ์ฒด ์์ 1)
import org.modelmapper.ModelMapper;
public class Example {
public static void main(String[] args) {
ModelMapper modelMapper = new ModelMapper();
Source source = new Source();
source.setName("ํ๊ธธ๋");
source.setAge(25);
Destination destination = modelMapper.map(source, Destination.class);
System.out.println(destination.getName());
System.out.println(destination.getAge());
}
}
class Source {
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
class Destination {
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
์ ์ฒด ์์ 2) ์ฑ๊ธํค์ผ๋ก MapperUtil ํด๋์ค ์ ์
package org.zerock.jdbcex.util;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
public enum MapperUtil {
INSTANCE;
private ModelMapper modelMapper;
MapperUtil() {
this.modelMapper = new ModelMapper();
this.modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
.setMatchingStrategy(MatchingStrategies.LOOSE);
}
public ModelMapper get() {
return modelMapper;
}
}
๐งTodoService
package org.zerock.jdbcex.service;
import lombok.extern.log4j.Log4j2;
import org.modelmapper.ModelMapper;
import org.zerock.jdbcex.dao.TodoDAO;
import org.zerock.jdbcex.domain.TodoVO;
import org.zerock.jdbcex.dto.TodoDTO;
import org.zerock.jdbcex.util.MapperUtil;
import java.util.List;
import java.util.stream.Collectors;
@Log4j2
public enum TodoService {
INSTANCE;
private TodoDAO dao;
private ModelMapper modelMapper;
TodoService() {
dao = new TodoDAO();
modelMapper = MapperUtil.INSTANCE.get();
}
public void register(TodoDTO todoDTO)throws Exception{
TodoVO todoVO = modelMapper.map(todoDTO, TodoVO.class);
log.info(todoVO);
dao.insert(todoVO);
}
public List<TodoDTO> listAll()throws Exception {
List<TodoVO> voList = dao.selectAll();
log.info("voList.................");
log.info(voList);
List<TodoDTO> dtoList = voList.stream()
.map(vo -> modelMapper.map(vo,TodoDTO.class))
.collect(Collectors.toList());
return dtoList;
}
public TodoDTO get(Long tno)throws Exception {
log.info("tno: " + tno);
TodoVO todoVO = dao.selectOne(tno);
TodoDTO todoDTO = modelMapper.map(todoVO, TodoDTO.class);
return todoDTO;
}
public void remove(Long tno)throws Exception {
log.info("tno: " + tno);
dao.deleteOne(tno);
}
public void modify(TodoDTO todoDTO)throws Exception {
log.info("todoDTO: " + todoDTO );
TodoVO todoVO = modelMapper.map(todoDTO, TodoVO.class);
dao.updateOne(todoVO);
}
}
๐ง@Log4j2
Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์ด๋
ธํ
์ด์
์ผ๋ก, Log4j2 ํ๋ ์์ํฌ์ ํตํฉํ์ฌ ๋ก๊ทธ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ.
Log4j์์ ์ฌ์ฉํ๋ Event Level

https://myblog.opendocs.co.kr/archives/950
๋ณดํต ๊ฐ๋ฐ ์์๋ 'Info' ์ดํ์ ๋ ๋ฒจ์ ์ด์ฉํด์ ์์ฑํ๊ณ , ์ด์ํ ๋๋ 'Error'์ด๋ 'Warn' ์ด์์ ์ฌ์ฉํจ.
Log4j2.xml ์ค์ ํ์ผ
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
gradle ์ค์
implementation 'org.projectlombok:lombok:1.18.30'
compileOnly 'org.apache.logging.log4j:log4j-api:2.x.x'
runtimeOnly 'org.apache.logging.log4j:log4j-core:2.x.x'
์ฌ์ฉ ์์
import lombok.extern.log4j.Log4j2;
@Log4j2
public class MyClass {
public static void main(String[] args) {
log.info("This is an info message");
log.error("This is an error message");
}
}