MVC 구조에서 View는 어떻게 DB 데이터를 받을까?

heeezni·2025년 6월 12일

Java GUI 프로젝트

목록 보기
15/20
post-thumbnail

View는 직접 DB에 접근하지 않으며, 사용자 입력이나 요청은 Controller를 통해 DAO를 거쳐 DB에 전달되고, 다시 Model 데이터를 받아 View에 표시된다. 이 흐름은 MVC 구조의 핵심이다!

다만, 현재 구조에서 View 클래스(ProductPage.java)는
ViewController임.
➡️ 사용자 인터페이스(UI) 구성뿐 아니라, 이벤트 처리 → DAO 호출까지 직접 담당

Java의 객체 - 관계 매핑 (ORM)

ORM : Object-Relational Mapping

1. 모델 클래스의 역할

  • DB 테이블의 한 행(row) 을 자바 객체로 표현
  • 테이블의 컬럼 = 멤버변수 로 대응

2. 외래 키(FK) 표현하기

  • FK로 연결된 객체를 멤버로 보유
  • 자바 객체 안에 또 다른 객체를 포함시켜 DB의 관계 구조를 반영하는 것
  • product.getCategory().getCategoryName() 처럼 자연스럽게 접근 가능 (객체 체이닝)
  • DAO, Mapper에서 객체 매핑 처리 필요
    ( 객체 매핑 = 자료형과 구조를 맞춰서 자바와 DB 사이 데이터를 변환하는 과정 )

📦 패키지로 보는 DB관련 구조와 역할

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


실제 코드

Model 클래스 (ProductImg.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;
	}
}

DAO 클래스 (ProductImgDAO.java)

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);
		}
	}
}

Controller 일부 - 이미지 등록 처리

// ▶ 상품에 등록된 이미지들 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 수행
}
profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글