๐ํ๊ฒฝ
IntelliJ Ultimate
Java 17
Spring boot 3.2.3
Gradle - Groovy
Dependencies:
Spring Web
Thymeleaf
Spring Data JPA
lombok
MariaDB 10.11
Spring Dev tool
๐ModelMapper๋?
์๋ก ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ ํ๋ฒ์ ๋ณต์ฌ(๋งคํ)ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์๋ฅผ ๋ค์ด, ์์์ฑ ์ปจํ ์คํธ์ ์ผ์นํ๋ ์ํฐํฐ ๊ฐ์ฒด๊ฐ ์๊ณ ์ด ๊ฐ์ DTO์ ๋ด๊ฑฐ๋ ํน์ ๊ทธ ๋ฐ๋์ ์์ ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํ ๋, ํ๋๋ฅผ ํ๋์ฉ ๋งคํ์ํจ๋ค๋ฉด ๋๋ฝ๋๊ฑฐ๋ ๊ฐ์ด ๋ณ์ง๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. `modelMapper`๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํฐ์ DTO์ ๋ณํ์ ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์๋ค.
๐ํ๋ฆ
1. `build.gradle`์ `modelMapper`์์กด์ฑ์ ์ถ๊ฐํ๋ค.
2. `configuration` ํด๋์ค๋ฅผ ์์ฑํ๋ค.
๐๊ตฌํ
`build.gradle`์ ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
dependencies{
.
.
.
implementation 'org.modelmapper:modelmapper:3.1.0'
}
config ํจํค์ง์ `RootConfig` ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
package org.zerock.b02.config;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RootConfig {
@Bean
public ModelMapper getMapper(){
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
.setMatchingStrategy(MatchingStrategies.LOOSE);
return modelMapper;
}
}
dto ํจํค์ง์ `BoardDTO`๋ฅผ ์ถ๊ฐํ๋ค. ํ๋๋ `Board`์ ๋์ผํ๋ค.
package org.zerock.b02.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BoardDTO {
private Long bno;
private String title;
private String content;
private String writer;
private LocalDateTime regDate;
private LocalDateTime modDate;
}
โ๏ธ CREATE(INSERT)
service ํจํค์ง์ `BoardService` ์ธํฐํ์ด์ค์ ๊ทธ ๊ตฌํ์ฒด๋ฅผ ์์ฑํ๋ค.
package org.zerock.b02.service;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Service;
import org.zerock.b02.domain.Board;
import org.zerock.b02.dto.BoardDTO;
import org.zerock.b02.repository.BoardRepository;
@Service
@Slf4j
@RequiredArgsConstructor
@Transactional
public class BoardServiceImpl implements BoardService{
private final ModelMapper modelMapper;
private final BoardRepository boardRepository;
@Override
public Long register(BoardDTO boardDTO) {
Board board = modelMapper.map(boardDTO, Board.class);
Long bno = boardRepository.save(board).getBno();
return bno;
}
}
์ฌ๋ฌ ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์์ ์ ์์ผ๋ฏ๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉํด์ผํ๋ค.
๊ฒ์๊ธ ์์ฑ ํ์๋ ๋ฐฉ๊ธ ์์ฑํ ๊ฒ์๊ธ๋ก ์ด๋ํด์ผํ๊ธฐ ๋๋ฌธ์ bno๊ฐ ํ์ํ๋ค.
ํ ์คํธ ์ฝ๋
package org.zerock.b02.service;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.b02.dto.BoardDTO;
@SpringBootTest
@Slf4j
public class BoardServiceTests {
@Autowired
private BoardService boardService;
@Test
public void registerTest(){
// ์ฌ๋ฌ ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์์ ์ ์์ผ๋ฏ๋ก ํธ๋์ญ์
์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉํด์ผํจ
// @Transactional ์ ๋
ธํ
์ด์
์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ์คํ๋ง์ด ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ๋ณ๋์ ํด๋์ค๋ฅผ ๋ง๋ฆ
// [boardService class name] org.zerock.b02.service.BoardServiceImpl$$SpringCGLIB$$0
log.info("[boardService class name] " + boardService.getClass().getName());
BoardDTO boardDTO = BoardDTO.builder()
.title("Sample title...")
.content("Sample content...")
.writer("user00")
.build();
Long bno = boardService.register(boardDTO);
log.info("[after register bno] " + bno);
}
}
2024-03-13T00:21:59.047+09:00 INFO 60814 --- [b02] [ Test worker] o.zerock.b02.service.BoardServiceTests : [after register bno] 101
DB์ ์ ๋ค์ด๊ฐ๊ณ bno์ด ์ง์ง ๋ฝํ ใทใท ์ด์ผ ํ ๊ฑฐ์ง (24/03/13) ๊ณต๋ถํ ๊ฒ
๐ READ(SELECT)
// BoardServiceImpl
@Override
public BoardDTO readOne(Long bno) {
Optional<Board> result = boardRepository.findById(bno);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ํ ์ผ์นํ๋ ์ํฐํฐ ๊ฐ์ฒด
Board board = result.orElseThrow();
// ์ํฐํฐ -> dto ๋ณํ
BoardDTO boardDTO = modelMapper.map(board, BoardDTO.class);
return boardDTO;
}
@Test
public void readOneTest(){
Long bno = 101L;
BoardDTO boardDTO = boardService.readOne(bno);
log.info("[readOne] " + boardDTO);
}
2024-03-13T00:31:42.667+09:00 INFO 60964 --- [b02] [ Test worker] o.zerock.b02.service.BoardServiceTests : [readOne] BoardDTO(bno=101, title=Sample title..., content=Sample content..., writer=user00, regDate=2024-03-13T00:21:59.022021, modDate=2024-03-13T00:21:59.022021)
๐ UPDATE
// BoardService
@Override
public void modify(BoardDTO boardDTO) {
Optional<Board> result = boardRepository.findById(boardDTO.getBno());
Board board = result.orElseThrow();
board.update(boardDTO.getTitle(), boardDTO.getContent());
boardRepository.save(board);
}
@Test
public void modifyTest(){
BoardDTO boardDTO = BoardDTO.builder()
.bno(101L)
.title("modified Title...")
.content("modified Content...")
.build();
boardService.modify(boardDTO);
}
๐ช DELETE
@Override
public void remove(Long bno) {
boardRepository.deleteById(bno);
}
๐์ฐธ๊ณ
์๋ฐ ์น ๊ฐ๋ฐ ์ํฌ๋ถ - ๊ตฌ๋ฉ๊ฐ๊ฒ ์ฝ๋ฉ๋จ
'Java > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] Swagger ์ฌ์ฉ ์ ์ค๋ฅ (0) | 2024.03.13 |
---|---|
[SpringBoot/JPA] ๊ฒ์์ ํฌํจํ ํ์ด์ง ์ฒ๋ฆฌ DTO (0) | 2024.03.13 |
[SpringBoot/JPA] Querydsl์ ์ฌ์ฉํ ๋์ ์ฟผ๋ฆฌ (0) | 2024.03.12 |
[SpringBoot/JPA] ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ๋์ฒดํ๋ @Query (0) | 2024.03.12 |
[Spring/JPA] Spring Data JPA๋ก ํ์ด์ง ์ฒ๋ฆฌํ๊ธฐ (1) | 2024.03.12 |