자바 ORM 표준 JPA 프로그래밍 - 기본편

자바 ORM 표준 JPA 프로그래밍 - 기본편

(40개의 수강평)

468명의 수강생
jhwoo 프로필

Composite ID Key 질문 드립니다 jhwoo 6일 전

안녕하세요 영한님

오랜만에 질문드립니다

실무 레거시 코드에 JPA를 적용하려던 중 궁금한점이 생겨서 질문드립니다

기존 테이블의 PK가 컬럼 2개를 하나의 쌍으로 가진 composite 형태입니다

그래서 @IdClass를 이용한 매핑을 하였는데 문제는 select 후 PK로 사용하는 컬럼 중 하나의 값을 변경해서 Dirty Check 과정으로 업데이트를 하려고 하면 identifier of an instance of ... was altered from 메세지가 나오면서 에러가 납니다

메세지 내용과 Hibernate 1차 캐시의 개념을 생각해 본다면 어느 정도 이해가 가기는 하는데 혹시 composite 형태의 PK 필드 중 특정 필드만 변경해서 업데이트를 하는 것이 가능한가요?

2
아리마 프로필

Repository 생성 문의드립니다. 아리마 11일 전

영한님 안녕하세요. 

이제 기본편 학습이 끝나가고 있고, 곧 실전편 학습을 시작할 수 있을 거 같습니다. ㅎ

또 문의드릴 내용을 하나 들고 왔는데요.

쿼리 실행을 할 수 있는 방법들이 JPA 에는 생각보다 다양한 것 같습니다.

Spring Data JPA 환경에서 반복사용할만한 Repository 기본 틀을 한번 만들어 보고 있는데요.

아래와 같은 구성으로 틀을 만들어 놓으면 중소형 프로젝트를 할 때 큰 무리가 없어 보일 거 같은데

좀 개선이 필요할만한 부분이 있다면 조언 부탁드릴께요.

-------------------------------------------------------------------------

Book 이라는 도메인이 있을 경우

1) interface BookCustomRepository

2) interface BookRepository extends JpaRepository, BookCustomRepository

3) class BookCustomRepository extends QuerydslRepositorySupport  implements BookCustomRepository

repository 패키지 내에 위 3가지 구조로 와꾸를 만든 뒤

2번에서는 "쿼리 메소드" 기능과 @Query 활용

3번에서는 JPQL 과 QueryDSL 활용한 구현체 작성

-------------------------------------------------------------------------

아직 기본편과 책만으로 학습중이라 내공이 부족한데 실무 관점에서 몇마디 조언해 주시면 감사하겠습니다.

그리고 근처 타팀에서 JPA 프로젝트하는 곳을 살짝 들여다 봤는데 Repository 구현체는 전혀없고

Service Layer 에서 QueryDsl 을 작성하고 있던데 이러한 개발 형태는 어떨 지 함께 의견 부탁드릴께요.

1
아리마 프로필

Cascade 질문 드립니다. 아리마 15일 전

영한님 안녕하세요.

영한님 책과 강좌를 통해서 JPA 학습에 몰입 중인데 DDD, Spring Data JPA 개념과 함께 학습을 하려고 하니

생각보다 배워야 할 내용들이 너무 많네요.. 질문 드릴 분이 영한님 밖에 없어서 한번 더 문의를 드립니다.

DDD 책을 보면 Aggregate 의 리파지토리를 만들 때, Aggregate root 에 대해서만 제공하라고 하고 있습니다.

영한님 책의 예제에서 보면 Order, OrderItem, Delivery 같은 Entity 를 하나의 Aggregate 으로 묶을 수가 있고

Order 를 Aggregate Root 를 볼 수 있을 거 같은데요.

이 경우 Order 에 대해서만 Repository 를 제공할 경우, Cascade 를 사용하지 않고서는

Order, OrderItem, Delivery 를 한번에 저장할 수 있는 방법이 없을 거 같은데요..

(OrderItem 이니 Delivery 는 Repository 가 없으므로)

이렇게 Aggregate Root 에 대해서만 Repository 를 제공할 때, 혹시 Cascade 를 활용하지 않고

저장할 수 있는 방법이 있나요?

만약 Cascade 가 유일하다면 이러한 구조로 개발을 하는 것이 가장 보편적이 방법인지도 알고 싶습니다.

1
curtiskim 프로필

안녕하세요 쓰기지연 -insert 장표의 설명에 관해 질문이 있습니다. curtiskim 16일 전

트랜잭션을 지원하는 쓰기 지연 -insert

에서 jpa가 특정 옵션을 켜면 쓰기 지연 insert가 된다고 말씀해 주셨는데 이는 기본 동작이 아니었나요?

어떤 옵션으로 이를 컨트롤 할 수 있나요! 

+ 강의 정말 잘듣고 있습니다 감사합니다.

1
김정규 프로필

강의 중에 값타입의 수정에 대해서 다뤄주셨는데요. 문득, 엔티티 수정에 대해서 궁금해져 질문드립니다. 김정규 16일 전

안녕하세요. 스프링뉴비입니다.

양질의 강의로 JPA 학습을 잘 이어오고 있습니다.

다름이 아니라, 엔티티에서 변경감지에 대해 문득 궁금한 내용이 생겨 이렇게 질문 남겨드립니다.

 흔히 엔티티에 롬복 @Setter 남기지 않고 코딩을 권장하고 있습니다. 불변성을 보장하고, 불필요한 사이트 이펙트를 해결하기 위해서라는 측면에서. 이 부분은 충분히 공감합니다.

첫 스프링 토이 프로젝트로 JPA에 대해 깊히 알지 못한 채, 엔티티 특정 값을 수정하기 위해 늘 Builder패턴으로 객체를 만들어 .save(Object) 로 해당 id를 조회해서 엎어치기를 했었는데요.  이번에 변경감지를 사용하고자 했더니, setter가 아니면 안되는 것 같더라구요.

혹시 더티체크를 불변성을 어느정도 보장할 수 있는 안전성있게 할 수 있는 방법이 있을까요? 저는 주로 생성자를 통해 불변성이 보장되는 Value Object 스럽게 써왔습니다.

 JPA에서 더티체크를 위해서 setter를 설정해야된다는 것은 무조건일까요? 혹시 되도록 사이드이펙트가 일어나지 않도록 하는 또다른 방법은 없을까요? 더하여, 김영한강사님께서는 객체내에 setter라는 단어보다는 chageXX 이런식으로 하는 것을 권하셨던걸로 기억하는데, 혹시 맞을까요?

3
아리마 프로필

연관관계 질문 드려요. 아리마 18일 전

영한님 안녕하세요. 

실무에서 Master / Detail 의 일대다 관계 구조로 설계된 기능들이 꽤 있는데

화면에서 Master 를 먼저 등록 완료하고, 이후 등록된 Master 중 택일하여 Detail 을 등록하는 방식들입니다.

만약 이러한 구조에서 연관관계 맵핑을 하지 않고 Join 이 되는 외래키를

Detail 의 속성에 넣어 구현할 경우, 연관관계 맵핑 방식과 비교하여 단점이 클까요?

JPA 를 한번도 경험해보지 않은 팀원들이 개발을 해보려고 하니

연관관계 맵핑을 적용하는 것에 어려움이 있어 당장은 위 구조를 활용하려고 하네요.

저도 아직 영한님 강의만 듣고 있는 상태라 큰 도움이 못되고 있고요..

의견 좀 주시면 감사하겠습니다.

그리고 QueryDSL 내용이 강의에 전혀 포함되어 있지 않아 아쉬움이 크네요 ㅠ

1
bk 프로필

cascade 질문입니다 bk 18일 전

부모엔티티에서 자식엔티티를 mappedby로 양방향 잡으면 readonly로 데이터 생성 변경 모두 불가하지만 cascade를 사용하면 가능하다라고 이해하는게 맞는건가요?

반대로 자식엔티티에 조인된 부모엔티티에 cascade하고 자식엔티티에 부모엔티티넣으면 pk뿐만 아니라 부모도 함께만들어 진다

즉, 방향성이든 주인이든 상관없이 같이 영속상태가되어 저장된다고 이해하면 맞을까요?

1
junmo sung 프로필

동적인 쿼리에 대한 질문 junmo sung 19일 전

우선 좋은 강의 감사합니다!!

1.
iBatis나 MyBatis를 사용하면 동적인쿼리에 대한 처리가 가능합니다.
하지만 JPA에서도 동적인 쿼리에 대한 처리가 가능한가요?

예를 들어 if조건에 의한 동적쿼리를 생성해야할 경우에 대한 처리 등등

2.
이러한 문제들을 해결하기 위해 사용하는 프레임워크중에 Querydsl, Jooq라는 대표적 프레임워크가 있다고 인지하고 있습니다.

그렇다면 보통 현업에서는 일반적은 SQL은 JAP를 사용하고,
동적인 복작한 쿼리는 Querydsl, Jooq를 사용한다고 인지하면 되겠습니까??

