해결된 질문
작성
·
2.3K
2
답변 5
3
안녕하세요. kevin님
2주 전에 답변을 하셨는데 저희가 질문을 놓셨습니다.
(인프런에서 가끔 메일이 오지 않아서 질문을 놓치는 경우가 있습니다. ㅠㅠ)
1. 적절한 방법이 뭘까요?
코드를 보니 충분히 잘 개선하셨습니다.
2. 복잡하고 큰 규모의 서버 코드를 보고싶은데 좋은 예시를 어디서 찾을수 있을까요?
복잡하고 큰 규모의 코드는 사실 실무에서 일하지 않는 이상 확인하기 어려운 것 같아요. 이번에 공부하신 예제가 그나마 학습용으로는 어느정도 복잡한 예제입니다.
관련해서 도메인 주도 설계에 대해서 공부해보시면 많은 인사이트를 얻으실 수 있을거에요.
만들면서 배우는 클린 아키텍처라는 책도 괜찮습니다.
3. 제가 해결방법으로 여러 service를 주입받아서 사용만하는 service를 만들어서 컨트롤러에 있던 코드를 거기로 옮겨서 컨트롤러에 비즈니스 로직이 생기는걸 없에고 순환참조, 코드 중복 등을 제거 해봤는데 이게 맞는건가요?
서비스에서 서비스를 주입 받아도 됩니다. 순환 참조가 걱정되면 서비스를 쪼개서 순환 참조가 되지 않도록 개선하면 됩니다.
4. MSA와 상관있는 문제일까요?
네 MSA와는 관계 없습니다.
감사합니다.
0
//서비스를 주입받는 서비스
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class BookComplexService {
private final BookInfoService bookInfoService;
private final BookService bookService;
private final ClubBookUserService cbuService;
private final UserService userService;
private final PostService postService;
@Transactional
public Long createBookAndRelated(CreateBookDto createBookDto, Long userId) {
BookInfo bookInfo = BookInfo.builder()
.name(createBookDto.getName())
.isbn(createBookDto.getIsbn())
.build();
bookInfo = bookInfoService.createOrFindBookInfo(bookInfo);
Book newBook = Book.builder()
.category(createBookDto.getCategory())
.bookInfo(bookInfo)
.build();
Long bookId = bookService.createBookWithValidation(newBook, bookInfo.getIsbn(), userId);
User user = userService.findById(userId);
ClubBookUser cbu = ClubBookUser.builder()
.book(newBook)
.user(user)
.build();
cbuService.createClubBookUser(cbu);
return bookId;
}
0
//수정한코드
@PostMapping
public ResponseEntity<CreateBookDto> createBook(@SessionAttribute(name = SessionConst.LOGIN_USER, required = false) User loginUser,
@RequestBody CreateBookDto createBookDto, UriComponentsBuilder b) {
Long bookId = bookComplexService.createBookAndRelated(createBookDto, loginUser.getId());
UriComponents uriComponents = b.path("/books/{bookId}").buildAndExpand(bookId);
return ResponseEntity.created(uriComponents.toUri()).body(createBookDto);
}
0
//기존 코드
@PostMapping
public ResponseEntity<CreateBookDto> createBook(@SessionAttribute(name = SessionConst.LOGIN_USER, required = false) User loginUser,
@RequestBody CreateBookDto createBookDto, UriComponentsBuilder b){
BookInfo bookInfo = BookInfo.builder()
.name(createBookDto.getName())
.isbn(createBookDto.getIsbn())
.build();
try {
bookInfoService.createBookInfo(bookInfo);
}catch (IllegalStateException e){
log.info("bookInfoService = {}",e.toString());
BookInfo byIsbn = bookInfoService.findByIsbn(bookInfo.getIsbn());
bookInfo = byIsbn;
}
Book newBook = Book.builder()
.category(createBookDto.getCategory())
.bookInfo(bookInfo)
.build();
Long bookId = bookService.createBook(newBook);
ClubBookUser cbu = ClubBookUser.builder()
.book(newBook)
.user(loginUser)
.build();
cbuService.createClubBookUser(cbu);
UriComponents uriComponents =
b.path("/books/{bookId}").buildAndExpand(bookId);
// return ResponseEntity.noContent().build().created(uriComponents.toUri()).build();
return ResponseEntity.created(uriComponents.toUri()).body(createBookDto);
}
제가 좀 바보같은 질문을 해서 답이 없으신가...하고 슬퍼하던 중이였는데 다행이네요 ㅎㅎ 감사합니다!