Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion backend/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,5 @@ out/
.vscode/

src/main/resources/config/email.properties
src/main/resources/application-dev.yml
src/main/resources/application-dev.yml
src/main/resources/resources/aws.yml
1 change: 1 addition & 0 deletions backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-aws', version: '2.2.1.RELEASE'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
Expand Down
79 changes: 79 additions & 0 deletions backend/src/main/java/com/devu/backend/config/s3/S3Uploader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.devu.backend.config.s3;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.devu.backend.entity.Image;
import com.devu.backend.entity.post.Post;
import com.devu.backend.repository.ImageRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;

@Slf4j
@Component
@RequiredArgsConstructor
public class S3Uploader {

private final AmazonS3Client amazonS3Client;
private final ImageRepository imageRepository;

@Value("${cloud.aws.s3.bucket}")
private String bucket;

public String upload(MultipartFile multipartFile, String dirName, Post post) throws IOException {
File uploadFile = convert(multipartFile)
.orElseThrow(() -> new IllegalArgumentException("MultipartFile -> File로 전환이 실패했습니다."));

return upload(uploadFile, dirName, post);
}

public void delete(String name) {
amazonS3Client.deleteObject(bucket, name);
}

private String upload(File uploadFile, String dirName, Post post) {
String fileName = dirName + "/" + UUID.randomUUID() + "_" + uploadFile.getName();
String uploadImageUrl = putS3(uploadFile, fileName);
removeNewFile(uploadFile);
Image image = Image.builder()
.name(fileName)
.path(uploadImageUrl)
.build();
post.addImage(imageRepository.save(image));
return uploadImageUrl;
}

private String putS3(File uploadFile, String fileName) {
amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile).withCannedAcl(CannedAccessControlList.PublicRead));
return amazonS3Client.getUrl(bucket, fileName).toString();
}

private void removeNewFile(File targetFile) {
if (targetFile.delete()) {
log.info("파일이 삭제되었습니다.");
} else {
log.info("파일이 삭제되지 못했습니다.");
}
}

private Optional<File> convert(MultipartFile file) throws IOException {
File convertFile = new File(file.getOriginalFilename());
if(convertFile.createNewFile()) {
try (FileOutputStream fos = new FileOutputStream(convertFile)) {
fos.write(file.getBytes());
}
return Optional.of(convertFile);
}

return Optional.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.devu.backend.common.exception.PostNotFoundException;
import com.devu.backend.controller.ResponseErrorDto;
import com.devu.backend.entity.Image;
import com.devu.backend.entity.post.*;
import com.devu.backend.repository.PostRepository;
import com.devu.backend.service.PostService;
Expand All @@ -12,6 +13,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Slf4j
Expand Down Expand Up @@ -120,13 +122,15 @@ public ResponseEntity<?> getQuestionById(@PathVariable("id") Long id) {

//자유 게시판 글 작성
@PostMapping("/chat")
public ResponseEntity<?> createChat(@RequestBody RequestPostCreateDto requestPostDto) {
public ResponseEntity<?> createChat(RequestPostCreateDto requestPostDto) {
try {
Chat chat = postService.createChat(requestPostDto);
log.info("{}님이 chat 게시글 생성",chat.getUser().getUsername());
List<String> images = getImageUrl(chat);
ResponsePostDto postDto = ResponsePostDto.builder()
.title(chat.getTitle())
.username(chat.getUser().getUsername())
.url(images)
.build();
return ResponseEntity.ok(postDto);
} catch (Exception e) {
Expand All @@ -138,6 +142,14 @@ public ResponseEntity<?> createChat(@RequestBody RequestPostCreateDto requestPos
}
}

private List<String> getImageUrl(Chat chat) {
List<String> images = new ArrayList<>();
for (Image image : chat.getImages()) {
images.add(image.getPath());
}
return images;
}

//스터디 게시판 글 작성
@PostMapping("/study")
public ResponseEntity<?> createStudy(@RequestBody RequestPostCreateDto requestPostDto) {
Expand Down Expand Up @@ -180,7 +192,7 @@ public ResponseEntity<?> createQuestion(@RequestBody RequestPostCreateDto reques

//chat update
@PatchMapping("/chat/{id}")
public ResponseEntity<?> updateChat(@PathVariable("id") Long id, @RequestBody RequestPostUpdateDto updateDto) {
public ResponseEntity<?> updateChat(@PathVariable("id") Long id, RequestPostUpdateDto updateDto) {
try {
Chat chat = (Chat) postRepository.findById(id).orElseThrow(PostNotFoundException::new);
postService.updateChat(chat, updateDto);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.devu.backend.controller.post;

import lombok.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Getter
@Setter
Expand All @@ -11,5 +14,6 @@ public class RequestPostCreateDto {
private String username;
private String title;
private String content;
//image,tag 추후에 필요
private List<MultipartFile> images;
//tag 추후에 필요
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.devu.backend.controller.post;

import lombok.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Getter
@Setter
Expand All @@ -11,5 +14,6 @@ public class RequestPostUpdateDto {
private String title;
private String content;
private String status;
//image,tag 추후에 필요
private List<MultipartFile> images;
//tag 추후에 필요
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@Builder
@NoArgsConstructor
Expand All @@ -16,6 +18,7 @@ public class ResponsePostDto {
private String username;
private String title;
private String content;
private List<String> url;
private Long hit;
private Long like;
private StudyStatus studyStatus;
Expand Down
16 changes: 10 additions & 6 deletions backend/src/main/java/com/devu/backend/entity/Image.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package com.devu.backend.entity;

import com.devu.backend.entity.post.Post;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
public class Image {
@Builder @Getter
@NoArgsConstructor @AllArgsConstructor
public class Image extends BaseTime{

@Id
@GeneratedValue
Expand All @@ -19,9 +25,7 @@ public class Image {

private String name;

private String save_name;

private Long fileSize;

private LocalDateTime create_date_time;
public void setPost(Post post) {
this.post = post;
}
}
17 changes: 13 additions & 4 deletions backend/src/main/java/com/devu/backend/entity/post/Post.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import lombok.*;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
Expand Down Expand Up @@ -40,8 +40,12 @@ public class Post extends BaseTime{
@Column(name = "like_count")
private Long like;

@OneToMany(mappedBy = "post")
private Set<Image> images = new HashSet<>();
@OneToMany(
mappedBy = "post",
cascade = {CascadeType.PERSIST, CascadeType.REMOVE},
orphanRemoval = true
)
private List<Image> images = new ArrayList<>();

//==비지니스 로직==//
public void plusHit() {
Expand All @@ -63,4 +67,9 @@ public void updatePost(RequestPostUpdateDto updateDto) {
this.title = updateDto.getTitle();
this.content = updateDto.getContent();
}

public void addImage(Image image) {
this.images.add(image);
image.setPost(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.devu.backend.repository;

import com.devu.backend.entity.Image;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ImageRepository extends JpaRepository<Image, Long> {
}
Loading