728x90
테이블 구조를 변경하였다.
이미 저장된 데이터를 유지하면서 변경된 데이터를 옮기는 작업을 했다.
왜 바꿨냐면, 제3정규화를 위반하여 중복되는 데이터가 많을것으로 생각했기 때문이다.
book 테이블은 회원이 고유하게 소유하는 책이다.
책 isbn, name 같은 정보 저장 말고도,
다 읽은, 읽는 중, 읽고싶은 등의 정보를 저장하고,
기획상 book이 post를 여러개 갖고 있어서
회원의 post들 테이블에 접근할때 처음 구분을 해주는 역할을 해준다.
구조 변경 전에 처음 설계할때는 사실 중복될것을 몰랐던건 아닌데,
같은 책 정보 몇개 들어온다고 크게 문제될까? 라고 생각했다.
어차피 별로 중복이 많을것같진 않은데 구조가 복잡해지는게 싫었다.
그런데 개발중에 쌓인 테스트 데이터를 보면서 생각해보니, 사실 사람들은
듣보잡 책들보다는 베스트 셀러를 많이 읽을것이고, 그러면 중복이 엄청 생길것이라는
확신이 생겼다.
새로운 구조에서는 책의 isbn을 기준으로 중복검사하여,
새로운 isbn이면 생성, 중복이면 기존것을 사용하여 book과 매핑해준다.
package mangpo.server.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import mangpo.server.entity.Book;
import mangpo.server.entity.BookInfo;
import mangpo.server.service.BookInfoService;
import mangpo.server.service.BookService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.persistence.EntityManager;
import java.util.List;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/update-db")
class ModifyDBController {
private final BookService bookService;
private final BookInfoService bookInfoService;
private final EntityManager em;
@PostMapping
public ResponseEntity<?> createBookInfo() {
List<Book> books = bookService.findAllBooks();
for (Book book : books) {
BookInfo bookInfo = BookInfo.builder()
.name(book.getName())
.isbn(book.getIsbn())
.build();
try{
bookInfoService.createBookInfo(bookInfo);
bookService.setBookInfo(book,bookInfo);
}catch (IllegalStateException e){
log.info("duplicate info");
BookInfo byIsbn = bookInfoService.findByIsbn(book.getIsbn());
bookService.setBookInfo(book,byIsbn);
}
}
return ResponseEntity.noContent().build();
}
}
데이터를 조건에 맞게 옮기는 코드를 작성해서 해결했다.
기존 테스트 데이터의 유실 없이 구조를 변경하여,
앱 개발자 분들의 시간과 정신건강을 지킬수 있었다.
기존에 있던dto가 변경된것도 아니라서 api 또한 변경이 없었다.
728x90
'Dev > 개발일지' 카테고리의 다른 글
서버에 HTTPS 적용하기 (0) | 2022.12.05 |
---|---|
테스트 코드 리팩토링 해보자 (0) | 2021.11.20 |
AWS beanstalk에서 RDS 사용하려고 삽질 (0) | 2021.11.06 |
스프링 데이터 JPA, Query DSL 완강 (0) | 2021.07.05 |
실전! 스프링 부트와 JPA 활용 1,2 완강 (0) | 2021.06.29 |