자바 ORM 표준 JPA 프로그래밍 - 기본편
자바 ORM 표준 JPA 프로그래밍 - 기본편
수강정보
(216개의 수강평)
2354명의 수강생
스킬태그 #Java, #JPA, #Spring Data JPA
5개월 할부시
월 24,200원121,000원
지식공유자 : 김영한
54회 수업 · 총 16시간 1분 수업
기간 : 평생 무제한 시청
수료증 : 발급 강의
수강 난이도 : 초급
김광훈 프로필

Spring boot에서 EntityManager를 사용하여 Transaction 사용 시 오류 질문드립니다. 김광훈 6시간 전
안녕하세요 급 호기심에 Spring boot 에서 EntityManager를 사용하여 명시적으로 트랜잭션을 사용해보았는데요. 아래와 같은 오류가 떠서 질문드립니다 트랜잭션 템플릿을 사용해서 실행시켰을 떄는 오류없이 잘되었는데, EntiyManager를 사용해서 트랜잭션을 사용하면 위와 같은 에러가 출력되는 이유가 궁금합니다 !! 테스트한 코드는 아래와 같습니다. (예제 코드를 코틀린으로 올린 점 죄송합니다 ㅠㅠ) 감사합니다 !!

0
kangsy763 프로필

양방향 관계 질문이 있습니다. kangsy763 5일 전
안녕하세요 영한님, 프로젝트를 하다가 막히는 부분이 생겨서 해당 부분 복습하다 이 부분에도 궁금한점이 생겨 질문드립니다! 1.  Team team = new Team();team.setName("java");Member member = new Member();member.setUsername("kang");member.setTeam(team);em.persist(team);em.persist(member); 다음과 같은 상황에서는 insert 문이 2번 나갑니다. Team team = new Team();team.setName("java");Member member = new Member();member.setUsername("kang");member.setTeam(team);em.persist(member);em.persist(team); 위의 상황에서는 insert문 2번 후에 update 문이 나갑니다. 이 이유는 member.setTeam(team); 을 했지만 jpa는 엔티티 저장시에 연관된 엔티티들이 모두 영속 상태여야 하니깐(team의 id가 없으니깐?) team_id를 null 로 두어서 em.persist(team) 후에 update 문이 호출된 것으로 보이는데 맞나요 ??  사실 이 질문을 드리는 이유는 제가 현재 진행하고 있는 프로젝트에서 어떻게 처리해야할지 의문이 드는 부분이 생겨서입니다. 2. 티켓판매 어플리케이션이고, Order 테이블이 있고 Ticket 테이블이 있습니다. 일대다 매핑을 해둔 상태입니다. 주문을 받으면 해당 티켓을 주문에 등록하는 느낌입니다.  그래서 Order 를 생성 시에 Ticket을 생성한 후에 Order와 매핑을 해주려고 했습니다. 그런데,  'Many'(Ticket) 쪽을 먼저 save 한 후에(영속성컨텍스트에 올린 후) 'One' (Order)에 집어넣고 order를 save 하면 1번 질문과 같이 update 문이 나갈 것이라는 것을 알게되었습니다. 이 로직은 OrderService -> OrderRepository 에서 일어나는 로직입니다. 설계가 잘못된건가요? Ticket 을 create 하는 부분에서 order를 생성을 먼저하는 것이 맞다고는 생각이 드는데, 실제 주문단계를 생각해보면 order 안에 ticket이 있는 것이라고 생각이 들어서 인지부조화가 오는 기분입니다... 어떻게 해야할까요? +)  생각해보니깐 jpa 활용 1편 주문 관련 부분이랑 굉장히 유사한 것 같은데 해당부분을 다시 복습해보겠습니다...

3
이지훈 프로필

dtype 관련 질문입니다. 이지훈 6일 전
서버쪽에서 이 아이템이 어떤 dtype인지 가져오는 서비스 로직을 만드는게 가능할까요??JPQL로 가능할거같다는 생각이들긴 하는데 JPQL을 공부해보지 않아서 잘 모르겠습니다ㅠ 추가로 SQL을 어느정도 안다고 했을때JPQL을 따로 공부해야할 필요가 있나요? 아니면 이후 강의 계속 수강하면서 모르는부분 구글링하면서 해도 괜찮을까요

2
hun 프로필

테스트 코드 관련 질문 hun 6일 전
안녕하세요, 영한님 강의 정말 잘 듣고 있습니다! 다름이 아니라 테스트 코드 관련 질문사항이 있습니다. 1. 단위 테스트에서 @DataJpaTest를 사용하여 slice Test를 하는 것과 mock 객체를 생성하여 테스트 하는 방법 중 어느 방법이 더 옮은 방법 인지 알고 싶습니다. 2. 테스트 시 주로 h2를 사용하는데, 테스트시 특정 db에 대한 방언을 지정 후 테스트 하는 것이 좋은지, 아니면 h2 기본값을 사용하는 것이 좋은지 궁금합니다. 질문을 하다보니 강좌 내용과 약간 동떨어진 내용같아서 죄송합니다ㅠㅠ

1
이인규 프로필

영한님 엔티티 setter 관련해서 질문드립니다. 이인규 6일 전
안녕하세요 영한님, 영한님의 책 및 강의와 함께 하이버네이트 레퍼런스를 보면서 공부하는 학생입니다. 하이버네이트 레퍼런스를 보니 지연 로딩을 위한 프록시 생성을 위해서 getter/setter를 구현하는 것을 추천하고, 적어도 package 가시성의 getter/setter가 필요하다고 명시가 되어있어서 관련해서 질문드립니다. 저는 엔티티 객체에 사실 setter를 쓰게 되면 가시성도 떨어지게 되고, 불변객체가 아니게 되서 setter를 안쓰고 있었는데, 지연로딩을 위해서 setter를 써야 한다고 나와있어서 좀 헷갈리는 부분이 있어서 질문드립니다.  혹시 setter를 안써도 지연로딩을 사용할 수 있는 방법이 있는건가요? 아니라면 규약에 따라서 엔티티에는 setter를 명시하고 사용해야 하는건가요

2
이지훈 프로필

H2 DB 연결 질문입니다. 이지훈 9일 전
이미 사용됬다는 에러가 자꾸 떴는데 url창 localhost로 변경하고 tcp 붙이고 하면서 어떻게 하다보니 해결은 했습니다. 그런데 궁금한점이 있어서 질문드립니다!persistence.xml 파일에서 적는 경로는 프로젝트 파일 경로가 아닌가요? 현재 이 강의 프로젝트에서는 아래 사진처럼 jdbc:h2:tcp://localhost/프로젝트경로 형태로 작성했습니다. 연결이 됬습니다! 그런데 이전에 실전 활용1 강의 프로젝트에서는 프로젝트 경로를 적지않았습니다. 지금보니 이게 어떻게 연결된건지 이해가 안갑니다ㅠ설정파일에서 적는 url은 그냥 아무렇게 적고 연결시 똑같이만 적어주면 되는건가요? 위 사진은 이전 강의 프로젝트 application.yml 부분입니다.둘다 연결은 잘 됩니다!

2
shekwl24 프로필

allocationsize = 50으로 하니 오류가 뜨네요 shekwl24 10일 전
allocationsize를 1로했을때는 잘나오는데 50으로 바꾸니 오류가 뜹니다. ㅠㅠ 요 근래 강의를 듣게되면서 질문을 하루에 하나씩 하게되는 것 같은데 항상 빠르게 답변해주셔서 감사드립니다.

3
우리팀 프로필

여기 사람있어요 퇴근좀 시켜주세요. 우리팀 11일 전
안녕하세요 선생님, 몇시간 동안 고민하다가 답이 나오지 않아 이렇게 질문드립니다. 아래 코드와 같이 doByScheduler() 메소드와 doByClient() 메소드에서 synchronized 키워드를 가진 task() 메소드를 호출하고 있습니다. 시나리오:  doByScheduler() 호출 후 수행 중에 doByClient() 호출 1. doByScheduler() 로 인해 task() 메소드 수행,      1.1. 74번 라인에서 데이터 가져옴      1.2. 76~82번 라인: 가져온 데이터로 비즈니스로직 수행 후 save 작업이 진행 됨      1.3. 84번 라인에서 업데이트 된 List가 호출 됨 2. doByScheduler() 종료 후 doByClient() 로 인해 task() 메소드 수행, (synchrous)     ** 2.1. 74번 라인에서 [1.3] 의 결과인 List 가 호출됨 (예상)         현상 : [1.1] 의 내용이 보여짐 위와 같은 현상이 왜 발생이 되는걸까요? synchronized를 사용하면 예상대로 동작할 줄 알았는데.... 안되더군요 결국 해결은 아래와 같이 repository에 있는 해당 쿼리의 메서드에 직접 @Lock을 줘서 해결하였는데.. 도저히 이해가 되지 않습니다 ㅜㅜ 답변 부탁드립니다! 감사합니다.

1
shekwl24 프로필

