[JPA] CRUD 확인하기

지니·2025년 3월 29일

JPA

목록 보기
3/4
post-thumbnail

여기에서는 Spring Boot와 연결해서 JPA를 보는 것이 아니라, JPA의 CRUD의 기능에 초점을 맞추고 있다. Spring Boot와 함께 작성하는 내용은 추후에 작성할 예정이다.

1. 어노테이션들 확인하기


1-1. @Entity

JPA에서 엔티티 클래스임을 명시하는 어노테이션으로, 이 어노테이션이 붙은 클래스는 JPA에서 관리되는 엔티티 인것이다.

✅ 엔티티의 기본 이름은 클래스명이다. 그런데, 다른 이름으로 설정하고 싶다면 밑에처럼 작성하면 된다. 다만, 엔티티명은 중복되면 안된다.

@Entity(name = "Section01") 

1-2. @Table

JPA에서 테이블임을 명시하는 어노테이션이다. 이 어노테이션을 사용하면 엔티티와 매핑할 테이블의 이름을 정할 수 있다.

✅ 이 엔티티가 어떤 테이블과 매핑되는지 나타내면 된다.

@Table(name = "tbl_menu") 

1-3. @Id

JPA에서 엔티티의 PK임을 명시하는 어노테이션으로, 엔티티 내에서 해당 필드를 기본 키로 사용할 수 있다.

@Id // PK임을 표시
@Column(name = "menu_code")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int menuCode;

1-4. @Column

JPA에서 해당 필드가 테이블의 컬럼임을 명시하는 어노테이션으로 엔티티 필드와 테이블 컬럼 간의 매핑을 정할 수 있다.

@Column(name = "menu_name")
private String menuName;

1-5. @GeneratedValue

JPA에서 엔티티의 기본 키를 자동 생성할 때 사용하는 어노테이션으로 기본 키 생성 전략을 설정할 수 있다.

✅ 밑에 코드에서 지정한 IDENTITY는 기본 키 생성을 DB에 위임하는 것이다.id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT를 해준다.

@Id
@Column(name = "menu_code")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int menuCode;

1-6. 한 번에 모아보기

@Entity(name = "Menu1)
@Table(name = "tbl_menu") 
public class Menu {

    @Id 
    @Column(name = "menu_code")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int menuCode;
    @Column(name = "menu_name")
    private String menuName;
    @Column(name = "menu_price")
    private int menuPrice;
    @Column(name = "category_code")
    private int categoryCode;
    @Column(name = "orderable_status")
    private String orderableStatus;


    public Menu(String menuName, int menuPrice, int categoryCode, String orderableStatus) {
        this.menuName = menuName;
        this.menuPrice = menuPrice;
        this.categoryCode = categoryCode;
        this.orderableStatus = orderableStatus;
    }

    public Menu() {}

    public int getMenuCode() {
        return menuCode;
    }

    public String getMenuName() {
        return menuName;
    }

    public void setMenuName(String menuName){
        this.menuName = menuName;
    }

    @Override
    public String toString() {
        return "Menu{" +
                "menuCode=" + menuCode +
                ", menuName='" + menuName + '\'' +
                ", menuPrice=" + menuPrice +
                ", categoryCode=" + categoryCode +
                ", orderableStatus='" + orderableStatus + '\'' +
                '}';
    }
}

2. CRUD


insert, update, delete는 하나의 트랜잭션 단위로 관리해야 한다. 이 때, EntityTransaction을 수동으로 관리한다.

이 경우에 try-catch문을 사용해 만약 예외가 발생하게 되면 rollback하고 정상적으로 수행된다면 commit 시키게 작성하는 것이 확실하다.

다만, 여기에서는 CRUD를 수행하기 위한 메소드에 초점이 맞춰져 있으므로 따로 예외 처리는 하지 않을 것이다.

2-1. Select

EntityManger의 find() 메소드 사용하기

find(타입.class, pk)
find() 메소드에 어떤 타입의 엔티티를 찾을 것이며, 이것의 PK가 무엇인지 전달

// 메뉴 코드를 통해 메뉴를 조회하는 기능
public Menu findMenuByMenuCode(int menuCode){
	entityManager = EntityManagerGenerator.getInstance();
    
    eturn entityManager.find(Menu.class, menuCode);
}

⭐ JPA에서 만들어준 SQL문

2-2. Insert

EntityManger의 persist() 메소드 사용하기

public Long saveAndReturnAllCount(Menu newMenu){
	entityManager = EntityManagerGenerator.getInstance();
        
    EntityTransaction entityTransaction = entityManager.getTransaction();
    entityTransaction.begin();

    entityManager.persist(newMenu);

    entityTransaction.commit();

 	// 여기에서 getCount는 클래스에서 따로 구현했지만,
    // 코드를 여기에 작성하지 않았다.
    // 이 값을 반환하는 이유는 행이 추가됐을 때
    // DB의 행의 수가 변화하기 때문에, 이것을 이용해 test를 진행하기 위해서 작성한 것이다. 
    return getCount(entityManager);
}

⭐ JPA에서 만들어준 SQL문

2-3. Update

update의 경우 따로 메소드가 존재하지 않는다. 그래서 select을 위해 사용한 find 메소드를 통해 바꾸고 싶은 값을 찾고 set 메소드를 통해 변경해주면 된다.

// 메뉴 이름 수정하기
public Menu modifyMenuName(int menuCode, String menuName){
	entityManager = EntityManagerGenerator.getInstance();
    // entityManger는 수정한다는 기능을 가지고 있지 않음
    Menu foundMenu = entityManager.find(Menu.class, menuCode);

    EntityTransaction entityTransaction = entityManager.getTransaction();
    entityTransaction.begin();

    foundMenu.setMenuName(menuName);

    entityTransaction.commit();

    return foundMenu;
}

⭐ JPA에서 만들어준 SQL문

2-4. Delete

EntityManger의 remove() 메소드 사용하기

// 객체를 찾은 뒤에 삭제하기
public Long removeAndReturnAllCount(int menuCode){
	entityManager = EntityManagerGenerator.getInstance();

    Menu foundMenu = entityManager.find(Menu.class, menuCode);

    EntityTransaction entityTransaction = entityManager.getTransaction();
    entityTransaction.begin();

    entityManager.remove(foundMenu);

    entityTransaction.commit();

 	// 여기에서 getCount는 클래스에서 따로 구현했지만,
    // 코드를 여기에 작성하지 않았다.
    // 이 값을 반환하는 이유는 삭제가 진행됐을 때 DB의 행의 수가
    // 변화하기 때문에, 이것을 이용해 test를 진행하기 위해서 작성한 것이다.
    return getCount(entityManager);
}

⭐ JPA에서 만들어준 SQL문

0개의 댓글