본문 바로가기
Language/Java

JPA 초급 공부 (manager / transaction / getSingleReulst()) 등..

by 쿠키오빠 2025. 1. 7.
반응형

JPA 공부 중, 기본적인 내용이지만 기록하기

 

일단 JPA란 MyBatis의 상위 개념이 아니라 MyBatis와는 다른 느낌의 ORM(Object-Relational Mapping)이다.

 

간단하게 복잡한 쿼리나 특정 데이터베이스 기능을 활용해야 하는 경우 MyBatis가 더 적합하고,
데이터베이스와의 상호작용을 간소화하고 싶다면 JPA를 사용하는 것이 적합하다.

(여러개의 조인이 들어간 복잡한 Select 구문은 mybatis가 유리하고,각종 DML 구문 (insert , update , delete)는 JPA가 유리하다.)

 

결론적으로 둘을 모두 사용하는 게 효율적!


오늘 공부한 내용은 JPA 초급 사용하기....

 

뭐가 안 되다 됐다 가 아니라, 그냥 복습할 겸 적어본다.

 

test 클래스에서 insert 해주고, select문으로 총 개수를 반환 받을 거다.

일단 Test 클래스에서 @MethodSource 어노테이션을 이용하여 메서드로 전달받고, 

모든 필드를 초기화(menu_code 빼구)하는 기본 생성자를 만들어서 newMenu에 넣어줬다. 

 

실제 insert를 진행하는 메서드에 해당 정보를 전달하여 insert 진행.

주석에 달아놓은 것 처럼 DML (insert , update, delete) 구문이므로 transaction을 해줘야 한다.

 

manager(매니저를 생성하는 메서드 호출)에 자바에서 제공(jakarta.persistence)하는 getTransaction으로

transaction을 열어주고

 

이전에 담아 놓은 newMenu를 전달하여 insert해준다 (persist)

 

 

이후에 DB에 반영을 위해, flush(); (DB로 밀어주기) 라는 메서드를 호출하는데,

commit이 없다면 DB에 반영이 되지는 않는다.

 

근데 신기한 건, DB에 저장만 되지 않을 뿐 반영은 된다는 거다.

 

실제로 transaction.commit();을 주석 해놓고 3번 정도 run(insert)를 진행했었다.

 

transaction.commit();을 다시 적용하고 쿼리 콘솔을 통해 확인해보니 원래 21번 메뉴까지 있었는데.

25번에 해당 메뉴가 저장 되었다. (알고 넘어가자~)


적으려고 했던 메모 내용은 이게 아닌데... 

무튼 transaction 성공 시 1을 반환받기 때문에 test 클래스에서 Long으로 받기로 하였다. 

 

 

아 추가로 insert와 동시에  select(insert 이후의 총 개수) 결과도 동시에 받아야 하므로, (2가지의 로직 수행)

manager를 통으로 전달하며, Long 타입 메서드를 만들어서(너무 길어지니까..)  반환을 해주기로 했다.

 

 

반환 메서드 return 구문에 DB 저장 이후, 총 개수에 대한 SELEC문을  작성하였는데

FROM 절 작성 시에는 실제 DB의 테이블 명을 적는 게 아니라,  아래에 @Entity 등록해 놓은 name 속성을 적어준다.

열쇠모양 → PK

SELECT 절 이후, Long.class를 적는 이유가 궁금해서 한 참 찾아보다 깨달은 사실이,

 

두번째 전달인자에 반환하는 타입에 맞게 작성하지 않는다면(예 : Long) 모두 Object 타입으로 인식한다는 것이다.

 

다른 쪽 코드를 수정하고 Long.class를 굳이 적지 않아도 돌아가긴 하지만,

 

코드 가독성이나 타입 안정성을 위해 명시하는 게 좋다.

 

마지막 getSingleReulst() 메서드는  JPA에서 쿼리 실행 결과로 단일 결과를 반환받기 위해 사용되는 메서드이다.

(만약 쿼리 결과가 없을 경우 NoResultException이 발생, 쿼리 결과가 두 개 이상일 경우 NonUniqueResultException이 발생한다.)
 무조건 결과가 하나라면 해당 메서드를 사용하는 것이 안전하다.


이상 끝!

반응형