굉장히 추상적인 질문이지만 궁금해서 이렇게 남겨봅니다.

강의너무 좋습니답... 고생하십쇼~

감사합니다.

1
jhwoo 프로필

2가지 질문 추가로 드립니다 jhwoo 20일 전

안녕하세요 또 질문드리게 되었네요^^

항상 감사드립니다

1. EntityManager Thread Safe 질문

책을 보던 중 책 91페이지에

- EntityManager는 스레드 간에 절대 공유하면 안된다고 되어 있습니다

강의 중 예제에서 Repository 생성하실 때 Spring Data Jpa에서 제공하는 JpaRepository 사용하지 않고 직접 EntityManager 주입받아서 사용하시던데 이 때 Spring 기본 정책인 싱글턴 빈이 등록되면 모든 쓰레드가 하나의 EntityManager를 공유하는 것이 아닌지에 대한 의문이 들어 질문드립니다

2. Spring OSIV 사용 시 Controller에서 Lazy 로딩 후 Object -> JSON 변환 중 serialize 방법

- REST API서버를 개발중입니다

  Controller에서 Lazy 로딩 후 jackson의 API를  이용해서 Object -> JSON 변환하는 중 프록시 객체의 "hibernateLazyInitializer", "handler" 2개의 필드가 getter가 없어 serialize 실패하는 현상이 있습니다

현재까지 생각한 해결 방법은 아래의 2가지 방법입니다

       1) Mapper 변환 옵션에서 2개의 필드만 except 처리 

       2) Mapper 사용하지 않고 2개의 필드를 제외한 각 필드의 Getter를 호출해서 직접 Json String 생성

Controller에서 Lazy 로딩을 하는 상황에서 위 2가지 방법이 아닌 다른 방법이 있는지 궁금합니다

2
김정규 프로필

혹시 각 엔티티에 ID를 대문자로 쓰는건 어떤 이유가 있는걸까요? 김정규 21일 전

만약 엔티티가 xx 라면 xx_id 이렇게 쓰는건 저도 좋은 방식이라고 생각하는데, join_column, 기본키를 위한 id을 명명시 대문자로 쓰는 이유가 궁금합니다 : )

1
jhwoo 프로필

좋은 강좌 항상 감사드립니다. 추가로 질문이 있습니다 jhwoo 25일 전

안녕하세요 영한님

이전에 드렸던 질문에 대한 친절한 답변 감사드립니다

추가로 2가지 질문이 있어 질문드립니다

1. 회원테이블(Member)과 부서테이블(Department)이 있고 회원테이블에서 부서테이블을 ManytoOne으로 매핑하였습니다

     회원의 부서정보 수정 시 Client에서 회원테이블의 ID값, 부서테이블의 ID값을 전송해 주는 것으로 설계하였습니다

     서버에서 수정 시 아래의 2가지 방법이 가능한 것으로 테스트 하였습니다

     편의상 EntityManager를 em이라고 하겠습니다

       1) 방법1

            Department findDepartment = em.find(Department.class, Client가 전달한 Department ID값);

            Member findMember = em.find(Member.class, Client가 전달한 Member ID값);

            findMember.set(findDepartment)

           이때는 Select 쿼리 2개 (Department, Member), Update 쿼리 1개 (Member)가 발생합니다

      2) 방법2

            Member findMember = em.find(Member.class, Client가 전달한 Member ID값);

            findMember.set(new Department(Client가 전달한 Department ID값));

           이때는 Select 쿼리 1개 (Member), Update 쿼리 1개 (Member)가 발생합니다

      2번 방법은 Select 쿼리 1개가 줄어드는 장점이 있는듯 하지만 JPA의 취지에는 맞지 않는 방법인듯 합니다

      FK 업데이트를 위한 용도로만 2번 방법을 사용하는 것에 대한 의견이 궁금합니다

2. persist 관련 질문

       트랜젹션 시작

        Member member = new Member();

        member.setName("Member-A");

        em.persist(member);

        member.setName("Change");

       트랜젹션 끝

     

     위 코드를 JPA 입장에서 보면 Insert문 생성 후 member의 name이 변경되었으니 Insert문의 name 값만

      "Member-A" -> Change"로 해서 한번의 insert만 실행할 것이라고 예상하였는데 테스트를 해보면 항상 insert 후

      update가 실행됩니다

      ID 전략문제인거 같아 여러가지 전략을 변경해 봐도 동작은 동일합니다

      위 내용에 대한 의견 부탁드립니다

     

     

     

      

                

