
View는 직접 DB에 접근하지 않으며, 사용자 입력이나 요청은 Controller를 통해 DAO를 거쳐 DB에 전달되고, 다시 Model 데이터를 받아 View에 표시된다. 이 흐름은 MVC 구조의 핵심이다!
다만, 현재 구조에서 View 클래스(ProductPage.java)는
ViewController임.
➡️ 사용자 인터페이스(UI) 구성뿐 아니라, 이벤트 처리 → DAO 호출까지 직접 담당
ORM : Object-Relational Mapping
product
├── model ← DB의 테이블 구조를 Java 객체로 표현
│ ├── Color.java
│ ├── Product.java
│ ├── ProductColor.java
│ ├── ProductImg.java
│ ├── ProductSize.java
│ ├── Size.java
│ ├── SubCategory.java
│ └── TopCategory.java
│
├── repository ← DB 접근 (DAO: Data Access Object)
│ ├── ColorDAO.java
│ ├── ProductColorDAO.java
│ ├── ProductDAO.java
│ ├── ProductImgDAO.java
│ ├── ProductSizeDAO.java
│ └── SizeDAO.java
│
└── view ← 사용자 화면(UI), Controller 역할도 일부 포함
└── ProductPage.java
package com.sinse.shopadmin.product.model;
// ▶ ProductImg 모델 클래스 (DTO)
// - product_img 테이블과 1:1로 매핑되는 순수 데이터 객체
public class ProductImg {
private int product_img_id; // 이미지 고유 ID
private String filename; // 파일명
private Product product; // ✅ ERD상에서는 자식이 부모의 pk를 숫자로 보유하지만
// 자바코드에서는 부모를 객체로 보유해야한다!
// Getter / Setter
public int getProduct_img_id() {
return product_img_id;
}
public void setProduct_img_id(int product_img_id) {
this.product_img_id = product_img_id;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
package com.sinse.shopadmin.product.repository;
import java.sql.*;
import com.sinse.shopadmin.common.exception.ProductImgException;
import com.sinse.shopadmin.common.util.DBManager;
import com.sinse.shopadmin.product.model.ProductImg;
// ▶ ProductImg 테이블 전담 DAO
// - 상품 이미지 등록 전용 DAO
public class ProductImgDAO {
DBManager dbManager = DBManager.getInstance();
// ▶ 이미지 등록 (INSERT)
public void insert(ProductImg productImg) throws ProductImgException {
Connection con = null;
PreparedStatement pstmt = null;
con = dbManager.getConnection();
StringBuffer sql = new StringBuffer();
sql.append("insert into product_img(filename, product_id) values(?,?)");
try {
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, productImg.getFilename()); // 파일명 바인딩
pstmt.setInt(2, productImg.getProduct().getProduct_id()); // 상품 ID 바인딩 (FK)
int result = pstmt.executeUpdate(); // 수행 결과 반환
if (result < 1) {
throw new ProductImgException("상품이미지가 등록되지 않았습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
throw new ProductImgException("상품이미지가 등록되지 않았습니다.", e);
}
}
}
// ▶ 상품에 등록된 이미지들 DB에 저장
for (int i = 0; i < newFiles.length; i++) {
File file = newFiles[i]; // 업로드된 이미지 파일 1개
ProductImg productImg = new ProductImg(); // 이미지 DTO 객체 생성
productImg.setProduct(product); // 참조하는 부모테이블 설정
productImg.setFilename(file.getName()); // 파일명 설정
productImg.setProduct_img_id(productImg.getProduct().getProduct_id());
// ▲ 실제 insert에는 사용되지 않음. PK는 auto_increment니까
productImgDAO.insert(productImg); // DAO를 통해 insert 수행
}