Team5-be01-Final-Project / .github

https://github.com/beyond-sw-camp/beyond-sw-camp-be01_last-dance
3 stars 0 forks source link

[ 정보 ] DB에 이미지 넣기 및 업로드 #30

Open INAUGURATE-Ryong opened 6 months ago

INAUGURATE-Ryong commented 6 months ago
dhkdtld37 commented 6 months ago

SQL로 직접 경로 지정

CREATE TABLE Employee (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(255),
    Photo BLOB
);

INSERT INTO Employee (EmployeeID, Name, Photo) VALUES (1, 'John Doe', LOAD_FILE('/path/to/image.jpg'));

위의 방법으로 간단하게 생성 가능하지만 사진 파일의 경로 지정으로 사진이 저장되어 있는 기기가 아니라면 업로드가 불가할 것으로 예상됩니다. 혹시 위의 문제 해결 방법을 아시는 분 공유 부탁드립니다.

REF

parc02 commented 6 months ago

https://okky.kr/questions/218429

위와 같은 이유로 db에 image file을 직접 넣지 않고 메타데이터만 넣어두는게 효율적일듯 합니다.

https://hs-archive.tistory.com/42

INAUGURATE-Ryong commented 6 months ago

저는 우선 코드 레퍼런스 위주로 찾아서 넣어놨어용

jsmin6330 commented 6 months ago
dhkdtld37 commented 6 months ago

여러 레포들을 참고해 종합해본 결과 DB에 직접 사진을 저장하는 방법은 서버 과부하나 용량 증가로 인해서 좋지 않을 것 같습니다. 사진을 따로 서버에 올려놓고 DB에서는 테이블 내에서 URL주소로 불러오는 방법이 좋을 것 같습니다.

아래는 예시 입니다.

  1. SQL DB
    
    CREATE TABLE ImageTable (
    ImageID INT PRIMARY KEY,
    ImageURL VARCHAR(255)
    );

INSERT INTO ImageTable (ImageID, ImageURL) VALUES (1, 'https://github.com/username/repo/raw/main/path/to/image.jpg');


2. Spring boot controller

```java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

@Controller
public class ImageController {

    @GetMapping("/image")
    public String getImage(Model model) {
        String url = "jdbc:mariadb://localhost:3306/your_database";
        String username = "your_username";
        String password = "your_password";

        try {
            Class.forName("org.mariadb.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, username, password);

            String query = "SELECT ImageURL FROM ImageTable WHERE ImageID = ?";
            try (PreparedStatement pstmt = conn.prepareStatement(query)) {
                pstmt.setInt(1, 1);
                try (ResultSet rs = pstmt.executeQuery()) {
                    if (rs.next()) {
                        String imageUrl = rs.getString("ImageURL");
                        model.addAttribute("imageUrl", imageUrl);
                    }
                }
            }

            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "image"; // Thymeleaf 템플릿 이름
    }
}
  1. HTML (Thymeleaf 템플릿)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Page</title>
</head>
<body>
    <img th:src="${imageUrl}" alt="Image">
</body>
</html>

위 방법은 어떠한지 의견 부탁드립니다.