From 4f9bfa40f38d7cbcb193f036937c604ab2c803da Mon Sep 17 00:00:00 2001 From: MINGW64 Date: Mon, 9 Dec 2024 15:12:35 +0900 Subject: [PATCH 01/10] 1 --- build.gradle | 58 ++++--------------- gradle/wrapper/gradle-wrapper.properties | 2 +- .../example/taba_project/DemoApplication.java | 2 - .../controller/InfoController.java | 25 ++++++++ .../handler/FileStorageHandler.java | 3 +- .../com/example/taba_project/model/Info.java | 24 ++++++++ .../repository/InfoRepository.java | 8 +++ src/main/resources/application.properties | 41 ++++--------- 8 files changed, 82 insertions(+), 81 deletions(-) create mode 100644 src/main/java/com/example/taba_project/controller/InfoController.java create mode 100644 src/main/java/com/example/taba_project/model/Info.java create mode 100644 src/main/java/com/example/taba_project/repository/InfoRepository.java diff --git a/build.gradle b/build.gradle index c0170ab..1433930 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'io.spring.dependency-management' version '1.1.6' } -group = 'com.example' +group = 'Comment_Adm' version = '0.0.1-SNAPSHOT' java { @@ -13,58 +13,24 @@ java { } } -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -jar { - enabled = true -} - repositories { mavenCentral() } dependencies { - // Spring Boot JPA와 관련 의존성도 확인(Database와 관련) - // implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - // OAuth2 클라이언트 기능 지원 - implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - // Spring Security를 사용한 인증 및 권한 관리를 지원 - // implementation 'org.springframework.boot:spring-boot-starter-security' - // implementation 'mysql:mysql-connector-java:8.0.33' - // Spring MVC와 REST API 개발을 위한 기본 설정 및 라이브러리 제공 - implementation 'org.springframework.boot:spring-boot-starter-web' - // Spring Boot와 Thymeleaf 템플릿 엔진의 통합을 지원 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - - // Lombok 라이브러리 의존성 - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - implementation 'org.projectlombok:lombok:1.18.20' - - // MySQL 데이터베이스에 연결하기 위한 JDBC 드라이버 추가 - // runtimeOnly 'com.mysql:mysql-connector-j' - - // runtimeOnly 'com.mysql:mysql-connector-j' // -j - // runtimeOnly 'com.mysql:mysql-connector-java:8.0.38' - // implementation 'com.mysql:mysql-connector-java:8.0.33' - // 테스트 코드를 작성하고 실행하기 위한 라이브러리 모음 추가 - testImplementation 'org.springframework.boot:spring-boot-starter-test' - - // Spring Security를 테스트하기 위한 유틸리티 추가 - testImplementation("org.springframework.security:spring-security-test") - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - - // 비밀번호 암호화(Password Encoder) - // implementation 'org.springframework.security:spring-security-crypto:5.7.1' - - // 웹소켓 서버 세팅 + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // JPA 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-websocket' - // WebClient 사용을 위해 필요 - // implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'org.projectlombok:lombok:1.18.26' + annotationProcessor 'org.projectlombok:lombok:1.18.26' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'mysql:mysql-connector-java' + implementation 'mysql:mysql-connector-java:8.0.33' + testImplementation ('org.springframework.boot:spring-boot-starter-test'){ + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df97d72..ccc1a9b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -4,4 +4,4 @@ distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/src/main/java/com/example/taba_project/DemoApplication.java b/src/main/java/com/example/taba_project/DemoApplication.java index 21fad3d..5eb13e4 100644 --- a/src/main/java/com/example/taba_project/DemoApplication.java +++ b/src/main/java/com/example/taba_project/DemoApplication.java @@ -3,9 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -// import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -// @SpringBootApplication(exclude = { SecurityAutoConfiguration.class }) @SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) public class DemoApplication { diff --git a/src/main/java/com/example/taba_project/controller/InfoController.java b/src/main/java/com/example/taba_project/controller/InfoController.java new file mode 100644 index 0000000..7308d79 --- /dev/null +++ b/src/main/java/com/example/taba_project/controller/InfoController.java @@ -0,0 +1,25 @@ +package com.example.taba_project.controller; + +import com.example.taba_project.model.Info; +import com.example.taba_project.repository.InfoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/info") +public class InfoController { + + @Autowired + private InfoRepository infoRepository; + + // 새로운 Info 저장 + @PostMapping + public Info saveInfo(@RequestBody Info info) { + System.out.println("Received info: " + info); + return infoRepository.save(info); + } + +} diff --git a/src/main/java/com/example/taba_project/handler/FileStorageHandler.java b/src/main/java/com/example/taba_project/handler/FileStorageHandler.java index e219d02..3f4a6d6 100644 --- a/src/main/java/com/example/taba_project/handler/FileStorageHandler.java +++ b/src/main/java/com/example/taba_project/handler/FileStorageHandler.java @@ -7,7 +7,7 @@ public class FileStorageHandler { - public static void saveFile(String directoryPath, String fileName, byte[] data) throws IOException { + public static String saveFile(String directoryPath, String fileName, byte[] data) throws IOException { // 디렉토리 경로를 생성 Path dirPath = Paths.get(directoryPath); if (!Files.exists(dirPath)) { @@ -18,5 +18,6 @@ public static void saveFile(String directoryPath, String fileName, byte[] data) Path filePath = Paths.get(directoryPath, fileName); Files.write(filePath, data); System.out.println("파일 저장 완료: " + filePath.toAbsolutePath()); + return directoryPath; } } \ No newline at end of file diff --git a/src/main/java/com/example/taba_project/model/Info.java b/src/main/java/com/example/taba_project/model/Info.java new file mode 100644 index 0000000..bac2bcd --- /dev/null +++ b/src/main/java/com/example/taba_project/model/Info.java @@ -0,0 +1,24 @@ +package com.example.taba_project.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Data; + +@Data +@Entity +public class Info { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String age; + + private String emotion; + + private String gender; + + private String percentage; +} diff --git a/src/main/java/com/example/taba_project/repository/InfoRepository.java b/src/main/java/com/example/taba_project/repository/InfoRepository.java new file mode 100644 index 0000000..188d6e7 --- /dev/null +++ b/src/main/java/com/example/taba_project/repository/InfoRepository.java @@ -0,0 +1,8 @@ +package com.example.taba_project.repository; + +import com.example.taba_project.model.Info; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface InfoRepository extends JpaRepository { + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 062b0c3..444d8bc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,36 +1,15 @@ -spring.application.name=demo - -# ? ?? ???? ?? address(AWS EC2 ??? ?? ???? ????? IP? ??? ???) server.address=0.0.0.0 -# server.address=localhost -# ? ?? ???? ?? port server.port=8080 -#server.ssl.enabled=true -#server.ssl.key-store=classpath:keystore.p12 -#server.ssl.key-store-password=your-password -#server.ssl.key-store-type=PKCS12 - - -## ???? ?? -# spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.show-sql=true -### db url -#spring.datasource.url=jdbc:mysql://localhost:3306/exam -### db username ?? root -#spring.datasource.username=root -### db password -#spring.datasource.password=jh6324309! - -#true ??? JPA ??? ?? ?? -# spring.jpa.show-sql=true - -# JPA? ???? Hibernate? ????? ??? SQL? ???? ????. -# spring.jpa.properties.hibernate.format_sql=true - -spring.jpa.open-in-view=false -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration +spring.application.name=demo -logging.level.org.springframework.web=DEBUG -logging.level.org.springframework.messaging=DEBUG -logging.level.org.springframework.web.socket=TRACE +spring.datasource.url=jdbc:mysql://13.125.196.37:3306/EC2?serverTimezone=UTC +spring.datasource.username=TABA +spring.datasource.password=1234 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect +spring.jpa.database=mysql +spring.jackson.serialization.fail-on-empty-beans=false +spring.jpa.hibernate.ddl-auto=update From b62ebb093e0338dd2de121e197e444bb2a11d9a0 Mon Sep 17 00:00:00 2001 From: MINGW64 Date: Mon, 9 Dec 2024 15:40:18 +0900 Subject: [PATCH 02/10] 2 --- .../controller/InfoController.java | 55 ++++++++++++++++++- .../com/example/taba_project/model/Info.java | 24 -------- 2 files changed, 53 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/com/example/taba_project/model/Info.java diff --git a/src/main/java/com/example/taba_project/controller/InfoController.java b/src/main/java/com/example/taba_project/controller/InfoController.java index 7308d79..522f0ad 100644 --- a/src/main/java/com/example/taba_project/controller/InfoController.java +++ b/src/main/java/com/example/taba_project/controller/InfoController.java @@ -17,9 +17,60 @@ public class InfoController { // 새로운 Info 저장 @PostMapping - public Info saveInfo(@RequestBody Info info) { + public String saveInfo(@RequestBody Info info) { System.out.println("Received info: " + info); - return infoRepository.save(info); + + // DB에 저장 + infoRepository.save(info); + + // 감정 메시지 생성 + String emotionMessage = generateEmotionMessage(info.getEmotion(), info.getPercentage()); + + // 결과 반환 + return emotionMessage; + } + + private String generateEmotionMessage(String emotion, Double percentage) { + String message = ""; + String intensity = getIntensity(percentage); + + switch (emotion.toLowerCase()) { + case "happy": + message = "상대가 " + intensity + " 행복해 합니다."; + break; + case "surprise": + message = "상대가 " + intensity + " 놀랐습니다."; + break; + case "무표정": + message = "상대가 " + intensity + " 무표정입니다."; + break; + case "gross": + message = "상대가 " + intensity + " 불쾌한 상태입니다."; + break; + case "angry": + message = "상대가 " + intensity + " 화가 난 상태입니다."; + break; + case "sad": + message = "상대가 " + intensity + " 슬퍼합니다."; + break; + default: + message = "알 수 없는 감정입니다."; + } + + return message; } + private String getIntensity(Double percentage) { + if (percentage >= 90) { + return "극도로"; + } else if (percentage >= 75) { + return "매우"; + } else if (percentage >= 60) { + return "상당히"; + } else if (percentage >= 50) { + return "조금"; + } else { + return "미미하게"; + } + } } diff --git a/src/main/java/com/example/taba_project/model/Info.java b/src/main/java/com/example/taba_project/model/Info.java deleted file mode 100644 index bac2bcd..0000000 --- a/src/main/java/com/example/taba_project/model/Info.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.taba_project.model; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.Data; - -@Data -@Entity -public class Info { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String age; - - private String emotion; - - private String gender; - - private String percentage; -} From 5fca1d6bf552d8177f54719f9edba1977162c1de Mon Sep 17 00:00:00 2001 From: MINGW64 Date: Mon, 9 Dec 2024 16:24:04 +0900 Subject: [PATCH 03/10] 2 --- .../controller/InfoController.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/taba_project/controller/InfoController.java b/src/main/java/com/example/taba_project/controller/InfoController.java index 522f0ad..955f755 100644 --- a/src/main/java/com/example/taba_project/controller/InfoController.java +++ b/src/main/java/com/example/taba_project/controller/InfoController.java @@ -18,18 +18,28 @@ public class InfoController { // 새로운 Info 저장 @PostMapping public String saveInfo(@RequestBody Info info) { - System.out.println("Received info: " + info); + try { + System.out.println("Received info: " + info); - // DB에 저장 - infoRepository.save(info); + // DB에 저장 + infoRepository.save(info); - // 감정 메시지 생성 - String emotionMessage = generateEmotionMessage(info.getEmotion(), info.getPercentage()); + // 감정 메시지 생성 + String emotionMessage = generateEmotionMessage(info.getEmotion(), info.getPercentage()); - // 결과 반환 - return emotionMessage; + // 로그에 출력 + System.out.println("Generated emotion message: " + emotionMessage); + + // 결과 반환 + return emotionMessage; + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + e.printStackTrace(); + return "Error occurred"; + } } + private String generateEmotionMessage(String emotion, Double percentage) { String message = ""; String intensity = getIntensity(percentage); From e20f305a0742de232c08bd3f0632f2e1a4a268ac Mon Sep 17 00:00:00 2001 From: MINGW64 Date: Mon, 9 Dec 2024 16:46:08 +0900 Subject: [PATCH 04/10] 2 --- .../handler/ImageWebSocketHandler.java | 120 ++++-------------- 1 file changed, 24 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/example/taba_project/handler/ImageWebSocketHandler.java b/src/main/java/com/example/taba_project/handler/ImageWebSocketHandler.java index a8eb33e..0e1ff65 100644 --- a/src/main/java/com/example/taba_project/handler/ImageWebSocketHandler.java +++ b/src/main/java/com/example/taba_project/handler/ImageWebSocketHandler.java @@ -1,96 +1,9 @@ -//package com.example.demo.handler; -// -//// import org.springframework.security.crypto.codec.Base64; -//import org.springframework.stereotype.Component; -//import org.springframework.web.socket.TextMessage; -//import org.springframework.web.socket.WebSocketSession; -//import org.springframework.web.socket.handler.TextWebSocketHandler; -// -//import javax.imageio.ImageIO; -//import java.awt.image.BufferedImage; -//import java.io.ByteArrayInputStream; -//import java.util.concurrent.ConcurrentHashMap; -// -///* -//- Websocket Handler 작성 -//- 소켓 통신은 서버와 클라이언트가 1:n 관계를 가지기에 한 서버에 여러 클라이언트 접속 가능 -//- 서버에서 여러 클라이언트가 발송한 메세지를 받아 처리해줄 핸들러가 필요 -//- TextWebSocketHandler를 상속받아 핸들러 작성 -// */ -//@Component -//public class ImageWebSocketHandler extends TextWebSocketHandler { -// -// // 세션별 메시지 조합을 위한 맵 -// private final ConcurrentHashMap sessionData = new ConcurrentHashMap<>(); -// -// -// private boolean isLastChunk(String payload) { -// // 마지막 청크 확인 로직 -// // 클라이언트에서 마지막 청크를 구분하는 방법에 맞게 구현 (예: 끝에 특수 문자 추가) -// return payload.endsWith(""); -// } -// -// @Override -// public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { -// String payload = message.getPayload(); -// -// // 세션별 데이터 저장 -// sessionData.putIfAbsent(session.getId(), new StringBuilder()); -// StringBuilder builder = sessionData.get(session.getId()); -// builder.append(payload); -// -// // 마지막 청크 확인 -// if (isLastChunk(payload)) { -// // 조립된 Base64 데이터 -// String base64EncodedData = builder.toString().replace("", "").trim().replace("\\s", "").trim(); -// System.out.println(base64EncodedData); -// // byte[] base64EncodedData = base64EncodedData. -// // Base64 인코딩은 정상적으로 되었다는 것을 확인 -//// try { -//// java.util.Base64.getDecoder().decode(base64EncodedData); -//// System.out.println("Base64 데이터 디코딩 가능."); -//// } catch (IllegalArgumentException e) { -//// System.err.println("Base64 디코딩 불가: " + e.getMessage()); -//// return; -//// } -// -// try { -// // Base64 디코딩 -// byte[] base64DecodedData = java.util.Base64.getDecoder().decode(base64EncodedData); -// -// // 디코딩된 데이터를 다시 인코딩하여 원본과 비교 -// String reEncodedBase64 = java.util.Base64.getEncoder().encodeToString(base64DecodedData); -// if (!reEncodedBase64.equals(base64EncodedData)) { -// System.err.println("Base64 데이터 검증 실패: 디코딩 후 다시 인코딩한 데이터가 일치하지 않습니다."); -// return; -// } -// -// // 이미지 유효성 검증 -// BufferedImage img = ImageIO.read(new ByteArrayInputStream(base64DecodedData)); -// if (img == null) { -// System.err.println("이미지 유효성 검증 실패: 유효하지 않은 이미지 데이터입니다."); -// return; -// } -// System.out.println("이미지 유효성 검증 성공."); -// -// // 로컬에 저장 -// final String DIRECTORY_PATH = "/Users/jaeh/Downloads/socket"; -// FileStorageHandler.saveFile(DIRECTORY_PATH, "image_" + System.currentTimeMillis() + ".jpg", base64DecodedData); -// System.out.println("이미지 저장 성공: " + DIRECTORY_PATH); -// -// } catch (IllegalArgumentException e) { -// System.err.println("Base64 디코딩 실패: " + e.getMessage()); -// } catch (Exception e) { -// System.err.println("이미지 저장 실패: " + e.getMessage()); -// } -// } -// } -//} - - -/* 수 정 */ package com.example.taba_project.handler; +import com.example.taba_project.controller.ImageController; // ImageController import +import com.example.taba_project.model.Image; +import com.example.taba_project.repository.ImageRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; @@ -104,6 +17,12 @@ @Component public class ImageWebSocketHandler extends TextWebSocketHandler { + @Autowired + private ImageRepository imageRepository; // ImageRepository 주입 + + @Autowired + private ImageController imageController; // ImageController 주입 + // 세션별 메시지 조합을 위한 맵 private final ConcurrentHashMap sessionData = new ConcurrentHashMap<>(); @@ -156,7 +75,6 @@ private void processBase64Data(String base64EncodedData, WebSocketSession sessio return; } - // 이미지 유효성 검증 BufferedImage image = ImageIO.read(new ByteArrayInputStream(decodedData)); if (image == null) { @@ -166,7 +84,14 @@ private void processBase64Data(String base64EncodedData, WebSocketSession sessio System.out.println("이미지 유효성 검증 성공."); // 이미지 저장 - saveImage(decodedData); + String fileUrl = saveImage(decodedData); + + // DB에 이미지 URL 저장 + if (fileUrl != null) { + Image imageObj = new Image(); + imageObj.setUrl(fileUrl); + imageController.saveUrl(imageObj); // ImageController의 saveUrl 메서드 호출 + } } catch (IllegalArgumentException e) { System.err.println("Base64 디코딩 실패: " + e.getMessage()); @@ -175,14 +100,17 @@ private void processBase64Data(String base64EncodedData, WebSocketSession sessio } } - private void saveImage(byte[] imageData) { + private String saveImage(byte[] imageData) { try { final String DIRECTORY_PATH = "/home/ubuntu/userimage"; String fileName = "image_" + System.currentTimeMillis() + ".jpg"; FileStorageHandler.saveFile(DIRECTORY_PATH, fileName, imageData); - System.out.println("이미지 저장 성공: " + DIRECTORY_PATH + "/" + fileName); + String filePath = DIRECTORY_PATH + "/" + fileName; + System.out.println("이미지 저장 성공: " + filePath); + return filePath; } catch (Exception e) { System.err.println("이미지 저장 실패: " + e.getMessage()); + return null; } } -} \ No newline at end of file +} From 2adf75686a900deca0c4861bb20b9c1df582aae9 Mon Sep 17 00:00:00 2001 From: MINGW64 Date: Mon, 9 Dec 2024 17:03:06 +0900 Subject: [PATCH 05/10] 12/9 last --- .../controller/ImageController.java | 31 +++++++++++++++++++ .../com/example/taba_project/model/Image.java | 18 +++++++++++ .../com/example/taba_project/model/Info.java | 25 +++++++++++++++ .../repository/ImageRepository.java | 7 +++++ 4 files changed, 81 insertions(+) create mode 100644 src/main/java/com/example/taba_project/controller/ImageController.java create mode 100644 src/main/java/com/example/taba_project/model/Image.java create mode 100644 src/main/java/com/example/taba_project/model/Info.java create mode 100644 src/main/java/com/example/taba_project/repository/ImageRepository.java diff --git a/src/main/java/com/example/taba_project/controller/ImageController.java b/src/main/java/com/example/taba_project/controller/ImageController.java new file mode 100644 index 0000000..0aa8848 --- /dev/null +++ b/src/main/java/com/example/taba_project/controller/ImageController.java @@ -0,0 +1,31 @@ +package com.example.taba_project.controller; + +import com.example.taba_project.handler.FileStorageHandler; +import com.example.taba_project.model.Image; +import com.example.taba_project.model.Info; +import com.example.taba_project.repository.ImageRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; + +@RestController +@RequestMapping("/api/image") +public class ImageController { + + @Autowired + private ImageRepository imageRepository; + + @PostMapping + public String saveUrl(@RequestBody Image image) { + try { + // DB에 저장 + imageRepository.save(image); + + // 결과 반환 + return image.getUrl(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/taba_project/model/Image.java b/src/main/java/com/example/taba_project/model/Image.java new file mode 100644 index 0000000..750a480 --- /dev/null +++ b/src/main/java/com/example/taba_project/model/Image.java @@ -0,0 +1,18 @@ +package com.example.taba_project.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Data; + +@Entity +@Data +public class Image { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long idImages; + + private String url; +} \ No newline at end of file diff --git a/src/main/java/com/example/taba_project/model/Info.java b/src/main/java/com/example/taba_project/model/Info.java new file mode 100644 index 0000000..bf46c6e --- /dev/null +++ b/src/main/java/com/example/taba_project/model/Info.java @@ -0,0 +1,25 @@ +package com.example.taba_project.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Data; +import lombok.Getter; + +@Data +@Entity +public class Info { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Integer age; + + private String emotion; + + private String gender; + + private Double percentage; +} \ No newline at end of file diff --git a/src/main/java/com/example/taba_project/repository/ImageRepository.java b/src/main/java/com/example/taba_project/repository/ImageRepository.java new file mode 100644 index 0000000..62e6dc0 --- /dev/null +++ b/src/main/java/com/example/taba_project/repository/ImageRepository.java @@ -0,0 +1,7 @@ +package com.example.taba_project.repository; + +import com.example.taba_project.model.Image; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ImageRepository extends JpaRepository { +} From a0ea62364d057a16ecd91dbcb29bd985900ba808 Mon Sep 17 00:00:00 2001 From: "Dev.gunnuuu" <105582355+gunnuuu@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:16:49 +0900 Subject: [PATCH 06/10] Delete src/main/java/com/example/taba_project/controller/HomeController.java --- .../taba_project/controller/HomeController.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 src/main/java/com/example/taba_project/controller/HomeController.java diff --git a/src/main/java/com/example/taba_project/controller/HomeController.java b/src/main/java/com/example/taba_project/controller/HomeController.java deleted file mode 100644 index 2e25d46..0000000 --- a/src/main/java/com/example/taba_project/controller/HomeController.java +++ /dev/null @@ -1,13 +0,0 @@ -// 일반 http 요청 처리 -package com.example.taba_project.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -@Controller -public class HomeController { - @GetMapping("/") - public String home() { - return "Welcome to the API!"; - } -} \ No newline at end of file From 1412111b6625671bd406e7b3b2dc2bbd0f9407fd Mon Sep 17 00:00:00 2001 From: "Dev.gunnuuu" <105582355+gunnuuu@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:17:09 +0900 Subject: [PATCH 07/10] Update ImageController.java --- .../controller/ImageController.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/taba_project/controller/ImageController.java b/src/main/java/com/example/taba_project/controller/ImageController.java index 0aa8848..525b97f 100644 --- a/src/main/java/com/example/taba_project/controller/ImageController.java +++ b/src/main/java/com/example/taba_project/controller/ImageController.java @@ -2,9 +2,12 @@ import com.example.taba_project.handler.FileStorageHandler; import com.example.taba_project.model.Image; -import com.example.taba_project.model.Info; import com.example.taba_project.repository.ImageRepository; -import org.springframework.beans.factory.annotation.Autowired; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -13,19 +16,36 @@ @RequestMapping("/api/image") public class ImageController { - @Autowired - private ImageRepository imageRepository; + private final ImageRepository imageRepository; + private final FileStorageHandler fileStorageHandler; + private static final Logger logger = LoggerFactory.getLogger(ImageController.class); - @PostMapping - public String saveUrl(@RequestBody Image image) { + @Value("${file.storage.directory") + private String directoryPath; + + public ImageController(ImageRepository imageRepository, FileStorageHandler fileStorageHandler) { + this.imageRepository = imageRepository; + this.fileStorageHandler = fileStorageHandler; + } + + @PostMapping("/upload") + public ResponseEntity uploadImage(@RequestParam("fileName") String fileName, + @RequestBody byte[] fileData) { try { + // 파일 저장 + String savedFilePath = fileStorageHandler.saveFile(directoryPath, fileName, fileData); + // DB에 저장 + Image image = new Image(); + image.setUrl(savedFilePath); // 파일 경로를 url로 설정 imageRepository.save(image); - // 결과 반환 - return image.getUrl(); - } catch (Exception e) { - throw new RuntimeException(e); + return ResponseEntity.ok("파일 업로드 및 DB 저장 성공: " + savedFilePath); + + } catch (IOException e) { + logger.error("파일 저장 실패", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("파일 저장 실패: " + e.getMessage()); } } -} \ No newline at end of file +} From 98907a43bbf70747ad52730e5d2e9c9382475c8c Mon Sep 17 00:00:00 2001 From: "Dev.gunnuuu" <105582355+gunnuuu@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:17:21 +0900 Subject: [PATCH 08/10] Update ImageWebSocketController.java --- .../controller/ImageWebSocketController.java | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/src/main/java/com/example/taba_project/controller/ImageWebSocketController.java b/src/main/java/com/example/taba_project/controller/ImageWebSocketController.java index 9b79151..123fa43 100644 --- a/src/main/java/com/example/taba_project/controller/ImageWebSocketController.java +++ b/src/main/java/com/example/taba_project/controller/ImageWebSocketController.java @@ -1,30 +1,3 @@ -//package com.example.demo.controller; -// -//import com.example.demo.model.ImageData; -//import com.example.demo.service.ImageProcessingService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.messaging.handler.annotation.MessageMapping; -//import org.springframework.messaging.handler.annotation.Payload; -//import org.springframework.stereotype.Controller; -// -//@Controller -//@RequiredArgsConstructor -//public class ImageWebSocketController { -// -// private final ImageProcessingService imageProcessingService; -// -// @MessageMapping("/upload") -// public void handleImageUpload(@Payload ImageData imageData) { -// try { -// // 서비스 계층으로 이미지 데이터 전달 및 저장 -// String savedPath = imageProcessingService.saveImage(imageData); -// System.out.println("이미지 저장 경로: " + savedPath); -// } catch (Exception e) { -// System.err.println("이미지 처리 중 오류: " + e.getMessage()); -// } -// } -//} - package com.example.taba_project.controller; import com.example.taba_project.model.ImageData; @@ -60,4 +33,4 @@ public void handleImageUpload(@Payload ImageData imageData) { logger.error("이미지 처리 중 오류: {}", e.getMessage()); } } -} \ No newline at end of file +} From 38573a88bcd18f4415557a5c5f2d25f7807f1095 Mon Sep 17 00:00:00 2001 From: "Dev.gunnuuu" <105582355+gunnuuu@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:17:37 +0900 Subject: [PATCH 09/10] Update InfoController.java --- .../controller/InfoController.java | 120 +++++++++--------- 1 file changed, 62 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/example/taba_project/controller/InfoController.java b/src/main/java/com/example/taba_project/controller/InfoController.java index 955f755..2ac21f2 100644 --- a/src/main/java/com/example/taba_project/controller/InfoController.java +++ b/src/main/java/com/example/taba_project/controller/InfoController.java @@ -2,85 +2,89 @@ import com.example.taba_project.model.Info; import com.example.taba_project.repository.InfoRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/info") +@RequiredArgsConstructor public class InfoController { - @Autowired - private InfoRepository infoRepository; + private static final Logger logger = LoggerFactory.getLogger(InfoController.class); + + private final InfoRepository infoRepository; // 새로운 Info 저장 @PostMapping - public String saveInfo(@RequestBody Info info) { - try { - System.out.println("Received info: " + info); - - // DB에 저장 - infoRepository.save(info); - - // 감정 메시지 생성 - String emotionMessage = generateEmotionMessage(info.getEmotion(), info.getPercentage()); - - // 로그에 출력 - System.out.println("Generated emotion message: " + emotionMessage); + public ResponseEntity saveInfo(@RequestBody Info info) { + if (info.getEmotion() == null || info.getPercentage() == null) { + logger.warn("유효하지 않은 데이터 요청: {}", info); + return ResponseEntity.badRequest().body(null); + } - // 결과 반환 - return emotionMessage; - } catch (Exception e) { - System.out.println("Error: " + e.getMessage()); - e.printStackTrace(); - return "Error occurred"; + if (!isValidPercentage(info.getPercentage())) { + logger.warn("퍼센트 범위 초과: {}", info.getPercentage()); + return ResponseEntity.badRequest().body(null); } - } + Info savedInfo = infoRepository.save(info); + logger.info("Info 저장 성공: {}", savedInfo); + return ResponseEntity.ok(savedInfo); + } - private String generateEmotionMessage(String emotion, Double percentage) { - String message = ""; - String intensity = getIntensity(percentage); + // 특정 Info 조회 및 스크립트 반환 + @GetMapping("/{id}") + public ResponseEntity getInfoWithScript(@PathVariable Long id) { + Info info = infoRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Info not found with id: " + id)); - switch (emotion.toLowerCase()) { - case "happy": - message = "상대가 " + intensity + " 행복해 합니다."; - break; - case "surprise": - message = "상대가 " + intensity + " 놀랐습니다."; - break; - case "무표정": - message = "상대가 " + intensity + " 무표정입니다."; - break; - case "gross": - message = "상대가 " + intensity + " 불쾌한 상태입니다."; - break; - case "angry": - message = "상대가 " + intensity + " 화가 난 상태입니다."; - break; - case "sad": - message = "상대가 " + intensity + " 슬퍼합니다."; - break; - default: - message = "알 수 없는 감정입니다."; + try { + String script = generateEmotionScript(info.getEmotion(), info.getPercentage()); + logger.info("생성된 스크립트: {}", script); + return ResponseEntity.ok(script); + } catch (IllegalArgumentException e) { + logger.error("스크립트 생성 중 오류 - id: {}, 이유: {}", id, e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("스크립트 생성 오류: " + e.getMessage()); } - - return message; } - private String getIntensity(Double percentage) { + private String generateEmotionScript(String emotion, String percentageStr) { + double percentage = Double.parseDouble(percentageStr); + + String intensity; if (percentage >= 90) { - return "극도로"; + intensity = "완전히"; } else if (percentage >= 75) { - return "매우"; + intensity = "매우"; } else if (percentage >= 60) { - return "상당히"; + intensity = "상당히"; } else if (percentage >= 50) { - return "조금"; + intensity = "약간"; } else { - return "미미하게"; + return "50% 미만 감정은 분석되지 않습니다."; + } + + return switch (emotion.toLowerCase()) { + case "행복" -> "상대가 " + intensity + " 행복해 합니다."; + case "놀람" -> "상대가 " + intensity + " 놀랐습니다."; + case "무표정" -> "상대가 " + intensity + " 무표정입니다."; + case "혐오" -> "상대가 " + intensity + " 불쾌한 상태입니다."; + case "분노" -> "상대가 " + intensity + " 화가 난 상태입니다."; + case "슬픔" -> "상대가 " + intensity + " 슬퍼합니다."; + default -> throw new IllegalArgumentException("알 수 없는 감정: " + emotion); + }; + } + + private boolean isValidPercentage(String percentageStr) { + try { + double percentage = Double.parseDouble(percentageStr); + return percentage >= 0 && percentage <= 100; + } catch (NumberFormatException e) { + return false; } } } From 976c34dc6e827340e5c1ba61d86b3481bdf6950e Mon Sep 17 00:00:00 2001 From: "Dev.gunnuuu" <105582355+gunnuuu@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:17:50 +0900 Subject: [PATCH 10/10] Update FileStorageHandler.java --- .../handler/FileStorageHandler.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/taba_project/handler/FileStorageHandler.java b/src/main/java/com/example/taba_project/handler/FileStorageHandler.java index 3f4a6d6..9c9ba49 100644 --- a/src/main/java/com/example/taba_project/handler/FileStorageHandler.java +++ b/src/main/java/com/example/taba_project/handler/FileStorageHandler.java @@ -1,23 +1,33 @@ package com.example.taba_project.handler; +import org.springframework.stereotype.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +@Component public class FileStorageHandler { - public static String saveFile(String directoryPath, String fileName, byte[] data) throws IOException { + private static final Logger logger = LoggerFactory.getLogger(FileStorageHandler.class); + + public String saveFile(String directoryPath, String fileName, byte[] data) throws IOException { // 디렉토리 경로를 생성 Path dirPath = Paths.get(directoryPath); if (!Files.exists(dirPath)) { Files.createDirectories(dirPath); // 디렉토리가 없으면 생성 + logger.info("디렉토리 생성 : {}", dirPath.toAbsolutePath()); } // 파일 경로 생성 및 저장 Path filePath = Paths.get(directoryPath, fileName); Files.write(filePath, data); - System.out.println("파일 저장 완료: " + filePath.toAbsolutePath()); - return directoryPath; + logger.info("파일 저장 완료: {}", filePath.toAbsolutePath()); + + // 저장된 파일의 절대 경로 반환 + return filePath.toAbsolutePath().toString(); } -} \ No newline at end of file +}