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

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

(94개의 수강평)

1100명의 수강생
월40,333원
121,000원
3개월 할부시
지식공유자 · 김영한
54회 수업· 총 16시간 1분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 초급
Dongmin Choi 프로필

Spring Data JPA 관련 질문드립니다. Dongmin Choi 12시간 전

안녕하세요 김영한님!

강의 중에 Spring Data JPA에서 사용하는 clearAutomatically 관련해서 찾아 보았습니다. 

언급해주신 clearAutomatically에 대해서는 잘 이해가 되었는데, 보다보니 @Modifying에 또 다른 애트리뷰트인 flushAutomatically를 보게 되었는데 이 애트리뷰트는 default 가 false이고, 기능은 해당 쿼리 호출 전 flush를 하는 것이라고 나와있는데, 여기서 혼란이 생겨 질문드립니다.

이 애트리뷰트와 상관 없이 벌크 연산을 하면 자동으로 연산 전에 flush가 발생하는 것으로 이해하고 있습니다. 

그렇다면 이 애트리뷰트의 역할이 정확히 무엇인지 잘 모르겠어서 질문드립니다.

그리고 추가적으로 벌크 연산 후 (clearAutomatically = false 상태로) findById 를 하면 영속성 컨텍스트에 엔티티가 존재해 쿼리를 날리지 않지만, findAll 을 한 경우 쿼리를 날리는데 벌크 연산이 진행되지 않는 값을 날립니다.

이런 경우는 DB에 접근을 했는데 조회한 값이 영속성 컨텍스트를 업데이트 시키는 것이 맞지 않나요???

학습 테스트 중 혼란이 있어 추가 질문 남깁니다..

 

2
Jay 프로필

전체코드 조회하는 방법을 알고싶습니다. Jay 1일 전

안녕하세요, 영한님 덕분에 JPA 재밌게 배우고 있습니다.

지난시간부터 궁금했던건데 클래스 Declaration에서 전체코드를 어떻게 확인하실 수 있는건지 궁금합니다.  

디컴파일러로 JD-GUI 플러그인을 설치해봤으나, 여전히 전체 코드를 확인할 수가 없습니다. 인텔리제이에서 설정 하는 방법이 있나요?

 

1
jungjin1.kim 프로필

Insert 할 때 간단하게 하는 방법 jungjin1.kim 3일 전

테이블에 새로운 Row 를 추가하기 위해서 Entity 객체를 생성하고 persist 합니다.

그런데 Entity가 다른 Entity를 참조(@ManyToOne) 하는 경우,

새로운 Entity 객체를 생성하면서 그 참조하는 객체까지 넣어 줘야하는 상황에 대해 질문드립니다.

예를 들면 아래와 같은 케이스 입니다.

public class User{
    @Id
    private String userId;
    @ManyToOne
    private Team team;
}

public class Team{
    @Id
    private String teamId;
}

새로운 사용자를 하나 추가하기 위해서 Team 객체가 필요합니다.

이럴 때 Team 객체를 수작업으로 생성하지 않기 위해 TeamRepository에서 findById 와 같은 메소드로 객체를 가져온 뒤

User Entity를 만들때 넣어 줄 수 있습니다.

하지만 이렇게 되면 코드도 길어지고 User를 만드는 도메인 객체에서 Team Repository 까지 알아야 하는 상황이 생기는데

더 간단하게 User Entity를 만들수 있는 방법이 있을까해서 질문드립니다.

예를 들면 new User() 할 때 teamId를 넘겨주어서 자동으로 참조되는 객체까지 가져오게 하는 방법이라던지...

좋은 조언 부탁드립니다.

1
Junyoung_Choi 프로필

제가 이해한 것이 정확한지 궁금합니다. Junyoung_Choi 4일 전

1. 이렇게 표로 정리된 내용이 맞나요?

2
ab81004 프로필

안녕하세요! OneToOne 관계에서는 어떻게 하나요? ab81004 6일 전

안녕하세요! 수업 정말 잘 듣고 있습니다 ㅎㅎ

궁금한 점이 있습니다. 아마도 뒤에 있지 않을까 하는데요.

OneToOne 관계에서는 어떻게 하나요?

이것도 역시 FK가 있는 쪽이 주인이 되는 건가요?

1
dareme798 프로필

7분18초 내용 질문있습니다. dareme798 6일 전

7분18초에 팀에서 멤버들을 List로 출력할때 위에서, 

