728x90
3계층 아키텍쳐 형식으로 만들어보기
컨트롤러(클라이언트에게 반환해주는 부분?)
// 게시글 상세 조회 API
getPostById = async (req, res, next) => {
try {
const { postId } = req.params;
const post = await this.postService.findPostById(postId);
return res.status(200).json({ data: post });
} catch (err) {
next(err);
}
};
// 게시글 수정 API
updatePost = async (req, res, next) => {
try {
const { postId } = req.params;
const { password, title, content } = req.body;
// 서비스 계층에 구현된 updatePost 로직을 실행한다.
const updatePost = await this.postService.updatePost(
postId,
password,
title,
content
);
return res.status(200).json({ data: updatePost });
} catch (err) {
next(err);
}
};
// 게시글 삭제 API
deletePost = async (req, res, next) => {
try {
const { postId } = req.params;
const { password } = req.body;
// 서비스 계층에 구현된 deletePost 로직 실행
const deletePost = await this.postService.deletePost(postId, password);
return res.status(200).json({ data: deletePost });
} catch (err) {
next(err);
}
};
}
서비스(메인 로직 부분)
// 게시물 상세 조회
findPostById = async (postId) => {
// 저장소(Repository)에 특정 게시글 하나를 요청한다.
const post = await this.postsRepository.findPostById(postId);
return {
postId: post.postId,
nickname: post.nickname,
title: post.title,
content: post.content,
createAt: post.createdAt,
updatedAt: post.updatedAt,
};
};
// 게시물 수정
updatePost = async (postId, password, title, content) => {
// 특정 게시물을 찾아서 post에 할당한다.
const post = await this.postsRepository.findPostById(postId);
// 만약 게시물이 존재하지 않는다면 에러를 던져준다.
if (!post) {
throw new Error("존재하지 않는 게시물 입니다!");
}
// 저장소(Repository)에게 데이터 수정을 요청한다.
await this.postsRepository.updatePost(postId, password, title, content);
//변경된 데이터를 조회한다.
const updatePost = this.postsRepository.findPostById(postId);
return {
postId: updatePost.postId,
nickname: updatePost.password,
title: updatePost.title,
content: updatePost.content,
createdAt: updatePost.createAt,
updatedAt: updatePost.updatedAt,
};
};
// 게시물 삭제
deletePost = async (postId, password) => {
// 삭제할 특정 게시물을 찾아준다.
const post = await this.postsRepository.findPostById(postId);
// 게시물을 찾지 못했을 경우 에러 메세지를 던져줌
if (!post) {
throw new Error("게시물을 찾을 수 없습니다!");
}
// 저장소(Repository)에 데이터 삭제를 요청한다.
await this.postsRepository.deletePost(postId, password);
return {
postId: post.postId,
nickname: post.nickname,
title: post.title,
content: post.content,
createAt: post.createdAt,
updatedAt: post.updatedAt,
};
};
}
레파지토리(저장소에서 일어나는 일들을 처리한다)
// 게시물 상세 조회
findPostById = async (postId) => {
// ORM인 Prisma에서 Posts 모델의 findUnique 메서드를 통해 데이터를 요청함
const post = await prisma.posts.findUnique({
where: { postId: +postId },
});
return post;
};
// 게시물 수정
updatePost = async (postId, password, title, content) => {
const updatedPost = await prisma.posts.update({
where: {
postId: +postId,
password,
},
data: {
title,
content,
},
});
return updatedPost;
};
// 게시물 삭제
deletePost = async (postId, password) => {
const deletedPost = await prisma.posts.delete({
where: { postId: +postId, password },
});
return deletedPost;
};
}