Skip to content
Open
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: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ target/
!**/src/main/**/target/
!**/src/test/**/target/

*.yaml
*.zip

### STS ###
.apt_generated
.classpath
Expand Down
24 changes: 24 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,30 @@
<version>2.12.4</version>
</dependency>

<!-- image upload to S3 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-context</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-autoconfigure</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>

<!-- &lt;!&ndash; https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.amazonaws</groupId>-->
<!-- <artifactId>aws-java-sdk-s3</artifactId>-->
<!-- <version>1.11.901</version>-->
<!-- </dependency>-->

</dependencies>

<build>
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/com/hebe/AmazonS3Config.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.hebe;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class AmazonS3Config {

@Value("${cloud.aws.credentials.access-key}")
private String accessKey;

@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;

@Value("${cloud.aws.region.static}")
private String region;

@Bean
@Primary
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();
}
}
34 changes: 25 additions & 9 deletions src/main/java/com/hebe/controller/DiaryController.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hebe.controller;

import com.hebe.imgUpload.ImageManagerService;
import com.hebe.jwt.model.UserEntity;
import com.hebe.service.DiaryService;
import com.hebe.vo.*;
Expand All @@ -18,6 +19,9 @@ public class DiaryController {
@Autowired
private DiaryService DiaryService;

@Autowired
private ImageManagerService ImageManagerService;

// 특정 유저 게시글 조회
@PostMapping("/diary")
public List<CardDomain> selUserDiary(UserEntity param) {
Expand All @@ -42,20 +46,18 @@ public UserEntity selUserInfo(UserEntity param) {
return userInfo;
}

// 글쓰기 버튼 클릭 시 임의의 글 생성 (이미지 폴더 담아두기용)
@PostMapping("/preWrite")
public int preWriteDiary(DiaryEntity param) {
return DiaryService.preWriteDiary(param);
}

// 최신 글 iboard 가져오기
@PostMapping("/diary/recent")
public int getRecentIboard() { return DiaryService.getRecentIboard(); }

// 이미지 업로드
@PostMapping("/diaryImg")
public String uploadImage(MultipartFile img, int iboard, int iuser) {
return DiaryService.uploadImage(img, iboard, iuser); }
public String uploadImage(MultipartFile img, int iboard, int iuser) { // 기존엔 String 타입
String filePath = "img/" + iuser + "/" + iboard;
return ImageManagerService.createAndUploadFile(img, filePath);

// return DiaryService.uploadImage(img, iboard, iuser);
}

// 글 작성
@PostMapping("/write")
Expand All @@ -72,13 +74,27 @@ public int cancelDiary(DiaryEntity param) {
return DiaryService.cancelDiary(param);
}

// 글 수정
@PostMapping("/update")
public int updateDiary(DiaryEntity param) {
System.out.println("/api/update 작동");
// 수정할 때 기존에 있던 이미지 삭제 시 s3에서 이미지 삭제

return DiaryService.updateDiary(param);
}

// detail 조회
@PostMapping("/detail")
public DetailDomain detailDiary(DiaryEntity param) { return DiaryService.detailDiary(param); }

// 글 삭제
@PostMapping("/delete")
public int deleteDiary(DiaryEntity param) { return DiaryService.deleteDiary(param); }
public int deleteDiary(DiaryEntity param) {
String filePath = "img/" + param.getIuser() + "/" + param.getIboard();
ImageManagerService.deleteFile(filePath); // 글 삭제 시 s3에 이미지 삭제

return DiaryService.deleteDiary(param);
}

// 댓글 리스트 조회
@PostMapping("/cmt/list")
Expand Down
80 changes: 80 additions & 0 deletions src/main/java/com/hebe/controller/TodoController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.hebe.controller;

import com.hebe.service.TodoService;
import com.hebe.vo.CalendarDTO;
import com.hebe.vo.TodoDTO;
import com.hebe.vo.TodoDTOList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api")
public class TodoController {

@Autowired
private TodoService TodoService;

// 접속유저의 전체 todolist 조회
// RequestBody는 post형식으로 json 받을 때 사용
@PostMapping("/todo")
public List<TodoDTO> selTodoList(TodoDTO param) {
List<TodoDTO> list = TodoService.selTodoList(param);
System.out.println("TodoList select : " + list);
return list;
}

// 접속유저의 날짜별 todolist 조회
@GetMapping("/todo")
public List<TodoDTO> dayTodoList(TodoDTO param) {
List<TodoDTO> list = TodoService.dayTodoList(param);
System.out.println("day : " + param.getRegdt());
for(int i = 0; i < list.toArray().length; i++) {
if (param.getRegdt().equals(list.get(i).getRegdt())) {
System.out.println("iuser : " + param.getIuser());
System.out.println(param.getRegdt() + " : " + list.get(i));
} else {
list.remove(i);
}
}
System.out.println(param.getRegdt() + "[list] : "+ list);
return list;
}

@PostMapping("/todo/regdt")
public List<CalendarDTO> monthData(CalendarDTO param) {
System.out.println(param.getMonth());
return TodoService.monthData(param);
}

// @PostMapping("/todo/cal") // 안쓰는ㄷ...듯?
// public String[] calAllList(TodoDTO param){
// List<TodoDTO> list = TodoService.calAllList(param);
// String[] strArr = new String[20];
// for(int i=0; i < TodoService.calAllList(param).toArray().length; i++){
// strArr[i] = list.get(i).getRegdt();
// System.out.println(list.get(i).getRegdt());
// };
// return strArr;
// }

// 접속유저의 todoList 작성
@PostMapping("/todo/insert")
public void insTodoList(@RequestBody TodoDTOList param) {
System.out.println(param);
TodoService.insTodoList(param);
}

// 접속유저의 todoList 수정
@PostMapping("/todo/update")
public void update(@RequestBody TodoDTO param) {
TodoService.updTodoList(param);
}

// 접속유저의 todoList 삭제
@PostMapping("/todo/delete")
public void delTodoList(@RequestBody TodoDTOList param) {
TodoService.delTodoList(param);
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/hebe/imgUpload/FileManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.hebe.imgUpload;

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;

@Component
public class FileManager {
// MultipartFile을 File로 변형 후 로컬로 저장, 파일 객체를 리턴
public Optional<File> convertMultipartFileToFile(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();
}
}
61 changes: 61 additions & 0 deletions src/main/java/com/hebe/imgUpload/ImageManagerService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.hebe.imgUpload;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

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

@Service
@RequiredArgsConstructor
public class ImageManagerService {

@Autowired
private FileManager fileManager;

@Autowired
private UploadImageS3 uploadImageS3;

// 임시 파일 생성 & 업데이트 & 임시 파일 삭제
public String createAndUploadFile(MultipartFile mf, String filePath) {
String ext = FilenameUtils.getExtension(mf.getOriginalFilename());
String saveFileName = UUID.randomUUID().toString() + "." + ext;

// 파일 생성
File uploadFile = null;
try {
Optional<File> uploadFileOpt = fileManager.convertMultipartFileToFile(mf);
if (uploadFileOpt.isEmpty()) {
System.out.println("파일 변환에 실패했습니다.");
}
uploadFile = uploadFileOpt.get();

// 파일 업로드
uploadImageS3.upload(uploadFile, filePath, saveFileName);
} catch (IOException e) {
e.printStackTrace();
System.out.println("파일을 업로드 하던 중 에러가 발생했습니다.");
} finally {
// 파일 삭제
if (uploadFile != null) {
uploadFile.delete();
}
}
return saveFileName;
}

// 글 삭제 시 해당 글에 있는 s3 이미지 삭제
public void deleteFile(String filePath) {
uploadImageS3.delete(filePath);
}
}
46 changes: 46 additions & 0 deletions src/main/java/com/hebe/imgUpload/UploadImageS3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.hebe.imgUpload;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;

@Component
@RequiredArgsConstructor
public class UploadImageS3 {

private final AmazonS3Client amazonS3;

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

public String upload(File uploadFile, String filePath, String saveFileName) {
String fileName = filePath + "/" + saveFileName;
amazonS3.putObject(new PutObjectRequest(bucket, fileName, uploadFile)
.withCannedAcl(CannedAccessControlList.PublicRead));

return fileName;
}

public void delete(String filePath) {
try {
//Delete 객체 생성
DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucket, filePath);
//Delete
amazonS3.deleteObject(deleteObjectRequest);
System.out.println(String.format("[%s] deletion complete", filePath));
} catch (AmazonServiceException e) {
e.printStackTrace();
} catch (SdkClientException e) {
e.printStackTrace();
}
}
}
14 changes: 12 additions & 2 deletions src/main/java/com/hebe/jwt/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,18 @@ protected void configure(HttpSecurity http) throws Exception {
.httpBasic().disable(); // 기본 인증 방식 사용 x

http.authorizeRequests()
.antMatchers("/api/main/**", "/api/user/**", "/api/oauth/**").permitAll()
.anyRequest().authenticated();
// .antMatchers(
// "/api/main/**"
// , "/api/user/**"
// , "/api/oauth/**"
// , "/api/detail"
// , "/api/cmt/list"
// , "/api/search"
// , "/api/diary"
// , "/api/diary/**"
// ).permitAll()
// .anyRequest().authenticated();
.antMatchers("/api/**").permitAll();

http.formLogin().disable();

Expand Down
Loading