flush()자동 호출되는 것중에 이것도 포함이 될까요? shekwl24 11일 전
Member member = em.find(member.class, 150L) System.out.println(member.getId() == 150L); 이런경우에도 데이터베이스에 쿼리를 날려서 데이터를 가져와야 되니까 flush()가 호출되는게맞을까요?

2
석민 프로필

엔티티매니저 동시성 문제 석민 12일 전
강의 잘듣고 있습니다.  1. 엔티티 매니저를 사용할 시에, 쓰레드가 안전하지 않다, 동시성 문제가 발생할 수 있다. 라는 내용을 책에서 본적이 있습니다. 뭔가 동시성 문제가 발생한다면, 한개의 리퀘스트에서 생성하는 1차캐시 내에서 동시성 문제가 발생하진 않을 것 같고, 애플리케이션이 동작하는 동안 여러 클라이언트가 접근할 수 있는, 2차캐시에서 발생할 것 같다는 생각이 들었습니다. 혹시 제 생각이 맞을까요? ㅎㅎ

3
shekwl24 프로필

em.close() 질문있습니다! shekwl24 12일 전
엔티티매니저를 종료시키는 것이 하나의 트랜잭션이 종료되었을때로 보면 맞을까요? 아니면 하나의 메소드, 기능(회원가입 등.)이 끝났을 경우로 봐야할까요? em 작업 단위가 궁금하고 em도 엔티티매니저 팩토리처럼 계속 사용하면 왜 문제가 되는지 궁금합니다!

1
JEONGHO HAN 프로필

Category에서 parent child 부분 질문이요 JEONGHO HAN 12일 전
안녕하세요~ 관계형 db는 지식이 좀 부족해서 이해가 안가는 부분이 하나 있어요. @ManyToOne@JoinColumn(name = "PARENT_ID")private Category parent;@OneToMany(mappedBy = "parent")private List<Category> child = new ArrayList<>(); 셀프로 매핑한다고 하셨는데 무슨 의미인지 잘 모르겠어요.

1
bogenarc 프로필

커리큘럼과 관련있는 질문인지 잘모르겠지만 실무 관련 질문드립니다. bogenarc 13일 전
최근 다시 JPA에 대해서 공부를 하고 있고 현재는 반정도 진행하였습니다. 제가 근무하던 곳에서는 JPA를 전혀 도입하고 있지 않아서 실무 사례를 잘 찾을 수 없다 보니 질문드립니다. 현업에서는 쿼리를 짤 때, JPQL과 QueryDSL 중에 어떤 것이 더 많이 사용될까요. 두 방식이 배우기에 러닝커브가 있고 한쪽을 사용하면 다른 방식은 불필요한게 아닌가 해서 질문드립니다. 커리큘럼과 관련없는 사적인 질문일까 싶어 죄송합니다.

1
melo 프로필

1차 캐시 관련 질문있습니다. melo 14일 전
안녕하세요~ 강의에서 EntityManager의 1차 캐시의 성능 이점은 그렇게 크지 않다, 라고 말씀해주셨는데요. 1) 데스크탑 애플리케이션, 한 명의 유저. 2) insert, update, delete가 빈번하지 않은(flush 발생으로 1차 캐시가 자주 변경 되지 않는?), 데이터 조회가 주로 사용되는 DB를 사용 위와 같은 상황을 가정했을 때,  EntityManagerFactory와 EntityManager를 싱글톤으로 관리, (EntityManager의 1차 캐시 영속을 위해) 애플리케이션이 종료되기 전 까지 EntityManager close하지 않고 사용할 수 있을까요? 가능하다면, 실무에서 이런 방법을 사용하기도 하나요? 만약 위와 같은 경우라면, 1차 캐시에서 조회하는 성능 이점을 가져갈 수 있지 않을까 해서 질문 드립니다.

1
유재선 프로필

persist() 호출 시 시퀀스로 기본 키 값이 초기화 되는 원리가 궁금합니다. 유재선 17일 전
안녕하세요. 강의 너무 잘 듣고 있습니다. 이해가 잘 되도록 설명을 정말 잘해주셔서 재밌게 공부하고 있습니다. 강의를 듣던 중 의문이 생겨 질문드립니다. member의 아이디가 1로 출력됩니다. MySQL을 사용할 때(Oracle로 시퀀스를 만들어도 동일합니다.) persist를 호출하는 시점에서 memebr가 id로 1로 초기화가 되는데 내부적으로 setter를 호출해서 초기화되는 것이라고 생각했었습니다. 근데 setter를 지워도 초기화가 되는 것이 신기합니다. private 제어자로 설정했기 때문에 member.id = 1; 이렇게 할 수 도 없을텐데 어떤 과정으로 초기화가 되는건지 궁금합니다.

2
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스