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: