From e3d0f42c0a3914c90fb5b3cb8f407b50806bedc2 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 1 Sep 2021 21:20:58 +0900 Subject: [PATCH 01/21] application.yaml spring: datasource: url mysql -> mariadb --- src/main/resources/application.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a17f2cd..2d82f84 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,6 +1,6 @@ spring: datasource: - url: jdbc:mysql://hebe-db.cok6p3wjd2e5.ap-northeast-2.rds.amazonaws.com:3306/hebe + url: jdbc:mariadb://hebe-db.cok6p3wjd2e5.ap-northeast-2.rds.amazonaws.com:3306/hebe username: admin password: sweetgirl3! driver-class-name: org.mariadb.jdbc.Driver From c409984d764890dc869fd38b25520ef2ce254873 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Thu, 2 Sep 2021 20:07:01 +0900 Subject: [PATCH 02/21] =?UTF-8?q?SecurityConfig=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hebe/jwt/config/SecurityConfig.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hebe/jwt/config/SecurityConfig.java b/src/main/java/com/hebe/jwt/config/SecurityConfig.java index d739e78..74aae15 100644 --- a/src/main/java/com/hebe/jwt/config/SecurityConfig.java +++ b/src/main/java/com/hebe/jwt/config/SecurityConfig.java @@ -58,7 +58,14 @@ protected void configure(HttpSecurity http) throws Exception { .httpBasic().disable(); // 기본 인증 방식 사용 x http.authorizeRequests() - .antMatchers("/api/main/**", "/api/user/**", "/api/oauth/**").permitAll() + .antMatchers( + "/api/main/**" + , "/api/user/**" + , "/api/oauth/**" + , "/api/detail" + , "/api/cmt/list" + , "/api/search" + ).permitAll() .anyRequest().authenticated(); http.formLogin().disable(); From 4ea32c916e7462578fb14c49e0a142c9894a728c Mon Sep 17 00:00:00 2001 From: jun17183 Date: Fri, 3 Sep 2021 22:10:00 +0900 Subject: [PATCH 03/21] =?UTF-8?q?application.yaml=20redis=20host=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 2d82f84..f4d2e49 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -70,7 +70,9 @@ spring: # https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100 # Redis-x64-3.2.100.msi install redis: - host: hebe-db.cok6p3wjd2e5.ap-northeast-2.rds.amazonaws.com + # host: localhost + # host: hebe-db.cok6p3wjd2e5.ap-northeast-2.rds.amazonaws.com + host: ec2-15-164-202-112.ap-northeast-2.compute.amazonaws.com port: 6379 mybatis: From f3ee0bb86d31643fc79f80bd49201d5d6c25f5ec Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 6 Sep 2021 10:44:06 +0900 Subject: [PATCH 04/21] =?UTF-8?q?SecurityConfig=20=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hebe/jwt/config/SecurityConfig.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hebe/jwt/config/SecurityConfig.java b/src/main/java/com/hebe/jwt/config/SecurityConfig.java index 74aae15..61e57ab 100644 --- a/src/main/java/com/hebe/jwt/config/SecurityConfig.java +++ b/src/main/java/com/hebe/jwt/config/SecurityConfig.java @@ -65,8 +65,25 @@ protected void configure(HttpSecurity http) throws Exception { , "/api/detail" , "/api/cmt/list" , "/api/search" + , "/api/diary" + , "/api/diary/**" ).permitAll() - .anyRequest().authenticated(); + .antMatchers( + "/api/write" + , "/api/delete" + , "/api/preWrite" + , "/api/diaryImg" + , "/api/cancel" + , "/api/cmt/write" + , "/api/cmt/delete" + , "/api/cmt/update" + , "/api/fav" + , "/update/**" + , "/api/user/profileMod" + ).authenticated(); + + + // .anyRequest().authenticated(); http.formLogin().disable(); From 20340458876df2b025fe2e15342ab1fad5ccadeb Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 6 Sep 2021 11:42:09 +0900 Subject: [PATCH 05/21] =?UTF-8?q?SecurityConfig=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20permitAll=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hebe/jwt/config/SecurityConfig.java | 38 ++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/hebe/jwt/config/SecurityConfig.java b/src/main/java/com/hebe/jwt/config/SecurityConfig.java index 61e57ab..44cdc1f 100644 --- a/src/main/java/com/hebe/jwt/config/SecurityConfig.java +++ b/src/main/java/com/hebe/jwt/config/SecurityConfig.java @@ -58,32 +58,18 @@ protected void configure(HttpSecurity http) throws Exception { .httpBasic().disable(); // 기본 인증 방식 사용 x http.authorizeRequests() - .antMatchers( - "/api/main/**" - , "/api/user/**" - , "/api/oauth/**" - , "/api/detail" - , "/api/cmt/list" - , "/api/search" - , "/api/diary" - , "/api/diary/**" - ).permitAll() - .antMatchers( - "/api/write" - , "/api/delete" - , "/api/preWrite" - , "/api/diaryImg" - , "/api/cancel" - , "/api/cmt/write" - , "/api/cmt/delete" - , "/api/cmt/update" - , "/api/fav" - , "/update/**" - , "/api/user/profileMod" - ).authenticated(); - - - // .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(); From e22db8cface213c2e1bc2d2f60ef861d7d38ec12 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 12:10:40 +0900 Subject: [PATCH 06/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + pom.xml | 24 ++++++ src/main/java/com/hebe/AmazonS3Config.java | 31 ++++++++ .../com/hebe/controller/DiaryController.java | 17 ++++- .../java/com/hebe/imgUpload/FileManager.java | 24 ++++++ .../hebe/imgUpload/ImageManagerService.java | 49 ++++++++++++ .../com/hebe/imgUpload/UploadImageS3.java | 51 +++++++++++++ .../java/com/hebe/service/DiaryService.java | 48 +++++++----- .../java/com/hebe/service/ImageService.java | 74 +++++++++++++++++++ src/main/resources/application.yaml | 12 +++ 10 files changed, 311 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/hebe/AmazonS3Config.java create mode 100644 src/main/java/com/hebe/imgUpload/FileManager.java create mode 100644 src/main/java/com/hebe/imgUpload/ImageManagerService.java create mode 100644 src/main/java/com/hebe/imgUpload/UploadImageS3.java create mode 100644 src/main/java/com/hebe/service/ImageService.java diff --git a/.gitignore b/.gitignore index 549e00a..a6bf458 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ target/ !**/src/main/**/target/ !**/src/test/**/target/ +*.yaml +*.zip + ### STS ### .apt_generated .classpath diff --git a/pom.xml b/pom.xml index ef5396b..49fcf03 100644 --- a/pom.xml +++ b/pom.xml @@ -136,6 +136,30 @@ 2.12.4 + + + org.springframework.cloud + spring-cloud-starter-aws + 2.0.1.RELEASE + + + org.springframework.cloud + spring-cloud-aws-context + 1.2.1.RELEASE + + + org.springframework.cloud + spring-cloud-aws-autoconfigure + 1.2.1.RELEASE + + + + + com.amazonaws + aws-java-sdk-s3 + 1.11.901 + + diff --git a/src/main/java/com/hebe/AmazonS3Config.java b/src/main/java/com/hebe/AmazonS3Config.java new file mode 100644 index 0000000..9e129b7 --- /dev/null +++ b/src/main/java/com/hebe/AmazonS3Config.java @@ -0,0 +1,31 @@ +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; + +@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 + public AmazonS3Client amazonS3Client() { + BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey); + return (AmazonS3Client) AmazonS3ClientBuilder.standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) + .build(); + } +} diff --git a/src/main/java/com/hebe/controller/DiaryController.java b/src/main/java/com/hebe/controller/DiaryController.java index fc45017..20328ab 100644 --- a/src/main/java/com/hebe/controller/DiaryController.java +++ b/src/main/java/com/hebe/controller/DiaryController.java @@ -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.*; @@ -18,6 +19,9 @@ public class DiaryController { @Autowired private DiaryService DiaryService; + @Autowired + private ImageManagerService ImageManagerService; + // 특정 유저 게시글 조회 @PostMapping("/diary") public List selUserDiary(UserEntity param) { @@ -54,8 +58,12 @@ public int preWriteDiary(DiaryEntity param) { // 이미지 업로드 @PostMapping("/diaryImg") - public String uploadImage(MultipartFile img, int iboard, int iuser) { - return DiaryService.uploadImage(img, iboard, iuser); } + public void uploadImage(MultipartFile img, int iboard, int iuser) { // 기존엔 String 타입 + String filePath = "img/" + iuser + "/" + iboard; + ImageManagerService.createAndUploadFile(img, filePath); + + // return DiaryService.uploadImage(img, iboard, iuser); + } // 글 작성 @PostMapping("/write") @@ -67,9 +75,10 @@ public int writeDiary(DiaryEntity param) { // 글 작성 취소 @PostMapping("/cancel") - public int cancelDiary(DiaryEntity param) { + public void cancelDiary(DiaryEntity param) { // 원래는 int System.out.println("/api/cancel 작동"); - return DiaryService.cancelDiary(param); + + // return DiaryService.cancelDiary(param); } // detail 조회 diff --git a/src/main/java/com/hebe/imgUpload/FileManager.java b/src/main/java/com/hebe/imgUpload/FileManager.java new file mode 100644 index 0000000..a8252d9 --- /dev/null +++ b/src/main/java/com/hebe/imgUpload/FileManager.java @@ -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 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(); + } +} diff --git a/src/main/java/com/hebe/imgUpload/ImageManagerService.java b/src/main/java/com/hebe/imgUpload/ImageManagerService.java new file mode 100644 index 0000000..a755757 --- /dev/null +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -0,0 +1,49 @@ +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.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 { + + private final FileManager fileManager; + private final UploadImageS3 uploadImageS3; + + // 임시 파일 생성 & 업데이트 & 임시 파일 삭제 + public void createAndUploadFile(MultipartFile mf, String filePath) { + String saveFileName = UUID.randomUUID().toString(); + + // 파일 생성 + File uploadFile = null; + try { + Optional uploadFileOpt = fileManager.convertMultipartFileToFile(mf); + if (uploadFileOpt.isEmpty()) { + System.out.println("파일 변환에 실패했습니다."); + } + uploadFile = uploadFileOpt.get(); + + // 파일 업로드 + String saveFilePath = uploadImageS3.upload(uploadFile, filePath, saveFileName); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("파일을 업로드 하던 중 에러가 발생했습니다."); + } finally { + // 파일 삭제 + if (uploadFile != null) { + uploadFile.delete(); + } + } + } +} diff --git a/src/main/java/com/hebe/imgUpload/UploadImageS3.java b/src/main/java/com/hebe/imgUpload/UploadImageS3.java new file mode 100644 index 0000000..c7dae08 --- /dev/null +++ b/src/main/java/com/hebe/imgUpload/UploadImageS3.java @@ -0,0 +1,51 @@ +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; + private AmazonS3 s3Client; + + @Value("${aws.s3.image.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 key) { + try { + //Delete 객체 생성 + DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.bucket, key); + + //Delete + this.s3Client.deleteObject(deleteObjectRequest); + System.out.println(String.format("[%s] deletion complete", key)); + + } catch (AmazonServiceException e) { + e.printStackTrace(); + } catch (SdkClientException e) { + e.printStackTrace(); + } + } +} + +// file path에 유저네임, 아이보드값 넣기 diff --git a/src/main/java/com/hebe/service/DiaryService.java b/src/main/java/com/hebe/service/DiaryService.java index f3e5be3..db9d591 100644 --- a/src/main/java/com/hebe/service/DiaryService.java +++ b/src/main/java/com/hebe/service/DiaryService.java @@ -1,5 +1,6 @@ package com.hebe.service; +import com.hebe.imgUpload.UploadImageS3; import com.hebe.jwt.model.UserEntity; import com.hebe.mapper.DiaryMapper; import com.hebe.vo.*; @@ -18,6 +19,9 @@ public class DiaryService { @Autowired private DiaryMapper DiaryMapper; + @Autowired + private UploadImageS3 UploadImageS3; + // 특정 유저 게시글 조회 public List selUserDiary(UserEntity param) { return DiaryMapper.selUserDiary(param); } @@ -67,30 +71,38 @@ public String uploadImage(MultipartFile img, int iboard, int iuser) { public int writeDiary(DiaryEntity param) { return DiaryMapper.writeDiary(param); } // 글 작성 취소 - public int cancelDiary(DiaryEntity param) { - File target = new File("C:/Users/82109/Desktop/project/hebe-react/public/img/" + param.getIuser() + "/" + param.getIboard()); - if (target.exists()) { - File[] imgList = target.listFiles(); - for (int i = 0; i< imgList.length; i++) { - imgList[i].delete(); - } - if (target.delete()) { - System.out.println("폴더 삭제 성공"); - } else { - System.out.println("폴더 삭제 실패"); - } - } else { - System.out.println("폴더가 존재하지 않습니다."); - } - - return DiaryMapper.deleteDiary(param); + public void cancelDiary(DiaryEntity param) { // 원래는 int +// File target = new File("C:/Users/82109/Desktop/project/hebe-react/public/img/" + param.getIuser() + "/" + param.getIboard()); +// if (target.exists()) { +// File[] imgList = target.listFiles(); +// for (int i = 0; i< imgList.length; i++) { +// imgList[i].delete(); +// } +// if (target.delete()) { +// System.out.println("폴더 삭제 성공"); +// } else { +// System.out.println("폴더 삭제 실패"); +// } +// } else { +// System.out.println("폴더가 존재하지 않습니다."); +// } +// +// return DiaryMapper.deleteDiary(param); + + String dirPath = "img/" + param.getIuser() + "/" + param.getIboard(); + UploadImageS3.delete(dirPath); } // detail 조회 public DetailDomain detailDiary(DiaryEntity param) { return DiaryMapper.detailDiary(param); } // 글 삭제 - public int deleteDiary(DiaryEntity param) { return DiaryMapper.deleteDiary(param); } + public int deleteDiary(DiaryEntity param) { + String dirPath = "img/" + param.getIuser() + "/" + param.getIboard(); + UploadImageS3.delete(dirPath); + + return DiaryMapper.deleteDiary(param); + } // 댓글 리스트 조회 public List cmtList(DiaryEntity param) { return DiaryMapper.cmtList(param); } diff --git a/src/main/java/com/hebe/service/ImageService.java b/src/main/java/com/hebe/service/ImageService.java new file mode 100644 index 0000000..f534f53 --- /dev/null +++ b/src/main/java/com/hebe/service/ImageService.java @@ -0,0 +1,74 @@ +package com.hebe.service; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.SdkClientException; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.s3.model.DeleteObjectRequest; +import com.amazonaws.services.s3.model.PutObjectRequest; +import lombok.experimental.Delegate; +import org.springframework.beans.factory.annotation.Value; + +import java.io.File; + +public class ImageService { + + // Amazon-s3-sdk + private AmazonS3 s3Client; + + @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; + + @Value("${aws.s3.image.bucket}") + private String bucket; + + // aws S3 client 생성 + private void createS3Client() { + AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + this.s3Client = AmazonS3ClientBuilder + .standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .build(); + } + + private void uploadToS3(PutObjectRequest putObjectRequest) { + try { + this.s3Client.putObject(putObjectRequest); + System.out.println(String.format("[%s] upload complete", putObjectRequest.getKey())); + } catch (AmazonServiceException e) { + e.printStackTrace(); + } catch (SdkClientException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void upload(File file, String key) { + uploadToS3(new PutObjectRequest(this.bucket, key, file)); + } + + public void delete(String key) { + try { + // delete 객체 생성 + DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.bucket, key); + // delete + this.s3Client.deleteObject(deleteObjectRequest); + System.out.println(String.format("[%s] deletion complete", key)); + } catch (AmazonServiceException e) { + e.printStackTrace(); + } catch (SdkClientException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index f4d2e49..1338134 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -81,3 +81,15 @@ mybatis: server: port: 8080 + +cloud: + aws: + credentials: + accessKey: AKIAXJCTAAUDILUQ2MRI + secretKey: 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 + s3: + bucket: hebe-bucket + region: + static: ap-northeast-2 + stack: + auto: false \ No newline at end of file From 7d7b1c0d0369d3f1011aaf2b17c28392f671f130 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 12:38:53 +0900 Subject: [PATCH 07/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 +++---- src/main/java/com/hebe/AmazonS3Config.java | 2 ++ .../com/hebe/controller/DiaryController.java | 5 ++- .../com/hebe/imgUpload/UploadImageS3.java | 32 +++++++++---------- .../java/com/hebe/service/DiaryService.java | 10 +++--- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 49fcf03..39a3f31 100644 --- a/pom.xml +++ b/pom.xml @@ -153,12 +153,12 @@ 1.2.1.RELEASE - - - com.amazonaws - aws-java-sdk-s3 - 1.11.901 - + + + + + + diff --git a/src/main/java/com/hebe/AmazonS3Config.java b/src/main/java/com/hebe/AmazonS3Config.java index 9e129b7..8ab8ade 100644 --- a/src/main/java/com/hebe/AmazonS3Config.java +++ b/src/main/java/com/hebe/AmazonS3Config.java @@ -7,6 +7,7 @@ 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 { @@ -21,6 +22,7 @@ public class AmazonS3Config { private String region; @Bean + @Primary public AmazonS3Client amazonS3Client() { BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey); return (AmazonS3Client) AmazonS3ClientBuilder.standard() diff --git a/src/main/java/com/hebe/controller/DiaryController.java b/src/main/java/com/hebe/controller/DiaryController.java index 20328ab..a46b7ce 100644 --- a/src/main/java/com/hebe/controller/DiaryController.java +++ b/src/main/java/com/hebe/controller/DiaryController.java @@ -75,10 +75,9 @@ public int writeDiary(DiaryEntity param) { // 글 작성 취소 @PostMapping("/cancel") - public void cancelDiary(DiaryEntity param) { // 원래는 int + public int cancelDiary(DiaryEntity param) { System.out.println("/api/cancel 작동"); - - // return DiaryService.cancelDiary(param); + return DiaryService.cancelDiary(param); } // detail 조회 diff --git a/src/main/java/com/hebe/imgUpload/UploadImageS3.java b/src/main/java/com/hebe/imgUpload/UploadImageS3.java index c7dae08..5606b89 100644 --- a/src/main/java/com/hebe/imgUpload/UploadImageS3.java +++ b/src/main/java/com/hebe/imgUpload/UploadImageS3.java @@ -20,7 +20,7 @@ public class UploadImageS3 { private final AmazonS3Client amazonS3; private AmazonS3 s3Client; - @Value("${aws.s3.image.bucket}") + @Value("${cloud.aws.s3.bucket}") private String bucket; public String upload(File uploadFile, String filePath, String saveFileName) { @@ -31,21 +31,21 @@ public String upload(File uploadFile, String filePath, String saveFileName) { return fileName; } - public void delete(String key) { - try { - //Delete 객체 생성 - DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.bucket, key); - - //Delete - this.s3Client.deleteObject(deleteObjectRequest); - System.out.println(String.format("[%s] deletion complete", key)); - - } catch (AmazonServiceException e) { - e.printStackTrace(); - } catch (SdkClientException e) { - e.printStackTrace(); - } - } +// public void delete(String key) { +// try { +// //Delete 객체 생성 +// DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.bucket, key); +// +// //Delete +// s3Client.deleteObject(deleteObjectRequest); +// System.out.println(String.format("[%s] deletion complete", key)); +// +// } catch (AmazonServiceException e) { +// e.printStackTrace(); +// } catch (SdkClientException e) { +// e.printStackTrace(); +// } +// } } // file path에 유저네임, 아이보드값 넣기 diff --git a/src/main/java/com/hebe/service/DiaryService.java b/src/main/java/com/hebe/service/DiaryService.java index db9d591..b48329f 100644 --- a/src/main/java/com/hebe/service/DiaryService.java +++ b/src/main/java/com/hebe/service/DiaryService.java @@ -71,7 +71,7 @@ public String uploadImage(MultipartFile img, int iboard, int iuser) { public int writeDiary(DiaryEntity param) { return DiaryMapper.writeDiary(param); } // 글 작성 취소 - public void cancelDiary(DiaryEntity param) { // 원래는 int + public int cancelDiary(DiaryEntity param) { // File target = new File("C:/Users/82109/Desktop/project/hebe-react/public/img/" + param.getIuser() + "/" + param.getIboard()); // if (target.exists()) { // File[] imgList = target.listFiles(); @@ -87,10 +87,10 @@ public void cancelDiary(DiaryEntity param) { // 원래는 int // System.out.println("폴더가 존재하지 않습니다."); // } // -// return DiaryMapper.deleteDiary(param); - String dirPath = "img/" + param.getIuser() + "/" + param.getIboard(); - UploadImageS3.delete(dirPath); + // UploadImageS3.delete(dirPath); + + return DiaryMapper.deleteDiary(param); } // detail 조회 @@ -99,7 +99,7 @@ public void cancelDiary(DiaryEntity param) { // 원래는 int // 글 삭제 public int deleteDiary(DiaryEntity param) { String dirPath = "img/" + param.getIuser() + "/" + param.getIboard(); - UploadImageS3.delete(dirPath); + // UploadImageS3.delete(dirPath); return DiaryMapper.deleteDiary(param); } From 4b2d3f8fd0408b9af1395859493ebc26851beecb Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 19:28:53 +0900 Subject: [PATCH 08/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hebe/imgUpload/ImageManagerService.java | 4 +++- .../resources/mybatis-mapper/DiaryMapper.xml | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hebe/imgUpload/ImageManagerService.java b/src/main/java/com/hebe/imgUpload/ImageManagerService.java index a755757..e2b10a7 100644 --- a/src/main/java/com/hebe/imgUpload/ImageManagerService.java +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -5,6 +5,7 @@ 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.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -23,7 +24,8 @@ public class ImageManagerService { // 임시 파일 생성 & 업데이트 & 임시 파일 삭제 public void createAndUploadFile(MultipartFile mf, String filePath) { - String saveFileName = UUID.randomUUID().toString(); + String ext = FilenameUtils.getExtension(mf.getOriginalFilename()); + String saveFileName = UUID.randomUUID().toString() + "." + ext; // 파일 생성 File uploadFile = null; diff --git a/src/main/resources/mybatis-mapper/DiaryMapper.xml b/src/main/resources/mybatis-mapper/DiaryMapper.xml index 4e6206a..693f9c3 100644 --- a/src/main/resources/mybatis-mapper/DiaryMapper.xml +++ b/src/main/resources/mybatis-mapper/DiaryMapper.xml @@ -53,11 +53,18 @@ select * from diarydb ORDER BY iboard DESC LIMIT 1; - - update diarydb - set iuser = #{iuser}, title = #{title}, content = #{content}, thumbnail = #{thumbnail} - where iboard = #{iboard} - + + + + + + + + insert into diarydb + (iuser, title, content, thumbnail) + values + (#{iuser}, #{title}, #{content}, #{thumbnail}) + delete from diarydb From bd470e3adfed8be8bc5c65f7d1a52d74f07b93ba Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 19:35:25 +0900 Subject: [PATCH 09/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hebe/controller/DiaryController.java | 4 ++-- src/main/java/com/hebe/imgUpload/ImageManagerService.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hebe/controller/DiaryController.java b/src/main/java/com/hebe/controller/DiaryController.java index a46b7ce..292094f 100644 --- a/src/main/java/com/hebe/controller/DiaryController.java +++ b/src/main/java/com/hebe/controller/DiaryController.java @@ -58,9 +58,9 @@ public int preWriteDiary(DiaryEntity param) { // 이미지 업로드 @PostMapping("/diaryImg") - public void uploadImage(MultipartFile img, int iboard, int iuser) { // 기존엔 String 타입 + public String uploadImage(MultipartFile img, int iboard, int iuser) { // 기존엔 String 타입 String filePath = "img/" + iuser + "/" + iboard; - ImageManagerService.createAndUploadFile(img, filePath); + return ImageManagerService.createAndUploadFile(img, filePath); // return DiaryService.uploadImage(img, iboard, iuser); } diff --git a/src/main/java/com/hebe/imgUpload/ImageManagerService.java b/src/main/java/com/hebe/imgUpload/ImageManagerService.java index e2b10a7..8ff3167 100644 --- a/src/main/java/com/hebe/imgUpload/ImageManagerService.java +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -23,7 +23,7 @@ public class ImageManagerService { private final UploadImageS3 uploadImageS3; // 임시 파일 생성 & 업데이트 & 임시 파일 삭제 - public void createAndUploadFile(MultipartFile mf, String filePath) { + public String createAndUploadFile(MultipartFile mf, String filePath) { String ext = FilenameUtils.getExtension(mf.getOriginalFilename()); String saveFileName = UUID.randomUUID().toString() + "." + ext; @@ -47,5 +47,6 @@ public void createAndUploadFile(MultipartFile mf, String filePath) { uploadFile.delete(); } } + return saveFileName; } } From bc9cff2397c04ef8fda232860250ba71069c22c3 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 21:48:43 +0900 Subject: [PATCH 10/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hebe/controller/DiaryController.java | 7 +++ .../hebe/imgUpload/ImageManagerService.java | 6 +-- .../com/hebe/imgUpload/UploadImageS3.java | 18 ------- .../com/hebe/jwt/service/UserService.java | 54 ++++++++++++++++--- .../java/com/hebe/mapper/DiaryMapper.java | 3 ++ .../java/com/hebe/service/DiaryService.java | 3 ++ .../resources/mybatis-mapper/DiaryMapper.xml | 10 ++-- 7 files changed, 67 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/hebe/controller/DiaryController.java b/src/main/java/com/hebe/controller/DiaryController.java index 292094f..aae1463 100644 --- a/src/main/java/com/hebe/controller/DiaryController.java +++ b/src/main/java/com/hebe/controller/DiaryController.java @@ -80,6 +80,13 @@ public int cancelDiary(DiaryEntity param) { return DiaryService.cancelDiary(param); } + // 글 수정 + @PostMapping("/update") + public int updateDiary(DiaryEntity param) { + System.out.println("/api/update 작동"); + return 0; + } + // detail 조회 @PostMapping("/detail") public DetailDomain detailDiary(DiaryEntity param) { return DiaryService.detailDiary(param); } diff --git a/src/main/java/com/hebe/imgUpload/ImageManagerService.java b/src/main/java/com/hebe/imgUpload/ImageManagerService.java index 8ff3167..0d9f495 100644 --- a/src/main/java/com/hebe/imgUpload/ImageManagerService.java +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -19,8 +19,8 @@ @RequiredArgsConstructor public class ImageManagerService { - private final FileManager fileManager; - private final UploadImageS3 uploadImageS3; + private FileManager fileManager; + private UploadImageS3 uploadImageS3; // 임시 파일 생성 & 업데이트 & 임시 파일 삭제 public String createAndUploadFile(MultipartFile mf, String filePath) { @@ -37,7 +37,7 @@ public String createAndUploadFile(MultipartFile mf, String filePath) { uploadFile = uploadFileOpt.get(); // 파일 업로드 - String saveFilePath = uploadImageS3.upload(uploadFile, filePath, saveFileName); + uploadImageS3.upload(uploadFile, filePath, saveFileName); } catch (IOException e) { e.printStackTrace(); System.out.println("파일을 업로드 하던 중 에러가 발생했습니다."); diff --git a/src/main/java/com/hebe/imgUpload/UploadImageS3.java b/src/main/java/com/hebe/imgUpload/UploadImageS3.java index 5606b89..0ee5f01 100644 --- a/src/main/java/com/hebe/imgUpload/UploadImageS3.java +++ b/src/main/java/com/hebe/imgUpload/UploadImageS3.java @@ -30,22 +30,4 @@ public String upload(File uploadFile, String filePath, String saveFileName) { return fileName; } - -// public void delete(String key) { -// try { -// //Delete 객체 생성 -// DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.bucket, key); -// -// //Delete -// s3Client.deleteObject(deleteObjectRequest); -// System.out.println(String.format("[%s] deletion complete", key)); -// -// } catch (AmazonServiceException e) { -// e.printStackTrace(); -// } catch (SdkClientException e) { -// e.printStackTrace(); -// } -// } } - -// file path에 유저네임, 아이보드값 넣기 diff --git a/src/main/java/com/hebe/jwt/service/UserService.java b/src/main/java/com/hebe/jwt/service/UserService.java index 30c25b7..8acaeb7 100644 --- a/src/main/java/com/hebe/jwt/service/UserService.java +++ b/src/main/java/com/hebe/jwt/service/UserService.java @@ -1,5 +1,7 @@ package com.hebe.jwt.service; +import com.hebe.imgUpload.FileManager; +import com.hebe.imgUpload.UploadImageS3; import com.hebe.jwt.mapper.UserMapper; import com.hebe.jwt.model.UserDTO; import com.hebe.jwt.model.UserEntity; @@ -7,6 +9,7 @@ import com.hebe.jwt.util.CookieUtil; import com.hebe.jwt.util.JwtUtil; import com.hebe.jwt.util.RedisUtil; +import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -15,6 +18,9 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import java.io.File; +import java.io.IOException; +import java.util.Optional; +import java.util.UUID; @Service public class UserService { @@ -24,6 +30,9 @@ public class UserService { @Autowired private CookieUtil cookieUtil; @Autowired private RedisUtil redisUtil; + private FileManager fileManager; + private UploadImageS3 uploadImageS3; + public int selUsername(String username) { int result = userMapper.selUsername(username); return result; @@ -57,19 +66,48 @@ public UserEntity login(UserDTO user, HttpServletResponse res) { return userEntity; } - public String fileToString(MultipartFile file, int iuser) { - String path = "C:\\study\\practice\\springboot\\HEBE-prac\\real\\HEBE-app_9\\public\\img\\user\\" + iuser + "\\profile"; +// public String fileToString(MultipartFile file, int iuser) { +// String path = "C:\\study\\practice\\springboot\\HEBE-prac\\real\\HEBE-app_9\\public\\img\\user\\" + iuser + "\\profile"; +// +// File dir = new File(path); +// +// if(!dir.exists()) { dir.mkdirs(); } +// +// File target = new File(path + "/" + iuser + ".jpg"); +// +// try { file.transferTo(target); } +// catch (Exception e) { e.printStackTrace(); } +// +// return "/img/user/" + iuser + "/profile/" + iuser + ".jpg"; +// } - File dir = new File(path); + public String fileToString(MultipartFile mf, int iuser) { + String ext = FilenameUtils.getExtension(mf.getOriginalFilename()); + String saveFileName = UUID.randomUUID().toString() + "." + ext; - if(!dir.exists()) { dir.mkdirs(); } + String filePath = "img/profile/" + iuser; - File target = new File(path + "/" + iuser + ".jpg"); + File uploadFile = null; + try { + Optional uploadFileOpt = fileManager.convertMultipartFileToFile(mf); + if (uploadFileOpt.isEmpty()) { + System.out.println("파일 변환에 실패했습니다."); + } + uploadFile = uploadFileOpt.get(); - try { file.transferTo(target); } - catch (Exception e) { e.printStackTrace(); } + // 파일 업로드 + String saveFilePath = uploadImageS3.upload(uploadFile, filePath, saveFileName); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("파일을 업로드 하던 중 에러가 발생했습니다."); + } finally { + // 파일 삭제 + if (uploadFile != null) { + uploadFile.delete(); + } + } - return "/img/user/" + iuser + "/profile/" + iuser + ".jpg"; + return "/" + filePath + "/" + saveFileName; } public void profileMod(UserEntity user) { diff --git a/src/main/java/com/hebe/mapper/DiaryMapper.java b/src/main/java/com/hebe/mapper/DiaryMapper.java index 8b6124b..877d72b 100644 --- a/src/main/java/com/hebe/mapper/DiaryMapper.java +++ b/src/main/java/com/hebe/mapper/DiaryMapper.java @@ -22,6 +22,9 @@ public interface DiaryMapper { // 글 작성 int writeDiary(DiaryEntity param); + // 글 수정 + int updateDiary(DiaryEntity param); + // 글쓰기 버튼 클릭 시 임의의 글 생성 (이미지 폴더 담아두기용) int preWriteDiary(DiaryEntity param); diff --git a/src/main/java/com/hebe/service/DiaryService.java b/src/main/java/com/hebe/service/DiaryService.java index b48329f..22c02a8 100644 --- a/src/main/java/com/hebe/service/DiaryService.java +++ b/src/main/java/com/hebe/service/DiaryService.java @@ -70,6 +70,9 @@ public String uploadImage(MultipartFile img, int iboard, int iuser) { // 글 작성 public int writeDiary(DiaryEntity param) { return DiaryMapper.writeDiary(param); } + // 글 수정 + public int updateDiary(DiaryEntity param) { return DiaryMapper.updateDiary(param); } + // 글 작성 취소 public int cancelDiary(DiaryEntity param) { // File target = new File("C:/Users/82109/Desktop/project/hebe-react/public/img/" + param.getIuser() + "/" + param.getIboard()); diff --git a/src/main/resources/mybatis-mapper/DiaryMapper.xml b/src/main/resources/mybatis-mapper/DiaryMapper.xml index 693f9c3..898f15c 100644 --- a/src/main/resources/mybatis-mapper/DiaryMapper.xml +++ b/src/main/resources/mybatis-mapper/DiaryMapper.xml @@ -53,11 +53,11 @@ select * from diarydb ORDER BY iboard DESC LIMIT 1; - - - - - + + update diarydb + set iuser = #{iuser}, title = #{title}, content = #{content}, thumbnail = #{thumbnail} + where iboard = #{iboard} + insert into diarydb From 92101a9a6c2b436a94b1e760c38d336b9e9c754c Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 22:03:04 +0900 Subject: [PATCH 11/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hebe/jwt/controller/UserController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hebe/jwt/controller/UserController.java b/src/main/java/com/hebe/jwt/controller/UserController.java index 83d3a90..3601124 100644 --- a/src/main/java/com/hebe/jwt/controller/UserController.java +++ b/src/main/java/com/hebe/jwt/controller/UserController.java @@ -95,10 +95,8 @@ public ResponseEntity profileMod(@RequestParam(value="profileimg", required = user.setIntroduction(introduction); user.setIuser(iuser); - if(file != null) { - String img = userService.fileToString(file, iuser); - user.setProfileimg(img); - } + String img = userService.fileToString(file, iuser); + user.setProfileimg(img); System.out.println(user); userService.profileMod(user); From a3e398febd5c7998c648c0a394622b9bc2025847 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Wed, 8 Sep 2021 22:18:03 +0900 Subject: [PATCH 12/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hebe/jwt/service/UserService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hebe/jwt/service/UserService.java b/src/main/java/com/hebe/jwt/service/UserService.java index 8acaeb7..f7aa58e 100644 --- a/src/main/java/com/hebe/jwt/service/UserService.java +++ b/src/main/java/com/hebe/jwt/service/UserService.java @@ -30,8 +30,8 @@ public class UserService { @Autowired private CookieUtil cookieUtil; @Autowired private RedisUtil redisUtil; - private FileManager fileManager; - private UploadImageS3 uploadImageS3; + @Autowired private FileManager fileManager; + @Autowired private UploadImageS3 uploadImageS3; public int selUsername(String username) { int result = userMapper.selUsername(username); From 1017c8a4296c86c450f678a4499568238a2e5705 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Fri, 10 Sep 2021 00:46:54 +0900 Subject: [PATCH 13/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hebe/imgUpload/ImageManagerService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/hebe/imgUpload/ImageManagerService.java b/src/main/java/com/hebe/imgUpload/ImageManagerService.java index 0d9f495..369b017 100644 --- a/src/main/java/com/hebe/imgUpload/ImageManagerService.java +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -6,6 +6,7 @@ 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; @@ -19,7 +20,10 @@ @RequiredArgsConstructor public class ImageManagerService { + @Autowired private FileManager fileManager; + + @Autowired private UploadImageS3 uploadImageS3; // 임시 파일 생성 & 업데이트 & 임시 파일 삭제 From 336585b54828f9018f76ecb0c7b6ed97df23730a Mon Sep 17 00:00:00 2001 From: jun17183 <64164782+jun17183@users.noreply.github.com> Date: Mon, 13 Sep 2021 01:07:16 +0900 Subject: [PATCH 14/21] Update application.yaml --- src/main/resources/application.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 1338134..b7fec39 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -85,11 +85,11 @@ server: cloud: aws: credentials: - accessKey: AKIAXJCTAAUDILUQ2MRI - secretKey: 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 + accessKey: // accessKey + secretKey: // secretKey s3: bucket: hebe-bucket region: static: ap-northeast-2 stack: - auto: false \ No newline at end of file + auto: false From ebb0e9ffd389679bf914892726708dc5549f1ae5 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 01:08:49 +0900 Subject: [PATCH 15/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hebe/controller/DiaryController.java | 17 +++--- .../hebe/imgUpload/ImageManagerService.java | 5 ++ .../com/hebe/imgUpload/UploadImageS3.java | 15 +++++- .../java/com/hebe/service/DiaryService.java | 53 +------------------ .../resources/mybatis-mapper/DiaryMapper.xml | 7 --- 5 files changed, 29 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/hebe/controller/DiaryController.java b/src/main/java/com/hebe/controller/DiaryController.java index aae1463..00ea440 100644 --- a/src/main/java/com/hebe/controller/DiaryController.java +++ b/src/main/java/com/hebe/controller/DiaryController.java @@ -46,12 +46,6 @@ 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(); } @@ -84,7 +78,9 @@ public int cancelDiary(DiaryEntity param) { @PostMapping("/update") public int updateDiary(DiaryEntity param) { System.out.println("/api/update 작동"); - return 0; + // 수정할 때 기존에 있던 이미지 삭제 시 s3에서 이미지 삭제 + + return DiaryService.updateDiary(param); } // detail 조회 @@ -93,7 +89,12 @@ public int updateDiary(DiaryEntity 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") diff --git a/src/main/java/com/hebe/imgUpload/ImageManagerService.java b/src/main/java/com/hebe/imgUpload/ImageManagerService.java index 369b017..a6b781b 100644 --- a/src/main/java/com/hebe/imgUpload/ImageManagerService.java +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -53,4 +53,9 @@ public String createAndUploadFile(MultipartFile mf, String filePath) { } return saveFileName; } + + // 글 삭제 시 해당 글에 있는 s3 이미지 삭제 + public void deleteFile(String filePath) { + uploadImageS3.delete(filePath); + } } diff --git a/src/main/java/com/hebe/imgUpload/UploadImageS3.java b/src/main/java/com/hebe/imgUpload/UploadImageS3.java index 0ee5f01..203c991 100644 --- a/src/main/java/com/hebe/imgUpload/UploadImageS3.java +++ b/src/main/java/com/hebe/imgUpload/UploadImageS3.java @@ -18,7 +18,6 @@ public class UploadImageS3 { private final AmazonS3Client amazonS3; - private AmazonS3 s3Client; @Value("${cloud.aws.s3.bucket}") private String bucket; @@ -30,4 +29,18 @@ public String upload(File uploadFile, String filePath, String saveFileName) { 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(); + } + } } diff --git a/src/main/java/com/hebe/service/DiaryService.java b/src/main/java/com/hebe/service/DiaryService.java index 22c02a8..c4a4950 100644 --- a/src/main/java/com/hebe/service/DiaryService.java +++ b/src/main/java/com/hebe/service/DiaryService.java @@ -31,42 +31,9 @@ public class DiaryService { // 검색한 유저 정보 가져오기 public UserEntity selUserInfo(UserEntity param) { return DiaryMapper.selUserInfo(param); } - // 글쓰기 버튼 클릭 시 임의의 글 생성 (이미지 폴더 담아두기용) - public int preWriteDiary(DiaryEntity param) { - // 임의의 글 생성, 결과 담아둠 - int result = DiaryMapper.preWriteDiary(param); - System.out.println("result : " + result); - - // 유저 - iboard 이미지 폴더 생성 - int recentIboard = DiaryMapper.getMostRecent().getIboard(); - - final String PATH = "C:/Users/82109/Desktop/project/hebe-react/public/img/" + param.getIuser() + "/" + recentIboard; - File folder = new File(PATH); - folder.mkdirs(); - - return result; - } - // 최신 글 iboard 가져오기 public int getRecentIboard() { return DiaryMapper.getMostRecent().getIboard(); } - // 이미지 업로드 - 글쓰기 (write) - public String uploadImage(MultipartFile img, int iboard, int iuser) { - String ext = FilenameUtils.getExtension(img.getOriginalFilename()); - String fileNm = UUID.randomUUID().toString() + "." + ext; - - int temp = iboard; // 기존 글에 새로 이미지를 추가할 경우 => 기존 폴더(iboard)에 추가 - if (iboard == 0) { // 수정이 아닌 새로 글 작성할 경우 - temp = DiaryMapper.getMostRecent().getIboard(); - } - - // 나중에 로그인, 회원가입 완성하면 1 대신에 유저 토큰으로 iuser 값을 가지고 와야 함 - File target = new File("C:/Users/82109/Desktop/project/hebe-react/public/img/" + iuser + "/" + temp + "/" + fileNm); - try { img.transferTo(target); } catch (Exception e) { e.printStackTrace(); } - - return fileNm; - } - // 글 작성 public int writeDiary(DiaryEntity param) { return DiaryMapper.writeDiary(param); } @@ -75,23 +42,8 @@ public String uploadImage(MultipartFile img, int iboard, int iuser) { // 글 작성 취소 public int cancelDiary(DiaryEntity param) { -// File target = new File("C:/Users/82109/Desktop/project/hebe-react/public/img/" + param.getIuser() + "/" + param.getIboard()); -// if (target.exists()) { -// File[] imgList = target.listFiles(); -// for (int i = 0; i< imgList.length; i++) { -// imgList[i].delete(); -// } -// if (target.delete()) { -// System.out.println("폴더 삭제 성공"); -// } else { -// System.out.println("폴더 삭제 실패"); -// } -// } else { -// System.out.println("폴더가 존재하지 않습니다."); -// } -// String dirPath = "img/" + param.getIuser() + "/" + param.getIboard(); - // UploadImageS3.delete(dirPath); + // 작성 취소 시 업로드한 이미지 삭제시키기 return DiaryMapper.deleteDiary(param); } @@ -101,9 +53,6 @@ public int cancelDiary(DiaryEntity param) { // 글 삭제 public int deleteDiary(DiaryEntity param) { - String dirPath = "img/" + param.getIuser() + "/" + param.getIboard(); - // UploadImageS3.delete(dirPath); - return DiaryMapper.deleteDiary(param); } diff --git a/src/main/resources/mybatis-mapper/DiaryMapper.xml b/src/main/resources/mybatis-mapper/DiaryMapper.xml index 898f15c..be8f860 100644 --- a/src/main/resources/mybatis-mapper/DiaryMapper.xml +++ b/src/main/resources/mybatis-mapper/DiaryMapper.xml @@ -42,13 +42,6 @@ where iuser = #{iuser} - - insert into diarydb - (title, content, iuser) - values - (#{title}, #{content}, #{iuser}); - - From e4460801b384ebb3518ed4c78affab814b965e52 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 16:19:56 +0900 Subject: [PATCH 16/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hebe/controller/TodoController.java | 80 +++++++++++++++++++ src/main/java/com/hebe/mapper/TodoMapper.java | 31 +++++++ .../java/com/hebe/service/DiaryService.java | 4 - .../java/com/hebe/service/TodoService.java | 56 +++++++++++++ src/main/java/com/hebe/vo/CalendarDTO.java | 12 +++ src/main/java/com/hebe/vo/TodoDTO.java | 16 ++++ src/main/java/com/hebe/vo/TodoDTOList.java | 15 ++++ .../mybatis-mapper/TodoListMapper.xml | 36 +++++++++ 8 files changed, 246 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/hebe/controller/TodoController.java create mode 100644 src/main/java/com/hebe/mapper/TodoMapper.java create mode 100644 src/main/java/com/hebe/service/TodoService.java create mode 100644 src/main/java/com/hebe/vo/CalendarDTO.java create mode 100644 src/main/java/com/hebe/vo/TodoDTO.java create mode 100644 src/main/java/com/hebe/vo/TodoDTOList.java create mode 100644 src/main/resources/mybatis-mapper/TodoListMapper.xml diff --git a/src/main/java/com/hebe/controller/TodoController.java b/src/main/java/com/hebe/controller/TodoController.java new file mode 100644 index 0000000..e163854 --- /dev/null +++ b/src/main/java/com/hebe/controller/TodoController.java @@ -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 selTodoList(TodoDTO param) { + List list = TodoService.selTodoList(param); + System.out.println("TodoList select : " + list); + return list; + } + + // 접속유저의 날짜별 todolist 조회 + @GetMapping("/todo") + public List dayTodoList(TodoDTO param) { + List 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 monthData(CalendarDTO param) { + System.out.println(param.getMonth()); + return TodoService.monthData(param); + } + +// @PostMapping("/todo/cal") // 안쓰는ㄷ...듯? +// public String[] calAllList(TodoDTO param){ +// List 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); + } +} \ No newline at end of file diff --git a/src/main/java/com/hebe/mapper/TodoMapper.java b/src/main/java/com/hebe/mapper/TodoMapper.java new file mode 100644 index 0000000..9308ee0 --- /dev/null +++ b/src/main/java/com/hebe/mapper/TodoMapper.java @@ -0,0 +1,31 @@ +package com.hebe.mapper; + +import com.hebe.vo.CalendarDTO; +import com.hebe.vo.TodoDTO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface TodoMapper { + + // 접속유저의 전체 todolist 조회 + List selTodoList(TodoDTO param); + + // 접속유저의 날짜별 todolist 조회 + List dayTodoList(TodoDTO param); + + List monthData(CalendarDTO param); + + List calAllList(TodoDTO param); + + // 접속유저의 todoList 작성 + void insTodoList(TodoDTO param); + + // 접속유저의 todoList 수정 + void updTodoList(TodoDTO param); + + // 접속유저의 todoList 삭제 + void delTodoList(TodoDTO param); + +} \ No newline at end of file diff --git a/src/main/java/com/hebe/service/DiaryService.java b/src/main/java/com/hebe/service/DiaryService.java index c4a4950..20173f9 100644 --- a/src/main/java/com/hebe/service/DiaryService.java +++ b/src/main/java/com/hebe/service/DiaryService.java @@ -4,14 +4,10 @@ import com.hebe.jwt.model.UserEntity; import com.hebe.mapper.DiaryMapper; import com.hebe.vo.*; -import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; -import java.io.File; import java.util.List; -import java.util.UUID; @Service public class DiaryService { diff --git a/src/main/java/com/hebe/service/TodoService.java b/src/main/java/com/hebe/service/TodoService.java new file mode 100644 index 0000000..11c12e6 --- /dev/null +++ b/src/main/java/com/hebe/service/TodoService.java @@ -0,0 +1,56 @@ +package com.hebe.service; + +import com.hebe.mapper.TodoMapper; +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.stereotype.Service; + +import java.util.List; + +@Service +public class TodoService { + + @Autowired + private TodoMapper TodoMapper; + + // 접속유저의 전체 todolist 조회 + public List selTodoList(TodoDTO param) { + return TodoMapper.selTodoList(param); + } + + // 접속유저의 날짜별 todolist 조회 + public List dayTodoList(TodoDTO param) { + return TodoMapper.dayTodoList(param); + } + + public List monthData(CalendarDTO param) { return TodoMapper.monthData(param); } + +// public List calAllList(TodoDTO param) { return TodoMapper.calAllList(param);} + + + // 접속유저의 todoList 작성 + public void insTodoList(TodoDTOList param) { +// if(param.getList().get(0) != null) { + for(int i=0; i list; + +} diff --git a/src/main/resources/mybatis-mapper/TodoListMapper.xml b/src/main/resources/mybatis-mapper/TodoListMapper.xml new file mode 100644 index 0000000..52c84e7 --- /dev/null +++ b/src/main/resources/mybatis-mapper/TodoListMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + update todo set t_text = #{t_text} where t_board =#{t_board} AND iuser = #{iuser}; + + + + insert into todo (iuser,t_num,t_text,done,regdt) values (#{iuser},#{t_num},#{t_text},#{done},#{regdt}); + + + + DELETE FROM todo where iuser = #{iuser} and regdt = #{regdt}; + + \ No newline at end of file From 9340e766001295ae61d50d50be67cd8754cd0c67 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 16:25:44 +0900 Subject: [PATCH 17/21] =?UTF-8?q?AWS=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B810?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index b7fec39..b32a53a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -85,8 +85,8 @@ server: cloud: aws: credentials: - accessKey: // accessKey - secretKey: // secretKey + accessKey: AKIAXJCTAAUDILUQ2MRI + secretKey: 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 s3: bucket: hebe-bucket region: From 029b6494d8eac94a2773b4f76aa28abc3f2ea374 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 16:31:22 +0900 Subject: [PATCH 18/21] =?UTF-8?q?todo=20=ED=95=A9=EC=B9=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mybatis-mapper/TodoListMapper.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/mybatis-mapper/TodoListMapper.xml b/src/main/resources/mybatis-mapper/TodoListMapper.xml index 52c84e7..784b730 100644 --- a/src/main/resources/mybatis-mapper/TodoListMapper.xml +++ b/src/main/resources/mybatis-mapper/TodoListMapper.xml @@ -4,15 +4,15 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> @@ -23,14 +23,14 @@ - update todo set t_text = #{t_text} where t_board =#{t_board} AND iuser = #{iuser}; + update tododb set t_text = #{t_text} where t_board =#{t_board} AND iuser = #{iuser}; - insert into todo (iuser,t_num,t_text,done,regdt) values (#{iuser},#{t_num},#{t_text},#{done},#{regdt}); + insert into tododb (iuser,t_num,t_text,done,regdt) values (#{iuser},#{t_num},#{t_text},#{done},#{regdt}); - DELETE FROM todo where iuser = #{iuser} and regdt = #{regdt}; + DELETE FROM tododb where iuser = #{iuser} and regdt = #{regdt}; \ No newline at end of file From 76673d6aef6503767e0e1d0be58ad0c855949674 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 16:43:32 +0900 Subject: [PATCH 19/21] =?UTF-8?q?todo=20=ED=95=A9=EC=B9=98=EA=B8=B02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hebe/vo/CalendarDTO.java | 1 + src/main/resources/mybatis-mapper/TodoListMapper.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hebe/vo/CalendarDTO.java b/src/main/java/com/hebe/vo/CalendarDTO.java index 4649ba5..4c1cca2 100644 --- a/src/main/java/com/hebe/vo/CalendarDTO.java +++ b/src/main/java/com/hebe/vo/CalendarDTO.java @@ -9,4 +9,5 @@ @ToString public class CalendarDTO { private int month; + private int iuser; } diff --git a/src/main/resources/mybatis-mapper/TodoListMapper.xml b/src/main/resources/mybatis-mapper/TodoListMapper.xml index 784b730..a6d0fdb 100644 --- a/src/main/resources/mybatis-mapper/TodoListMapper.xml +++ b/src/main/resources/mybatis-mapper/TodoListMapper.xml @@ -12,7 +12,7 @@ From 2258f9e5f3afd7a901406f7330db261b7a109aa5 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 17:32:26 +0900 Subject: [PATCH 20/21] =?UTF-8?q?oauth=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hebe/jwt/controller/UserController.java | 50 +++------ .../java/com/hebe/jwt/mapper/UserMapper.java | 2 + src/main/java/com/hebe/jwt/model/UserDTO.java | 1 + .../java/com/hebe/jwt/model/UserEntity.java | 6 +- .../jwt/service/PrincipalDetailService.java | 2 - .../com/hebe/jwt/service/UserService.java | 101 ++++++++---------- src/main/resources/application.yaml | 2 +- 7 files changed, 71 insertions(+), 93 deletions(-) diff --git a/src/main/java/com/hebe/jwt/controller/UserController.java b/src/main/java/com/hebe/jwt/controller/UserController.java index 3601124..d7916cd 100644 --- a/src/main/java/com/hebe/jwt/controller/UserController.java +++ b/src/main/java/com/hebe/jwt/controller/UserController.java @@ -2,8 +2,8 @@ import com.hebe.jwt.model.UserDTO; import com.hebe.jwt.model.UserEntity; -import com.hebe.jwt.service.MailSendService; import com.hebe.jwt.service.UserService; +import com.hebe.jwt.service.MailSendService; import com.hebe.jwt.util.CookieUtil; import com.hebe.jwt.util.JwtUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -27,65 +27,41 @@ public class UserController { @PostMapping("/joinAuth") public String joinAuth(@RequestBody UserDTO param) { String authKey = "1"; - - System.out.println("username : " + param.getUsername()); - int result = userService.selUsername(param.getUsername()); - - System.out.println("username result : " + result); - if(result == 0) { - authKey = mailSendService.sendMail(param.getUsername()); - return authKey; + return mailSendService.sendMail(param.getUsername()); } return authKey; } @PostMapping("/nickname") public int nickname(@RequestBody UserEntity userEntity) { - System.out.println("nickname : " + userEntity.getNickname()); - - int result = userService.selNickname(userEntity.getNickname()); - - System.out.println("nickname result : " + result); - - return result; + return userService.selNickname(userEntity.getNickname()); } @PostMapping("/join") public void join(@RequestBody UserEntity userEntity){ - System.out.println(userEntity.getUsername()); - System.out.println(userEntity.getPassword()); - System.out.println(userEntity.getNickname()); userService.join(userEntity); } @PostMapping("/login") - public ResponseEntity login(@RequestBody UserDTO param, HttpServletResponse res) { - System.out.println("로그인 컨트롤러 진입!"); - + public ResponseEntity login(@RequestBody UserEntity param, HttpServletResponse res) { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(param.getUsername(), param.getPassword())); - UserEntity userEntity = userService.login(param, res); - userEntity.setPassword(null); - - System.out.println("로그인 정보 : " + userEntity); - + System.out.println("로그인"); return ResponseEntity.ok(userEntity); } @PostMapping("/logout") public void logout(HttpServletResponse res) { - System.out.println("로그아웃 컨트롤러 진입!"); - Cookie accessToken = cookieUtil.createCookie(JwtUtil.ACCESS_TOKEN_NAME, null); accessToken.setMaxAge(0); Cookie refreshToken = cookieUtil.createCookie(JwtUtil.REFRESH_TOKEN_NAME, null); refreshToken.setMaxAge(0); - res.addCookie(accessToken); res.addCookie(refreshToken); + System.out.println("로그아웃"); } @PostMapping("/profileMod") @@ -95,13 +71,21 @@ public ResponseEntity profileMod(@RequestParam(value="profileimg", required = user.setIntroduction(introduction); user.setIuser(iuser); - String img = userService.fileToString(file, iuser); - user.setProfileimg(img); + if(file != null) { + String img = userService.fileToString(file, iuser); + user.setProfileimg(img); + } - System.out.println(user); userService.profileMod(user); user.setPassword(""); return ResponseEntity.ok(user); } + + @PostMapping(value = "/oauth") + public ResponseEntity apiLogin(@RequestBody UserEntity param, HttpServletResponse res) { + UserEntity user = userService.apiLogin(param, res); + user.setPassword(null); + return ResponseEntity.ok(user); + } } \ No newline at end of file diff --git a/src/main/java/com/hebe/jwt/mapper/UserMapper.java b/src/main/java/com/hebe/jwt/mapper/UserMapper.java index 9c35d59..08cee40 100644 --- a/src/main/java/com/hebe/jwt/mapper/UserMapper.java +++ b/src/main/java/com/hebe/jwt/mapper/UserMapper.java @@ -1,5 +1,6 @@ package com.hebe.jwt.mapper; +import com.hebe.jwt.model.UserDTO; import com.hebe.jwt.model.UserEntity; import org.apache.ibatis.annotations.Mapper; @@ -8,4 +9,5 @@ public interface UserMapper { int selUsername(String username); int selNickname(String nickname); int updUser(UserEntity user); + UserEntity selNameProvider(UserEntity user); } \ No newline at end of file diff --git a/src/main/java/com/hebe/jwt/model/UserDTO.java b/src/main/java/com/hebe/jwt/model/UserDTO.java index 729cd4b..03a083e 100644 --- a/src/main/java/com/hebe/jwt/model/UserDTO.java +++ b/src/main/java/com/hebe/jwt/model/UserDTO.java @@ -6,4 +6,5 @@ public class UserDTO { private String username; private String password; + private String provider; } diff --git a/src/main/java/com/hebe/jwt/model/UserEntity.java b/src/main/java/com/hebe/jwt/model/UserEntity.java index 5d67d60..48caab6 100644 --- a/src/main/java/com/hebe/jwt/model/UserEntity.java +++ b/src/main/java/com/hebe/jwt/model/UserEntity.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; import javax.persistence.*; @@ -28,11 +29,12 @@ public class UserEntity { @Column(length = 10, unique = true, nullable = false) private String nickname; + @Column(length = 100, nullable = false) private String profileimg; - @Column(length = 100) + @Column(length = 100, nullable = false) private String introduction; - @Column + @Column(length = 10, nullable = false) private String provider; } diff --git a/src/main/java/com/hebe/jwt/service/PrincipalDetailService.java b/src/main/java/com/hebe/jwt/service/PrincipalDetailService.java index 793dc0a..25f7a41 100644 --- a/src/main/java/com/hebe/jwt/service/PrincipalDetailService.java +++ b/src/main/java/com/hebe/jwt/service/PrincipalDetailService.java @@ -17,9 +17,7 @@ public class PrincipalDetailService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - System.out.println("PrincipalDetailService의 loadUserByUsername 실행"); UserEntity userEntity = userRepository.findByUsername(username); - System.out.println("userEntity : " + userEntity); return new PrincipalDetails(userEntity); } } \ No newline at end of file diff --git a/src/main/java/com/hebe/jwt/service/UserService.java b/src/main/java/com/hebe/jwt/service/UserService.java index f7aa58e..5a6a0ef 100644 --- a/src/main/java/com/hebe/jwt/service/UserService.java +++ b/src/main/java/com/hebe/jwt/service/UserService.java @@ -1,25 +1,22 @@ package com.hebe.jwt.service; -import com.hebe.imgUpload.FileManager; -import com.hebe.imgUpload.UploadImageS3; import com.hebe.jwt.mapper.UserMapper; -import com.hebe.jwt.model.UserDTO; import com.hebe.jwt.model.UserEntity; import com.hebe.jwt.repository.UserRepository; import com.hebe.jwt.util.CookieUtil; import com.hebe.jwt.util.JwtUtil; import com.hebe.jwt.util.RedisUtil; -import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.io.IOException; -import java.util.Optional; import java.util.UUID; @Service @@ -29,9 +26,8 @@ public class UserService { @Autowired private JwtUtil jwtUtil; @Autowired private CookieUtil cookieUtil; @Autowired private RedisUtil redisUtil; - - @Autowired private FileManager fileManager; - @Autowired private UploadImageS3 uploadImageS3; + @Autowired private AuthenticationManager authenticationManager; + @Autowired private PasswordEncoder passwordEncoder; public int selUsername(String username) { int result = userMapper.selUsername(username); @@ -53,9 +49,39 @@ public void join(UserEntity user) { userRepository.save(user); } - public UserEntity login(UserDTO user, HttpServletResponse res) { - System.out.println("AuthService 진입!"); - UserEntity userEntity = userRepository.findByUsername(user.getUsername()); + public UserEntity login(UserEntity user, HttpServletResponse res) { + UserEntity userEntity = userMapper.selNameProvider(user); + jwtCookie(userEntity, res); + return userEntity; + } + + public UserEntity apiLogin(UserEntity user, HttpServletResponse res) { + UserEntity userEntity = userMapper.selNameProvider(user); + + if (userEntity == null && !user.getProvider().equals(userEntity.getProvider())) { + String uuid = UUID.randomUUID().toString().toUpperCase(); + String nickname = uuid.substring(uuid.length() - 6); + + UserEntity newUser = new UserEntity(); + newUser.setUsername(user.getUsername()); + newUser.setPassword(passwordEncoder.encode(user.getPassword())); + newUser.setProfileimg(user.getProfileimg()); + newUser.setNickname(nickname); + newUser.setIntroduction("한 줄 소개"); + newUser.setProvider(user.getProvider()); + + userRepository.save(newUser); + userEntity = newUser; + } + + authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword())); + + jwtCookie(userEntity, res); + + return userEntity; + } + + public void jwtCookie(UserEntity userEntity, HttpServletResponse res) { String token = jwtUtil.generateToken(userEntity); String refreshJwt = jwtUtil.generateRefreshToken(userEntity); Cookie accessToken = cookieUtil.createCookie(JwtUtil.ACCESS_TOKEN_NAME, token); @@ -63,51 +89,16 @@ public UserEntity login(UserDTO user, HttpServletResponse res) { redisUtil.setDataExpire(refreshJwt, userEntity.getUsername(), JwtUtil.REFRESH_TOKEN_VALIDATION_SECOND); res.addCookie(accessToken); res.addCookie(refreshToken); - return userEntity; } -// public String fileToString(MultipartFile file, int iuser) { -// String path = "C:\\study\\practice\\springboot\\HEBE-prac\\real\\HEBE-app_9\\public\\img\\user\\" + iuser + "\\profile"; -// -// File dir = new File(path); -// -// if(!dir.exists()) { dir.mkdirs(); } -// -// File target = new File(path + "/" + iuser + ".jpg"); -// -// try { file.transferTo(target); } -// catch (Exception e) { e.printStackTrace(); } -// -// return "/img/user/" + iuser + "/profile/" + iuser + ".jpg"; -// } - - public String fileToString(MultipartFile mf, int iuser) { - String ext = FilenameUtils.getExtension(mf.getOriginalFilename()); - String saveFileName = UUID.randomUUID().toString() + "." + ext; - - String filePath = "img/profile/" + iuser; - - File uploadFile = null; - try { - Optional uploadFileOpt = fileManager.convertMultipartFileToFile(mf); - if (uploadFileOpt.isEmpty()) { - System.out.println("파일 변환에 실패했습니다."); - } - uploadFile = uploadFileOpt.get(); - - // 파일 업로드 - String saveFilePath = uploadImageS3.upload(uploadFile, filePath, saveFileName); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("파일을 업로드 하던 중 에러가 발생했습니다."); - } finally { - // 파일 삭제 - if (uploadFile != null) { - uploadFile.delete(); - } - } - - return "/" + filePath + "/" + saveFileName; + public String fileToString(MultipartFile file, int iuser) { + String path = "C:\\study\\practice\\springboot\\HEBE-prac\\real\\HEBE-app_10\\public\\img\\user\\" + iuser + "\\profile"; + File dir = new File(path); + if(!dir.exists()) { dir.mkdirs(); } + File target = new File(path + "/" + iuser + ".jpg"); + try { file.transferTo(target); } + catch (Exception e) { e.printStackTrace(); } + return "/img/user/" + iuser + "/profile/" + iuser + ".jpg"; } public void profileMod(UserEntity user) { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index b32a53a..0cdc80f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -22,7 +22,7 @@ spring: google: client-id: 1032001853934-78dmac7kurqos5r8bpvs9hen0afa8bgv.apps.googleusercontent.com client-secret: oPRqiNcXKA9nUfMxMRYkLRe7 - scope : email, profile + scope: email, profile kakao: authorization-grant-type: authorization_code From c8d83647c91820698a0e580fa33b11dc63e63b37 Mon Sep 17 00:00:00 2001 From: jun17183 Date: Mon, 13 Sep 2021 17:40:38 +0900 Subject: [PATCH 21/21] =?UTF-8?q?usermapper=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mybatis-mapper/UserMapper.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/mybatis-mapper/UserMapper.xml b/src/main/resources/mybatis-mapper/UserMapper.xml index ad8252d..bd7a05e 100644 --- a/src/main/resources/mybatis-mapper/UserMapper.xml +++ b/src/main/resources/mybatis-mapper/UserMapper.xml @@ -4,7 +4,7 @@ + SELECT * FROM userdb + WHERE username = #{username} AND provider = #{provider} +