em.flush()랑 em.clear()를 사용해야만 쿼리가 DB로 보내지고

@OneToMany(mappedBy = "team") 애노테이션 때문에 ,

members 리스트에 멤버객체가 저장되는건가요 ?? 

em.flush()랑 em.clear()를 사용하는 이유가 헷갈립니다.

플러쉬랑 클리어를 안해주니 팀에서 members 가 비어있더라구요..

천천히 듣고있지만 이해가 안되서 여쭤봅니다 ㅜ.ㅜ

2
GPK 프로필

DDL에 해당하는 annotation들. GPK 6일 전

당연한 것을 질문하는 것 같기도 합니다만,

Entity 코드 작성시 DDL에 해당하는 annotation들을 실제 DB 상태에 맞게 모두 맞춰주는게 좋을까요?

실제 현업에서는 DDL에 의존해서 DB 생성을 하지 않을거라면,

소스 코드 상의 DDL과 실제 DB가 맞지 않는 상황이 발생할텐데, 

실제 DB 상황과 DDL의 내용을 계속 동기화 시켜주는게 필요할 것 같아서요.

column 길이 같은 것은 꼭 맞춰줘야할 것 같은데,

unique, index 설정 같은 것은 Entity 코드에 꼭 동기화시켜서 넣어줄 필요가 없을 것 같기도 하고...

1
GPK 프로필

복합키, 대리키 질문 GPK 6일 전

DB 초보, JPA초보라 영한님 강의가 정말 큰 도움이 되고 있습니다.

아래와 같은 DB 구조인데

// 한시간단위 통계
device_data_hourly
	system_id   varchar	PK
	device_id   varchar	PK
	target_date datetime
        yyyymm      varchar	PK
	dd          varchar	PK
	hh          varchar	PK
	data        float

복합키를 생성하기 위해 영한님 JPA 책에서 @IdClass나 @EmbeddedId를 보고 있습니다.

1) 강의에서도 대리키를 강조하셨고, 
인터넷 검색해보니 예전에는 복합키를 매우 많이 썼지만, 요즘은 대리키를 많이 쓰는 추세인 것 같습니다.

위와 같은 경우는 
저렇게 복합키를 생성하면 index도 걸리니까, 별도로 index를 걸 필요도 없어서 괜찮아 보이는데,
JPA 구현상으로는 불필요하게 code가 복잡해지는 것 같습니다.

그냥 대리키를 사용하고 index(system_id, device_id, yyyymm, dd, hh)를 걸어주는게 더 나을까요?

2) 테이블에서 yyyymm, dd, hh, mm 등의 필드를 별도로 분리해서 두는 이유가
   Batch Task 등에서 통계 조회시 group by 등을 할 때 성능 최적화를 위해서 저렇게 하는 것인가요?
   yyyymm, dd 등의 필드가 아니라 target_date(datetime)을 기반으로 값을 추출해서 조회하면 성능이 많이 차이나나요?

3) 위 통계 Table의 target_date 필드의 필요성
   yyyymm, dd, hh, mm 등의 필드가 있는데도 target_date를 별도로 두는 이유는  검색시 날짜 시간 구간 검색 query시 편의를 위해서인가요?

질문을 쓰고 보니, JPA 질문이 아니라 그냥 Database 질문이 되버렸네요. ^^;;

3
ab81004 프로필

안녕하세요! ab81004 6일 전

안녕하세요! 현재 강의를 수강 중인 학생입니다. 덕분에 열심히 공부하고 있습니다! ㅎㅎㅎ

제가 수업 이전에 이미 조금씩 스프링 부트를 공부 중이었습니다만

Autowired를 그 동안 사용해왔습니다. 그런데 수업에서는 entityManager를 사용 중입니다.

인터넷에서 찾아보니 Autowired는 사용하지 않는다고 적혀 있습니다. 

갑작스럽지만 왜 그런건지 알 수 있을까요?

그리고 만약에 둘다 사용해도 괜찮다면, 현업에서는 어떤 것을 더 자주 사용하나요?

1
dareme798 프로필

강의내용 dareme798 8일 전

강의 내용을 블로그로 정리해도 될까요 ?? 

1
이종석 프로필

복합키 사용에 대해서 알고 싶습니다. 이종석 9일 전

김영한 강사님 안녕하세요~

강사님의 모든 강의를 다 수강하고 큰 도움을 받았습니다. 

