diff --git a/push_to_db.py b/push_to_db.py
index 31a5433e9c195db606008e338da1a6adccde47b3..a7e68e4d81840c668cd9731afae2d5d25db0bf5f 100644
--- a/push_to_db.py
+++ b/push_to_db.py
@@ -73,6 +73,20 @@ RETURNING part_id;""".format(type=_part_type_enum, columns=columns, value_entrie
     return None
 
 
+def check_if_parts_exist(_cursor, _user_id, _part_ids):
+    sql = """WITH result AS (SELECT combinations.id AS combination_id, 
+ARRAY(SELECT part_id FROM relations WHERE relations.combination_id = combinations.id ORDER BY relations.part_id) AS parts 
+FROM combinations WHERE combinations.owner_id = %s) SELECT combination_id FROM result WHERE parts = %s;"""
+    _cursor.execute(sql, (_user_id, _part_ids))
+    data = _cursor.fetchall()
+    
+    if not data:
+        return None
+
+    _existing_combination_id = data[-1][-1]
+    return _existing_combination_id
+
+
 def create_combination(_cursor, nickname, _user_id):
     _pc_name = "새 PC"
     if nickname:
@@ -140,6 +154,7 @@ def func():
 
     _parts = parse.handle_xml_body(_xml_document)
     _part_ids = []
+    _created_parts = False
 
     print("Matching parts")
 
@@ -157,6 +172,7 @@ def func():
             _matched_id = match_part_obj_into_db(part, part_type)
 
             if not _matched_id:  # DB에 없는 부품이라면
+                _created_parts = True
                 print(".. creating new part with", part["name"])
                 with db_conn.cursor() as cursor:
                     _matched_id = create_new_one(part, part_type, cursor)
@@ -167,21 +183,34 @@ def func():
                 continue
 
             print(f"[WARNING] failed to match part type={part_type}, part:", part, file=sys.stderr)
-    
-    print("Creating combination")
-    with db_conn.cursor() as cursor:
-        _combination_id = create_combination(cursor, None, _user_id)
 
-    if not _combination_id:
-        print("Failed to create combination", file=sys.stderr)
-        exit(1)
 
-    print("Wiring parts", _part_ids, "to combination id", _combination_id)
-    with db_conn.cursor() as cursor:
-        wire_part_to_combination(cursor, _combination_id, *_part_ids)
+    _combination_id = None
+    # 이미 존재하는 경우
+    if not _created_parts:
+        print("Checking combination existance")
+        with db_conn.cursor() as cursor:
+            _combination_id = check_if_parts_exist(cursor, _user_id, _part_ids)
 
-    print("Committing to DB")
-    db_conn.commit()
+            if _combination_id is not None:
+                print("Combination exist. Using combination id", _combination_id)
+
+    # 새로 추가하는 경우
+    if _combination_id is not None:
+        print("Creating combination")
+        with db_conn.cursor() as cursor:
+            _combination_id = create_combination(cursor, None, _user_id)
+
+        if not _combination_id:
+            print("Failed to create combination", file=sys.stderr)
+            exit(1)
+
+        print("Wiring parts", _part_ids, "to combination id", _combination_id)
+        with db_conn.cursor() as cursor:
+            wire_part_to_combination(cursor, _combination_id, *_part_ids)
+
+        print("Committing to DB")
+        db_conn.commit()
 
     print("Finalizing transaction")
     with db_conn.cursor() as cursor: