diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/brand/QBrand.java b/apps/commerce-api/src/main/generated/com/loopers/domain/brand/QBrand.java
new file mode 100644
index 000000000..5e45718bc
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/brand/QBrand.java
@@ -0,0 +1,51 @@
+package com.loopers.domain.brand;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QBrand is a Querydsl query type for Brand
+ */
+@Generated("com.querydsl.codegen.DefaultEntitySerializer")
+public class QBrand extends EntityPathBase<Brand> {
+
+    private static final long serialVersionUID = 2004153807L;
+
+    public static final QBrand brand = new QBrand("brand");
+
+    public final com.loopers.domain.QBaseEntity _super = new com.loopers.domain.QBaseEntity(this);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> createdAt = _super.createdAt;
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> deletedAt = _super.deletedAt;
+
+    //inherited
+    public final NumberPath<Long> id = _super.id;
+
+    public final StringPath name = createString("name");
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> updatedAt = _super.updatedAt;
+
+    public QBrand(String variable) {
+        super(Brand.class, forVariable(variable));
+    }
+
+    public QBrand(Path<? extends Brand> path) {
+        super(path.getType(), path.getMetadata());
+    }
+
+    public QBrand(PathMetadata metadata) {
+        super(Brand.class, metadata);
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/like/QLike.java b/apps/commerce-api/src/main/generated/com/loopers/domain/like/QLike.java
new file mode 100644
index 000000000..7dc795856
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/like/QLike.java
@@ -0,0 +1,53 @@
+package com.loopers.domain.like;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QLike is a Querydsl query type for Like
+ */
+@Generated("com.querydsl.codegen.DefaultEntitySerializer")
+public class QLike extends EntityPathBase<Like> {
+
+    private static final long serialVersionUID = 906743549L;
+
+    public static final QLike like = new QLike("like1");
+
+    public final com.loopers.domain.QBaseEntity _super = new com.loopers.domain.QBaseEntity(this);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> createdAt = _super.createdAt;
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> deletedAt = _super.deletedAt;
+
+    //inherited
+    public final NumberPath<Long> id = _super.id;
+
+    public final NumberPath<Long> productId = createNumber("productId", Long.class);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> updatedAt = _super.updatedAt;
+
+    public final StringPath userId = createString("userId");
+
+    public QLike(String variable) {
+        super(Like.class, forVariable(variable));
+    }
+
+    public QLike(Path<? extends Like> path) {
+        super(path.getType(), path.getMetadata());
+    }
+
+    public QLike(PathMetadata metadata) {
+        super(Like.class, metadata);
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/order/QOrder.java b/apps/commerce-api/src/main/generated/com/loopers/domain/order/QOrder.java
new file mode 100644
index 000000000..66806fc25
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/order/QOrder.java
@@ -0,0 +1,56 @@
+package com.loopers.domain.order;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+import com.querydsl.core.types.dsl.PathInits;
+
+
+/**
+ * QOrder is a Querydsl query type for Order
+ */
+@Generated("com.querydsl.codegen.DefaultEntitySerializer")
+public class QOrder extends EntityPathBase<Order> {
+
+    private static final long serialVersionUID = 37960733L;
+
+    public static final QOrder order = new QOrder("order1");
+
+    public final com.loopers.domain.QBaseEntity _super = new com.loopers.domain.QBaseEntity(this);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> createdAt = _super.createdAt;
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> deletedAt = _super.deletedAt;
+
+    //inherited
+    public final NumberPath<Long> id = _super.id;
+
+    public final ListPath<OrderItem, QOrderItem> orderItems = this.<OrderItem, QOrderItem>createList("orderItems", OrderItem.class, QOrderItem.class, PathInits.DIRECT2);
+
+    public final EnumPath<OrderStatus> status = createEnum("status", OrderStatus.class);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> updatedAt = _super.updatedAt;
+
+    public final StringPath userId = createString("userId");
+
+    public QOrder(String variable) {
+        super(Order.class, forVariable(variable));
+    }
+
+    public QOrder(Path<? extends Order> path) {
+        super(path.getType(), path.getMetadata());
+    }
+
+    public QOrder(PathMetadata metadata) {
+        super(Order.class, metadata);
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/order/QOrderItem.java b/apps/commerce-api/src/main/generated/com/loopers/domain/order/QOrderItem.java
new file mode 100644
index 000000000..52ed8482b
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/order/QOrderItem.java
@@ -0,0 +1,69 @@
+package com.loopers.domain.order;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+import com.querydsl.core.types.dsl.PathInits;
+
+
+/**
+ * QOrderItem is a Querydsl query type for OrderItem
+ */
+@Generated("com.querydsl.codegen.DefaultEntitySerializer")
+public class QOrderItem extends EntityPathBase<OrderItem> {
+
+    private static final long serialVersionUID = 2013320400L;
+
+    private static final PathInits INITS = PathInits.DIRECT2;
+
+    public static final QOrderItem orderItem = new QOrderItem("orderItem");
+
+    public final com.loopers.domain.QBaseEntity _super = new com.loopers.domain.QBaseEntity(this);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> createdAt = _super.createdAt;
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> deletedAt = _super.deletedAt;
+
+    //inherited
+    public final NumberPath<Long> id = _super.id;
+
+    public final QOrder order;
+
+    public final NumberPath<java.math.BigDecimal> price = createNumber("price", java.math.BigDecimal.class);
+
+    public final NumberPath<Long> productId = createNumber("productId", Long.class);
+
+    public final NumberPath<Integer> quantity = createNumber("quantity", Integer.class);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> updatedAt = _super.updatedAt;
+
+    public QOrderItem(String variable) {
+        this(OrderItem.class, forVariable(variable), INITS);
+    }
+
+    public QOrderItem(Path<? extends OrderItem> path) {
+        this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
+    }
+
+    public QOrderItem(PathMetadata metadata) {
+        this(metadata, PathInits.getFor(metadata, INITS));
+    }
+
+    public QOrderItem(PathMetadata metadata, PathInits inits) {
+        this(OrderItem.class, metadata, inits);
+    }
+
+    public QOrderItem(Class<? extends OrderItem> type, PathMetadata metadata, PathInits inits) {
+        super(type, metadata, inits);
+        this.order = inits.isInitialized("order") ? new QOrder(forProperty("order")) : null;
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/point/QPoint.java b/apps/commerce-api/src/main/generated/com/loopers/domain/point/QPoint.java
index 2657be040..c8c351f85 100644
--- a/apps/commerce-api/src/main/generated/com/loopers/domain/point/QPoint.java
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/point/QPoint.java
@@ -30,7 +30,7 @@ public class QPoint extends EntityPathBase<Point> {
     //inherited
     public final NumberPath<Long> id = _super.id;
 
-    public final NumberPath<Long> pointAmount = createNumber("pointAmount", Long.class);
+    public final NumberPath<java.math.BigDecimal> pointAmount = createNumber("pointAmount", java.math.BigDecimal.class);
 
     //inherited
     public final DateTimePath<java.time.ZonedDateTime> updatedAt = _super.updatedAt;
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/product/QMoney.java b/apps/commerce-api/src/main/generated/com/loopers/domain/product/QMoney.java
new file mode 100644
index 000000000..125239ec3
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/product/QMoney.java
@@ -0,0 +1,37 @@
+package com.loopers.domain.product;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QMoney is a Querydsl query type for Money
+ */
+@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer")
+public class QMoney extends BeanPath<Money> {
+
+    private static final long serialVersionUID = 1289418416L;
+
+    public static final QMoney money = new QMoney("money");
+
+    public final NumberPath<java.math.BigDecimal> amount = createNumber("amount", java.math.BigDecimal.class);
+
+    public QMoney(String variable) {
+        super(Money.class, forVariable(variable));
+    }
+
+    public QMoney(Path<? extends Money> path) {
+        super(path.getType(), path.getMetadata());
+    }
+
+    public QMoney(PathMetadata metadata) {
+        super(Money.class, metadata);
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/product/QProduct.java b/apps/commerce-api/src/main/generated/com/loopers/domain/product/QProduct.java
new file mode 100644
index 000000000..0249ee259
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/product/QProduct.java
@@ -0,0 +1,72 @@
+package com.loopers.domain.product;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+import com.querydsl.core.types.dsl.PathInits;
+
+
+/**
+ * QProduct is a Querydsl query type for Product
+ */
+@Generated("com.querydsl.codegen.DefaultEntitySerializer")
+public class QProduct extends EntityPathBase<Product> {
+
+    private static final long serialVersionUID = 634840799L;
+
+    private static final PathInits INITS = PathInits.DIRECT2;
+
+    public static final QProduct product = new QProduct("product");
+
+    public final com.loopers.domain.QBaseEntity _super = new com.loopers.domain.QBaseEntity(this);
+
+    public final NumberPath<Long> brandId = createNumber("brandId", Long.class);
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> createdAt = _super.createdAt;
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> deletedAt = _super.deletedAt;
+
+    //inherited
+    public final NumberPath<Long> id = _super.id;
+
+    public final NumberPath<Long> likeCount = createNumber("likeCount", Long.class);
+
+    public final StringPath name = createString("name");
+
+    public final QMoney price;
+
+    public final QStock stockQuantity;
+
+    //inherited
+    public final DateTimePath<java.time.ZonedDateTime> updatedAt = _super.updatedAt;
+
+    public QProduct(String variable) {
+        this(Product.class, forVariable(variable), INITS);
+    }
+
+    public QProduct(Path<? extends Product> path) {
+        this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
+    }
+
+    public QProduct(PathMetadata metadata) {
+        this(metadata, PathInits.getFor(metadata, INITS));
+    }
+
+    public QProduct(PathMetadata metadata, PathInits inits) {
+        this(Product.class, metadata, inits);
+    }
+
+    public QProduct(Class<? extends Product> type, PathMetadata metadata, PathInits inits) {
+        super(type, metadata, inits);
+        this.price = inits.isInitialized("price") ? new QMoney(forProperty("price")) : null;
+        this.stockQuantity = inits.isInitialized("stockQuantity") ? new QStock(forProperty("stockQuantity")) : null;
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/generated/com/loopers/domain/product/QStock.java b/apps/commerce-api/src/main/generated/com/loopers/domain/product/QStock.java
new file mode 100644
index 000000000..2254ca2a8
--- /dev/null
+++ b/apps/commerce-api/src/main/generated/com/loopers/domain/product/QStock.java
@@ -0,0 +1,37 @@
+package com.loopers.domain.product;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.processing.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QStock is a Querydsl query type for Stock
+ */
+@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer")
+public class QStock extends BeanPath<Stock> {
+
+    private static final long serialVersionUID = 1295109382L;
+
+    public static final QStock stock = new QStock("stock");
+
+    public final NumberPath<Integer> quantity = createNumber("quantity", Integer.class);
+
+    public QStock(String variable) {
+        super(Stock.class, forVariable(variable));
+    }
+
+    public QStock(Path<? extends Stock> path) {
+        super(path.getType(), path.getMetadata());
+    }
+
+    public QStock(PathMetadata metadata) {
+        super(Stock.class, metadata);
+    }
+
+}
+
diff --git a/apps/commerce-api/src/main/java/com/loopers/application/order/OrderFacade.java b/apps/commerce-api/src/main/java/com/loopers/application/order/OrderFacade.java
new file mode 100644
index 000000000..70665914e
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/application/order/OrderFacade.java
@@ -0,0 +1,4 @@
+package com.loopers.application.order;
+
+public class OrderFacade {
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/application/example/UserFacade.java b/apps/commerce-api/src/main/java/com/loopers/application/user/UserFacade.java
similarity index 93%
rename from apps/commerce-api/src/main/java/com/loopers/application/example/UserFacade.java
rename to apps/commerce-api/src/main/java/com/loopers/application/user/UserFacade.java
index a857e1295..da3a0556a 100644
--- a/apps/commerce-api/src/main/java/com/loopers/application/example/UserFacade.java
+++ b/apps/commerce-api/src/main/java/com/loopers/application/user/UserFacade.java
@@ -1,4 +1,4 @@
-package com.loopers.application.example;
+package com.loopers.application.user;
 
 import com.loopers.domain.point.PointService;
 import com.loopers.domain.user.User;
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/brand/Brand.java b/apps/commerce-api/src/main/java/com/loopers/domain/brand/Brand.java
new file mode 100644
index 000000000..df9fe7ba1
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/brand/Brand.java
@@ -0,0 +1,24 @@
+package com.loopers.domain.brand;
+
+import com.loopers.domain.BaseEntity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Entity
+@Table(name = "brand")
+@Getter
+@NoArgsConstructor
+public class Brand extends BaseEntity {
+
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    @Builder
+    public Brand(String name) {
+        this.name = name;
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/like/Like.java b/apps/commerce-api/src/main/java/com/loopers/domain/like/Like.java
new file mode 100644
index 000000000..3fae03a35
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/like/Like.java
@@ -0,0 +1,27 @@
+package com.loopers.domain.like;
+
+import com.loopers.domain.BaseEntity;
+import jakarta.persistence.*;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Entity
+@Getter
+@NoArgsConstructor
+@Table(name = "product_like", uniqueConstraints = @UniqueConstraint(
+        columnNames = {"user_id", "product_id"})
+)
+public class Like extends BaseEntity {
+    @Column(name = "user_id", nullable = false)
+    private String userId;
+
+    @Column(name = "product_id", nullable = false)
+    private Long productId;
+
+    @Builder
+    public Like(String userId, Long productId) {
+        this.userId = userId;
+        this.productId = productId;
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/like/LikeRepository.java b/apps/commerce-api/src/main/java/com/loopers/domain/like/LikeRepository.java
new file mode 100644
index 000000000..0343c36ce
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/like/LikeRepository.java
@@ -0,0 +1,14 @@
+package com.loopers.domain.like;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface LikeRepository {
+    Optional<Like> findByUserIdAndProductId(String userId, Long productId);
+    Like save(Like like);
+    void delete(Like like);
+    //상품별 좋아요 수 조회
+    Long countByProductId(Long productId);
+    //유저가 좋아요한 상품 조회
+    List<Like> findAllByUserId(String userId);
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/like/LikeService.java b/apps/commerce-api/src/main/java/com/loopers/domain/like/LikeService.java
new file mode 100644
index 000000000..f9e39d3a6
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/like/LikeService.java
@@ -0,0 +1,47 @@
+package com.loopers.domain.like;
+import org.springframework.dao.DataIntegrityViolationException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class LikeService {
+    private final LikeRepository likeRepository;
+
+    //상품 좋아요
+    @Transactional
+    public void likeProduct(String userId, Long productId){
+        if (likeRepository.findByUserIdAndProductId(userId, productId).isEmpty()) {
+            Like like = new Like(userId, productId);
+            try {
+                likeRepository.save(like);
+            } catch (DataIntegrityViolationException e) {
+                // 동시성으로 인한 중복 삽입은 무시 (유니크 제약이 보장)
+            }
+
+        }
+    }
+
+    //상품 좋아요 취소
+    @Transactional
+    public void cancleLikeProduct(String useId, Long productId){
+        likeRepository.findByUserIdAndProductId(useId, productId)
+                .ifPresent(likeRepository::delete);
+
+    }
+
+    //상품 좋아요 수 조회
+    @Transactional(readOnly = true)
+    public Long getLikeCount(Long productId){
+        return likeRepository.countByProductId(productId);
+    }
+
+    //유저가 좋아요한 상품 조회
+    @Transactional(readOnly = true)
+    public List<Like> getUserLikeProduct(String userId){
+        return likeRepository.findAllByUserId(userId);
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/order/Order.java b/apps/commerce-api/src/main/java/com/loopers/domain/order/Order.java
new file mode 100644
index 000000000..01b89837e
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/order/Order.java
@@ -0,0 +1,57 @@
+package com.loopers.domain.order;
+
+import com.loopers.domain.BaseEntity;
+import com.loopers.support.error.CoreException;
+import com.loopers.support.error.ErrorMessages;
+import com.loopers.support.error.ErrorType;
+import jakarta.persistence.*;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Getter
+@NoArgsConstructor
+@Table(name = "orders")
+public class Order extends BaseEntity {
+
+    @Column(name = "user_id", nullable = false)
+    private String userId;
+
+    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
+    private List<OrderItem> orderItems = new ArrayList<>();
+
+    @Column(name = "status", nullable = false)
+    @Enumerated(EnumType.STRING)
+    private OrderStatus status;
+
+    @Builder
+    public Order(String userId, List<OrderItem> orderItems, OrderStatus status) {
+        validateUserId(userId);
+        validateOrderItems(orderItems);
+        this.userId = userId;
+        this.orderItems = orderItems;
+        this.status = OrderStatus.CREATED;
+    }
+
+    //주문 리스트 유효성 검증
+    private void validateOrderItems(List<OrderItem> orderItems) {
+        if (orderItems == null || orderItems.isEmpty()) {
+            throw new CoreException(ErrorType.BAD_REQUEST, ErrorMessages.INVALID_ORDER_ITEMS_LIST);
+        }
+    }
+
+    //주문 유저 아이디 유효성 검증
+    private void validateUserId(String userId) {
+        if (userId == null || userId.isBlank()) {
+            throw new CoreException(ErrorType.BAD_REQUEST, ErrorMessages.INVALID_NAME_FORMAT);
+        }
+    }
+
+    public static Order createOrder(String userId, List<OrderItem> orderItems) {
+        return new Order(userId, orderItems, OrderStatus.CREATED);
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderDomainService.java b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderDomainService.java
new file mode 100644
index 000000000..eff16509d
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderDomainService.java
@@ -0,0 +1,66 @@
+package com.loopers.domain.order;
+
+import com.loopers.domain.point.Point;
+import com.loopers.domain.point.PointRepository;
+import com.loopers.domain.product.Product;
+import com.loopers.domain.product.ProductRepository;
+import com.loopers.support.error.CoreException;
+import com.loopers.support.error.ErrorType;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class OrderDomainService {
+    private final OrderRepository orderRepository;
+    private final PointRepository pointRepository;
+    private final ProductRepository productRepository;
+
+    //주문 생성한다
+    @Transactional
+    public Order createOrder(String userId, List<OrderItem> orderItems){
+
+        //총 주문 금액 계산
+        BigDecimal totalAmount = orderItems.stream()
+                .map(OrderItem::calculateTotalPrice)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        //재고 차감
+        for(OrderItem orderItem : orderItems){
+            Product product = productRepository.findById(orderItem.getProductId())
+                    .orElseThrow(() -> new CoreException(ErrorType.BAD_REQUEST));
+
+            if(product.getStockQuantity() < orderItem.getQuantity()){
+                throw new CoreException(ErrorType.BAD_REQUEST);
+            }
+
+            product.decreaseStock(orderItem.getQuantity());
+            productRepository.save(product);
+        }
+
+        //포인트 차감
+        Point point = pointRepository.findByUserId(userId)
+                .orElseThrow(() -> new CoreException(ErrorType.BAD_REQUEST));
+
+        // 보유 포인트가 총액보다 적으면 예외
+        if (point.getPointAmount().compareTo(totalAmount) < 0) {
+            throw new CoreException(ErrorType.BAD_REQUEST);
+        }
+
+        // 실제 포인트 차감 반영
+        point.usePoints(totalAmount);
+        pointRepository.save(point);
+
+        // 주문 생성 (도메인 팩토리 사용 권장)
+        return Order.createOrder(userId, orderItems);
+    }
+
+    //주문 내역 확인
+    @Transactional(readOnly = true)
+    public List<Order> getOrdersByUserId(String userId){
+        return orderRepository.findAllByUserId(userId);
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderItem.java b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderItem.java
new file mode 100644
index 000000000..9fb7c62cb
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderItem.java
@@ -0,0 +1,41 @@
+package com.loopers.domain.order;
+
+import com.loopers.domain.BaseEntity;
+import jakarta.persistence.*;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Entity
+@Getter
+@NoArgsConstructor
+@Table(name = "order_item")
+public class OrderItem extends BaseEntity {
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "order_id")
+    private Order order;
+
+    @Column(name = "product_id", nullable = false)
+    private Long productId;
+
+    @Column(name = "quantity", nullable = false)
+    private int quantity;
+
+    @Column(name = "price", nullable = false)
+    private BigDecimal price;
+
+    @Builder
+    public OrderItem(Order order, Long productId, int quantity, BigDecimal price) {
+        this.order = order;
+        this.productId = productId;
+        this.quantity = quantity;
+        this.price = price;
+    }
+
+    public BigDecimal calculateTotalPrice() {
+        return price.multiply(BigDecimal.valueOf(quantity));
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderRepository.java b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderRepository.java
new file mode 100644
index 000000000..a82e60cad
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderRepository.java
@@ -0,0 +1,10 @@
+package com.loopers.domain.order;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface OrderRepository {
+    Optional<Order> findById(Long id);
+    Order save(Order order);
+    List<Order> findAllByUserId(String userId);
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderStatus.java b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderStatus.java
new file mode 100644
index 000000000..b3e05d041
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/order/OrderStatus.java
@@ -0,0 +1,7 @@
+package com.loopers.domain.order;
+
+public enum OrderStatus {
+    CREATED,
+    PENDING,
+    CANCELLED
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/point/Point.java b/apps/commerce-api/src/main/java/com/loopers/domain/point/Point.java
index 06289a2eb..7ab3472e0 100644
--- a/apps/commerce-api/src/main/java/com/loopers/domain/point/Point.java
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/point/Point.java
@@ -10,6 +10,8 @@
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
+
 import static com.loopers.support.error.ErrorMessages.INVALID_POINT_AMOUNT;
 
 @Entity
@@ -22,24 +24,36 @@ public class Point extends BaseEntity {
     private String userId;
 
     @Column(name = "point_amount", nullable = false)
-    private Long pointAmount;
+    private BigDecimal pointAmount;
 
     @Builder
-    public Point(String userId, Long pointAmount){
+    public Point(String userId, BigDecimal pointAmount){
         validatePointAmount(pointAmount);
         this.userId = userId;
         this.pointAmount = pointAmount;
     }
 
-    private void validatePointAmount(Long pointAmount) {
-        if(pointAmount == null || pointAmount < 0){
+    private void validatePointAmount(BigDecimal pointAmount) {
+        if (pointAmount == null || pointAmount.compareTo(BigDecimal.ZERO) < 0) {
+            throw new CoreException(ErrorType.BAD_REQUEST, INVALID_POINT_AMOUNT);
+        }
+    }
+
+    public void chargePoints(BigDecimal pointAmount) {
+        if (pointAmount == null || pointAmount.compareTo(BigDecimal.ZERO) <= 0) {
+            throw new CoreException(ErrorType.BAD_REQUEST, INVALID_POINT_AMOUNT);
+        }
+        this.pointAmount = this.pointAmount.add(pointAmount);
+    }
+
+    public void usePoints(BigDecimal pointAmount) {
+        if (pointAmount == null || pointAmount.compareTo(BigDecimal.ZERO) <= 0) {
             throw new CoreException(ErrorType.BAD_REQUEST, INVALID_POINT_AMOUNT);
         }
+        this.pointAmount = this.pointAmount.subtract(pointAmount);
     }
 
-    public void chargePoints(long amount) {
-        if (amount <= 0) throw new CoreException(ErrorType.BAD_REQUEST, INVALID_POINT_AMOUNT);
-        long updated = Math.addExact(this.pointAmount, amount);
-        this.pointAmount = updated;
+    public BigDecimal getPointAmount() {
+        return pointAmount;
     }
 }
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/point/PointService.java b/apps/commerce-api/src/main/java/com/loopers/domain/point/PointService.java
index 52b35e5b0..c69769f98 100644
--- a/apps/commerce-api/src/main/java/com/loopers/domain/point/PointService.java
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/point/PointService.java
@@ -6,6 +6,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+
 @Service
 @RequiredArgsConstructor
 public class PointService {
@@ -13,7 +15,7 @@ public class PointService {
 
     @Transactional
     public Point create(String userId){
-        Point point = new Point(userId, 0L);
+        Point point = new Point(userId, java.math.BigDecimal.ZERO);
         return pointRepository.save(point);
     }
 
@@ -24,10 +26,10 @@ public Point getPoints(String userId){
     }
 
     @Transactional
-    public Point chargePoints(String userId, Long amount){
+    public Point chargePoints(String userId, BigDecimal pointAmount){
         Point point = pointRepository.findByUserId(userId)  
                 .orElseThrow(() -> new CoreException(ErrorType.NOT_FOUND, "존재하지 않는 ID입니다."));
-        point.chargePoints(amount);
+        point.chargePoints(pointAmount);
         return pointRepository.save(point);
     }
 }
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/Money.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/Money.java
new file mode 100644
index 000000000..d5770702f
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/Money.java
@@ -0,0 +1,27 @@
+package com.loopers.domain.product;
+
+import com.loopers.support.error.CoreException;
+import com.loopers.support.error.ErrorMessages;
+import com.loopers.support.error.ErrorType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Embeddable
+@Getter
+@NoArgsConstructor
+public class Money {
+
+    @Column(name = "price", nullable = false)
+    private BigDecimal amount;
+
+    public Money(BigDecimal amount) {
+        if (amount == null || amount.compareTo(BigDecimal.ZERO) < 0) {
+            throw new CoreException(ErrorType.BAD_REQUEST, ErrorMessages.INVALID_MONEY_AMOUNT);
+        }
+        this.amount = amount;
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/Product.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/Product.java
new file mode 100644
index 000000000..47ab21452
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/Product.java
@@ -0,0 +1,62 @@
+package com.loopers.domain.product;
+
+import com.loopers.domain.BaseEntity;
+import jakarta.persistence.Column;
+import jakarta.persistence.AttributeOverride;
+import jakarta.persistence.AttributeOverrides;
+import jakarta.persistence.Embedded;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Entity
+@NoArgsConstructor
+@Getter
+@Table(name = "product")
+public class Product extends BaseEntity {
+
+    @Column(name = "brand_id", nullable = false)
+    private Long brandId;
+
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    @Embedded
+    private Money price;
+
+    @Embedded
+    @AttributeOverrides({
+        @AttributeOverride(name = "quantity", column = @Column(name = "stock_quantity", nullable = false))
+    })
+    private Stock stockQuantity;
+
+    @Column(name = "like_count", nullable = false)
+    private Long likeCount = 0L;
+
+    @Builder
+    public Product(Long brandId, String name, Money price, Stock stockQuantity, Long likeCount) {
+        this.brandId = brandId;
+        this.name = name;
+        this.price = price;
+        this.stockQuantity = stockQuantity;
+        this.likeCount = likeCount != null ? likeCount : 0L;
+    }
+
+    public void decreaseStock(int quantity) {
+        this.stockQuantity.decrease(quantity);
+    }
+
+    public int getStockQuantity() {
+        return stockQuantity.getQuantity();
+    }
+
+    public Money getPrice() {
+        return price;
+    }
+
+    public Long getLikeCount() {
+        return likeCount;
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductInfo.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductInfo.java
new file mode 100644
index 000000000..fa7e23dfd
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductInfo.java
@@ -0,0 +1,18 @@
+package com.loopers.domain.product;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.math.BigDecimal;
+
+@Getter
+@AllArgsConstructor
+public class ProductInfo {
+    private final Long id;
+    private final String name;
+    private final int stockQuantity;
+    private final BigDecimal priceAmount;
+    private final String brandName;
+    private final long likeCount;
+}
+
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductRepository.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductRepository.java
new file mode 100644
index 000000000..8c547d12c
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductRepository.java
@@ -0,0 +1,11 @@
+package com.loopers.domain.product;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface ProductRepository {
+    Optional<Product> findById(Long id);
+    Product save(Product product);
+    List<Product> findAll();
+    List<Product> findAllBySortType(ProductSortType sortType);
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductService.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductService.java
new file mode 100644
index 000000000..02b3a95cb
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductService.java
@@ -0,0 +1,39 @@
+package com.loopers.domain.product;
+
+import com.loopers.domain.brand.Brand;
+import com.loopers.domain.like.LikeRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import jakarta.persistence.EntityManager;
+
+@Service
+@RequiredArgsConstructor
+public class ProductService {
+    private final ProductRepository productRepository;
+    private final LikeRepository likeRepository;
+    private final EntityManager entityManager;
+
+    @Transactional
+    public Product createProduct(Product product) {
+        return productRepository.save(product);
+    }
+
+    @Transactional(readOnly = true)
+    public ProductInfo getProductDetail(Long productId) {
+        Product product = productRepository.findById(productId)
+                .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 상품입니다."));
+        Brand brand = entityManager.find(Brand.class, product.getBrandId());
+        String brandName = (brand != null) ? brand.getName() : null;
+        long likeCount = likeRepository.countByProductId(product.getId());
+
+        return new ProductInfo(
+                product.getId(),
+                product.getName(),
+                product.getStockQuantity(),
+                product.getPrice().getAmount(),
+                brandName,
+                likeCount
+        );
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductSortType.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductSortType.java
new file mode 100644
index 000000000..e830148ad
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/ProductSortType.java
@@ -0,0 +1,5 @@
+package com.loopers.domain.product;
+
+public enum ProductSortType {
+    latest, price_asc, likes_desc
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/domain/product/Stock.java b/apps/commerce-api/src/main/java/com/loopers/domain/product/Stock.java
new file mode 100644
index 000000000..6b64e2880
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/domain/product/Stock.java
@@ -0,0 +1,37 @@
+package com.loopers.domain.product;
+
+import com.loopers.support.error.CoreException;
+import com.loopers.support.error.ErrorMessages;
+import com.loopers.support.error.ErrorType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Embeddable
+@Getter
+@NoArgsConstructor
+public class Stock {
+
+    @Column(name = "stock_quantity", nullable = false)
+    private int quantity;
+
+    public Stock(int quantity) {
+        if (quantity < 0) {
+            throw new CoreException(ErrorType.BAD_REQUEST, ErrorMessages.INVALID_STOCK_QUANTITY);
+        }
+        this.quantity = quantity;
+    }
+
+    public void decrease(int quantity) {
+        if (quantity <= 0) {
+            throw new IllegalArgumentException("감소량은 1 이상이어야 합니다.");
+        }
+        int newQuantity = this.quantity - quantity;
+        if (newQuantity < 0) {
+            throw new IllegalArgumentException("재고 수량은 음수일 수 없습니다.");
+        }
+        this.quantity = newQuantity;
+    }
+}
+
diff --git a/apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeJpaRepository.java b/apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeJpaRepository.java
new file mode 100644
index 000000000..df5f3c25a
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeJpaRepository.java
@@ -0,0 +1,13 @@
+package com.loopers.infrastructure.like;
+
+import com.loopers.domain.like.Like;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface LikeJpaRepository extends JpaRepository<Like, Long> {
+    Optional<Like> findByUserIdAndProductId(String userId, Long productId);
+    Long countByProductId(Long productId);
+    List<Like> findAllByUserId(String userId);
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeRepositoryImpl.java b/apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeRepositoryImpl.java
new file mode 100644
index 000000000..56d9ce8c8
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/infrastructure/like/LikeRepositoryImpl.java
@@ -0,0 +1,41 @@
+package com.loopers.infrastructure.like;
+
+import com.loopers.domain.like.Like;
+import com.loopers.domain.like.LikeRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@RequiredArgsConstructor
+@Repository
+public class LikeRepositoryImpl implements LikeRepository {
+
+    private final LikeJpaRepository likeJpaRepository;
+
+    @Override
+    public Optional<Like> findByUserIdAndProductId(String userId, Long productId) {
+        return likeJpaRepository.findByUserIdAndProductId(userId, productId);
+    }
+
+    @Override
+    public Like save(Like like) {
+        return likeJpaRepository.save(like);
+    }
+
+    @Override
+    public void delete(Like like) {
+        likeJpaRepository.delete(like);
+    }
+
+    @Override
+    public Long countByProductId(Long productId) {
+        return likeJpaRepository.countByProductId(productId);
+    }
+
+    @Override
+    public List<Like> findAllByUserId(String userId) {
+        return likeJpaRepository.findAllByUserId(userId);
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderJpaRepository.java b/apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderJpaRepository.java
new file mode 100644
index 000000000..e596034b4
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderJpaRepository.java
@@ -0,0 +1,10 @@
+package com.loopers.infrastructure.order;
+
+import com.loopers.domain.order.Order;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface OrderJpaRepository extends JpaRepository<Order, Long> {
+    List<Order> findAllByUserId(String userId);
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderRepositoryImpl.java b/apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderRepositoryImpl.java
new file mode 100644
index 000000000..73de088fe
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/infrastructure/order/OrderRepositoryImpl.java
@@ -0,0 +1,30 @@
+package com.loopers.infrastructure.order;
+
+import com.loopers.domain.order.Order;
+import com.loopers.domain.order.OrderRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@RequiredArgsConstructor
+@Repository
+public class OrderRepositoryImpl implements OrderRepository{
+    private final OrderJpaRepository orderJpaRepository;
+
+    @Override
+    public Optional<Order> findById(Long id) {
+        return orderJpaRepository.findById(id);
+    }
+
+    @Override
+    public Order save(Order order) {
+        return orderJpaRepository.save(order);
+    }
+
+    @Override
+    public List<Order> findAllByUserId(String userId) {
+        return orderJpaRepository.findAllByUserId(userId);
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductJpaRepository.java b/apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductJpaRepository.java
new file mode 100644
index 000000000..937258460
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductJpaRepository.java
@@ -0,0 +1,15 @@
+package com.loopers.infrastructure.product;
+
+import com.loopers.domain.product.Product;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface ProductJpaRepository extends JpaRepository<Product, Long> {
+
+    List<Product> findAllByOrderByCreatedAtDesc();
+
+    List<Product> findAllByOrderByPriceAmountAsc();
+
+    List<Product> findAllByOrderByLikeCountDesc();
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductRepositoryImpl.java b/apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductRepositoryImpl.java
new file mode 100644
index 000000000..80de8e1a1
--- /dev/null
+++ b/apps/commerce-api/src/main/java/com/loopers/infrastructure/product/ProductRepositoryImpl.java
@@ -0,0 +1,39 @@
+package com.loopers.infrastructure.product;
+
+import com.loopers.domain.product.Product;
+import com.loopers.domain.product.ProductRepository;
+import com.loopers.domain.product.ProductSortType;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@RequiredArgsConstructor
+@Component
+public class ProductRepositoryImpl implements ProductRepository {
+    private final ProductJpaRepository productJpaRepository;
+    @Override
+    public Optional<Product> findById(Long id) {
+        return productJpaRepository.findById(id);
+    }
+
+    @Override
+    public Product save(Product product) {
+        return productJpaRepository.save(product);
+    }
+
+    @Override
+    public List<Product> findAll() {
+        return productJpaRepository.findAll();
+    }
+
+    @Override
+    public List<Product> findAllBySortType(ProductSortType sortType) {
+        return switch (sortType) {
+            case latest -> productJpaRepository.findAllByOrderByCreatedAtDesc();
+            case price_asc -> productJpaRepository.findAllByOrderByPriceAmountAsc();
+            case likes_desc -> productJpaRepository.findAllByOrderByLikeCountDesc(); //like entity 구현 후에 @Query 사용해서 정렬 진행해야 함.
+        };
+    }
+}
diff --git a/apps/commerce-api/src/main/java/com/loopers/interfaces/api/point/PointController.java b/apps/commerce-api/src/main/java/com/loopers/interfaces/api/point/PointController.java
index 859b4f700..610ca13b4 100644
--- a/apps/commerce-api/src/main/java/com/loopers/interfaces/api/point/PointController.java
+++ b/apps/commerce-api/src/main/java/com/loopers/interfaces/api/point/PointController.java
@@ -10,6 +10,8 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+
 @Tag(name = "Point", description = "포인트 관련 API")
 @RestController
 @RequestMapping("/api/v1/points")
@@ -45,7 +47,7 @@ public ResponseEntity<ApiResponse<Object>> getPoints(
     @PostMapping("/charge")
     public ResponseEntity<ApiResponse<Object>> chargePoints(
             @RequestHeader(value="X-USER-ID", required = false) String id,
-            @RequestParam("amount") Long amount
+            @RequestParam("amount") BigDecimal pointAmount
     ) {
         if (id == null || id.isBlank()) {
             return ResponseEntity
@@ -60,7 +62,7 @@ public ResponseEntity<ApiResponse<Object>> chargePoints(
                     .body(ApiResponse.fail("404","존재하지 않는 ID입니다."));
         }
 
-        Point updated = pointService.chargePoints(id, amount);
+        Point updated = pointService.chargePoints(id, pointAmount);
 
         return ResponseEntity.ok(
                 ApiResponse.success(updated.getPointAmount())
diff --git a/apps/commerce-api/src/main/java/com/loopers/interfaces/api/user/UserController.java b/apps/commerce-api/src/main/java/com/loopers/interfaces/api/user/UserController.java
index 72d249e14..f2eec07ab 100644
--- a/apps/commerce-api/src/main/java/com/loopers/interfaces/api/user/UserController.java
+++ b/apps/commerce-api/src/main/java/com/loopers/interfaces/api/user/UserController.java
@@ -1,6 +1,6 @@
 package com.loopers.interfaces.api.user;
 
-import com.loopers.application.example.UserFacade;
+import com.loopers.application.user.UserFacade;
 import com.loopers.domain.user.User;
 import com.loopers.domain.user.UserService;
 import com.loopers.interfaces.api.ApiResponse;
diff --git a/apps/commerce-api/src/main/java/com/loopers/support/error/ErrorMessages.java b/apps/commerce-api/src/main/java/com/loopers/support/error/ErrorMessages.java
index 2b84989b3..479c158e8 100644
--- a/apps/commerce-api/src/main/java/com/loopers/support/error/ErrorMessages.java
+++ b/apps/commerce-api/src/main/java/com/loopers/support/error/ErrorMessages.java
@@ -9,7 +9,11 @@ private ErrorMessages() {}
     public static final String INVALID_BIRTH_FORMAT = "생년월일이 yyyy-MM-dd 형식에 맞지 않습니다.";
     public static final String GENDER_CANNOT_BE_EMPTY = "성별은 빈 값이 될 수 없습니다.";
     public static final String INVALID_GENDER_VALUE = "성별 값이 올바르지 않습니다.";
-    public static final String INVALID_POINT_AMOUNT = "포인트 금액은 0 이상이어야 합니다.";
+    public static final String INVALID_POINT_AMOUNT = "잘못된 포인트 값입니다.";
+    public static final String INVALID_MONEY_AMOUNT = "금액은 0 이상이어야 합니다.";
+    public static final String INVALID_NAME_FORMAT = "이름은 형식이 올바르지 않습니다.";
+    public static final String INVALID_STOCK_QUANTITY = "재고 수량은 0 이상이어야 합니다.";
+    public static final String INVALID_ORDER_ITEMS_LIST = "주문 항목 리스트가 비어 있을 수 없습니다.";
 }
 
 
diff --git a/apps/commerce-api/src/test/java/com/loopers/domain/like/LikeModelTest.java b/apps/commerce-api/src/test/java/com/loopers/domain/like/LikeModelTest.java
new file mode 100644
index 000000000..109cd25c5
--- /dev/null
+++ b/apps/commerce-api/src/test/java/com/loopers/domain/like/LikeModelTest.java
@@ -0,0 +1,114 @@
+package com.loopers.domain.like;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.dao.DataIntegrityViolationException;
+
+import java.util.List;
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+class LikeModelTest {
+
+    @Mock
+    LikeRepository likeRepository;
+
+    @InjectMocks
+    LikeService likeService;
+
+    static final String USER_ID = "sky980221";
+    static final Long PRODUCT_ID = 19980221L;
+    static final Long PRODUCT_ID_2 = 19980303L;
+
+    @Test
+    @DisplayName("좋아요가 없는 경우 새 좋아요를 생성한다")
+    void like_registers_when_absent() {
+        // given
+        when(likeRepository.findByUserIdAndProductId(USER_ID, PRODUCT_ID)).thenReturn(Optional.empty());
+
+        // when
+        likeService.likeProduct(USER_ID, PRODUCT_ID);
+
+        // then
+        verify(likeRepository).save(argThat(like ->
+                like.getUserId().equals(USER_ID) &&
+                        like.getProductId().equals(PRODUCT_ID)
+        ));
+
+    }
+
+    @Test
+    @DisplayName("중복 등록은 무시된다(멱등)")
+    void like_ignores_when_present() {
+        // given
+        when(likeRepository.findByUserIdAndProductId(USER_ID, PRODUCT_ID))
+                .thenReturn(Optional.of(new Like(USER_ID, PRODUCT_ID)));
+
+        // when
+        likeService.likeProduct(USER_ID, PRODUCT_ID);
+
+        // then
+        verify(likeRepository, never()).save(any());
+    }
+
+    @Test
+    @DisplayName("이미 등록된 좋아요는 취소된다")
+    void cancel_deletes_when_present() {
+        // given
+        Like like = new Like(USER_ID, PRODUCT_ID);
+        when(likeRepository.findByUserIdAndProductId(USER_ID, PRODUCT_ID))
+                .thenReturn(Optional.of(like));
+
+        // when
+        likeService.cancleLikeProduct(USER_ID, PRODUCT_ID);
+
+        // then
+        verify(likeRepository, times(1)).delete(eq(like));
+    }
+
+    @Test
+    @DisplayName("상품별 좋아요 수를 카운트로 조회할 수 있다")
+    void count_by_product() {
+        // given
+        when(likeRepository.countByProductId(1L)).thenReturn(10000L);
+        when(likeRepository.countByProductId(2L)).thenReturn(20000L);
+
+        // when
+        Long c1 = likeService.getLikeCount(1L);
+        Long c2 = likeService.getLikeCount(2L);
+
+        // then
+        assertThat(c1).isEqualTo(10000L);
+        assertThat(c2).isEqualTo(20000L);
+    }
+
+    @Test
+    @DisplayName("유저가 좋아요 한 상품의 목록을 조회할 수 있다")
+    void get_liked_products_by_user() {
+        // given
+        Like like1 = new Like(USER_ID, PRODUCT_ID);
+        Like like2 = new Like(USER_ID, PRODUCT_ID_2);
+        when(likeRepository.findAllByUserId(USER_ID))
+                .thenReturn(List.of(like1, like2));
+
+        // when
+        List<Like> likedProducts = likeService.getUserLikeProduct(USER_ID);
+
+        // then
+        assertThat(likedProducts).hasSize(2);
+        assertThat(likedProducts).extracting("productId")
+                .containsExactlyInAnyOrder(PRODUCT_ID, PRODUCT_ID_2);
+    }
+}
+
diff --git a/apps/commerce-api/src/test/java/com/loopers/domain/order/OrderModelTest.java b/apps/commerce-api/src/test/java/com/loopers/domain/order/OrderModelTest.java
new file mode 100644
index 000000000..a79a7098d
--- /dev/null
+++ b/apps/commerce-api/src/test/java/com/loopers/domain/order/OrderModelTest.java
@@ -0,0 +1,85 @@
+package com.loopers.domain.order;
+
+import com.loopers.support.error.CoreException;
+import com.loopers.support.error.ErrorMessages;
+import com.loopers.support.error.ErrorType;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@DisplayName("Order 도메인 모델 테스트")
+public class OrderModelTest {
+
+    private OrderItem item(long productId, int quantity, String unitPrice) {
+        return OrderItem.builder()
+                .order(null)
+                .productId(productId)
+                .quantity(quantity)
+                .price(new BigDecimal(unitPrice))
+                .build();
+    }
+
+    @Nested
+    @DisplayName("정상 흐름")
+    class SuccessFlow {
+        @Test
+        @DisplayName("유효한 사용자와 아이템으로 주문이 생성된다")
+        void creates_order_when_valid_input() {
+            // given
+            String userId = "user-1";
+            List<OrderItem> items = List.of(
+                    item(1L, 2, "1000"),
+                    item(2L, 1, "5000")
+            );
+
+            // when
+            Order order = Order.createOrder(userId, items);
+
+            // then
+            assertThat(order).isNotNull();
+            assertThat(order.getUserId()).isEqualTo(userId);
+            assertThat(order.getOrderItems()).hasSize(2);
+            assertThat(order.getStatus()).isEqualTo(OrderStatus.CREATED);
+        }
+    }
+
+    @Nested
+    @DisplayName("예외 흐름")
+    class ExceptionFlow {
+        @Test
+        @DisplayName("userId가 비어 있으면 BAD_REQUEST가 발생한다")
+        void throws_when_userId_blank() {
+            // given
+            String userId = "   ";
+            List<OrderItem> items = List.of(item(1L, 1, "1000"));
+
+            // when
+            CoreException ex = assertThrows(CoreException.class, () -> Order.createOrder(userId, items));
+
+            // then
+            assertThat(ex.getErrorType()).isEqualTo(ErrorType.BAD_REQUEST);
+            assertThat(ex.getMessage()).isEqualTo(ErrorMessages.INVALID_NAME_FORMAT);
+        }
+
+        @Test
+        @DisplayName("아이템 리스트가 비어 있으면 BAD_REQUEST가 발생한다")
+        void throws_when_items_empty() {
+            // given
+            String userId = "user-1";
+            List<OrderItem> items = List.of();
+
+            // when
+            CoreException ex = assertThrows(CoreException.class, () -> Order.createOrder(userId, items));
+
+            // then
+            assertThat(ex.getErrorType()).isEqualTo(ErrorType.BAD_REQUEST);
+            assertThat(ex.getMessage()).isEqualTo(ErrorMessages.INVALID_ORDER_ITEMS_LIST);
+        }
+    }
+}
diff --git a/apps/commerce-api/src/test/java/com/loopers/domain/point/PointIntegrationTest.java b/apps/commerce-api/src/test/java/com/loopers/domain/point/PointIntegrationTest.java
index b97352c1f..2acc057e4 100644
--- a/apps/commerce-api/src/test/java/com/loopers/domain/point/PointIntegrationTest.java
+++ b/apps/commerce-api/src/test/java/com/loopers/domain/point/PointIntegrationTest.java
@@ -16,6 +16,8 @@
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
 
+import java.math.BigDecimal;
+
 @SpringBootTest
 @AutoConfigureMockMvc
 public class PointIntegrationTest {
@@ -39,7 +41,7 @@ void tearDown() {
     void return_point_when_user_exist() {
         //given
         String userId = "sangdon";
-        Long expectedPointAmount = 1000L;
+        BigDecimal expectedPointAmount = BigDecimal.valueOf(100L);
         
         Point point = Point.builder()
                 .userId(userId)
@@ -53,7 +55,7 @@ void return_point_when_user_exist() {
 
         //then
         assertThat(result).isNotNull();
-        assertThat(result.getPointAmount()).isEqualTo(expectedPointAmount);
+        assertThat(result.getPointAmount()).isEqualByComparingTo(expectedPointAmount);
         assertThat(result.getUserId()).isEqualTo(userId);
     }
 
@@ -77,7 +79,7 @@ void return_fail_when_user_not_exist() {
         String nonExistentUserId = "nonexistent";
 
         //when
-        CoreException result = assertThrows(CoreException.class, () -> pointService.chargePoints(nonExistentUserId, 500L));
+        CoreException result = assertThrows(CoreException.class, () -> pointService.chargePoints(nonExistentUserId, BigDecimal.valueOf(100L)));
 
         //then
         assertThat(result.getErrorType()).isEqualTo(ErrorType.NOT_FOUND);
diff --git a/apps/commerce-api/src/test/java/com/loopers/domain/point/PointTest.java b/apps/commerce-api/src/test/java/com/loopers/domain/point/PointTest.java
index 9e3e6e345..fdfe1c46d 100644
--- a/apps/commerce-api/src/test/java/com/loopers/domain/point/PointTest.java
+++ b/apps/commerce-api/src/test/java/com/loopers/domain/point/PointTest.java
@@ -6,6 +6,8 @@
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 
+import java.math.BigDecimal;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.springframework.test.web.servlet.result.StatusResultMatchersExtensionsKt.isEqualTo;
@@ -18,12 +20,12 @@ void return_fail_when_charge_point_with_invalid_amount() {
         // given
         Point point = Point.builder()
                 .userId("user1")
-                .pointAmount(1000L)
+                .pointAmount(BigDecimal.valueOf(100L))
                 .build();
     
         // when
-        CoreException result1 = assertThrows(CoreException.class, () -> point.chargePoints(0));
-        CoreException result2 = assertThrows(CoreException.class, () -> point.chargePoints(-500));
+        CoreException result1 = assertThrows(CoreException.class, () -> point.chargePoints(BigDecimal.valueOf(0L)));
+        CoreException result2 = assertThrows(CoreException.class, () -> point.chargePoints(BigDecimal.valueOf(-500L)));
     
         // then
         assertThat(result1.getErrorType()).isEqualTo(ErrorType.BAD_REQUEST);
diff --git a/apps/commerce-api/src/test/java/com/loopers/interfaces/api/PointV1ApiE2ETest.java b/apps/commerce-api/src/test/java/com/loopers/interfaces/api/PointV1ApiE2ETest.java
index 7db51c54a..25b56ac0e 100644
--- a/apps/commerce-api/src/test/java/com/loopers/interfaces/api/PointV1ApiE2ETest.java
+++ b/apps/commerce-api/src/test/java/com/loopers/interfaces/api/PointV1ApiE2ETest.java
@@ -17,6 +17,8 @@
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 
+import java.math.BigDecimal;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertAll;
  
@@ -47,7 +49,7 @@ public PointV1ApiE2ETest(
     void return_point_when_user_exist (){
         //given
         String userId = "sangdon";
-        Long expectedPointAmount = 1000L;
+        BigDecimal expectedPointAmount = BigDecimal.valueOf(100);
 
         Point point = Point.builder()
                 .userId(userId)
@@ -96,8 +98,8 @@ void return_total_point_when_charge_1000_point(){
 
         //given
         String userId = "sangdon";
-        long initialAmount = 5000L;
-        long chargeAmount = 1000L;
+        BigDecimal initialAmount = BigDecimal.valueOf(5000L);
+        BigDecimal chargeAmount = BigDecimal.valueOf(1000L);
 
         Point point = Point.builder()
                 .userId(userId)
