diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 7aff3474..00000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 0429a66b..c0de4917 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,6 +56,9 @@ dependencies {
// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
+
+ // AWS Spring Cloud
+ implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
}
tasks.named('test') {
diff --git a/src/main/java/leets/weeth/domain/file/entity/File.java b/src/main/java/leets/weeth/domain/file/entity/File.java
new file mode 100644
index 00000000..9312f72a
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/file/entity/File.java
@@ -0,0 +1,24 @@
+package leets.weeth.domain.file.entity;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Entity
+@Getter
+public class File {
+ public File(String url) {
+ this.url = url;
+ }
+
+ @Id //엔티티의 대푯값 지정
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "file_id")
+ private Long id;
+
+ private String url;
+
+
+}
diff --git a/src/main/java/leets/weeth/domain/file/repository/FileRepository.java b/src/main/java/leets/weeth/domain/file/repository/FileRepository.java
new file mode 100644
index 00000000..d3b91032
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/file/repository/FileRepository.java
@@ -0,0 +1,8 @@
+package leets.weeth.domain.file.repository;
+
+import leets.weeth.domain.file.entity.File;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface FileRepository extends JpaRepository {
+
+}
diff --git a/src/main/java/leets/weeth/domain/file/service/FileService.java b/src/main/java/leets/weeth/domain/file/service/FileService.java
new file mode 100644
index 00000000..5485b12e
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/file/service/FileService.java
@@ -0,0 +1,71 @@
+package leets.weeth.domain.file.service;
+
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.model.PutObjectRequest;
+import leets.weeth.domain.file.repository.FileRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import leets.weeth.domain.file.entity.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class FileService {
+
+ private final FileRepository fileRepository;
+
+ @Value("${cloud.aws.s3.bucket}")
+ private String bucketName;
+
+ private final AmazonS3 s3Client;
+
+ public List uploadFiles(List files) {
+ // 다중 업로드 && 리스트 ","을 기준으로 하나의 문자열 반환
+ // files 갯수 0 이면 반환 ""
+ if(files == null || files.isEmpty())
+ return List.of();
+
+ List results = new ArrayList<>();
+
+ for (MultipartFile file : files) {
+ java.io.File fileObj = convertMultiPartFileToFile(file);
+ String originalFilename = file.getOriginalFilename();
+ String extension = getFileExtension(originalFilename);
+ String fileName = UUID.randomUUID() + "." + extension;
+
+ log.info("uploadFile fileName: {}", fileName);
+ s3Client.putObject(new PutObjectRequest(bucketName, fileName, fileObj));
+ fileObj.delete();
+ File newFile = new File(s3Client.getUrl(bucketName, fileName).toString());
+
+
+ fileRepository.save(newFile);
+ results.add(newFile);
+ }
+ return results;
+ }
+
+ private java.io.File convertMultiPartFileToFile(MultipartFile file) {
+ java.io.File convertedFile = new java.io.File(file.getOriginalFilename());
+ try (FileOutputStream fos = new FileOutputStream(convertedFile)) {
+ fos.write(file.getBytes());
+ } catch (IOException e) {
+ log.error("Error converting multipartFile to file", e);
+ }
+ return convertedFile;
+ }
+
+ private static String getFileExtension(String originalFileName) {
+ return originalFileName.substring(originalFileName.lastIndexOf(".") + 1);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/leets/weeth/domain/post/controller/CommentController.java b/src/main/java/leets/weeth/domain/post/controller/CommentController.java
new file mode 100644
index 00000000..b8225dc5
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/controller/CommentController.java
@@ -0,0 +1,32 @@
+package leets.weeth.domain.post.controller;
+
+import leets.weeth.domain.post.dto.RequestCommentDTO;
+import leets.weeth.domain.post.dto.ResponseCommentDTO;
+import leets.weeth.domain.post.service.CommentService;
+import leets.weeth.global.common.response.CommonResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/articles/{articleId}/comments")
+public class CommentController {
+ @Autowired
+ private CommentService commentService;
+ @PostMapping()
+ public CommonResponse create(@PathVariable Long articleId, @RequestBody RequestCommentDTO dto,
+ @AuthenticationPrincipal User user){
+ commentService.create(user.getUsername(), articleId, dto);
+ return CommonResponse.createSuccess();
+ }
+ @GetMapping()
+ public CommonResponse> show(@PathVariable Long articleId){
+ List comments = commentService.comments(articleId);
+ return CommonResponse.createSuccess(comments);
+ }
+}
diff --git a/src/main/java/leets/weeth/domain/post/controller/PostController.java b/src/main/java/leets/weeth/domain/post/controller/PostController.java
new file mode 100644
index 00000000..26f6ff49
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/controller/PostController.java
@@ -0,0 +1,54 @@
+package leets.weeth.domain.post.controller;
+
+import leets.weeth.domain.post.dto.RequestPostDTO;
+import leets.weeth.domain.post.dto.ResponsePostDTO;
+import leets.weeth.domain.post.service.PostService;
+import leets.weeth.global.auth.annotation.CurrentUser;
+import leets.weeth.global.common.error.exception.custom.InvalidAccessException;
+import leets.weeth.global.common.response.CommonResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/posts")
+public class PostController {
+ @Autowired
+ private final PostService postService;
+ @PostMapping(value = {"/{postId}",""})
+ public CommonResponse createOrUpdate(@RequestPart(value = "requestPostDTO") RequestPostDTO requestPostDTO,
+ @RequestPart(value = "files", required = false) List files,
+ @CurrentUser Long userId, @PathVariable(required = false) Long postId) throws InvalidAccessException {
+
+ postService.create(userId, requestPostDTO, files, postId);
+ return CommonResponse.createSuccess();
+ }
+
+ @GetMapping("")
+ public CommonResponse> findAllPosts(){
+ List posts = postService.findAllPosts();
+ return CommonResponse.createSuccess(posts);
+ }
+
+ @GetMapping("/myPosts")
+ public CommonResponse> showMyPost(@CurrentUser Long userId){
+ List myPost = postService.myPosts(userId);
+ return CommonResponse.createSuccess(myPost);
+ }
+
+ @GetMapping("/{postId}")
+ public CommonResponse showPost(@PathVariable Long postId){
+ ResponsePostDTO newPost = postService.show(postId);
+ return CommonResponse.createSuccess(newPost);
+ }
+
+ @DeleteMapping("/{postId}")
+ public CommonResponse delete(@PathVariable Long postId, @CurrentUser Long userId) throws InvalidAccessException {
+ postService.delete(postId, userId);
+ return CommonResponse.createSuccess();
+ }
+
+}
diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java
new file mode 100644
index 00000000..ac040f39
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/dto/RequestCommentDTO.java
@@ -0,0 +1,18 @@
+package leets.weeth.domain.post.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@ToString
+public class RequestCommentDTO {
+
+ @NotBlank
+ private String content;
+
+}
diff --git a/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java
new file mode 100644
index 00000000..6edea8bc
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/dto/RequestPostDTO.java
@@ -0,0 +1,16 @@
+package leets.weeth.domain.post.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.*;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@ToString
+@Setter
+public class RequestPostDTO {
+ @NotBlank
+ private String title;
+ @NotBlank
+ private String content;
+}
\ No newline at end of file
diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java
new file mode 100644
index 00000000..a0295b8e
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/dto/ResponseCommentDTO.java
@@ -0,0 +1,25 @@
+package leets.weeth.domain.post.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import leets.weeth.domain.post.entity.Comment;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@ToString
+public class ResponseCommentDTO {
+ private Long id;
+ @NotBlank
+ private String content;
+ private LocalDateTime time;
+
+ public static ResponseCommentDTO createResponseCommentDto(Comment comment) {
+ return new ResponseCommentDTO(comment.getId(), comment.getContent(),
+ comment.getTime());
+ }
+}
diff --git a/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java
new file mode 100644
index 00000000..5f4c7b5d
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/dto/ResponsePostDTO.java
@@ -0,0 +1,37 @@
+package leets.weeth.domain.post.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import leets.weeth.domain.file.entity.File;
+import leets.weeth.domain.post.entity.Post;
+import lombok.*;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@AllArgsConstructor
+@Builder
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Getter
+@ToString
+public class ResponsePostDTO {
+
+ private Long id;
+ @NotBlank
+ private String name;
+ @NotBlank
+ private String title;
+ @NotBlank
+ private String content;
+ private LocalDateTime time;
+ private List fileUrls;
+
+ public static ResponsePostDTO createResponsePostDTO(Post post) {
+ return ResponsePostDTO.builder()
+ .id(post.getId())
+ .name(post.getUser().getName())
+ .title(post.getTitle())
+ .content(post.getContent())
+ .time(post.getTime())
+ .fileUrls(post.getFileUrls())
+ .build();
+ }
+}
diff --git a/src/main/java/leets/weeth/domain/post/entity/Comment.java b/src/main/java/leets/weeth/domain/post/entity/Comment.java
new file mode 100644
index 00000000..bca7bd53
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/entity/Comment.java
@@ -0,0 +1,59 @@
+package leets.weeth.domain.post.entity;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotEmpty;
+import leets.weeth.domain.post.dto.RequestCommentDTO;
+import leets.weeth.domain.user.entity.User;
+import leets.weeth.global.common.entity.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+
+
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Entity
+@Getter
+@Table
+public class Comment extends BaseEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "comment_id")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name="post_id")
+ private Post post;
+
+ @ManyToOne
+ @JoinColumn(name = "user_id")
+ private User user;
+
+ @NotEmpty
+ @Column
+ private String content;
+ LocalDateTime time;
+ public static Comment createComment(RequestCommentDTO dto, Post post, User user){
+
+ Comment newComment = new Comment(
+ null,
+ post,
+ user,
+ dto.getContent(),
+ null
+ );
+ return newComment;
+ }
+
+ @PrePersist
+ @PreUpdate
+ public void setTime() {
+ this.time = this.getModifiedAt() == null ? this.getCreatedAt() : this.getModifiedAt();
+ }
+
+
+}
diff --git a/src/main/java/leets/weeth/domain/post/entity/Post.java b/src/main/java/leets/weeth/domain/post/entity/Post.java
new file mode 100644
index 00000000..b683249d
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/entity/Post.java
@@ -0,0 +1,66 @@
+package leets.weeth.domain.post.entity;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotEmpty;
+import leets.weeth.domain.file.entity.File;
+import leets.weeth.domain.post.dto.RequestPostDTO;
+import leets.weeth.domain.user.entity.User;
+import leets.weeth.global.common.entity.BaseEntity;
+import lombok.*;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Entity
+@Getter
+@Table
+public class Post extends BaseEntity {
+ @Id //엔티티의 대푯값 지정
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "post_id")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "user_id")
+ private User user;
+
+ @NotEmpty
+ private String title;
+
+ @NotEmpty
+ private String content;
+
+ LocalDateTime time;
+ @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)
+ private List fileUrls = new ArrayList<>();
+
+ public static Post createPost(RequestPostDTO dto, User user, List urls){
+
+ return Post.builder()
+ .id(null)
+ .user(user)
+ .title(dto.getTitle())
+ .content(dto.getContent())
+ .time(null)
+ .fileUrls(urls)
+ .build();
+ }
+
+ public void updatePost(RequestPostDTO dto, List newUrls) {
+ this.title = dto.getTitle();
+ this.content = dto.getContent();
+ this.fileUrls.clear(); // 기존 파일 제거
+ this.fileUrls.addAll(newUrls); // 새로운 url 추가
+ }
+
+ @PrePersist
+ @PreUpdate
+ public void setTime() {
+ this.time = this.getModifiedAt() == null ? this.getCreatedAt() : this.getModifiedAt();
+ }
+
+}
diff --git a/src/main/java/leets/weeth/domain/post/repository/CommentRepository.java b/src/main/java/leets/weeth/domain/post/repository/CommentRepository.java
new file mode 100644
index 00000000..050343e6
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/repository/CommentRepository.java
@@ -0,0 +1,13 @@
+package leets.weeth.domain.post.repository;
+
+import leets.weeth.domain.post.entity.Comment;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface CommentRepository extends JpaRepository {
+
+ @Query(value = "SELECT * FROM comment WHERE post_id = :postId", nativeQuery = true)
+ List findByPostId(Long postId);
+}
diff --git a/src/main/java/leets/weeth/domain/post/repository/PostRepository.java b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java
new file mode 100644
index 00000000..2d333e02
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/repository/PostRepository.java
@@ -0,0 +1,13 @@
+package leets.weeth.domain.post.repository;
+
+import leets.weeth.domain.post.entity.Post;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.ArrayList;
+import java.util.List;
+
+public interface PostRepository extends JpaRepository {
+ ArrayList findAll();
+ List findByUserId(Long userId, Sort sort);
+
+}
diff --git a/src/main/java/leets/weeth/domain/post/service/CommentService.java b/src/main/java/leets/weeth/domain/post/service/CommentService.java
new file mode 100644
index 00000000..15e07ebe
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/service/CommentService.java
@@ -0,0 +1,43 @@
+package leets.weeth.domain.post.service;
+
+import jakarta.persistence.EntityNotFoundException;
+import leets.weeth.domain.post.dto.RequestCommentDTO;
+import leets.weeth.domain.post.dto.ResponseCommentDTO;
+import leets.weeth.domain.post.entity.Comment;
+import leets.weeth.domain.post.entity.Post;
+import leets.weeth.domain.post.repository.CommentRepository;
+import leets.weeth.domain.post.repository.PostRepository;
+import leets.weeth.domain.user.entity.User;
+import leets.weeth.domain.user.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class CommentService {
+ @Autowired
+ private PostRepository postRepository;
+ @Autowired
+ private UserRepository userRepository;
+ @Autowired
+ private CommentRepository commentRepository;
+
+ public List comments(Long articleId) {
+ return commentRepository.findByPostId(articleId)
+ .stream()
+ .map(ResponseCommentDTO::createResponseCommentDto)
+ .collect(Collectors.toList());
+ }
+
+ public void create(String email, Long articleId, RequestCommentDTO requestCommentDTO) {
+ User user = userRepository.findByEmail(email)
+ .orElseThrow(() -> new UsernameNotFoundException("failed to add post! no such user"));
+ Post targetPost = postRepository.findById(articleId).orElseThrow(()->new EntityNotFoundException("failed to add post! no such post"));
+
+ Comment newComment = Comment.createComment(requestCommentDTO, targetPost, user);
+ commentRepository.save(newComment);
+ }
+}
diff --git a/src/main/java/leets/weeth/domain/post/service/PostService.java b/src/main/java/leets/weeth/domain/post/service/PostService.java
new file mode 100644
index 00000000..49596518
--- /dev/null
+++ b/src/main/java/leets/weeth/domain/post/service/PostService.java
@@ -0,0 +1,104 @@
+package leets.weeth.domain.post.service;
+
+import jakarta.transaction.Transactional;
+import leets.weeth.domain.file.entity.File;
+import leets.weeth.domain.file.service.FileService;
+import leets.weeth.domain.post.dto.RequestPostDTO;
+import leets.weeth.domain.post.dto.ResponsePostDTO;
+import leets.weeth.domain.post.entity.Post;
+import leets.weeth.domain.post.repository.PostRepository;
+import leets.weeth.domain.user.entity.User;
+import leets.weeth.domain.user.repository.UserRepository;
+import leets.weeth.global.common.error.exception.custom.InvalidAccessException;
+import leets.weeth.global.common.error.exception.custom.PostNotFoundException;
+import leets.weeth.global.common.error.exception.custom.UserNotFoundException;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Slf4j
+@Service //서비스 객체 생성
+public class PostService {
+ private final PostRepository postRepository;
+ private final UserRepository userRepository;
+ private final FileService fileService;
+
+ //모든 게시물 가져오기
+ public List findAllPosts() {
+ // 모든 게시물을 id에 대해 오름차순으로 조회
+ List posts = postRepository.findAll(Sort.by(Sort.Direction.ASC, "id"));
+ return posts.stream()
+ .map(ResponsePostDTO::createResponsePostDTO)
+ .collect(Collectors.toList());
+ }
+
+ // 특정 postId의 게시물만 조회
+ public ResponsePostDTO show(Long postId) {
+ Post target = postRepository.findById(postId)
+ .orElseThrow(PostNotFoundException::new);
+
+ return ResponsePostDTO.createResponsePostDTO(target);
+ }
+
+ // 특정 유저(본인)의 게시물만 조회
+ public List myPosts(Long userId){
+ // 특정 유저의 모든 게시물을 오름차순으로 조회
+ List myPosts = postRepository.findByUserId(userId, Sort.by(Sort.Direction.ASC, "id"));
+
+ // Post 리스트를 ResponsePostDTO 리스트로 변환
+ return myPosts.stream()
+ .map(ResponsePostDTO::createResponsePostDTO) // Post -> ResponsePostDTO 변환
+ .collect(Collectors.toList());
+ }
+
+ @Transactional
+ public void create(Long userId, RequestPostDTO requestPostDTO, List files, Long postId) throws InvalidAccessException {
+ // 사용자가 존재하지 않는 경우
+ User user = userRepository.findById(userId)
+ .orElseThrow(UserNotFoundException::new);
+ //
+ List fileUrls;
+ Post newPost;
+ if(postId!=null){
+ Post targetPost = postRepository.findById(postId).orElse(null);
+ // 대상 게시물이 존재하지 않는 경우
+ if (targetPost==null){
+ throw new PostNotFoundException();
+ }
+ // 게시글을 수정하려는 유저가 원래의 게시글 작성자와 다를 경우
+ if(!(targetPost.getUser().getId() == userId)){
+ throw new InvalidAccessException();
+ }
+ // 파일 첨부
+ fileUrls = fileService.uploadFiles(files);
+ newPost = postRepository.findById(postId).orElse(null);
+ // 게시물 수정
+ newPost.updatePost(requestPostDTO, fileUrls);
+ }
+ else {
+ // 파일 첨부
+ fileUrls = fileService.uploadFiles(files);
+ // 게시물 생성
+ newPost = Post.createPost(requestPostDTO, user, fileUrls);
+ }
+ postRepository.save(newPost);
+ }
+
+ @Transactional
+ public void delete(Long postId, Long userId) throws InvalidAccessException {
+ // 대상 게시물이 존재하지 않는 경우
+ Post deleted = postRepository.findById(postId)
+ .orElseThrow(PostNotFoundException::new);
+ // 게시글을 수정하려는 유저가 원래의 게시글 작성자와 다를 경우
+ if(!(deleted.getUser().getId() == userId)){
+ throw new InvalidAccessException();
+ }
+ postRepository.delete(deleted);
+ }
+}
diff --git a/src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java b/src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java
new file mode 100644
index 00000000..4f195af2
--- /dev/null
+++ b/src/main/java/leets/weeth/global/common/error/exception/custom/PostNotFoundException.java
@@ -0,0 +1,9 @@
+package leets.weeth.global.common.error.exception.custom;
+
+import jakarta.persistence.EntityNotFoundException;
+
+public class PostNotFoundException extends EntityNotFoundException {
+ public PostNotFoundException() {
+ super("존재하지 않는 게시물입니다.");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/leets/weeth/global/config/AwsS3Config.java b/src/main/java/leets/weeth/global/config/AwsS3Config.java
new file mode 100644
index 00000000..51787d9c
--- /dev/null
+++ b/src/main/java/leets/weeth/global/config/AwsS3Config.java
@@ -0,0 +1,32 @@
+package leets.weeth.global.config;
+
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@RequiredArgsConstructor
+public class AwsS3Config {
+
+ @Value("${cloud.aws.credentials.access-key}")
+ private String accessKey;
+
+ @Value("${cloud.aws.credentials.secret-key}")
+ private String accessSecret;
+ @Value("${cloud.aws.region.static}")
+ private String region;
+
+ @Bean
+ public AmazonS3 s3Client() {
+ AWSCredentials credentials = new BasicAWSCredentials(accessKey, accessSecret);
+ return AmazonS3ClientBuilder.standard()
+ .withCredentials(new AWSStaticCredentialsProvider(credentials))
+ .withRegion(region).build();
+ }
+}
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index 90205be1..8a4b854d 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -11,6 +11,11 @@ spring:
dialect: org.hibernate.dialect.MySQLDialect
hibernate:
ddl-auto: update
+ servlet:
+ multipart:
+ max-file-size: 5MB
+ max-request-size: 10MB
+ resolve-lazily: true
# MySQL 유저 생성 및 스키마 생성 터미널 명령어
# 터미널 혹은 프로그램으로 루트 사용자 접속 후,
@@ -27,3 +32,16 @@ weeth:
refresh:
expiration: ${REFRESH_EXP}
header: ${REFRESH_HEAD}
+
+cloud:
+ aws:
+ s3:
+ bucket: ${S3_BUCKET}
+ credentials:
+ access-key: ${S3_ACCESS_KEY}
+ secret-key: ${S3_SECRET_KEY}
+ region:
+ static: ap-northeast-2
+ auto: false
+ stack:
+ auto: false
\ No newline at end of file
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 809066e2..c2f619a2 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -19,4 +19,16 @@ weeth:
header: ${ACCESS_HEAD}
refresh:
expiration: ${REFRESH_EXP}
- header: ${REFRESH_HEAD}
\ No newline at end of file
+ header: ${REFRESH_HEAD}
+cloud:
+ aws:
+ s3:
+ bucket: ${S3_BUCKET}
+ credentials:
+ access-key: ${S3_ACCESS_KEY}
+ secret-key: ${S3_SECRET_KEY}
+ region:
+ static: ap-northeast-2
+ auto: false
+ stack:
+ auto: false
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 5a28705a..2d953afa 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,6 +1,11 @@
spring:
profiles:
active: local
+ servlet:
+ multipart:
+ enabled: true
+ max-file-size: 10MB
+ max-request-size: 10MB
springdoc:
swagger-ui: