여기에서는 Spring Boot와 연결해서 JPA를 보는 것이 아니라, JPA의 CRUD의 기능에 초점을 맞추고 있다. Spring Boot와 함께 작성하는 내용은 추후에 작성할 예정이다.
JPA에서 엔티티 클래스임을 명시하는 어노테이션으로, 이 어노테이션이 붙은 클래스는 JPA에서 관리되는 엔티티 인것이다.
✅ 엔티티의 기본 이름은 클래스명이다. 그런데, 다른 이름으로 설정하고 싶다면 밑에처럼 작성하면 된다. 다만, 엔티티명은 중복되면 안된다.
@Entity(name = "Section01")
JPA에서 테이블임을 명시하는 어노테이션이다. 이 어노테이션을 사용하면 엔티티와 매핑할 테이블의 이름을 정할 수 있다.
✅ 이 엔티티가 어떤 테이블과 매핑되는지 나타내면 된다.
@Table(name = "tbl_menu")
JPA에서 엔티티의 PK임을 명시하는 어노테이션으로, 엔티티 내에서 해당 필드를 기본 키로 사용할 수 있다.
@Id // PK임을 표시
@Column(name = "menu_code")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int menuCode;
JPA에서 해당 필드가 테이블의 컬럼임을 명시하는 어노테이션으로 엔티티 필드와 테이블 컬럼 간의 매핑을 정할 수 있다.
@Column(name = "menu_name")
private String menuName;
JPA에서 엔티티의 기본 키를 자동 생성할 때 사용하는 어노테이션으로 기본 키 생성 전략을 설정할 수 있다.
✅ 밑에 코드에서 지정한 IDENTITY는 기본 키 생성을 DB에 위임하는 것이다.id 값을 null로 하면 DB가 알아서 AUTO_INCREMENT를 해준다.
@Id
@Column(name = "menu_code")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int menuCode;
@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 + '\'' +
'}';
}
}
insert, update, delete는 하나의 트랜잭션 단위로 관리해야 한다. 이 때,
EntityTransaction을 수동으로 관리한다.
이 경우에try-catch문을 사용해 만약 예외가 발생하게 되면rollback하고 정상적으로 수행된다면commit시키게 작성하는 것이 확실하다.
다만, 여기에서는 CRUD를 수행하기 위한 메소드에 초점이 맞춰져 있으므로 따로 예외 처리는 하지 않을 것이다.
EntityManger의 find() 메소드 사용하기
✅ find(타입.class, pk)
find() 메소드에 어떤 타입의 엔티티를 찾을 것이며, 이것의 PK가 무엇인지 전달
// 메뉴 코드를 통해 메뉴를 조회하는 기능
public Menu findMenuByMenuCode(int menuCode){
entityManager = EntityManagerGenerator.getInstance();
eturn entityManager.find(Menu.class, menuCode);
}
⭐ JPA에서 만들어준 SQL문

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문
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문

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문
