실전! 스프링 데이터 JPA

실전! 스프링 데이터 JPA

(26개의 수강평)

608명의 수강생
월29,333원
88,000원
3개월 할부시
지식공유자 · 김영한
32회 수업· 총 7시간 17분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 중급
sangyong choi 프로필

별건 아닌데 pdf파일에 오타가 있습니다. sangyong choi 7일 전

public Class BaseEntity extends BaseTimeEntity 인데
PDF에는 public Class BaseEntity extends BaseEntity 라고 되어있습니다...!

1
허진호 프로필

인터페이스 상속 관련 질문 허진호 21일 전

안녕하세요 커스텀 리포지토리 네이밍 관련 궁금한점이 있습니다.

커스텀 리포지토리를 실수로 MemberRepositoryCustomImpl로 네이밍했는데 MemberRepositoryCustom을 Impl한 클래스로 인식이 됐는지 MemberRepositoyTest에서도 정상적으로 동작했습니다.

네이밍을 MemberRepositoryCustomImpl로 한 것과 MemberRepositoryImpl로 한것과 기능상 차이가 있을까요?

1
Bulbasaur 프로필

API 통신 시, @Transactional 사용 관련 질문 드립니다. Bulbasaur 24일 전

안녕하세요. 강사님

매번 질문을 남겨 볼까, 말까 고민하다가 처음으로 질문 드립니다.

저는 SpringDataJpa를 먼저 사용하다가, 강사님 강의를 통해 JPA와 queryDSL을 공부하고 있습니다.

또한, 사내에서 신규 프로젝트 또는 레거시 프로젝트를 작업할 때 SpringDataJpa를 도입해 나가고 있습니다.

현재 API 통신을 하는 메서드를 작성할 때, API 통신 전 과 후 히스토리를 남기고 있는데 @Transactional 없이 한 메서드에서 사용을 하고 있습니다. 제가 생각할 때 잘못 사용 하다가, 원치 않는 결과를 초래할 수도 있을 것이라 생각이 들어서 아래 예제 코드와 같이 사용하고 있습니다.

그러나 요즘 들어 제가 작성하는 코드가 효율적이지 못하다는 것과 update와 관련된 부분은 영속성컨텍스트 내에서 이뤄져야 하지 않을까란 생각이 들었습니다. 조언을 얻을 수 있는 분이 주위에 많이 안 계셔서 이렇게 부끄럽지만 질문 드립니다.  

감사합니다.

@Transactional에 noRollback 옵션을 주고, 적절한 timeOut 시간을 정의해서 사용하면 괜찮을까요??

ex)

//API 통신 전 히스토리 생성

Hist updHist = histRepository.save(hist);

//API 통신

ResponseEntity<Result> exampleResult = restTeamplte.postForEntity(uri,HttpEntitiy,Result.class);

result = exampleResult.getBody();

//API 통신 후, 히스토리 업데이트를 위한 값 변경 메서드 (setter)

updHist.updateResult(result.getCd(),result.getMsg());

//히스토리 업데이트

historyRepository.save(updHist);

3
이시열 프로필

h2 접속오류 부탁드립니다. 이시열 1달 전

ㅇ문제가 무엇일까요. 

2
화이 프로필

다른 엔티티 저장 할때 화이 1달 전

1대N 관계인 두 엔티티를 동시에 저장할때 save메서드는 각각의 엔티티에 트랜잭션으로 처리하는거 같은데 하나의 트랜잭션으로 묶고 두 엔티티를 저장할 방법이 있나요??

1
dev 프로필

@Query 사용시 @Param 어노테이션이 필수 인가요? dev 1달 전

안녕하세요 강사님 강의 보는중에 궁금한점이 생겨서 질문 드립니다 ^^

쿼리 메소드 사용 강의 중에 @Query 사용에 대한 강의를 보다가 @Query 선언한 메소드에 사용하는 파라미터 변수들에게

@Param 어노테이션을 정의해주시는데요 해당 역할은 전 강의에서 설명해주셔서 알고는 있는데 @Param 이 없어도 잘 동작하는거 같아서요 ^^;

사용하는것이 권장되어야 할지 궁금합니다!

3
허진호 프로필

@PersistenceContext 질문 허진호 1달 전

안녕하세요 jpa api 강의와 이번 강의를 들으면서 repository에서 EntityManager를 정의하는 방식이 달라서 이 두 방식의 차이점이 궁금해서 질문드립니다.

항상 친절한 답변 감사합니다!

@RequiredArgsConstructor
public class ItemRepository {

private final EntityManager em;

@PersistenceContext
private EntityManager em;

1
이요한 프로필

테스트 코드에서 @autowired 사용 질문입니다! 이요한 1달 전

강의 중 테스트 코드 작성시 Repository 와 같은 경우 autowired가 아닌 생상자 주입을 권장한다고 해주셨는데 혹시 그 이유를 알 수 있을까요?? 

힝상 좋은 강의 감사합니다!

1
dksrudwns 프로필

외래키에 해당하는 컬럼으로 조회하고 싶을때는 어떻게 하면 될까요??? dksrudwns 1달 전

특정 팀 소속인 사용자 목록을 얻고 싶다면

Member Repository에서 아래와 같이 만들어서 

findByTeam(Team team, Pageable pageable);

Team 객체에 해당하는 Team의 id 값을 담아서 조회 하고 있는데 이러한 방식 맞나요??

4
@Todo 프로필

MultipleBagFetchException 관련 @Todo 1달 전

안녕하세요. 

아래와 같이 하나의 클래스에서 XToMany 연관관계를

2개 이상 사용을 하면 MultipleBagFetchException  

을 발생시키는데요. 이것을 좀 찾아보니 LIST -> SET으로 변경하면 간단히 해결이 되나 성능상 문제가 있는것으로 보이는데

실무에서는 이를 어떻게 해결하시는지 궁금합니다. 

1
@Todo 프로필

@Transactional관련 질문 입니다. @Todo 1달 전

package study.querydsl.repository;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.List;

@SpringBootTest
@Transactional
@Rollback(false)
class MemberRepositoryTest {
@PersistenceContext
private EntityManager em;

@Autowired
private MemberRepository memberRepository;


@Test
public void test() throws InterruptedException {
List<Member> members = makeList();
for (Member member : members) {
test1(member.getId());
Thread.sleep(1000);
}
}

private List<Member> makeList() throws InterruptedException {
List<Member> members = new ArrayList<>();
for (int i = 0 ; i < 20 ; i++) {
Member member = new Member("gon " + i, i);
members.add(member);
}
memberRepository.saveAll(members);
em.flush(); //<--- insert query는 생성되나 db 에는 아직 없음.

Thread.sleep(5000);
return members;
}

protected void test1(Long id) {
Member member = memberRepository.findById(id).get();
member.setUsername("Park");
memberRepository.save(member);
em.flush(); //<--- update query는 생성되나 db 에는 아직 없음.
}
}

안녕하세요 

위와 같은 예제에서 makeList 메소드에서 생성된 리스트를 실 db에 insert를 하고 

각 리스트 아이템을 처리하는 test1 메소드에서 처리된 아이템을 insert 를 하고 싶은데 em.flush를 해도 insert, update 쿼리만 발생되고 db에는 아직 결과가 들어오지 않고 test가 완전히 종료가 되는 순간 db에 값이 들어온것으로 확인 됩니다. 

이를 해결하기 위해서 class에 @transactional 을 제거하고 test1 메소드에 @Transactional을 붙이니 의도한대로 makelist에서 리스트 결과가 한번 db에 저장되고 

test1 메소드에서 처리된 결과도 순차적으로 db에 인서트 되는것으로 확인 했으나 연관관계가 존재하는 경우 fetch lazy 동작이 no session으로 안되던데 이를 해결하는 방법이 있는지요. 

질문을 정리하면 

1. Transactional 중간에 db에 값을 쓰는 방법이 있는지. 

2. class에서 @Transactional을 제거 하고 test1에 @Transactional을 붙이면 연관관계 fetch lazy가 동작을 하지 않는 이유가 무엇인지 

(제가 이해를 했을땐 test1 부터 영속성 컨텍스트가 관리되어 이후 메소드 호출부터는 transaction이 걸려서 fetch lazy가 동작될거라고 예상했습니다. )

친절하고 자세한 답변 늘 감사드립니다. 

4
jae uk choi 프로필

상속받는 엔티티 질문(outer join) jae uk choi 2달 전

강의 잘 보다가 문의점이 있어 질문드립니다.

상속받는 테이블의 경우에는 어떻게 처리하나요?

A의 모든 칼럼을 포함하는 B 가 있고 (+B의 고유한 항목 있음)

A전체 리스트를 조회하되, B 타입인 경우에는 B 항목까지 보고 싶은데.. (없으면 공백 조회)

@Query("SELECT new me.jaeuk.homework.product.dto.ProductStock(p.id, p.type, p.name, p.price, k.stock) FROM Product p LEFT OUTER JOIN Kit k ON p.id = k.id")
List<ProductStock> findProductStock();



.JpaTransactionManager@41bfa9e9]; rollback [true]

Hibernate: 

    select

        product0_.id as col_0_0_,

        product0_.type as col_1_0_,

        product0_.name as col_2_0_,

        product0_.price as col_3_0_,

        kit1_.stock as col_4_0_ 

    from

        product product0_ 

    left outer join

        (

            kit kit1_ 

        inner join

            product kit1_1_ 

                on kit1_.id=kit1_1_.id

            ) 

                on (

                    product0_.id=kit1_.id

                )

쿼리가 이렇게 뜨더라구요.. 혹시 어떤 방식으로 해결을 해야 할까요? 

4
JH K 프로필

save the transient instance before flushing 에러 JH K 2달 전

안녕하세요.

MemberRepositoryTest 시에 

List<Member> all = memberRepository.findAll(); 에서 

save the transient instance before flushing 에러가 발생을 하는데요.

인터넷에서 찾아보니 casecade 옵션을 넣어야 한다고 하는데 강의하신 소스와 자료와는 차이가 없는데요.

Member 엔티티의 Team 엔티티와의 @ManyToOne 에 casecade 를 적용하니 오류는 해결이 되었습니다.

혹시 이유를 알 수 있을까요?

1
yebon2002 프로필

객체 생성에 대한 방법 yebon2002 2달 전

안녕하세요? 첫강의부터 쭉 잘 듣고 있습니다.

JPA에 대한 질문이라기 보다는 객체지향 기법과 관련된 질문입니다.

엔티티 클래스에 최대한 setter지양하고 필드의 변경 포인트를 해당 엔티티로 모으는 것을 강조하셨고,

객체 생성 시점에 생성자로 필요한 필드들을 다 받아서 생성(저는 of가 더 좋네요)하는 게 좋다고도 말씀하셨지요.

근데 실무 개발하다보면 엔티티에 필드들이 최소 10개 이상은 되고 초반에 세팅되어야 할 값들이 많아지더라구요. 이 상황에서 파라미터가 10개 이상되는 argument constructor나 of를 이용해서 객체를 생성하는게... 맞는가? 예쁜가? 더 좋은 방법은 없는가? 생각이 들더라고요. 클린코드 같은 책보면 파라미터 개수는 3갠가 4개 이하로 유지하는게 좋다고도 하고 가독성도 떨어져 보입니다.

그래서 그냥 default constructor를 public으로 열어두고, setter도 열어둬서 객체 생성을 setAaa, setBbb, setCcc 등으로 해서 하나씩 하게 됩니다. 물론 세팅해줘야할 필드의 누락의 문제나 변경 포인트 관리 어려움 등의 문제가 생기겠지만요.

요약하자면, 생성 시점에 많은 필드들을 이용해 객체를 생성해야 할 때 어떻게 하시는지, 어떻게 하는게 좋을 지 의견 부탁드립니다.

감사합니다.

1
kim 프로필

intellij 질문 드립니다. kim 2달 전

최신 프로젝트로 만들어서 사용하고 있는데

@Entity를 붙이면 command + N 으로 constructer를 만들면 defalut 생성자만 생성되는데

혹시 설정이 바뀌었을까요?

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