29-2. (데이터베이스) 쇼핑몰 프로그램 만들기 (심화)_실습

박은서's avatar
Jan 02, 2026
29-2. (데이터베이스) 쇼핑몰 프로그램 만들기 (심화)_실습

1. 상품 등록(Product)

1️⃣ 데이터베이스 테이블 생성

CREATE TABLE product_tb ( p_id INT AUTO_INCREMENT PRIMARY KEY, p_name VARCHAR(10), p_price INT, p_stock INT ) ENGINE=InnoDB CHARACTER SET utf8mb4;

2️⃣ Product 클래스

JAVA → model 패키지 → Product 클래스
package com.mtcoding.shop.model; import lombok.AllArgsConstructor; import lombok.Data; /** * product_tb */ @AllArgsConstructor @Data public class Product { private Integer pId; // 숫자증가(PK) private String pName; // 상품명 private Integer pPrice; // 상품가격 private Integer pStock; // 상품재고 }

3️⃣ 상품 등록 트랜잭션

Java → service 패키지 → ProductService 클래스
‘상품 등록’ 트랜잭션 : ① product_tb에 insert
package com.mtcoding.shop.service; import com.mtcoding.shop.model.Product; import com.mtcoding.shop.repository.ProductRepository; public class ProductService { ProductRepository productRepository; public ProductService(ProductRepository productRepository) { this.productRepository = productRepository; } // 상품 등록 트랜잭션 public void 상품등록(String pName, int pPrice, int pStock){ // 1. product_tb에 insert productRepository.insert(pName, pPrice, pStock); } }

4️⃣ Product_tb에 Insert

Java → repository 패키지 → ProductRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import com.mtcoding.shop.model.Product; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; public class ProductRepository { // 상품 등록하기 public int insert(String pName, int pPrice, int pStock){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = "insert into product_tb(p_name, p_price, p_stock) values(?,?,?)"; try { // 2. 버퍼달기 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, pName); pstmt.setInt(2, pPrice); pstmt.setInt(3, pStock); // 3. 쿼리전송 int result = pstmt.executeUpdate(); return result; } catch (SQLException e) { e.printStackTrace(); } return -1; } }

5️⃣ 상품 등록

package com.mtcoding.shop; import com.mtcoding.shop.repository.ProductRepository; import com.mtcoding.shop.service.ProductService; public class ShopApp { public static void main(String[] args) { ProductRepository productRepository = new ProductRepository(); // 상품등록 ProductService ps = new ProductService(productRepository); ps.상품등록("바나나", 100, 5); ps.상품등록("딸기",150,10); ps.상품등록("복숭아",200,20); } }
product_tb
product_tb

2. 회원 가입

1️⃣ 데이터베이스 테이블 생성

CREATE TABLE user_tb ( u_id INT AUTO_INCREMENT PRIMARY KEY, u_name VARCHAR(10), u_password INT, u_email VARCHAR(20) ) ENGINE=InnoDB CHARACTER SET utf8mb4;

2️⃣ User 클래스

JAVA → model 패키지 → User 클래스
package com.mtcoding.shop.model; import lombok.AllArgsConstructor; import lombok.Data; /** * user_tb */ @AllArgsConstructor @Data public class User { private Integer uId; // 숫자증가(PK) private String uName; // 아이디 private String uPassword; // 패스워드 private String uEmail; // 이메일 }

3️⃣ 회원 가입 트랜잭션

Java → service 패키지 → UserService 클래스
‘회원 가입’ 트랜잭션 : ① user_tb에 insert
package com.mtcoding.shop.service; import com.mtcoding.shop.repository.UserRepository; public class UserService { UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } // 회원 가입 트랜잭션 public void 회원가입(String uName, String uPassword, String uEmail){ // 1. user_tb에 insert userRepository.insert(uName, uPassword, uEmail); } }

4️⃣ User_tb에 Insert

Java → repository 패키지 → UserRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import java.sql.Connection; import java.sql.PreparedStatement; public class UserRepository { // 회원 가입 public int insert(String uName, String uPassword, String uEmail){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = "insert into user_tb(u_name, u_password, u_email) values(?, ?, ?)"; try { // 2. 버퍼 달기 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, uName); pstmt.setString(2, uPassword); pstmt.setString(3, uEmail); // 3. 쿼리 전송 int result = pstmt.executeUpdate(); return result; } catch (Exception e) { e.printStackTrace(); } return -1; } }

5️⃣ 회원 가입

package com.mtcoding.shop; import com.mtcoding.shop.repository.UserRepository; import com.mtcoding.shop.service.UserService; public class ShopApp { public static void main(String[] args) { UserRepository userRepository = new UserRepository(); // 회원가입 UserService us = new UserService(userRepository); us.회원가입("ssar","ssar0000","ssar@naver.com"); us.회원가입("cos","cos0000","cos@naver.com"); us.회원가입("love","love0000","love@naver.com"); } }
user_tb
user_tb

3. 상품 목록 보기

1️⃣ 상품 목록 보기 트랜잭션

Java → service 패키지 → ProductService 클래스
‘상품 목록 보기’ 트랜잭션 : ① product_tb에서 selectAll
package com.mtcoding.shop.service; import com.mtcoding.shop.model.Product; import com.mtcoding.shop.repository.ProductRepository; import java.util.List; public class ProductService { ProductRepository productRepository; public ProductService(ProductRepository productRepository) { this.productRepository = productRepository; } // 상품 목록 보기 트랜잭션 public List<Product> 상품목록보기(){ // 1. 전체조회 (order by pId desc) return productRepository.selectAll(); } }

2️⃣ Product_tb에서 selectAll

Java → repository 패키지 → ProductRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import com.mtcoding.shop.model.Product; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class ProductRepository { // 상품 목록 보기 public List<Product> selectAll(){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = "select * from product_tb order by id desc"; try { // 2. 버퍼 달기 PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); List<Product> list = new ArrayList<>(); while (rs.next()){ int id = rs.getInt("p_id"); String pName = rs.getString("p_name"); int pPrice = rs.getInt("p_price"); int pStock = rs.getInt("p_stock"); Product product = new Product(id, pName, pPrice, pStock); list.add(product); } return list; } catch (Exception e) { e.printStackTrace(); } return null; } }

3️⃣ 상품 목록 보기

package com.mtcoding.shop; import com.mtcoding.shop.model.Product; import com.mtcoding.shop.repository.ProductRepository; import com.mtcoding.shop.service.ProductService; import java.util.List; public class ShopApp { public static void main(String[] args) { ProductRepository productRepository = new ProductRepository(); // 상품 목록 보기 ProductService ps = new ProductService(productRepository); List<Product> list = ps.상품목록보기(); for (Product p : list) { System.out.println(p); } } }
notion image

4. 장바구니 담기

(상품 하나만 개수를 포함해서 담을 수 있다) - 여러 상품을 담지 못하는 쇼핑몰

1️⃣ 데이터베이스 테이블 생성

CREATE TABLE cart_tb ( c_id INT AUTO_INCREMENT PRIMARY KEY, u_id INT, p_id INT, qty INT ) ENGINE=InnoDB CHARACTER SET utf8mb4;

2️⃣ Cart 클래스

JAVA → model 패키지 → Cart 클래스
package com.mtcoding.shop.model; import lombok.AllArgsConstructor; import lombok.Data; /** * cart_tb */ @AllArgsConstructor @Data public class Cart { private Integer cId; // 숫자증가(PK) private Integer uId; // 장바구니에 담은 유저 ID private Integer pId; // 장바구니에 담은 상품 ID private Integer qty; // 장바구니에 담은 상품 개수 }

3️⃣ 장바구니 담기 트랜잭션

Java → service 패키지 → CartService 클래스
‘장바구니 담기’ 트랜잭션 : ① cart_tb에 insert
package com.mtcoding.shop.service; import com.mtcoding.shop.repository.CartRepository; public class CartService { CartRepository cartRepository; public CartService(CartRepository cartRepository) { this.cartRepository = cartRepository; } // 장바구니 담기 트랜잭션 public void 장바구니담기(int uId, int pId, int qty){ // 1. cart_tb에 insert cartRepository.insert(uId,pId,qty); } }

4️⃣ cart_tb에 Insert

Java → repository 패키지 → CartRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import java.sql.Connection; import java.sql.PreparedStatement; public class CartRepository { // 장바구니 담기 public int insert(int uId, int pId, int qty) { // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = "insert into cart_tb (u_id, p_id, qty) values (?, ?, ?)"; try { // 2. 버퍼달기 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,uId); pstmt.setInt(2,pId); pstmt.setInt(3,qty); // 3. 쿼리 전송 int result = pstmt.executeUpdate(); return result; } catch (Exception e) { e.printStackTrace(); } return 1; } }

5️⃣ 장바구니 담기

package com.mtcoding.shop; import com.mtcoding.shop.repository.CartRepository; import com.mtcoding.shop.service.CartService; import java.util.List; public class ShopApp { public static void main(String[] args) { CartRepository cartRepository = new CartRepository(); // 장바구니 담기 CartService cs = new CartService(cartRepository); cs.장바구니담기(1,1,1); } }
cart_tb
cart_tb

5. 장바구니 보기

0️⃣ CartListView 클래스

JAVA → view 패키지 → CartListView 클래스
package com.mtcoding.shop.view; import lombok.AllArgsConstructor; import lombok.Data; /** * View 결과를 아래 클래스에 파싱하기 */ @AllArgsConstructor @Data public class CartListView { private Integer cId; // 장바구니 번호 private String uName; // uId 대신 유저 이름 가져오기 (조인) private String pName; // pId 대신 상품 이름 가져오기 (조인) private Integer qty; // 장바구니에 담은 상품 개수 }

1️⃣ 장바구니 보기 트랜잭션

Java → service 패키지 → CartService 클래스
‘장바구니 보기’ 트랜잭션 : ① cart_tb에서 selectJoin
package com.mtcoding.shop.service; import com.mtcoding.shop.repository.CartRepository; import com.mtcoding.shop.view.CartListView; public class CartService { CartRepository cartRepository; public CartService(CartRepository cartRepository) { this.cartRepository = cartRepository; } // 장바구니 보기 트랜잭션 public CartListView 장바구니보기(int uId){ // 1. cart selectJoin(uId) return cartRepository.selectJoin(uId); } }

2️⃣ Cart_tb에서 selectJoin

notion image
select ct.c_id, ut.u_name, pt.p_name, ct.qty from cart_tb ct left outer join user_tb ut on ct.u_id = ut.u_id left outer join product_tb pt on ct.p_id = pt.p_id where ct.u_id=1;
SQL_JOIN문법
SQL_JOIN결과
SQL_JOIN결과
Java → repository 패키지 → CartRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import com.mtcoding.shop.view.CartListView; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class CartRepository { // 장바구니 보기 public CartListView selectJoin(int uId){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = """ select ct.c_id, ut.u_name, pt.p_name, ct.qty from cart_tb ct left outer join user_tb ut on ct.u_id = ut.u_id left outer join product_tb pt on ct.p_id = pt.p_id where ct.u_id=? """; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,uId); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { int cId = rs.getInt("c_id"); String uName = rs.getString("u_name"); String pName = rs.getString("p_name"); int qty = rs.getInt("qty"); CartListView cartListView = new CartListView(cId, uName, pName, qty); return cartListView; } } catch (Exception e) { e.printStackTrace(); } return null; } }

3️⃣ 상품 목록 보기

package com.mtcoding.shop; import com.mtcoding.shop.repository.CartRepository; import com.mtcoding.shop.service.CartService; public class ShopApp { public static void main(String[] args) { CartRepository cartRepository = new CartRepository(); // 장바구니 보기 CartService cs = new CartService(cartRepository); System.out.println(cs.장바구니보기(1)); } }
notion image

6. 주문하기

(장바구니에 있는 것을 주문테이블에 그대로 옮겨담고, totalPrice 계산)

1️⃣ 데이터베이스 테이블 생성

CREATE TABLE order_tb ( o_id INT AUTO_INCREMENT PRIMARY KEY, u_id INT, p_id INT, qty INT, total_price INT ) ENGINE=InnoDB CHARACTER SET utf8mb4;

2️⃣ Order 클래스

JAVA → model 패키지 → Order 클래스
package com.mtcoding.shop.model; import lombok.AllArgsConstructor; import lombok.Data; /** * order_tb */ @AllArgsConstructor @Data public class Order { private Integer oId; // 숫자증가(PK) private Integer uId; // 주문한 유저 ID private Integer pId; // 주문한 상품 ID private Integer qty; // 주문한 상품 개수 private Integer totalPrice; // 총 금액 }

3️⃣ 주문하기 트랜잭션

Java → service 패키지 → OrderService 클래스
‘주문하기’ 트랜잭션 : ① product_tb에서 가격 selectOne ② order_tb에 insert ③ product_tb에서 수량 update
package com.mtcoding.shop.service; import com.mtcoding.shop.repository.OrderRepository; import com.mtcoding.shop.repository.ProductRepository; /** * 서비스는 트랜잭션 관리 책임 */ public class OrderService { ProductRepository productRepository; OrderRepository orderRepository; public OrderService(ProductRepository productRepository, OrderRepository orderRepository) { this.productRepository = productRepository; this.orderRepository = orderRepository; } // 주문하기 트랜잭션 public void 주문하기(int uId, int pId, int qty){ // 1. product selectOne(pId) -> 가격 productRepository.selectOne(pId); // 2. order insert orderRepository.insert(uId, pId, qty, productRepository.selectOne(pId)*qty); // 3. product update(pId, qty) productRepository.update(pId, qty); } }

4️⃣ 상품 가격 조회 → 주문 입력 → 상품 재고 수정

1) product_tb에서 가격 selectOne

Java → repository 패키지 → ProductRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import com.mtcoding.shop.model.Product; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class ProductRepository { // 주문하기 위해 상품 금액 찾기 public int selectOne(int pID) { Connection conn = DBConnection.getConnection(); String sql = "select p_price from product_tb where p_id=?"; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, pID); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { int pPrice = rs.getInt("p_price"); return pPrice; } } catch (Exception e) { e.printStackTrace(); } return 1; } }

2) order_tb에 insert

Java → repository 패키지 → OrderRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.List; public class OrderRepository { // 주문하기 public int insert(int uId, int pId, int qty, int totalPrice){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = "insert into order_tb (u_id, p_id, qty, total_price) values (?, ?, ?, ?)"; try { // 2. 버퍼 달기 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,uId); pstmt.setInt(2,pId); pstmt.setInt(3,qty); pstmt.setInt(4,totalPrice); // 3. 쿼리 전송 int result = pstmt.executeUpdate(); return result; } catch (Exception e) { e.printStackTrace(); } return -1; } }

3) product_tb에서 수량 update

Java → repository 패키지 → ProductRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import com.mtcoding.shop.model.Product; import java.sql.Connection; import java.sql.PreparedStatement; public class ProductRepository { // 주문 후 상품 재고 수정하기 public int update(int pId, int qty){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = "update product_tb set p_stock = p_stock - ? where p_id = ?"; try { // 2. 버퍼 달기 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(2, pId); pstmt.setInt(1, qty); // 3. 쿼리 전송 int result = pstmt.executeUpdate(); return result; } catch (Exception e) { e.printStackTrace(); } return -1; } }

5️⃣ 주문하기

package com.mtcoding.shop; import com.mtcoding.shop.model.Product; import com.mtcoding.shop.repository.OrderRepository; import com.mtcoding.shop.repository.ProductRepository; import com.mtcoding.shop.service.OrderService; import com.mtcoding.shop.service.ProductService; public class ShopApp { public static void main(String[] args) { ProductRepository productRepository = new ProductRepository(); OrderRepository orderRepository = new OrderRepository(); // 주문하기 OrderService os = new OrderService(productRepository,orderRepository); os.주문하기(1,1,1); } }
order_tb
order_tb
product_tb
product_tb

7. 주문 이력 보기 (유저별)

0️⃣ OrderListView 클래스

JAVA → view 패키지 → OrderListView 클래스
package com.mtcoding.shop.view; import lombok.AllArgsConstructor; import lombok.Data; /** * View 결과를 아래 클래스에 파싱하기 */ @AllArgsConstructor @Data public class OrderListView { private Integer oId; // 주문번호 private String uName; // uId 대신 유저 이름 가져오기 (조인) private String pName; // pId 대신 상품 이름 가져오기 (조인) private Integer qty; // 주문한 상품 개수 private Integer pPrice; // 상품 개별 가격 private Integer totalPrice; // 주문한 상품 전체 금액 }

1️⃣ 주문 이력 보기 트랜잭션

Java → service 패키지 → OrderService 클래스
‘주문 이력 보기’ 트랜잭션 : ① order_tb에서 selectJoin
package com.mtcoding.shop.service; import com.mtcoding.shop.repository.OrderRepository; import com.mtcoding.shop.repository.ProductRepository; import com.mtcoding.shop.view.OrderListView; import java.util.List; /** * 서비스는 트랜잭션 관리 책임 */ public class OrderService { ProductRepository productRepository; OrderRepository orderRepository; public OrderService(ProductRepository productRepository, OrderRepository orderRepository) { this.productRepository = productRepository; this.orderRepository = orderRepository; } // 유저별 주문 이력 보기 public List<OrderListView> 주문이력보기(int uId){ // 1. selectJoin(); return orderRepository.selectJoin(uId); } }

2️⃣ Order_tb에서 selectJoin

notion image
select ot.o_id, ut.u_name, pt.p_name, ot.qty, pt.p_price, ot.total_price from order_tb ot left outer join user_tb ut on ot.u_id = ut.u_id left outer join product_tb pt on ot.p_id = pt.p_id where ot.u_id = 1;
SQL_JOIN문법
SQL_JOIN결과
SQL_JOIN결과
Java → repository 패키지 → OrderRepository 클래스
package com.mtcoding.shop.repository; import com.mtcoding.shop.DBConnection; import com.mtcoding.shop.view.OrderListView; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class OrderRepository { // 주문 이력 보기 public List<OrderListView> selectJoin(int uId){ // 1. DBMS와 연결된 소켓 Connection conn = DBConnection.getConnection(); String sql = """ select ot.o_id, ut.u_name, pt.p_name, ot.qty, pt.p_price, ot.total_price from order_tb ot left outer join user_tb ut on ot.u_id = ut.u_id left outer join product_tb pt on ot.p_id = pt.p_id where ot.u_id = ? """; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,uId); ResultSet rs = pstmt.executeQuery(); List<OrderListView> list = new ArrayList<>(); while (rs.next()) { int oId = rs.getInt("o_id"); String uName = rs.getString("u_name"); String pName = rs.getString("p_name"); int qty = rs.getInt("qty"); int pPrice = rs.getInt("p_price"); int totalPrice = rs.getInt("total_price"); OrderListView orderListView = new OrderListView(oId,uName,pName,qty,pPrice,totalPrice); list.add(orderListView); } return list; } catch (Exception e) { e.printStackTrace(); } return null; } }

3️⃣ 주문 이력 보기

package com.mtcoding.shop; import com.mtcoding.shop.repository.OrderRepository; import com.mtcoding.shop.repository.ProductRepository; import com.mtcoding.shop.service.OrderService; import java.util.List; public class ShopApp { public static void main(String[] args) { ProductRepository productRepository = new ProductRepository(); OrderRepository orderRepository = new OrderRepository(); // 주문 이력 보기 OrderService os = new OrderService(productRepository, orderRepository); System.out.println(os.주문이력보기(1));; } }
notion image
Share article