Open jminkkk opened 2 months ago
codezap.tag.service ์๋์ TemplateTagService๊ฐ ์กด์ฌํฉ๋๋ค. TagService๋ฅผ ๋ถ๋ฆฌํ์ฌ Tag ๋๋ฉ์ธ์๋ง ํด๋นํ๋ ๋ก์ง๋ค์ TemplateTagService๊ฐ ์๋ ์ ์๋น์ค๋ก ์ด๋ํฉ๋๋ค. ๊ธฐ์กด TemplateTagService๋ TemplateTag์ ํด๋นํ๋ ๋ก์ง๋ค์ ๋ก๋๋ค.
๋ ๋๋ฉ์ธ์ ๋ํ ๋ก์ง๋ค์ TemplateTagApplicationService ์ ๋๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค๊ณ ์๊ฐ๋ฉ๋๋ค. ์์๋ก ์์ฑ์ ๋ํ ๋ถ๋ถ ์์๋ฅผ ๋๊ฒ ์ต๋๋ค.
// TemplateTagService.java
@Transactional
public void createTags(Template template, List<String> tagNames) {
List<String> existingTags = tagRepository.findNameByNamesIn(tagNames);
templateTagRepository.saveAll(
existingTags.stream()
.map(tagRepository::fetchByName)
.map(tag -> new TemplateTag(template, tag))
.toList()
);
List<Tag> newTags = tagRepository.saveAll(
tagNames.stream()
.filter(tagName -> !existingTags.contains(tagName))
.map(Tag::new)
.toList()
);
templateTagRepository.saveAll(
newTags.stream()
.map(tag -> new TemplateTag(template, tag))
.toList()
);
}
// // TemplateTagApplicationService.java
@Transactional
public void createTemplateTags(Template template, List<String> tagNames) {
List<Tag> tags = tagService.findOrCreateTags(tagNames);
templateTagService.createTemplateTag(template, newTags);
}
// TemplateTagService.java
@Transactional
public void createTemplateTags(Template template, List<Tag> tags) {
List<TemplateTag> templateTags = tags.stream()
.map(tag -> new TemplateTag(template, tag))
.collect(Collectors.toList());
templateTagRepository.saveAll(templateTags);
}
// TagService.java
@Transactional
public List<Tag> findOrCreateTags(Template template, List<String> tagNames) {
List<Tag> existingTags = tagRepository.findAllByNamesIn(tagNames);
List<Tag> newTags = this.createTags(existingTags, newTagNames);
return existingTags.saveAll(newTags);
}
// TemplateTagService.java
public List<Tag> getByTemplate(Template template) {
return templateTagRepository.findAllByTemplate(template).stream()
.map(TemplateTag::getTag)
.toList();
}
// TagService๋ก ์ด๋
public List<Tag> getAllByTemplate(List<TemplateTag> templateTags) {
return templateTags.stream()
.map(TemplateTag::getTag)
.toList();
}
@Transactional
public void deleteByIds(List<Long> templateIds) {
templateIds.forEach(sourceCodeRepository::deleteByTemplateId);
}
deleteByTemplateId ๋ฉ์๋ n๋ฒ ํธ์ถ & ์ฟผ๋ฆฌ n๋ฒ
์์ค ์ฝ๋ ์์ด๋๋ก ์ญ์ ํ๋ ๊ฒ ๊ฐ์ง๋ง ํ ํ๋ฆฟ ์์ด๋๋ก ์ญ์ ํ๋ ๊ฒ์ ์์ ๊ฐ์ ํผ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฉ์๋๋ช ๋ณ๊ฒฝํ๊ธฐ
1.
@Transactional
public void deleteByIds(List<Long> templateIds) {
sourseCodeRepository.deleteAllByTemplateId(templateIds);
// ๋๋ sourseCodeRepository.deleteAllByTemplateIdInBatch(templateIds);
}
๊ฐ๊ฐ repository ๋ฉ์๋ 1๋ฒ ํธ์ถ & ์ฟผ๋ฆฌ n๋ฒ(deleteAllByTemplateId) ๋๋ 1๋ฒ(deleteAllByTemplateIdInBatch)
๋ฑ๋ฑ์ด ๋ ์์ ์ ์์ต๋๋ค.
createSourceCodes() ๋ฉ์๋์ @Transactional ๊ด๋ จ
createSourceCodes์์๋ saveAll๋ง ํธ์ถํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด์ง ์์๋ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค~ ๋ํ saveAll์ ์ด๋ฏธ ๋ด๋ถ์์ @Transactional๋ฅผ ์ ์ธํ๊ณ ์์ด ์ผ๋ถ save ์คํจ ์ ๋กค๋ฐฑ๋ฉ๋๋ค.
๊ฐ ์ผ์ด์ค์ ๋ํด ๊ฒ์ฆ ๋๋ ๋ก์ง ๋ณ๊ฒฝ์ด ํ์
ํ์ฌ ๊ตฌ์กฐ์์๋ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ จ ๋ก์ง ๋ณ๊ฒฝ ์ ํ์ฌ๋ ํด๋์ค๋ ์์ ํด์ผ ํ๋ค. == ์ ์ง๋ณด์์ ์ข์ง ์๋ค. ๊ฒ์ ์กฐ๊ฑด์์ ์นดํ ๊ณ ๋ฆฌ ์กฐํ๋ ์ถ๊ฐ๋๋ ๊ฒ์ฒ๋ผ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด? ๋ง์ฝ ํ์๋น ํ๊ฐ์ฉ ์๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ชจ๋ ํ์์ด ๊ฐ์ด ์ฌ์ฉํด์ผ๋ง ํ๋ค๋ฉด?
category.validateAuthorization(member)
๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ฏ๋ก ํ์ฌ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
์ฆ ํ์ฌ๋์ ์ฅ์ ์ธ ์๋ธ์์คํ
๋ด๋ถ ์ค๊ณ์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์๋ธ์์คํ
์ ๋
๋ฆฝ์ ์ผ๋ก ์์ ๋กญ๊ฒ ๋ ์ ์๋ ๊ฒ๊ณผ ๋ฉ์ด์ง๋ค.
์ฆ, CategoryTemplateApplicationService ๋ ์นดํ ๊ณ ๋ฆฌ ์๋น์ค์๊ฒ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ์์ฒญ๋ง ํด์ผ ํ๋ฉฐ, ์นดํ ๊ณ ๋ฆฌ ์๋น์ค์์ ์ค๋ ๋๋์ง(๊ถํ ์ฒดํฌ), ์๋์ง ์๋์ง(fetchBy) ๋ฑ์ ํ๋จํด์ผํจ
@Service
@RequiredArgsConstructor
public class CategoryTemplateApplicationService {
private final CategoryService categoryService;
private final TemplateApplicationService templateApplicationService;
public Long createTemplate(Member member, CreateTemplateRequest createTemplateRequest) {
Category category = categoryService.fetchById(createTemplateRequest.categoryId());
category.validateAuthorization(member);
return templateApplicationService.createTemplate(member, category, createTemplateRequest);
}
public void update(Member member, Long templateId, UpdateTemplateRequest updateTemplateRequest) {
Category category = categoryService.fetchById(updateTemplateRequest.categoryId());
category.validateAuthorization(member);
templateApplicationService.update(member, templateId, updateTemplateRequest, category);
}
}
@Service
@RequiredArgsConstructor
public class CategoryTemplateApplicationService {
private final CategoryService categoryService;
private final TemplateApplicationService templateApplicationService;
public Long createTemplate(Member member, CreateTemplateRequest createTemplateRequest) {
Category category = categoryService.findById(createTemplateRequest.categoryId(), member.getId());
return templateApplicationService.createTemplate(member, category, createTemplateRequest);
}
public void update(Member member, Long templateId, UpdateTemplateRequest updateTemplateRequest) {
Category category = categoryService.findById(updateTemplateRequest.categoryId(), member.getId());
templateApplicationService.update(member, templateId, updateTemplateRequest, category);
}
}
Member.equals()
์์ ํด๋์ค ๋น๊ต ์ ๊ฑฐํด๋น ํด๋์ค๊ฐ Category
์ ํ๋๋ก ์ฌ์ฉ๋๊ณ , lazy loading ์ ์ฌ์ฉํ๋ฉด์ ํ๋ก์ ๊ฐ์ฒด์ Member
๊ฐ์ฒด์ ๋๋ฑ์ฑ ๋น๊ต๊ฐ ์๊ธด๋ค.
์ด ๋๋ฌธ์ ํด๋์ค ๋น๊ต๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค.
if (o == null || getClass() != o.getClass()) {
return false;
}
CategoryService.findAllByMemer(Member member)
์ ์ ์ฅ๋์ง ์์ ๋ฉค๋ฒ๊ฐ ๋ค์ด๊ฐ๋ฉด DB ์์ธ ๋ฐ์
์ด ๋ถ๋ถ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด ์ฃผ์ด์ผ ํ ์ง~
CategoryTemplateService
์ CategoryService
๋ก ํตํฉํ์ฌ CategoryTemplateService
์ public
๋ฉ์๋๋ deleteById()
ํ๋๋ฐ์ ์์.
๊ทธ๋ฆฌ๊ณ , ์ด ๋ฉ์๋๋ TemplateRepository
์ ์์กด์ฑ์ด ํ์ํ๋ค๋ ์ด์ ์ด์ธ์๋ ํด๋์ค๊ฐ ๋ถ๋ฆฌ๋์ด ์์ ์ด์ ๊ฐ ์์.
์ด์ CategoryService
ํด๋์ค๋ก์ ํตํฉ์ ์ ์
MemberFixture๊ฐ ๋ ๊ฐ ์กด์ฌํ๋ค (fixture ํจํค์ง, member.fixture ํจํค์ง) MemberFixture๋ ํ๋๋ก ํต์ผํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค
Fixture ๋ง๋ค ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋ ๋ช ์ด ๋ค๋ฅด๋ค ํด๋น ๋ฉ์๋๋ค์ ํต์ผํ๋ฉด ์ถํ ์ฌ์ฌ์ฉํ ๋ ํธ๋ฆฌํ ๊ฒ ๊ฐ๋ค.
๋ด๊ฐ ์ ์ํ๋ ์ด๋ฆ์ ๊ฒฐ๊ตญ์ ๋ชจ๋ ๋ฉ์๋๊ฐ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์ด๋ ์ ํฉ๋ฉ ์ด๋ฆ ๊ท์น์ ๋ฐ๋ฅด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์ถ๊ฐ์ ์ผ๋ก Fixture ๋ฅผ ์์ฑ์๋ก ์ฌ์ฉํ ์ผ์ด ์์ ๊ฒ ๊ฐ์ผ๋ private๋ก ์์ฑ์๋ฅผ ๋ง๋ ๊ฑด ์ด๋ค๊ฐ์?
ํ ์คํธ๋ฅผ ํ๊ธฐ ์ํด ์ด๋ค ๊ฒ์ ํ ์คํธ ํด์ผํ๋์ง, ์ด ๊ณ์ธต์ ์ญํ ์ ๋ฌด์์ธ์ง ๊ณ ๋ฏผํ์ต๋๋ค. MemberTemplateApplicationService์์ ๋จ๊ฑด ์กฐํ ๊ฐ์ด ์นดํ ๊ณ ๋ฆฌ๊ฐ ํ์ํ์ง ์๋ ๊ณณ์ ์์กด์ฑ์ด ์ ๊ฑฐ๋๊ธด ํ๋, MemberTemplateApplicationService๊ฐ ๊ฒฐ๊ณผ์ ์ผ๋ก TemplateApplicationService๋ฅผ ๋ ๋ฒ ์์กดํ๊ณ ์๋ ๋ฑ ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๋ณต์กํ๋ค.
์ ๊ฐ ์๊ฐํ๊ธฐ์ ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ
TemplateService์ createTemplate()
๋ฉ์๋๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋์ด ์์ต๋๋ค.
public Template createTemplate(Member member, CreateTemplateRequest createTemplateRequest, Category category) {
Template template = new Template(
member,
createTemplateRequest.title(),
createTemplateRequest.description(),
category);
return templateRepository.save(template);
}
CreateTemplateRequest
์๋ title, description, sourceCodes, categoryId ๋ฑ ๋ค์ํ ํ๋๋ค์ด ์กด์ฌํ์ง๋ง ํด๋น ๋ฉ์๋์์๋ title๊ณผ description๋ง์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ํ๋๋ค์ Templateservice์ ์์ ํด๋์ค๋ค์์ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ์ ์ ์ํฉ๋๋ค.
public Template createTemplate(Member member, String title, String description, Category category) {
Template template = new Template(
member,
title,
description,
category);
return templateRepository.save(template);
}
๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋๋ฐ getByMemberId
, findByMemberId
๋ฑ์ผ๋ก ์์ฑ๋์ด ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ณด๋ ํ
์คํธ๋ฅผ ์์ฑํ ๋ ํด๋น ๋ฉ์๋๋ค์ด ํ๋์ ๊ฐ๋ง์ ๋ฐํํด์ผ ํ ๊ฒ ๊ฐ์ ๋๋์ ๋ฐ์์ต๋๋ค.
์ด์ ์๋์ ๊ฐ์ ๋ฉ์๋๋ช
๋ณ๊ฒฝ์ ์ ์ํฉ๋๋ค.
public List<Template> getByMemberId(Long memberId) {
return templateRepository.findByMemberId(memberId);
}
public List<Template> getAllByMemberId(Long memberId) {
return templateRepository.findAllByMemberId(memberId);
}
(์ฌ๊ธฐ๋ ๋ชฐ๋ฆฌ๊ฐ ์ถ๊ฐํจ)
์ด๋กฑ์ ์ด์์ ๋์ผํ ์ด์ ๋ก TemplateTagService๋ ๋ณ๊ฒฝ์ด ํ์ํฉ๋๋ค~
public List<Tag> getByTemplate(Template template) {
return templateTagRepository.findAllByTemplate(template).stream()
.map(TemplateTag::getTag)
.toList();
}
public List<Tag> getAllByTemplate(Template template) {
return templateTagRepository.findAllByTemplate(template).stream()
.map(TemplateTag::getTag)
.toList();
}
ํ์ฌ ์ฌ๋ฌ ํ
ํ๋ฆฟ ์ญ์ ์ ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์ฌ์ฉ๋๋๋ฐ, id๊ฐ ์ค๋ณต๋์ด ์๋์ง ๊ฒ์ฌํ๋ ๋ก์ง์ด TemplateService
์๋ง ์์นํ๊ณ ์์ต๋๋ค.
// TemplateApplicationService.java
@Transactional
public void deleteByMemberAndIds(Member member, List<Long> ids) {
thumbnailService.deleteByTemplateIds(ids);
sourceCodeService.deleteByIds(ids);
templateTagService.deleteByIds(ids);
templateService.deleteByMemberAndIds(member, ids);
}
// TemplateService.java
@Transactional
public void deleteByMemberAndIds(Member member, List<Long> ids) {
if (ids.size() != new HashSet<>(ids).size()) {
throw new CodeZapException(HttpStatus.BAD_REQUEST, "์ญ์ ํ๊ณ ์ ํ๋ ํ
ํ๋ฆฟ ID๊ฐ ์ค๋ณต๋์์ต๋๋ค.");
}
ids.forEach(id -> deleteById(member, id));
}
๋ชจ๋ ์ญ์ ๋ก์ง ์ ์ ๊ฒ์ฆ์ด ์ฐ์ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ฌ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ์ ์ ์ํฉ๋๋ค.
// TemplateApplicationService.java
@Transactional
public void deleteByMemberAndIds(Member member, List<Long> ids) {
if (ids.size() != new HashSet<>(ids).size()) {
throw new CodeZapException(HttpStatus.BAD_REQUEST, "์ญ์ ํ๊ณ ์ ํ๋ ํ
ํ๋ฆฟ ID๊ฐ ์ค๋ณต๋์์ต๋๋ค.");
}
thumbnailService.deleteByTemplateIds(ids);
sourceCodeService.deleteByIds(ids);
templateTagService.deleteByIds(ids);
templateService.deleteByMemberAndIds(member, ids);
}
ThumbnailSerivce
์์ ์ ์ฒด ์ธ๋ค์ผ์ ์กฐํํ๋ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋์ง ์๊ณ ์์ต๋๋ค.
์ด์ ์ญ์ ๋ฅผ ์ ์ํฉ๋๋ค.
public ExploreTemplatesResponse findAll() {
return ExploreTemplatesResponse.from(thumbnailRepository.findAll());
}
์ธ์๋ ์ฌ์ฉ๋์ง ์๋ ๋ฉ์๋๋ค์ด ๋ค์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ฒด์ ์ผ๋ก ํ ๋ฒ ํ์ธํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
(์ฌ๊ธฐ๋ ๋ชฐ๋ฆฌ๊ฐ ์ถ๊ฐํจ)
์ด๋กฑ์ ์ด์์ ๋์ผํ ์ด์ ๋ก TemplateTagService๋ ๋ณ๊ฒฝ์ด ํ์ํฉ๋๋ค~
TemplateTagService์ getTemplateIdContainTagIds์ด ์ฌ์ฉ๋๊ณ ์์ง ์์ต๋๋ค. ๋ getTemplateIdContainTagIds์ ๋ฐํ ๊ฐ์ด TemplateId์ธ๋ฐ, TemplateTagService์์ TemplateId๋ฅผ ๋ฐํํ๋ ๊ฒ ์ฌ์ฉ์ด ์ด์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
public List<Long> getTemplateIdContainTagIds(List<Long> tagIds) {
if (tagIds.isEmpty()) {
throw new CodeZapException(HttpStatus.BAD_REQUEST, "ํ๊ทธ ID๊ฐ 0๊ฐ์
๋๋ค. ํํฐ๋ง ํ์ง ์์ ๊ฒฝ์ฐ null๋ก ์ ๋ฌํด์ฃผ์ธ์.");
}
tagIds.forEach(this::validateTagId);
return templateTagRepository.findAllTemplateIdInTagIds(tagIds, tagIds.size());
}
private void validateTagId(Long tagId) {
if (!tagRepository.existsById(tagId)) {
throw new CodeZapException(HttpStatus.NOT_FOUND, "์๋ณ์ " + tagId + "์ ํด๋นํ๋ ํ๊ทธ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
}
์ผ๋จ TemplateTagService๋ TagService ์ฉ๋๋ก๋ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. (Tag ๋ชฉ๋ก ์กฐํ ๋ฑ๋ฑ) TemplateTagService์์ ํ ํ๋ฆฟ๋ค์ ๋ํ ํ ํ๋ฆฟ ํ๊ทธ ์ญ์ ์ ํ๊ฐ๋ ์ฌ์ฉ๋์ง ์๋ ํ๊ทธ์ธ ๊ฒฝ์ฐ ํ๊ทธ๋ ํจ๊ป ์ ๊ฑฐ๋์ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
ex) "Moly"๋ผ๋ ํ๊ทธ๊ฐ template1, template2์์ ์ฌ์ฉ๋๊ณ ์์๋๋ฐ, ๋ ํ ํ๋ฆฟ์ ํด๋นํ๋ ํ๊ทธ ๋ชฉ๋ก ์ญ์ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ "template1, Moly", "template2, Moly"๋ผ๋ ํ ํ๋ฆฟ ํ๊ทธ๋ ์ญ์ ๋์ง๋ง, "Moly"๋ผ๋ ํ๊ทธ๋ ๊ณ์ํด์ ๋จ์์์ต๋๋ค.
// TemplateTagService.java
public void deleteByIds(List<Long> templateIds) {
templateIds.forEach(templateTagRepository::deleteAllByTemplateId);
}
// TemplateTagApplicationService.java
public void deleteByIds(List<Long> templateIds) {
List<Tag> notUsedTags = templateTagService.deleteAllByTemplate(templateIds);
tagService.deleteIfNotUsed(notUsedTags);
}
// TemplateTagService.java
public void deleteAndCollectUnused(List<Long> templateIds) {
// 1. ํ๊ทธ๋ก ํ
ํ๋ฆฟ ํ
๊ทธ ์กฐํ
// 2. ํ
ํ๋ฆฟ ํ๊ทธ ์ญ์ ๋ฐ ํ๊ทธ ๋ชฉ๋ก ๋ฐํ
// 3. ํ๊ทธ๋ค ์ค ๋ค๋ฅธ ํ
ํ๋ฆฟ์ ์ฌ์ฉ๋๋ ํ๊ทธ๋ค ์ ์ธ
// 4. ์ฌ์ฉ๋์ง ์๋ ํ๊ทธ ๋ชฉ๋ก ๋ฐํ
}
// TagService.java
public void deleteIfNotUsed(List<Tag> tags) {
// 1. ํ๊ทธ ์ญ์
}
Member.equals()
์์ ํด๋์ค ๋น๊ต ์ ๊ฑฐํด๋น ํด๋์ค๊ฐ
Category
์ ํ๋๋ก ์ฌ์ฉ๋๊ณ , lazy loading ์ ์ฌ์ฉํ๋ฉด์ ํ๋ก์ ๊ฐ์ฒด์Member
๊ฐ์ฒด์ ๋๋ฑ์ฑ ๋น๊ต๊ฐ ์๊ธด๋ค. ์ด ๋๋ฌธ์ ํด๋์ค ๋น๊ต๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค.if (o == null || getClass() != o.getClass()) { return false; }
(ํด๋น ์ฝ๋ฉํธ ๊ด๋ จ)
TemplateController.getTemplateById()
memberTemplateApplicationService.getTemplateById()
templateApplicationService.getById()
ํด๋น DTO๊ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฉ์๋๋ช ์ prefix๊ฐ get์ธ ๋ฐ๋ฉด, ํด๋์ค๋ช dml prefix๊ฐ Find์ฌ์ ๊ฐ๋ ์ฑ์ ์ ํดํฉ๋๋ค.
(์ผฌ๋ฏธ๊ฐ ์ด์ด์)
์กฐํ ๋ฉ์๋์ prefix๋ฅผ ํต์ผํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์ผฌ๋ฏธ ๊ฐ์ธ ์ ํธ์ ๋ฐ๋ฅธ ๋ณ๊ฒฝ
์ผ๋ถ ๋ฉ์๋๋ create๋ง ์ฌ์ฉํ๋ค
์ผ๋ถ ๋ฉ์๋๋ create ์ดํ ์ธ์๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ค
ํต์ผํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค
CategoryService.findAllByMember()
-> InvalidDataAccessApiUsageException
๋ฐ์
Member member
๋์ long memberId
๋ก ์กฐํํ๋ฉด DB ์์ธ๊ฐ ์๋ java.util.NoSuchElementException
๋ฐ์
์ด์ ์ํฐํฐ ๊ฐ์ฒด๊ฐ ์๋, id ๊ฐ์ผ๋ก ์กฐํํ๋๋ก ๋ณ๊ฒฝ ์ ์
๐ ์ด๋ค ๊ธฐ๋ฅ์ ๋ฆฌํฉํฐ๋ง ํ๋์?
์ถ๊ฐ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์์๋ Service Layer ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ฝ๋ฉํธ๋ก ์ด๋ฅผ ๋จ๊ฒจ์ฃผ์๊ณ ์ด์ ๋ณธ๋ฌธ์ TODO์ ์ถ๊ฐํด์ฃผ์ธ์.
TODO