diff --git a/.gitignore b/.gitignore index c2065bc..a50e99a 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ out/ ### VS Code ### .vscode/ + +src/main/resources/application.yml diff --git a/build.gradle b/build.gradle index f1d084a..4084531 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,9 @@ dependencies { implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-orgjson', version: '0.11.2' implementation group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '9.37.2' + + //s3 + implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' } tasks.named('test') { diff --git a/src/main/java/com/example/beginnerfitbe/category/domain/Category.java b/src/main/java/com/example/beginnerfitbe/category/domain/Category.java new file mode 100644 index 0000000..7310ad8 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/category/domain/Category.java @@ -0,0 +1,32 @@ +package com.example.beginnerfitbe.category.domain; + +import com.example.beginnerfitbe.post.domain.Post; +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor +public class Category { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true) + private String categoryName; + + @OneToMany(mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) + @JsonIgnore + private List posts; + + @Builder + public Category(String categoryName) { + this.categoryName = categoryName; + } +} + diff --git a/src/main/java/com/example/beginnerfitbe/category/repository/CategoryRepository.java b/src/main/java/com/example/beginnerfitbe/category/repository/CategoryRepository.java new file mode 100644 index 0000000..abdc804 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/category/repository/CategoryRepository.java @@ -0,0 +1,12 @@ +package com.example.beginnerfitbe.category.repository; + +import com.example.beginnerfitbe.category.domain.Category; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface CategoryRepository extends JpaRepository { + Optional findByCategoryName (String categoryName); +} diff --git a/src/main/java/com/example/beginnerfitbe/category/service/CategoryService.java b/src/main/java/com/example/beginnerfitbe/category/service/CategoryService.java new file mode 100644 index 0000000..73ecfa3 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/category/service/CategoryService.java @@ -0,0 +1,28 @@ +package com.example.beginnerfitbe.category.service; + +import com.example.beginnerfitbe.category.domain.Category; +import com.example.beginnerfitbe.category.repository.CategoryRepository; +import com.example.beginnerfitbe.post.domain.Post; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CategoryService { + + private final CategoryRepository categoryRepository; + @PostConstruct + public void initCategories() { + List categoryNames = Arrays.asList("자유게시판", "정보공유"); + + categoryNames.forEach(categoryName -> { + if (categoryRepository.findByCategoryName(categoryName).isEmpty()) { + categoryRepository.save(new Category(categoryName)); + } + }); + } +} diff --git a/src/main/java/com/example/beginnerfitbe/post/controller/PostController.java b/src/main/java/com/example/beginnerfitbe/post/controller/PostController.java new file mode 100644 index 0000000..db11141 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/controller/PostController.java @@ -0,0 +1,70 @@ +package com.example.beginnerfitbe.post.controller; + +import com.example.beginnerfitbe.error.StateResponse; +import com.example.beginnerfitbe.jwt.util.JwtUtil; +import com.example.beginnerfitbe.post.dto.PostCreateDto; +import com.example.beginnerfitbe.post.dto.PostUpdateDto; +import com.example.beginnerfitbe.post.service.PostService; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + + +@RestController +@RequiredArgsConstructor +@RequestMapping("/posts") +public class PostController { + + private final PostService postService; + private final JwtUtil jwtUtil; + + @GetMapping("") + @Operation(summary = "게시글 조회 메서드", description = "전체 게시글을 조회합니다.") + public ResponseEntity list() { + return ResponseEntity.ok(postService.list()); + } + + @GetMapping("/{postId}") + @Operation(summary = "게시글 상세 조회 메서드", description = "게시글 상세 정보를 조회합니다.") + public ResponseEntity read(@PathVariable Long postId) { + return ResponseEntity.ok(postService.read(postId)); + } + @GetMapping("/me") + @Operation(summary = "사용자 게시글 조회 메소드", description = "사용자가 마이페이지에서 자신이 등록한 글을 조회합니다.") + public ResponseEntity me(HttpServletRequest request) { + Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); + return ResponseEntity.ok(postService.me(userId)); + } + + @GetMapping("/categories/{categoryName}") + @Operation(summary = "카테고리 별 게시글 조회 메소드", description = "카테고리 이름을 통해 카테고리 별로 게시글을 조회합니다.") + public ResponseEntity getPostsByCategoryName(@PathVariable String categoryName) { + return ResponseEntity.ok(postService.getPostsByCategoryName(categoryName)); + } + + @PostMapping("") + @Operation(summary = "게시글 생성 메서드", description = "제목/내용/카테고리이름/사진(선택)을 입력받아 게시글을 생성합니다.") + public ResponseEntity create(HttpServletRequest request, @RequestPart("createDto") PostCreateDto createDto, @RequestPart(value = "postPicture", required = false) MultipartFile postPicture){ + Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); + return postService.create(userId, createDto, postPicture); + } + @PutMapping("/{postId}") + @Operation(summary = "사용자 글 수정 메서드", description = "사용자가 자신이 작성한 글을 수정합니다.") + ResponseEntity update(HttpServletRequest request, @PathVariable Long postId, @RequestPart("updateDto") PostUpdateDto updateDto, @RequestPart(value = "postPicture", required = false) MultipartFile postPicture){ + Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); + return postService.update(postId, userId, updateDto ,postPicture); + } + @DeleteMapping("/{postId}") + @Operation(summary = "게시글 삭제 메서드", description = "사용자가 커뮤니티 글을 삭제하기 위한 메서드입니다.") + ResponseEntity delete(HttpServletRequest request, @PathVariable Long postId){ + Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7)); + return postService.delete(postId, userId); + } + +} diff --git a/src/main/java/com/example/beginnerfitbe/post/domain/Post.java b/src/main/java/com/example/beginnerfitbe/post/domain/Post.java new file mode 100644 index 0000000..ba73fcc --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/domain/Post.java @@ -0,0 +1,60 @@ +package com.example.beginnerfitbe.post.domain; + +import com.example.beginnerfitbe.category.domain.Category; +import com.example.beginnerfitbe.user.domain.User; +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor +public class Post { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + @Column + private String pictureUrl; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @ManyToOne + @JoinColumn(name = "category_id", nullable = false) + private Category category; + + @CreatedDate + @Column(nullable = false) + private LocalDateTime createdAt; + + @Builder + public Post(String title, String content, String pictureUrl, LocalDateTime createdAt, User user, Category category) { + this.title = title; + this.content = content; + this.pictureUrl = pictureUrl; + this.createdAt = createdAt; + this.category = category; + this.user = user; + } + + public void update(String title, String content, Category category) { + this.title=title; + this.content = content; + this.category= category; + } + public void updatePicture(String pictureUrl) { + this.pictureUrl = pictureUrl; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/beginnerfitbe/post/dto/PostCreateDto.java b/src/main/java/com/example/beginnerfitbe/post/dto/PostCreateDto.java new file mode 100644 index 0000000..eb742d7 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/dto/PostCreateDto.java @@ -0,0 +1,22 @@ +package com.example.beginnerfitbe.post.dto; + +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class PostCreateDto { + private String title; + private String content; + private String categoryName; + + @Builder + public PostCreateDto(String title, String content, String categoryName) { + this.title = title; + this.content = content; + this.categoryName = categoryName; + } + +} diff --git a/src/main/java/com/example/beginnerfitbe/post/dto/PostDto.java b/src/main/java/com/example/beginnerfitbe/post/dto/PostDto.java new file mode 100644 index 0000000..e1bdee4 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/dto/PostDto.java @@ -0,0 +1,43 @@ +package com.example.beginnerfitbe.post.dto; + +import com.example.beginnerfitbe.post.domain.Post; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class PostDto { + private Long id; + private String title; + private String content; + private String pictureUrl; + private LocalDateTime createdAt; + + private Long userId; + private String userName; + private String categoryName; + + public PostDto(Long id, String title, String content, String pictureUrl, LocalDateTime createdAt, Long userId, String userName, String categoryName) { + this.id = id; + this.title = title; + this.content = content; + this.pictureUrl=pictureUrl; + this.createdAt = createdAt; + this.userId = userId; + this.userName = userName; + this.categoryName = categoryName; + } + + public static PostDto fromEntity(Post post) { + return new PostDto( + post.getId(), + post.getTitle(), + post.getContent(), + post.getPictureUrl(), + post.getCreatedAt(), + post.getUser().getId(), + post.getUser().getName(), + post.getCategory().getCategoryName() + ); + } +} diff --git a/src/main/java/com/example/beginnerfitbe/post/dto/PostUpdateDto.java b/src/main/java/com/example/beginnerfitbe/post/dto/PostUpdateDto.java new file mode 100644 index 0000000..5be677f --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/dto/PostUpdateDto.java @@ -0,0 +1,12 @@ +package com.example.beginnerfitbe.post.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class PostUpdateDto { + private String title; + private String content; + private String categoryName; +} diff --git a/src/main/java/com/example/beginnerfitbe/post/repository/PostRepository.java b/src/main/java/com/example/beginnerfitbe/post/repository/PostRepository.java new file mode 100644 index 0000000..42e05f5 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/repository/PostRepository.java @@ -0,0 +1,15 @@ +package com.example.beginnerfitbe.post.repository; + +import com.example.beginnerfitbe.category.domain.Category; +import com.example.beginnerfitbe.post.domain.Post; +import com.example.beginnerfitbe.user.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PostRepository extends JpaRepository { + List findAllByUser(User user); + List findPostsByCategory(Category category); +} diff --git a/src/main/java/com/example/beginnerfitbe/post/service/PostService.java b/src/main/java/com/example/beginnerfitbe/post/service/PostService.java new file mode 100644 index 0000000..2142ba4 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/post/service/PostService.java @@ -0,0 +1,144 @@ +package com.example.beginnerfitbe.post.service; + +import com.example.beginnerfitbe.category.domain.Category; +import com.example.beginnerfitbe.category.repository.CategoryRepository; +import com.example.beginnerfitbe.error.StateResponse; +import com.example.beginnerfitbe.post.domain.Post; +import com.example.beginnerfitbe.post.dto.PostCreateDto; +import com.example.beginnerfitbe.post.dto.PostDto; +import com.example.beginnerfitbe.post.dto.PostUpdateDto; +import com.example.beginnerfitbe.post.repository.PostRepository; +import com.example.beginnerfitbe.s3.util.S3Uploader; +import com.example.beginnerfitbe.user.domain.User; +import com.example.beginnerfitbe.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class PostService { + private final PostRepository postRepository; + private final UserRepository userRepository; + private final CategoryRepository categoryRepository; + private final S3Uploader s3Uploader; + + //글 생성 + public ResponseEntity create(Long userId, PostCreateDto postCreateDto, MultipartFile postPicture){ + try { + User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user")); + + Category category = categoryRepository.findByCategoryName(postCreateDto.getCategoryName()) + .orElseThrow(() -> new IllegalArgumentException("not found category")); + + String pictureUrl = null; + if (postPicture != null && !postPicture.isEmpty()) { + pictureUrl = s3Uploader.upload(postPicture, "Post"); + } + + Post post = Post.builder() + .title(postCreateDto.getTitle()) + .content(postCreateDto.getContent()) + .pictureUrl(pictureUrl) + .createdAt(LocalDateTime.now()) + .user(user) + .category(category) + .build(); + + postRepository.save(post); + + return ResponseEntity.ok(StateResponse.builder().code("SUCCESS").message("글을 성공적으로 생성했습니다.").build()); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(StateResponse.builder().code("ERROR").message("오류가 발생했습니다: " + e.getMessage()).build()); + } + } + //전체 글 조회 + public List list(){ + return postRepository.findAll().stream() + .map(PostDto::fromEntity) + .collect(Collectors.toList()); + } + //postId로 조회 + public PostDto read(Long postId){ + Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("해당 글이 없습니다. id= " + postId)); + return PostDto.fromEntity(post); + } + //내가 작성한 글 조회 + public List me(Long userId){ + User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("not found user")); + List posts= postRepository.findAllByUser(user); + return posts.stream() + .map(PostDto::fromEntity) + .collect(Collectors.toList()); + } + public List getPostsByCategoryName(String categoryName){ + Category category = categoryRepository.findByCategoryName(categoryName).orElseThrow(() -> new IllegalArgumentException("not found category")); + List posts = postRepository.findPostsByCategory(category); + + return posts.stream() + .map(PostDto::fromEntity) + .collect(Collectors.toList()); + } + public ResponseEntity update(Long postId, Long id, PostUpdateDto updateDto, MultipartFile postPicture) { + try { + Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post")); + + Long userId = post.getUser().getId(); + String previousPictureUrl = post.getPictureUrl(); + + if (!userId.equals(id)) throw new IllegalArgumentException("작성자만 글을 수정할 수 있습니다."); + + String title = updateDto.getTitle(); + String content = updateDto.getContent(); + String categoryName = updateDto.getCategoryName(); + + if (title != null && content != null && categoryName != null) { + Category category = categoryRepository.findByCategoryName(categoryName).orElseThrow(() -> new IllegalArgumentException("not found category")); + post.update(title, content, category); + } + + if (previousPictureUrl != null) { + s3Uploader.delete("Post",previousPictureUrl); + } + String newPictureUrl=null; + // 사진 수정 + if (postPicture != null && !postPicture.isEmpty()) { + if (previousPictureUrl != null) { + s3Uploader.delete("Post",previousPictureUrl); + } + newPictureUrl = s3Uploader.upload(postPicture, "Post"); + } + post.updatePicture(newPictureUrl); + postRepository.save(post); + return ResponseEntity.ok(StateResponse.builder().code("SUCCESS").message("게시글을 성공적으로 업데이트했습니다.").build()); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(StateResponse.builder().code("ERROR").message("오류가 발생했습니다: " + e.getMessage()).build()); + } + } + + @Transactional + public ResponseEntity delete(Long postId, Long id){ + Post post = postRepository.findById(postId).orElseThrow(() -> new IllegalArgumentException("not found post")); + Long userId = post.getUser().getId(); + if(!userId.equals(id)) throw new IllegalArgumentException("작성자만 글을 삭제할 수 있습니다."); + + String previousPictureUrl = post.getPictureUrl(); + if(previousPictureUrl!=null){ + s3Uploader.delete("Post",previousPictureUrl); + } + + postRepository.delete(post); + return ResponseEntity.ok(StateResponse.builder().code("SUCCESS").message("글을 성공적으로 삭제했습니다.").build()); + } + + +} diff --git a/src/main/java/com/example/beginnerfitbe/s3/config/S3Config.java b/src/main/java/com/example/beginnerfitbe/s3/config/S3Config.java new file mode 100644 index 0000000..df1e233 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/s3/config/S3Config.java @@ -0,0 +1,36 @@ +package com.example.beginnerfitbe.s3.config; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.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 S3Config { + + @Value("${BUCKET_ACCESS}") + private String accessKey; + + @Value("${BUCKET_SECRET}") + private String secretKey; + + @Value("${cloud.aws.region.static}") + private String region; + + @Bean + public AmazonS3Client amazonS3Client() { + BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + + return (AmazonS3Client) AmazonS3ClientBuilder + .standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .build(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/beginnerfitbe/s3/util/S3Uploader.java b/src/main/java/com/example/beginnerfitbe/s3/util/S3Uploader.java new file mode 100644 index 0000000..abd52e7 --- /dev/null +++ b/src/main/java/com/example/beginnerfitbe/s3/util/S3Uploader.java @@ -0,0 +1,97 @@ +package com.example.beginnerfitbe.s3.util; + +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 lombok.extern.slf4j.Slf4j; +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.FileOutputStream; +import java.io.IOException; +import java.util.Optional; +import java.util.UUID; + +@Slf4j +@RequiredArgsConstructor +@Service +public class S3Uploader { + private final AmazonS3Client amazonS3Client; + + @Value("${cloud.aws.s3.bucket}") + private String bucket; + + public String upload(MultipartFile multipartFile, String dirName) throws IOException { + + File uploadFile = convert(multipartFile) + .orElseThrow(() -> new IllegalArgumentException("MultipartFile -> File 전환 실패")); + return upload(uploadFile, dirName); + } + + private String upload(File uploadFile, String dirName) { + String fileName = dirName + "/" + UUID.randomUUID() + "." + getFileExtension(uploadFile.getName()); + String uploadImageUrl = putS3(uploadFile, fileName); + + removeNewFile(uploadFile); + + return uploadImageUrl; + } + + public void delete(String dirName, String imageUrl) { + try { + String key = dirName+"/"+imageUrl.substring(imageUrl.lastIndexOf("/") + 1); // .com/ 다음부터 파일 경로가 시작됨 + + // 파일이 존재하는지 확인 + boolean exists = amazonS3Client.doesObjectExist(bucket, key); + log.info("파일 존재 여부: {}", exists); + + if (amazonS3Client.doesObjectExist(bucket, key)) { + amazonS3Client.deleteObject(new DeleteObjectRequest(bucket, key)); + log.info("파일이 S3에서 삭제되었습니다: {}", key); + } else { + log.warn("파일이 존재하지 않습니다: {}", key); + } + } catch (Exception e) { + log.error("S3에서 파일 삭제에 실패했습니다: {}", e.getMessage()); + throw new RuntimeException("Failed to delete file from S3", e); + } + } + + private String putS3(File uploadFile, String fileName) { + amazonS3Client.putObject( + new PutObjectRequest(bucket, fileName, uploadFile) + .withCannedAcl(CannedAccessControlList.PublicRead) + ); + return amazonS3Client.getUrl(bucket, fileName).toString(); + } + + private void removeNewFile(File targetFile) { + if (targetFile.delete()) { + log.info("파일이 삭제되었습니다."); + } else { + log.info("파일이 삭제되지 못했습니다."); + } + } + + private Optional convert(MultipartFile file) throws IOException { + File convertFile = new File(file.getOriginalFilename()); + if (convertFile.createNewFile()) { + try (FileOutputStream fos = new FileOutputStream(convertFile)) { + fos.write(file.getBytes()); + } + return Optional.of(convertFile); + } + return Optional.empty(); + } + + private String getFileExtension(String fileName) { + if (fileName == null || fileName.isEmpty() || !fileName.contains(".")) { + return ""; + } + return fileName.substring(fileName.lastIndexOf(".") + 1); + } +} diff --git a/src/main/java/com/example/beginnerfitbe/user/domain/User.java b/src/main/java/com/example/beginnerfitbe/user/domain/User.java index fa697f0..efe71d5 100644 --- a/src/main/java/com/example/beginnerfitbe/user/domain/User.java +++ b/src/main/java/com/example/beginnerfitbe/user/domain/User.java @@ -1,11 +1,15 @@ package com.example.beginnerfitbe.user.domain; +import com.example.beginnerfitbe.post.domain.Post; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.List; + @Entity @Getter @@ -36,6 +40,11 @@ public class User { @Column private int exerciseIntensity; + @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) + @JsonIgnore + private List posts; + + @Builder public User(String email, String name, String password, int exercisePurpose, int exercisePart, int exerciseTime, int exerciseIntensity) { this.email=email; @@ -50,7 +59,9 @@ public User(String email, String name, String password, int exercisePurpose, int public void update(String name, String password, int exercisePurpose, int exercisePart, int exerciseTime, int exerciseIntensity) { this.name=name; this.password = password; + this.exercisePurpose = exercisePurpose; this.exercisePart= exercisePart; + this.exerciseTime=exerciseTime; this.exerciseIntensity = exerciseIntensity; } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 444c472..ef00c8f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -18,3 +18,13 @@ jwt: secret: ${JWT_SECRET} expiration: ${JWT_EXPIRATION} issuer: ${JWT_ISSUER} + +cloud: + aws: + s3: + bucket: ${BUCKET_NAME} + stack.auto: false + region.static: ap-northeast-2 + credentials: + accessKey: ${BUCKET_ACCESS} + secretKey: ${BUCKET_SECRET} \ No newline at end of file