diff --git a/backend/src/main/java/org/example/backend/global/config/S3Uploader.java b/backend/src/main/java/org/example/backend/global/config/S3Uploader.java index 7b03782f..02d8d01d 100644 --- a/backend/src/main/java/org/example/backend/global/config/S3Uploader.java +++ b/backend/src/main/java/org/example/backend/global/config/S3Uploader.java @@ -1,14 +1,7 @@ package org.example.backend.global.config; -import static org.example.backend.professor.exception.ProfessorExceptionType.NOT_FOUND_FILE; - import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.PutObjectRequest; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Objects; -import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.example.backend.professor.exception.ProfessorException; @@ -17,60 +10,73 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Objects; +import java.util.Optional; + +import static org.example.backend.professor.exception.ProfessorExceptionType.NOT_FOUND_FILE; + @Slf4j @Component @RequiredArgsConstructor public class S3Uploader { + private static final String FILE_DELETE_SUCCESS = "파일이 삭제되었습니다."; + private static final String FILE_DELETE_FAILURE = "파일 삭제에 실패했습니다."; + private static final String FILE_CONVERSION_ERROR = "파일 변환 중 에러가 발생했습니다."; + private final AmazonS3Client amazonS3Client; @Value("${cloud.aws.s3.bucket}") - public String bucket; + private String bucket; @Transactional public String upload(MultipartFile multipartFile, String dirName) { - File uploadFile = convert(multipartFile) + File convertedFile = convertToFile(multipartFile) .orElseThrow(() -> new ProfessorException(NOT_FOUND_FILE)); - return upload(uploadFile, dirName); - } + String fileName = generateFileName(dirName, convertedFile.getName()); + String uploadUrl = uploadToS3(convertedFile, fileName); - private String upload(File uploadFile, String dirName) { - String fileName = dirName + "/" + uploadFile.getName(); - String uploadImageUrl = putS3(uploadFile, fileName); - removeNewFile(uploadFile); + deleteLocalFile(convertedFile); + return uploadUrl; + } - return uploadImageUrl; + private String generateFileName(String dirName, String originalFileName) { + return String.format("%s/%s", dirName, originalFileName); } - private String putS3(File uploadFile, String fileName) { - log.info("S3Uploader putS3"); - amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile)); + private String uploadToS3(File file, String fileName) { + log.info("S3Uploader: 파일을 S3에 업로드 중 - 파일 이름: {}", fileName); + amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, file)); return amazonS3Client.getUrl(bucket, fileName).toString(); } - private void removeNewFile(File targetFile) { - log.info("S3Uploader removeNewFile"); - if (targetFile.delete()) { - log.info("파일이 삭제되었습니다."); + private void deleteLocalFile(File file) { + if (file.delete()) { + log.info(FILE_DELETE_SUCCESS); } else { - log.info("파일이 삭제되지 못했습니다."); + log.warn(FILE_DELETE_FAILURE); } } - private Optional convert(MultipartFile file) { - if (file.isEmpty()) { + private Optional convertToFile(MultipartFile multipartFile) { + if (multipartFile.isEmpty()) { + log.warn("빈 파일입니다."); return Optional.empty(); } - File convertedFile = new File(Objects.requireNonNull(file.getOriginalFilename())); - try (FileOutputStream fos = new FileOutputStream(convertedFile)) { - fos.write(file.getBytes()); + String originalFileName = Objects.requireNonNull(multipartFile.getOriginalFilename()); + File file = new File(originalFileName); + + try (FileOutputStream fos = new FileOutputStream(file)) { + fos.write(multipartFile.getBytes()); + return Optional.of(file); } catch (IOException e) { - log.error("파일 전환 중 에러 발생", e); + log.error(FILE_CONVERSION_ERROR, e); return Optional.empty(); } - - return Optional.of(convertedFile); } -} +} \ No newline at end of file diff --git a/backend/src/main/java/org/example/backend/reservation/domain/Reservation.java b/backend/src/main/java/org/example/backend/reservation/domain/Reservation.java new file mode 100644 index 00000000..0230f4d0 --- /dev/null +++ b/backend/src/main/java/org/example/backend/reservation/domain/Reservation.java @@ -0,0 +1,52 @@ +package org.example.backend.reservation.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.util.Date; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.example.backend.seminarRoom.domain.SeminarRoom; +import org.example.backend.user.domain.entity.User; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "reservation") +public class Reservation { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "reservation_id") + private Long id; + + @Column(name = "start_date") + private Date startDate; + + @Column(name = "end_date") + private Date endDate; + + @Column(name = "purpose") + private ReservationPurpose purpose; + + @Column(name = "etc") + private String etc; + + @Column(name = "status") + private ReservationStatus status; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "seminar_room", nullable = false) + private SeminarRoom seminarRoom; +} diff --git a/backend/src/main/java/org/example/backend/reservation/domain/ReservationPurpose.java b/backend/src/main/java/org/example/backend/reservation/domain/ReservationPurpose.java new file mode 100644 index 00000000..8c515028 --- /dev/null +++ b/backend/src/main/java/org/example/backend/reservation/domain/ReservationPurpose.java @@ -0,0 +1,4 @@ +package org.example.backend.reservation.domain; + +public enum ReservationPurpose { +} diff --git a/backend/src/main/java/org/example/backend/reservation/domain/ReservationStatus.java b/backend/src/main/java/org/example/backend/reservation/domain/ReservationStatus.java new file mode 100644 index 00000000..4938a84d --- /dev/null +++ b/backend/src/main/java/org/example/backend/reservation/domain/ReservationStatus.java @@ -0,0 +1,4 @@ +package org.example.backend.reservation.domain; + +public enum ReservationStatus { +} diff --git a/backend/src/main/java/org/example/backend/seminarRoom/domain/SeminarRoom.java b/backend/src/main/java/org/example/backend/seminarRoom/domain/SeminarRoom.java new file mode 100644 index 00000000..b792f2f6 --- /dev/null +++ b/backend/src/main/java/org/example/backend/seminarRoom/domain/SeminarRoom.java @@ -0,0 +1,43 @@ +package org.example.backend.seminarRoom.domain; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.ArrayList; +import java.util.List; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.example.backend.reservation.domain.Reservation; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "seminar_room") +public class SeminarRoom { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "seminar_room_id") + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "person_capacity") + private Integer personCapacity; + + @Column(name = "place") + private String place; + + @Column(name = "image") + private String image; + + @OneToMany(mappedBy = "seminar_room", cascade = CascadeType.ALL, orphanRemoval = true) + private List reservations = new ArrayList<>(); +} diff --git a/backend/src/main/java/org/example/backend/user/domain/entity/User.java b/backend/src/main/java/org/example/backend/user/domain/entity/User.java new file mode 100644 index 00000000..75219d99 --- /dev/null +++ b/backend/src/main/java/org/example/backend/user/domain/entity/User.java @@ -0,0 +1,40 @@ +package org.example.backend.user.domain.entity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.ArrayList; +import java.util.List; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.example.backend.reservation.domain.Reservation; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "user") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id") + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "major") + private String major; + + @Column(name = "phone", unique = true) + private String phoneN; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + private List reservations = new ArrayList<>(); +}