TodoDTO์ ๊ฒฝ์ฐ Lombok์ ์ด์ฉํ๋ ๊ฒ
์ด ๋ ์ข๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ๋ค์ ๊ตฌ์ฑ
ํ๋ก์ ํธ ๋ด์ dto ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ณ TodoDTO ํด๋์ค๋ฅผ ์ ์ธ
TodoDTO์ TodoVO๋ ์์ ํ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ์ด๋ ธํ ์ด์ ์์ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
@Data
๋ getter/setter/toString/equals/hashCode ๋ฑ์ ๋ชจ๋ ์ปดํ์ผ ๋ ์์ฑํ๋ ๋ฐ๋ฉด VO์ ๊ฒฝ์ฐ getter๋ง์ ์ด์ฉํด ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๊ตฌ์ฑํ๋ค.
// https://mvnrepository.com/artifact/org.modelmapper/modelmapper
implementation 'org.modelmapper:modelmapper:3.0.0'
ModelMapper ๋ผ์ด๋ธ๋ฌ๋ฆฌ
: DTO โก๏ธ VO, VO โก๏ธ DTO ๋ณํ ์ฝ๊ฒ ๋ณด์กฐ
(๋จ, ์์ฆ์ ์ฑ๋ฅ์ ์ด์ ๋๋ฌธ์ MapStruct๋ฅผ ์ฌ์ฉํ๋ค.)
VO์ ์ ๋ํ
์ด์
@AllArgsConstructor
, @NoArgsConstructor
๋ฅผ ์ถ๊ฐ ์ ์ฉํด์ผ ํ๋ค.
(๋ชจ๋ ํ๋๊ฐ์ด ํ์ํ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ์์ฑ์๋ฅผ ์ ์ฉํ์ฌ, VOโฌ
๏ธโก๏ธDTO์ ModelMapper๋ฅผ ํตํ ๋ณํ์ ํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ์ํจ)
util.MapperUtil
ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ ModelMapper์ ์ค์ ์ ๋ณ๊ฒฝํ๊ณ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ MapperUtil์ enum์ผ๋ก ์ค์ public enum MapperUtil {
INSTANCE;
private ModelMapper modelMapper;
MapperUtil() {
this.modelMapper = new ModelMapper();
//modelMapper ๊ตฌ์ฑ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
this.modelMapper.getConfiguration()
.setFieldMatchingEnabled(true) // ํ๋ ๋งค์นญ ๊ฐ๋ฅ
//PRIVATE ํ๋๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก
.setFieldAccessLevel(Configuration.AccessLevel.PRIVATE)
.setMatchingStrategy(MatchingStrategies.STRICT);
}
public ModelMapper get() {
return this.modelMapper
}
}
TodoService๋ ์๋น์ค ๊ณ์ธต์์ DTO์ VO๋ฅผ ๋ ๋ค ์ด์ฉํด์ผ ํ๋ค.
service.TodoService
enum์ผ๋ก ์ ์ธ.
ํ
์คํธ ์ฝ๋๋ฅผ ํตํ ๋ฑ๋ก ํ์ธ : service.TodoServiceTests
์งํ (140)
System.out.println()
์ ๋ก๊ทธ์ ๊ธฐ๋ฅ์ผ๋ก ์ ํฉํ์ง ์๋ค. โถ์์ ์๋ชจ๊ฐ ๋ง๊ณ , โทํ๋ฐ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
Log4j2๋ ๋ ๋ฒจ(level)์ด๋ผ๋ ์ค์ ์ด ์์ด ๊ฐ๋ฐํ ๋, ํ์ํ ๋ ๋ฒจ์ ๋ก๊ทธ์ ์ค์ ์ด์ ์์ ํ์ํ ๋ก๊ทธ๋ฅผ ์ฝ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
Lombok์ @Log4j2๋ผ๋ ์ด๋
ธํ
์ด์
์ ์ด์ฉํด์ ๊ฐ๋จํ ์์ค ์ฝ๋ ๋ด์ ๋ก๊ทธ๋ฅผ ์ ์ฉํ ์ ์๋ค.
Log4j2์ ํต์ฌ ๊ฐ๋ : โถ๋ ๋ฒจ(Level) โท์ดํ๋(Appender)
- โถ๋ ๋ฒจ(Level)โก : ๋ก๊ทธ์ '์ค์๋' ๋ก๊ทธ์ ๋ ๋ฒจ์ ์ง์ ํ๋ฉด ํด๋น ๋ ๋ฒจ ์ด์์ ๋ก๊ทธ๋ค๋ง ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐํ ๋๋ ๋ก๊ทธ์ ๋ ๋ฒจ์ ๋ฎ๊ฒํ์ฌ ๊ฐ๋ฐํ๊ณ ์ด์ํ ๋๋ ์ค์ํ ๋ก๊ทธ๋ค๋ง ๊ธฐ๋กํ๊ฒ ์ค์ ํ๋ค.
- โท์ดํ๋(Appender)โก : ๋ก๊ทธ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ธฐ๋กํ ๊ฒ์ธ์ง.
์ฝ์(console) ๋๋ ํ์ผ(File) ์ถ๋ ฅ์ด ๊ฐ๋ฅ.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐํ ๋๋ Info ์ดํ์ ๋ ๋ฒจ ์ฌ์ฉ,
์ด์ํ ๋๋ Error๋ Warn์ด์์ ๋ ๋ฒจ์ ์ฌ์ฉ.
Log4j2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ
//log4j๊ด๋ จ ์์กด์ฑ ์ถ๊ฐ
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.2'
implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.2'
implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.17.2'
log4j2.xml
ํ์ผ๋ก ์ดํ๋๋ ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํ ์ ์๋ค. ํ์. (ํ์ผ ๋ช
์ด ๋ฐ๋์ ์ผ์นํด์ผํจ.)
main/resources/log4j2.xml
์์ฑ
log4j2์ ์์ธํ ์ค์ : log4j/2.x/manul/configuration
- ๊ธฐ์กด์ TodoService ์ฝ๋์ @Log4j2 ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ๊ณ ,
System.out~
๋์ ์log.info()
๊ฐ์ ์ฝ๋๋ก ๋ณ๊ฒฝ
package org.zerock.jdbcex.service;
import lombok.extern.log4j.Log4j2;
import org.modelmapper.ModelMapper;
import org.zerock.jdbcex.MapperUtil;
import org.zerock.jdbcex.dao.TodoDAO;
import org.zerock.jdbcex.domain.TodoVO;
import org.zerock.jdbcex.dto.TodoDTO;
@Log4j2 // โญ
public enum TodoService {
INSTANCE;
private TodoDAO dao; // DB์ ์ฐ๊ณํ์ฌ VO๋ฅผ ๊ฐ์ ธ์ฌ ์ญํ
private ModelMapper modelMapper; // VO์ DTO์ ๋ณํ์ ๋ด๋น
TodoService() {
dao = new TodoDAO(); //์๋น์ค๊ฐ ์์ฑ๋ ๋ dao ์๋ ์์ฑ
modelMapper = MapperUtil.INSTANCE.get();
}
public void register(TodoDTO todoDTO) throws Exception {
//โญmodelMapper.map ์ด๋ผ๋ ๋ฉ์๋ ์ด์ฉํ์ฌ DTO -> VO
TodoVO todoVO = modelMapper.map(todoDTO, TodoVO.class);
log.info("todoVO: " + todoVO); //โญ log.info๋ก ๋ณ๊ฒฝ
dao.insert(todoVO); //๐ฅ int๋ฅผ ๋ฐํํ๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํ ์์ธ์ฒ๋ฆฌ๋ ๊ฐ๋ฅ
}
}
์ดํ TodoServiceTests testRegister()์คํ
Log4j2 ์ ์ฉ ํ HikariCP์ ๋ก๊ทธ๊ฐ ๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋๋ ์ด์ ?
HikariCP๊ฐ ๋ด๋ถ์ ์ผ๋ก slf4j ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋๋ฐ, build.gradle์ log4j-slf4j-impl ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Log4j2๋ฅผ ์ด์ฉํ ์ ์๋๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ์คํธ ํ๊ฒฝ์์ @Log4j2 ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ํด์ ํ ์คํธ ํ๊ฒฝ์์๋ ์ด๋ ธํ ์ด์ ์ ์ฒ๋ฆฌํ๋ testAnnotationProcessor์ testComplieOnly ์ค์ ์ ์ถ๊ฐํด์ค์ผ ํ๋ค.
build.gradle
testCompileOnly 'org.projectlombok:lombok:1.18.28'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.28'
TodoServiceTests.java
package org.zerock.service;
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.zerock.jdbcex.dto.TodoDTO;
import org.zerock.jdbcex.service.TodoService;
import java.time.LocalDate;
@Log4j2 //โญ
public class TodoServiceTests {
private TodoService todoService;
@BeforeEach
public void ready() {
todoService = TodoService.INSTANCE;
}
@Test
public void testRegister() throws Exception {
TodoDTO todoDTO = TodoDTO.builder()
.title("JDBC Test Title")
.dueDate(LocalDate.now())
.build();
log.info("-------------------------------------"); //โญ ํ
์คํธ ์ฝ๋์ log4j2 ์ค์ ํ์ธ
log.info(todoDTO); //โญ
todoService.register(todoDTO);
}
}
์๋ธ๋ฆฟ์ผ๋ก ์์ฑ๋๋ ์ปจํธ๋กค๋ฌ์ TodoService ์ฐ๋ํ๋ ์์ ์ ์ฒ๋ฆฌ
์ด์ ์์ ๋ค์ ๊ตฌ์กฐ๋ TodoRegisterController
์ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ ์ปจํธ๋กค๋ฌ๊ฐ ์กด์ฌํ์ฌ ํ๋์ TodoService๋ฅผ ํตํด ์์ ์ด ์ํ๋ ๊ธฐ๋ฅ์ ์ ๋ฌํ๊ณ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ
jdbcex.controller
ํจํค์ง ์์ฑ
๊ตฌํํด์ผ ํ๋ ์ปจํธ๋กค๋ฌ
ํ๋ก์ ํธ ์คํ๊ฒฝ๋ก /
๋ฅผ ์ด์ฉํ๋๋ก ์์ , [Deployment] ์ญ์ exploded๋ก ๋ณ๊ฒฝ
๋ณ๊ฒฝ๋ ํ์ผ์ ๋น ๋ฅธ ์ฌ์คํ
On 'Update' action
: Update classes and resources
On frame deactivation
: Update classes and resources
build.gradle JSTL ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
// https://mvnrepository.com/artifact/jstl/jstl
implementation group: 'jstl', name: 'jstl', version: '1.2'
์ถ์ฒ ๋ฐ ์ฐธ๊ณ ์๋ฃ : ์๋ฐ ์น ๊ฐ๋ฐ ์ํฌ ๋ถ