저번에 배웠던 CRUD를 사용해서 간단한 프로그램을 구현해보자.
package UserProgram;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class EMF {
private static EntityManagerFactory entityManagerFactory;
public static void init(){
entityManagerFactory = Persistence.createEntityManagerFactory("jpabegin");
}
public static EntityManager getEntityManager() {
return entityManagerFactory.createEntityManager();
}
public static void close(){
entityManagerFactory.close();
}
}
어차피 EntityManagerFactory는 계속 사용을 해야하니, 초기화하고 EntityManagerFactory에서 EntityManager를 가져올 수 있는 class를 작성해준다.
당연히 간편하게 사용하기 위해 만드는 것으로 굳이 안 만들어도 되기는 한다.
그 다음에 DB에서 사용할 User 객체를 만들어준다.
저번에 사용했던 그대로 사용할 예정이다.
package UserProgram;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
@Entity
@Table(name = "user")
public class User {
@Id
private String email;
private String name;
private LocalDateTime create_date;
protected User(){}
public User(String email, String name, LocalDateTime create_date) {
this.email = email;
this.name = name;
this.create_date = create_date;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LocalDateTime getCreate_data() {
return create_date;
}
public void setCreate_data(LocalDateTime create_data) {
this.create_date = create_data;
}
@Override
public String toString() {
return "User{" +
"email='" + email + '\'' +
", name='" + name + '\'' +
", create_data=" + create_date +
'}';
}
}
이제 본격적으로 JPA를 사용할 차례이다.
Service 하는 메서드들을 한 곳에 모아 클래스로 작성했다.
package UserProgram;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
public class UserService {
public void CreateUser(User user){
EntityManager entityManager = EMF.getEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
try{
entityTransaction.begin();
entityManager.persist(user);
entityTransaction.commit();
}catch(Exception exception){
entityTransaction.rollback();
throw exception;
} finally {
entityManager.close();
}
}
public User ReadUser(String email){
EntityManager entityManager = EMF.getEntityManager();
try{
User user = entityManager.find(User.class, email);
if(user == null) throw new NullPointerException();
else return user;
}finally{
entityManager.close();
}
}
public void UpdateUser(String email, String name){
EntityManager entityManager = EMF.getEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
try{
entityTransaction.begin();
User user = entityManager.find(User.class, email);
if(user == null) throw new NullPointerException();
user.setName(name);
entityTransaction.commit();
}catch (Exception exception){
entityTransaction.rollback();
throw exception;
}finally {
entityManager.close();
}
}
public void DeleteUser(String email){
EntityManager entityManager = EMF.getEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
try{
entityTransaction.begin();
User user = entityManager.find(User.class, email);
if (user == null) throw new NullPointerException();
entityManager.remove(user);
entityTransaction.commit();
}catch(Exception exception){
entityTransaction.rollback();
throw exception;
}finally {
entityManager.close();
}
}
}
우선 저번에 배운 CRUD를 사용하였고, 다른 점이 있다면 static으로 작성된 EntityManagerFactory를 사용하였다.
우선 예외는 대충 넘기고 나중에 추가로 작성하도록 하겠다.
package UserProgram;
import java.time.LocalDateTime;
import java.util.Scanner;
public class UserProgram {
private static UserService userService = new UserService();
private static String email;
private static String name;
public static void main(String[] args) {
EMF.init();
Scanner scanner = new Scanner(System.in);
boolean flag = true;
while(flag){
System.out.print("1. Create, 2. Read, 3. Update, 4. Delete, 5. exit : ");
int answer = scanner.nextInt();
switch(answer){
case 1:
CreateMethod();
break;
case 2:
ReadMethod();
break;
case 3:
UpdateMethod();
break;
case 4:
DeleteMethod();
break;
case 5:
flag = false;
break;
}
}
EMF.close();
scanner.close();
}
private static void inputEmail(){
Scanner scanner = new Scanner(System.in);
System.out.print("input email:");
email = scanner.nextLine();
}
private static void inputName(){
Scanner scanner = new Scanner(System.in);
System.out.print("input name:");
name = scanner.nextLine();
}
private static void CreateMethod(){
inputEmail();
inputName();
User user = new User(email, name, LocalDateTime.now());
try{
userService.CreateUser(user);
}catch(Exception exception){
System.out.println("createError");
}
}
private static void ReadMethod(){
inputEmail();
try{
User user = userService.ReadUser(email);
System.out.println(user);
}catch(Exception exception){
System.out.println("readError");
}
}
private static void UpdateMethod(){
inputEmail();
inputName();
try{
userService.UpdateUser(email, name);
System.out.println(userService.ReadUser(email));
}catch(Exception exception){
System.out.println("updateError");
}
}
private static void DeleteMethod(){
inputEmail();
try{
userService.DeleteUser(email);
}catch(Exception exception){
System.out.println("deleteError");
}
}
}
이렇게 프로그램을 작성하였다.

그러면 이렇게 프로그램이 잘 작동한다.
값을 추가하고 삭제하는 메서드들도 잘 작동이 된다.
'백엔드 > JPA' 카테고리의 다른 글
JPA 6장 (@Embeddable) (0) | 2023.03.17 |
---|---|
JPA 5장 (Entity 식별자 생성 방식) (0) | 2023.03.16 |
JPA 4장 (Entity에 대하여) (0) | 2023.03.16 |
JPA 2장 (영속 컨텍스트) (0) | 2023.03.15 |
JPA 1장 (우선 시작해보기) (0) | 2023.03.15 |