Java Servlet[7]

BaeSeBinยท2025๋…„ 1์›” 4์ผ

Java Servlet

๋ชฉ๋ก ๋ณด๊ธฐ
7/7

๐Ÿง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); // Private ํ•„๋“œ ์ ‘๊ทผ ํ—ˆ์šฉ
           .setMatchingStrategy(MatchingStrategies.STRICT);  // ํ•„๋“œ ์ด๋ฆ„์ด ์™„์ „ํžˆ ์ผ์น˜(๋Œ€์†Œ๋ฌธ์ž๊นŒ์ง€)ํ•ด์•ผ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.         
์ „์ฒด ์˜ˆ์‹œ 1)
import org.modelmapper.ModelMapper;

public class Example {
    public static void main(String[] args) {
        ModelMapper modelMapper = new ModelMapper();

        // Source ๊ฐ์ฒด ์ƒ์„ฑ
        Source source = new Source();
        source.setName("ํ™๊ธธ๋™");
        source.setAge(25);

        // Source๋ฅผ Destination์œผ๋กœ ๋งคํ•‘
        Destination destination = modelMapper.map(source, Destination.class);

        System.out.println(destination.getName()); // ์ถœ๋ ฅ: ํ™๊ธธ๋™
        System.out.println(destination.getAge());  // ์ถœ๋ ฅ: 25
    }
}

// ์†Œ์Šค ํด๋ž˜์Šค
class Source {
    private String name;
    private int age;

    // Getters and Setters
    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;

    // Getters and Setters
    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();
    }
//  DTO -> VO๋กœ ๋ณ€ํ™˜ํ•จ.
    public void register(TodoDTO todoDTO)throws Exception{

        TodoVO todoVO = modelMapper.map(todoDTO, TodoVO.class);

        //System.out.println("todoVO: " + todoVO);
        log.info(todoVO);

        dao.insert(todoVO); //int ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅ
    }
    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");
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€