덕분에 이번 프로젝트는 Spring Boot 기반에 QueryDSL을 사용하게 되었습니다. 

질문 드리고 싶은 내용은 복합키 사용에 관한 부분입니다. (기존 시스템이 복합키를 사용중이라~~)

강의 내용에는 복합키에 관한 부분이 없어서 자료를 찾던중 우아한 형제들의 자료를 찾기는 했는데 

진행이 되지 않고 있습니다. 

복합키에 관한 설명이나 자료를 부탁드리고 싶어서 질문을 남깁니다.

2
mqwerm98 프로필

시퀀스 방식에서 질문드립니다 mqwerm98 9일 전

시퀀스 방식에서 next value 50개를 먼저 가져오면 그 뒤에 실행되는 것들은 51번부터 시작한다고 하셨는데,

그러면 51번 시퀀스가 2, 3.. 50번 시퀀스보다 먼저 생성될 수 있게 되는 건가요?

1
유동관 프로필

실습시 궁굼한 점이 있어 질문 드립니다. 유동관 10일 전

실습을 직접 진행하며 해보았는데요, 양방향 연계해주기 전에 먼저 이전에 있던 팀 리스트에서 맴버를 빼주는 로직을 따로 구현해야 하는게 먼저 아닌지 궁굼해서 질문 남겨봅니다! 

아니라면 어떤 방식으로 로직 흐름이 이루어지는지 알려주시면 감사하겠습니다.

// 팀을 변경하고 싶다.
// 먼저 기존에 있던 팀에서 삭제 시켜야 하지 않을까?
Team findTeam = em.find(Team.class, team.getId());
findTeam.getUsers().remove(findUser);
if(findTeam.getUsers().size()==0){
System.out.println("삭제 완료!");
}

//팀을 옮긴다.
findUser.setTeam(team2); // 쿼리 수정 없이 이걸로 끝.
System.out.println("유저의 이름 = " + findUser.getName());
System.out.println("유저의 팀 이름 = " + findUser.getTeam().getName());

// 반대방향에서 팀에서 등록된 맴버들을 조회하고 싶다. 단순 조회의 역할만!!
Team findTeam2 = em.find(Team.class,team2.getId());
for (User u : findTeam2.getUsers()){
System.out.println("User name : " + u.getName());
}

지식 공유해주셔서 감사합니다!

1
박용훈 프로필

궁금한게 있습니다. 박용훈 11일 전

처음 설계를 할때 단방향 매핑을 하라고 하셨잖아요.

그게 양방향을 고려하지 않는 상태에서 테이블과 유사하게 만드는 건가요?

예를들면

테이블이 

id   primary key,

name

===================================

id,

other_id forigin key,

name

으로 되어있다고 하면 이렇게 되있다면 

private int id;

private String name;

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

private int id;

@JoinColum(name = "other_id")

private  int otherId;

private String name;

이렇게 설계하는 건가요? 이 질문을 하는 이유는 

강의에는 team과 member로 하셨잖아요.  왜래키 지정을 member에 하셨는데.. team에도 왜래키 지정을 해야하는지 헷갈려서 질문 올립니다. 

private int id;

private String name;

@JoinColum(name = "other_id2")

private int otherId2;

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

private int id;

@JoinColum(name = "other_id")

private  int otherId;

private String name;

이런식으로 하는건 아닌것 같긴 하지만 단방향 매핑으로만 한다는게 이런의미인지 아닌지 정확하게 알고 싶어서 질문 작성합니다.

2
LUA 프로필

JPQL에 조회할때 Team.class가 뭔지 궁금합니다. LUA 11일 전

4:55 정도 부분에 JPQL을 통해 Member를 조회해올 때 두번째 인자로 Member.class 대신 Team.class를 전달해야한다고 설명을 해주셨는데 두번째 인자로 줘야하는 Team.class 혹은 Member.class를 왜 주어야하는지 궁금합니다.

이전 영상인 TypedQuery와 Query를 설명해주실때

// 두번재 인자 있음
TypedQuery<Member> query1 = em.createQuery("select m from Member m", Member.class);

// 두번재 인자 없음?
Query query = em.createQuery("select m.username, m.age from Member m")

위 코드처럼 작성을 해주셨는데 두번째 인자의 역할이 무엇인지 적어야 할때와 적지않아도 될 때가 언제인지 궁금합니다!

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