diff --git a/src/main/java/com/yourssu/jpa/EntityManager.java b/src/main/java/com/yourssu/jpa/EntityManager.java new file mode 100644 index 0000000..20a8d29 --- /dev/null +++ b/src/main/java/com/yourssu/jpa/EntityManager.java @@ -0,0 +1,14 @@ +package com.yourssu.jpa; + +public class EntityManager { + private final PersistenceContext persistenceContext = new PersistenceContext<>(); + + public T persist(ID id, T entity) { + persistenceContext.save(id, entity); + return entity; + } + + public void merge() { + persistenceContext.merge(); + } +} diff --git a/src/main/java/com/yourssu/jpa/PersistenceContext.java b/src/main/java/com/yourssu/jpa/PersistenceContext.java new file mode 100644 index 0000000..9cf95a2 --- /dev/null +++ b/src/main/java/com/yourssu/jpa/PersistenceContext.java @@ -0,0 +1,34 @@ +package com.yourssu.jpa; + +import java.util.HashMap; +import java.util.Map; + +public class PersistenceContext { + private final Map entityMap = new HashMap<>(); + private final Map snapshotMap = new HashMap<>(); + + + public void merge() { + for (ID id : entityMap.keySet()) { + T instance = entityMap.get(id); + T original = snapshotMap.get(id); + + if (original == null) { + System.out.println("DB에 저장되었습니다. " + instance); + RealDB.push(id, instance); + continue; + } + + if (original.equals(instance)) { + continue; + } + System.out.println("DB에 저장되었습니다. " + instance); + RealDB.push(id, instance); + } + } + + public void save(ID id, T instance) { + System.out.println("영속성 컨텍스트에 저장되었습니다. " + instance); + entityMap.put(id, instance); + } +} diff --git a/src/main/java/com/yourssu/jpa/RealDB.java b/src/main/java/com/yourssu/jpa/RealDB.java new file mode 100644 index 0000000..31678fc --- /dev/null +++ b/src/main/java/com/yourssu/jpa/RealDB.java @@ -0,0 +1,13 @@ +package com.yourssu.jpa; + +import java.util.HashMap; +import java.util.Map; + +public class RealDB { + + private static final Map db = new HashMap<>(); + + public static void push(Object key, Object instance) { + db.put(key, instance); + } +} diff --git a/src/main/java/com/yourssu/jpa/Repository.java b/src/main/java/com/yourssu/jpa/Repository.java new file mode 100644 index 0000000..703288f --- /dev/null +++ b/src/main/java/com/yourssu/jpa/Repository.java @@ -0,0 +1,13 @@ +package com.yourssu.jpa; + +public class Repository { + private final EntityManager entityManager; + + public Repository(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public UserEntity save(UserEntity entity) { + return entityManager.persist(entity.getId(), entity); + } +} diff --git a/src/main/java/com/yourssu/jpa/UserEntity.java b/src/main/java/com/yourssu/jpa/UserEntity.java new file mode 100644 index 0000000..3460b2b --- /dev/null +++ b/src/main/java/com/yourssu/jpa/UserEntity.java @@ -0,0 +1,31 @@ +package com.yourssu.jpa; + +import java.util.Objects; + +public class UserEntity { + private final Long id; + private String name; + private String email; + + public UserEntity(Long id, String name, String email) { + this.id = id; + this.name = name; + this.email = email; + } + + public Long getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + UserEntity that = (UserEntity) o; + return Objects.equals(id, that.id) && Objects.equals(name, that.name) && Objects.equals(email, that.email); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, email); + } +} diff --git a/src/test/java/com/yourssu/EntityManagerTest.java b/src/test/java/com/yourssu/EntityManagerTest.java new file mode 100644 index 0000000..4984694 --- /dev/null +++ b/src/test/java/com/yourssu/EntityManagerTest.java @@ -0,0 +1,21 @@ +package com.yourssu; + + +import com.yourssu.jpa.EntityManager; +import com.yourssu.jpa.Repository; +import com.yourssu.jpa.UserEntity; +import org.junit.jupiter.api.Test; + +class EntityManagerTest { + @Test + void persist() { + EntityManager entityManager = new EntityManager<>(); + Repository repository = new Repository(entityManager); + // repository save 하고 + // merge하고 + + UserEntity userEntity = new UserEntity(1L, "test", "test@test.com"); + repository.save(userEntity); + entityManager.merge(); + } +}