Ownus 프로젝트 Spring boot + MySQL + JPA 연동 성공 ㅜㅜ

배인성·2023년 1월 4일
0

ownus

목록 보기
4/6
post-thumbnail

★★★★★ 하는 방법 적은거 아님 잠시 일기쓴거! 아 해결방법 있긴한데 순수JPA인 경우만 ★★★★

ㅋㅋㅋㅋ 아니 데이터 하나 insert 하는데 9시간 걸렸음...

일단 방금 데이터 insert에 성공하고.. 너무 감격스러워서 바로 글부터 쓰러왔다;

하.. 이번에 사이드 프로젝트인만큼 JPA라는게 해보고싶은 나머지 그냥 무작정 구글링으로 JPA를 따라하기 시작했는데 다음과 같은 문제점들이 발생했다.

DB에 insert가 안됨

음.. 문제점"들"도 아니고 그냥 얘 떄문에 어제 오늘 퇴근하고나서 시간을 달달하게 녹였다 ㅋㅋ

어제는 AWS의 EC2 서버를 빌려서 (회원가입 1년 무료) spring boot를 띄웠다.

따로 포스팅은 안했지만 ㅋㅋㅋ 띄우자마자 기분 좋아서 JPA로 데이터 삽입 하나 성공하면 git push하고 글 쓸려했다.

근데.. 못했다

Top-down으로 썰을 풀어보자면

EntityManager.persist()가 not work..

아니 에러메시지도 안뜨고 그냥 어떤 상태였냐면, user_id가 주키인데 포스트맨으로 그냥 같은 data를 form에 담아서 계에에에에에에에속 post요청을 보냈는데 그냥 내가 찍어놓은 성공했다는 로그만 출력이 되더라고? (DB에 아무 변화 X)

그래서 엥 뭐지... 싶었음

근데 이건 당연한거였음 왜냐면 persist는 DB에 반영하는 메소드가 아니라, 영속성 컨텍스트라는 곳에 잠시 객체를 올려두는 메소드기 때문

"아~"하고 그러면 DB에 commit하는건 따로 있구나! 해서 당연히 납득가능한 나의 무지로 인한 시간낭비였길래 다음 포인트를 찾고 처음엔 flush(EntityManager)를 했음.

flush가 persist로 영속성 컨텍스트라는 메모리에 올라간 엔티티를 DB에 강제로 insert 하는거더라고?

근데 안됨.. DB에 아무런 소식이 없었음..!

EntityManager Transaction 도입

일단 일부러 Spring Data JPA를 안썼음

이건 내가 기술스택을 접하는 신념중 하나인데, 음.. 갑자기 글로 풀려니 어려운데

그냥 JPA를 모르고 extends JpaRepository<Entity, 주키타입> 이거 해가지고 DB 접근하기엔 좀 너무 의미없이, 아무 발전없이 지름길 타는거같았음 (이럴려고 한거 아닌데)

그래서 순수 JPA로만 할려고 했음.

다시 본론으로 Transaction 도입

구글링을 해보니까, 트랜잭션을 만들어서 commit을 해야 DB에 반영이 된대? 그 트랜잭션은 EntityManager라는 친구가 생성해줌. 근데 EntityManager는 EntityManagerFactory가 생성해준댘ㅋㅋ

쨌든 EntityManagerFactory를 싱글톤으로 생성해서 관리해야함

@Configuration 달린 자바파일에서 의존성 주입해주고 있었기 때문에 여기다가 일단 private final로 팩토리를 생성함

그래서 Repoisotry단에서 팩토리를 주입받고 EntityManager를 생성해서 트랜잭션 생성하고 begin ~ 로직 ~ commit을 try catch에다가 넣어서 짰음

근데 또 DB에 반영이 안되는거.. 이 상태로 거의 대부분의 시간을 보냈음...

해결방법

음.. 해결은 코드 한 줄 추가해줬음

persistence.xml 파일에

저기저기저기저기저기 class 태그를 추가해줌 ㅋㅋㅋ 지금 자야해서 일단 이렇게만 적는다는게 너무 억울할 정도인데 진짜 저거 한줄 추가해주니까 갑자기 콘솔에 persist에 대한 쿼리도 출력되고 DB에 짠하고 반영되고 그냥 지렸음

저거를 해줘야 내가 생성한 Entity를 인식을 한대.. 이건 여기서 알게됨.. 역시 갓영한 ㅜㅜ

순수 JPA를 사용할 땐, 이렇게 Entity를 명시를 해줘야하나보다! 근데 만약 프로젝트가 엄청 커져서 엔티티들이 많아지면 어떡하지? 저기다 다 집어넣나..?

profile
부지런히 살자!!

0개의 댓글