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..39a3f31 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 + + + + + + + + + diff --git a/src/main/java/com/hebe/AmazonS3Config.java b/src/main/java/com/hebe/AmazonS3Config.java new file mode 100644 index 0000000..8ab8ade --- /dev/null +++ b/src/main/java/com/hebe/AmazonS3Config.java @@ -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(); + } +} diff --git a/src/main/java/com/hebe/controller/DiaryController.java b/src/main/java/com/hebe/controller/DiaryController.java index fc45017..00ea440 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) { @@ -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") @@ -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") 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/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..a6b781b --- /dev/null +++ b/src/main/java/com/hebe/imgUpload/ImageManagerService.java @@ -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 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); + } +} 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..203c991 --- /dev/null +++ b/src/main/java/com/hebe/imgUpload/UploadImageS3.java @@ -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(); + } + } +} diff --git a/src/main/java/com/hebe/jwt/config/SecurityConfig.java b/src/main/java/com/hebe/jwt/config/SecurityConfig.java index d739e78..44cdc1f 100644 --- a/src/main/java/com/hebe/jwt/config/SecurityConfig.java +++ b/src/main/java/com/hebe/jwt/config/SecurityConfig.java @@ -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(); diff --git a/src/main/java/com/hebe/jwt/controller/UserController.java b/src/main/java/com/hebe/jwt/controller/UserController.java index 83d3a90..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") @@ -100,10 +76,16 @@ public ResponseEntity profileMod(@RequestParam(value="profileimg", required = 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 30c25b7..5a6a0ef 100644 --- a/src/main/java/com/hebe/jwt/service/UserService.java +++ b/src/main/java/com/hebe/jwt/service/UserService.java @@ -1,20 +1,23 @@ package com.hebe.jwt.service; 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.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.util.UUID; @Service public class UserService { @@ -23,6 +26,8 @@ public class UserService { @Autowired private JwtUtil jwtUtil; @Autowired private CookieUtil cookieUtil; @Autowired private RedisUtil redisUtil; + @Autowired private AuthenticationManager authenticationManager; + @Autowired private PasswordEncoder passwordEncoder; public int selUsername(String username) { int result = userMapper.selUsername(username); @@ -44,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); @@ -54,21 +89,15 @@ 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"; - + 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"; } 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/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 f3e5be3..20173f9 100644 --- a/src/main/java/com/hebe/service/DiaryService.java +++ b/src/main/java/com/hebe/service/DiaryService.java @@ -1,16 +1,13 @@ package com.hebe.service; +import com.hebe.imgUpload.UploadImageS3; 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 { @@ -18,6 +15,9 @@ public class DiaryService { @Autowired private DiaryMapper DiaryMapper; + @Autowired + private UploadImageS3 UploadImageS3; + // 특정 유저 게시글 조회 public List selUserDiary(UserEntity param) { return DiaryMapper.selUserDiary(param); } @@ -27,61 +27,19 @@ 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); } + // 글 수정 + 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()); - 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(); + // 작성 취소 시 업로드한 이미지 삭제시키기 return DiaryMapper.deleteDiary(param); } @@ -90,7 +48,9 @@ public int cancelDiary(DiaryEntity param) { public DetailDomain detailDiary(DiaryEntity param) { return DiaryMapper.detailDiary(param); } // 글 삭제 - public int deleteDiary(DiaryEntity param) { return DiaryMapper.deleteDiary(param); } + public int deleteDiary(DiaryEntity param) { + 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/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/application.yaml b/src/main/resources/application.yaml index a17f2cd..0cdc80f 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 @@ -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 @@ -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: @@ -79,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 diff --git a/src/main/resources/mybatis-mapper/DiaryMapper.xml b/src/main/resources/mybatis-mapper/DiaryMapper.xml index 4e6206a..be8f860 100644 --- a/src/main/resources/mybatis-mapper/DiaryMapper.xml +++ b/src/main/resources/mybatis-mapper/DiaryMapper.xml @@ -42,23 +42,23 @@ where iuser = #{iuser} - - insert into diarydb - (title, content, iuser) - values - (#{title}, #{content}, #{iuser}); - - - + 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 where iboard = #{iboard} and iuser = #{iuser} diff --git a/src/main/resources/mybatis-mapper/TodoListMapper.xml b/src/main/resources/mybatis-mapper/TodoListMapper.xml new file mode 100644 index 0000000..a6d0fdb --- /dev/null +++ b/src/main/resources/mybatis-mapper/TodoListMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + update tododb set t_text = #{t_text} where t_board =#{t_board} AND iuser = #{iuser}; + + + + insert into tododb (iuser,t_num,t_text,done,regdt) values (#{iuser},#{t_num},#{t_text},#{done},#{regdt}); + + + + DELETE FROM tododb where iuser = #{iuser} and regdt = #{regdt}; + + \ No newline at end of file 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} +