Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions src/main/java/com/yourssu/entitymanager/EntityManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.yourssu.entitymanager;

public interface EntityManager {
public void persist(Object entity);
public <T> T merge(T entity);
}
65 changes: 65 additions & 0 deletions src/main/java/com/yourssu/entitymanager/EntityManagerImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.yourssu.entitymanager;

import java.util.HashMap;
import java.util.Map;

public class EntityManagerImpl implements EntityManager {

private final Map<Long, User> persistenceContext = new HashMap<>();
private long sequence = 1L;

// id가 null일 때 호출 (비영속 → 영속)
@Override
public void persist(Object entity) {
if (!(entity instanceof User)) {
throw new IllegalArgumentException("일단은 User 엔티티만 지원합니다.");
}

User user = (User) entity;

if (user.getId() != null) {
throw new IllegalStateException("이미 ID가 존재하는 엔티티입니다. persist 불가.");
}

user.setId(sequence++);

persistenceContext.put(user.getId(), user);

System.out.println("[persist] 저장됨: " + user.getId() + ", " + user.getName());
}

// 이미 ID가 있는 객체일 때 (준영속 → 영속)
@Override
public <T> T merge(T entity) {
if (!(entity instanceof User)) {
throw new IllegalArgumentException("일단은 User 엔티티만 지원합니다.");
}

User detached = (User) entity;

if (detached.getId() == null) {
throw new IllegalStateException("ID가 없는 엔티티는 merge할 수 없습니다.");
}

User managed = persistenceContext.get(detached.getId());

if (managed == null) {
managed = new User();
managed.setId(detached.getId());
persistenceContext.put(managed.getId(), managed);
}
managed.setName(detached.getName());

System.out.println("[merge] 병합됨: " + managed.getId() + ", " + managed.getName());

return (T) managed;
}

public void printStore() {
System.out.println("== 현재 영속성 컨텍스트 상태 ==");
for (Map.Entry<Long, User> entry : persistenceContext.entrySet()) {
User u = entry.getValue();
System.out.println("id=" + u.getId() + ", name=" + u.getName());
}
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/yourssu/entitymanager/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.yourssu.entitymanager;

public class Main {
public static void main(String[] args) {

EntityManager em = new EntityManagerImpl();
UserRespository userRepository = new UserRespository(em);

User user1 = new User();
user1.setName("피키");

System.out.println("persist test");
userRepository.save(user1);

System.out.println("merge test");
User detachedUser = new User(user1.getId(), "이름 수정");
userRepository.save(detachedUser);

System.out.println("또 다른 유저 persist");
User user2 = new User();
user2.setName("로건");
userRepository.save(user2);

System.out.println("영속성 컨텍스트 전체 출력");
((EntityManagerImpl) em).printStore();
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/yourssu/entitymanager/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.yourssu.entitymanager;

public class User {
private Long id;
private String name;

public User() {}

public User(Long id, String name) {
this.id = id;
this.name = name;
}

public Long getId() { return id; }
public void setId(Long id) { this.id = id; }

public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
19 changes: 19 additions & 0 deletions src/main/java/com/yourssu/entitymanager/UserRespository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.yourssu.entitymanager;

public class UserRespository {

private final EntityManager entityManager;

public UserRespository(EntityManager entityManager) {
this.entityManager = entityManager;
}

public void save(User user) {
if (user.getId() == null) {
entityManager.persist(user);
} else {
entityManager.merge(user);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.yourssu.entitymanager;

import static org.junit.jupiter.api.Assertions.*;

class UserRespositoryTest {


}