4
아리마 프로필

좋은 강좌 감사합니다. 제 질문은요.. 아리마 25일 전

영한님, 티아카데미 동영상을 우연히 본 뒤, 강의에 반해서 IT강의에 처음으로 결제를 해보게 된 초보개발자 입니다.

아직 강좌 학습이 진행 중인 상태에서 궁금한 것 몇 개만 문의드려봅니다.

1) 보통 시스템 운영을 하다보면 현업 요청으로 인한 자료 추출이나 그 밖의 운영상 확인을 위해 실제 SQL 문을 소스 상에서 긁어서 DB Tool 로 결과 조회를 하는 경우가 상당한데요. JPA 로 개발을 하게 된 시스템은  위와 같은 SQL 실행이 필요할 때, 매번 해당 기능을 로컬에서 실행을 한 뒤, 이후 로그에 나타난 SQL 을 긁어서 활용하는 방식을 취해야 할까요?

2) 약간 좀 어려울 수 있는 질문이 될 수도 있을 거 같은데요. 연관 관계 맵핑 강좌를  듣고 있는데 하나의 객체가 외래키를 속성으로 가지는 것이 객체지향스럽지 않다는 말씀을 하셨고, (Member 에서 team_id) 이보다는 객체참조를 중요하게 설명하고 계신데요.

막상 또 설계나 개발을 하다보면 객체참조보다 외래키를 속성으로만 포함시키는 경우도 많이 보게 됩니다.

아직 객체지향에 익숙치가 않아서 주로 언제 객체참조를 쓰는 게 좋고 언제 속성을 사용하는 것이 좋은 지 감이 잘 오지 않는데 영한님이 생각하시는 기준이 있다면 설명을 해주시면 도움이 될 것 같습니다.

1
jhwoo 프로필

외래키 생성 옵션이 있는지 궁급합니다 jhwoo 25일 전

안녕하세요

인프런 강의 잘 듣고 있습니다

강의 내용에서 조금 벗어나는 질문일수도 있으나 실무에서 많이 겪는 문제라고 생각하여 질문드립니다

유저 테이블(users)과 주문 테이블(orders)이 있고 주문테이블에서 manyToOne으로 유저 테이블이 매핑되어 있습니다

실무에서 유저가 탈퇴 시 DB에서는 어떻게 처리하는지 궁금합니다

    - 1) 외래키 제약조건이 있을 떄

             주문테이블 - 탈퇴한 유저의 주문 정보 모두 삭제

             유저테이블 - 주문테이블에서 탈퇴한 유저가 주문한 내역을 모두 삭제 후 유저 테이블에서 삭제

   - 2) 외래키 제약조건이 없을 때

             주문테이블 - 변경 없음 (삭제된 유저가 주문한 내역은 주문은 조회 되겠지만 주문한 유저는 조회 불가)

             유저테이블 - 유저 삭제

   - 3) 외래키 제약조건이 없을 때

             주문테이블 - 변경 없음 (주문 내역 조회 시 주문한 유저 조회 가능)

             유저테이블 - 유저 상태를 저장하는 필드를 따로 두고 탈퇴 상태로 플래그 변경

위 세가지 방식 중 하나를 선택해서 사용할 거 같은데 실무에서는 주로 어떻게 처리하는지 궁금합니다 

개인적으로 고민하는 방안은 2,3번 중 하나의 방식으로 처리를 하려고 하는데 이 때는 외래키 제약조건이 없어야 하기 때문에

JPA에서 DDL 생성 시 상대 테이블의 PK를 참조하는 컬럼은 생성하면서 외래키 제약조건은 생성하지 않는 방법이 있는지 알고 싶습니다

 

2
안재용 프로필

영속성 전이 cascade 질문드립니다. 안재용 27일 전

cascade all 과 persist 가 뭐가 다른지 자세히 모르겠습니다.

all = persist + remove 개념인가요?

1
Park Minwook 프로필

h2 에러 처리 설명으로 해결이 안되는 경우 Park Minwook 27일 전

혹시 저같은 경우가 계실까봐 작성해 둡니다.

강사님께서 h2 에러 관련해서 따로 아래 링크처럼

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21684

해결 방법을 알려주셨는데,

저는 그래도 작동하지 않고 같은 에러를 보이길래, h2를 실행할 때 관리자 권한으로 실행하고 나니 잘 되었습니다.

맥을 사용하고 있고, h2 디렉토리에서 sudo ./h2.sh  로 실행 하였습니다. 

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