스프링 데이터 JPA

스프링 데이터 JPA

(80개의 수강평)

1384명의 수강생
Spring Data JPASpringJava
월29,333원
88,000원
3개월 할부시
지식공유자 · 백기선
45회 수업· 총 9시간 22분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 중급이상
blossom_mind 프로필

질문이 있습니다 . blossom_mind 7일 전

서브쿼리를 나타내는 방법에 대해서 질문 드립니다 .

예를 들어서 

SELECT A.*

FROM

(SELECT ROW_NUMBER() OVER(ORDER BY MEMBER_ID) IDX

       ,MEMBER_ID

       ,NAME

   ,GENDER

   ,TO_CHAR(TO_DATE( BIRTH,'YYYYMMDD'),'YYYY.MM.DD') AS BIRTH

   ,REGEXP_REPLACE(HP, '(.{3})(.+)(.{4})', '\1-\2-\3') AS HP

   ,EMAIL

FROM CX_MEMBER

WHERE 1=1  

AND JOIN_DATE BETWEEN '20191029' AND '20201231' 

AND NAME = '홍길동'

AND MEMBER_ID='11111111111111'

AND HP = '01036801277'

ORDER BY MEMBER_ID

)  A

WHERE 1=1 

AND A.IDX BETWEEN 0 AND 10 

이런식의 게시판을 만들어봤는데요 .이걸 JPA로 바꿀려면 어떤게 필요한지 잘 모르겠습니다 .

1
홍지훈 프로필

Optional 관련 질문있습니다. 홍지훈 14일 전

스프링 데이터 Common 3. Null 처리를 보고 궁금한게 있습니다!

아래 CommentRepotoryTest 클래스에 crud 메서드에서 MyRepository에 정의하고 CommentRepository가 상속받은 findById(ID id)를 테스트 하고 있었습니다.

현재 DB에 ID가 3에 해당하는 글이 존재하기 때문에 comment 변수에 해당 정보가 들어가 있겠거니 생각했는데 생각과는 달리 Optional을 Comment 객체로 캐스팅 할 수 없다는 오류가 발생하였습니다.

MyRepository와 CommentRepository에서는 Optional 관련 코드가 전혀 없는데 해당 오류가 어떤 이유로 인해 발생하는지 전혀 모르겠습니다.

@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable> extends Repository<T,ID> {

    <E extends T> E save(E Entity);

    List<T> findAll();

    int count();

    <E extends T> E findById(ID id);

    /*@Nullable
    <E extends T> E findById(ID id);*/
}

public interface CommentRepository extends MyRepository<Comment,Long> {
}

@RunWith(SpringRunner.class)
@DataJpaTest
public class CommentRepostoryTest {

    @Autowired
    CommentRepository commentRepository;

    @Test
    public void crud(){
        Comment comment = commentRepository.findById(3l);
    }
}

1
윤홍찬 프로필

@Transaction 처리 질문입니다. 윤홍찬 16일 전

@Transaction 을 붙여서, 트랜잭션 처리를 언제 해야하는지 알 수 있을까요? 

검색해보니, 여러 쿼리를 하나의 단위로 실행해야할 때만 붙여서 처리하면 되는 것 같으나 일부 블로그에서는 모든 service의 메소드에 붙이라는 곳도 있는 거 같아서 헷갈립니다ㅠㅠ

따라서 read를 제외한 create, update, delete가 하나라도 있는 service layer의 메소드에 전부 붙여야하는지 궁금합니다. 다음은 update, delete 각자 하나의 쿼리만 수행하는 코드 예시입니다.

public boolean updateBoard(Board board, Long id) {
		Optional<Board> optionalBoard = boardRepository.findById(id);
		if (optionalBoard.isEmpty()) {
			return false;
		}

		Board existingBoard = optionalBoard.get();
		existingBoard.setTitle(board.getTitle());
		existingBoard.setContent(board.getContent());
		boardRepository.save(existingBoard);
		return true;
	}

	public boolean deleteBoard(Long id) {
		Optional<Board> optionalBoard = boardRepository.findById(id);
		if (optionalBoard.isEmpty()) {
			return false;
		}

		boardRepository.deleteById(id);
		return true;
	}

1
Hoon Jeon 프로필

EqualsAndHashCode와 관련하여 질문드립니다. Hoon Jeon 1달 전

안녕하세요 뒤늦게 강의를 알게되어 보고있습니다.

강의를 진행하시면서 작성하시는 코드를 직접 따라해보며 생긴 질문들이 있어 질문드립니다. 먼저 저는 lombok을 사용해 @EqualsAndHashCode 를 사용하였습니다. 이전 강의에서 @Data 애노테이션에 대한 문제를 인지하고 getter와 setter 등을 분리시켜 필요한것만 사용하고있습니다. 강의에서 작성한 Post와 Comment클래스 모두에 hashcode와 equals를 primary key인 id 필드만 사용하여 equals와 hashcode 를 작성하니 문제가 생겼습니다. 

Post의 Comment 컬렉션인 HashSet에 Comment를 추가할 때 equals와 hashcode를 비교하여 중복검사를 하게되는데 문제는 아직 저장하지 않은 Transient 상태의 객체들은 Id 값이 부여되지 않은 null 인 상태여서 Post에 Comment를 여러개 추가하면 자꾸 null인 아이디 때문에 덮어씌어져 결국 하나의 Comment만 추가됩니다. 

이 문제를 해결하기 위해 id 필드가 아닌 비즈니스 정보를 가진 필드들을 이용하여 equals와 hashcode 를 작성해야 하는지 ID 필드만을 사용해 구현하는 방법은 권장하지 않는 방법인지 궁금합니다.

4
노은영 프로필

@Temporal(TemporalType.TIME) 사용할 시에 타임존 노은영 1달 전

안녕하세요 좋은 강의 잘 듣고 있습니다..^__^ 타임존 관련 질문이 있어 글 남기게 됐습니다.

@Temporal(TemporalType.TIMESTAMP) 사용할 시에 타임존은 해당 데이터베이스의 타임존에 맞게 저장이 되나요? 아니면 애플리케이션의 타임존에 맞게 저장이 되나요?

@Temporal을 사용할 때 만약 타임존이 다를 경우에 타임존 문제를 어떻게 해결해서 사용하는지 궁금합니다~

1
doqndnffo 프로필

ㅎㅎ 강의 마지막에 PostRepositoryTest로실행하신것 같습니다. doqndnffo 2달 전

콘솔 확인해보시면..ㅎㅎ 뭐 크게 문제는 없었습니다.

2
doqndnffo 프로필

인텔리제이 어노테이션들 속성 빨간밑줄에러.. doqndnffo 2달 전

안녕하세요. 다음과 같은 빨간밑줄들이 자꾸 잡히길래 혹시 해결할 수 있는 방법이 있나 여쭤보고싶습니다..

에러없이 실행은 되더라구요!

그냥 무시하면 되는데 git에 올릴때 에러난다고 리뷰하라고 뜨는게 불편해서 여쭈어보아요!!

1
Taehee-kim-dev 프로필

테스트에 @Transactional 추가해도 안되네요.. Taehee-kim-dev 2달 전

기선님 안녕하세요!

저번에 JPA 테스트에서, 같은 객체에 대해서 assertThat을 두 번 했었습니다.

저는 JPA가 select문을 한 번만 날리고 그 객체로 assertThat을 두 번 할거라 예상했지만,

예상과 다르게 JPA는 select문을 각 asserThat문 마다 한 번씩, 총 두 번 날렸습니다.

그래서 제가 질문을 올렸었습니다. 왜 select문이 한 번만 날아가지 않고 두 번 다 날아가는지 모르겠다구요..

기선님이 @Transactional 을 테스트에 붙여보라고 하셨습니다.

사실 그때도 service 클래스에 @Transactional이 붙어있긴 했습니다.

기선님이 말씀하신 대로 테스트에 @Transactional을 붙여서 했는데 해결이 되지않아 다시 질문드립니다!!

일단 서비스 클래스입니다. 원래 @Transactional 어노테이션은 붙어있었습니다.

기선님이 말씀하신대로 테스트에 @Transactional 추가했습니다.

먼저 save 후 확인하는 테스트 코드입니다.

테스트 결과입니다. 테스트는 성공했습니다. 하지만 전과 같이 select문이 두 번 날아갔습니다.

그리고 왜인지는 모르겠는데 전에는 롤백이 없었는데,

test함수에 @Transactional을 추가하니 롤백이 생겼습니다ㅠ

save 후 update하여 확인하는 테스트 코드입니다.

에러가 났습니다..

insert후 select했는데 왜 났는지 모르겠네요 ㅠ

그 밑에 select문을 두 번 날리는 것은 같더군요..

왜 select를 한번만 하지 않는지, save 테스트에서 롤백은 왜 하는지, update테스트는 왜 에러가 나는지 모르겠습니다..ㅠ

7
문병량 프로필

QuerydslJpaRepository가 deprecated되었다네요 문병량 2달 전

저도 SimpleJpaRepository를 상속받아도 테스트가 성공합니다

5
hp 프로필

양방향 매핑과 객체 그래프 탐색 질문 hp 2달 전

안녕하세요.

이번 강의에서 양방향 관계로 매핑했을때 오너 엔티티에서 관계를 맺어주는 코드가 필수고 종속 엔티티에서 관계를 맺어주는 코드는 optional하다고 설명을 해주셨는데요

예를 들어 강의에서처럼 Study(오너), Account(종속) 엔티티가 있을때 객체에서는 study.setOwner(account)만 해주면 Study 테이블과 Account 테이블에 데이터가 잘 들어가잖아요

근데 객체측면에서 account.getStudies()와 같이 종속 엔티티에서 객체 그래프 탐색이 필요한 경우에는 account.getStudies().add(study)가 optional하지 않고 필수적인거 맞나요?

코드 작성해서 실행은 해봤는데 확실히 알고싶어서 질문드립니다. @OneTyMany(mappedBy)로 JPA가 어디까지 해주는건지 헷갈리네요.

감사합니다.

1
Taehee-kim-dev 프로필

JPA 쿼리 날리는것 관련 질문입니다! Taehee-kim-dev 2달 전

기선님 안녕하세요!

JPA에서 쿼리를 한번만 날려야 할 것 같은데, 왜 두 번 날리는지 궁금해서 여쭤봅니다.

아래에 두 사진이 있고 각각 설명을 달아놓았습니다.

사진1) 테스트 코드

JPA에 대해 강의를 들은것을 떠올려보면,

JPA가 워낙 똑똑해서, 어차피 findAll()을 한 후 allPost.get(0)을 통해 동일한 첫 번째 객체에 대해서만

두 번 assert체크를 할 거니까,

select 쿼리를 한번만 날리고, 가져온 동일 객체에 대해 assert체크를 두 번 해야한다고 생각했습니다.

그런데 select 쿼리문이 아래와 같이 두 번 날라갔습니다.

2) 테스트 결과 로그

왜 쿼리문이 한 번만 날라가지 않고 두 번 날라간 건가요?

1
hp 프로필

라이브러리간 호환 문제 hp 2달 전

안녕하세요.

스프링부트 2.0.4와 MySQL 8로 이번 강의 실습을 진행하다가

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

라는 에러가 발생해서 스프링부트 버전을 2.2.5로 바꾸고 정상적으로 동작하는걸 확인했습니다.

spring-boot-starter-data-jpa가 가져오는 의존성들중 어떤것이 MySQL 8점대와 호환되지 않았던건지 확인하고싶은데 어디서부터 알아봐야할지 감이 잡히지 않습니다.

조언부탁드립니다.

1
d_d 프로필

QueryDSL 관련해서 질문드립니다. d_d 2달 전

안녕하세요. 강의를 듣던 중 테스트가 실패해야하는데 정상적으로 실행이 되어 질문드립니다.

25.스프링 데이터 Common: QueryDSL 에 관련된 질문입니다.

저와 같은 질문을 하신 분이 있던데(https://www.inflearn.com/questions/9020)  버전 변경으로 인해QuerydslJpaRepository 이 deprecated 되며 SimpleJpaRepository 를 변경하지 않고 사용할 repository 에  QuerydslPredicateExecutor 을 상속받아서 사용해도 되는지 문의드립니다.

하단에 코드 함께 첨부하였습니다.

@EnableJpaRepositories(repositoryBaseClass = SimpleMyRepository.class)

@NoRepositoryBean 

public interface MyRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

boolean contains(T entity);

}

public class SimpleMyRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID>{

 

private EntityManager entityManager;

private SimpleMyRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {

super(entityInformation, entityManager);

this.entityManager = entityManager;

}

 

@Override

public boolean contains(T entity) {

return entityManager.contains(entity);

}

}

public interface PostRepository extends MyRepository<Post, Long>, QuerydslPredicateExecutor<Post> {

}

@Test

public void crud() {

Post post = new Post();

post.setTitle("hibernate!");

postRepository.save(post.publish());

Predicate predicate = QPost.post.title.contains("hi");

Optional<Post> one = postRepository.findOne(predicate);

assertThat(one).isNotEmpty();

}

1
조한선닮은이 프로필

findAll() 메서드 조한선닮은이 3달 전

안녕하세요..

우선 다른 질문들에 답변이 없어서 답변이 달릴까 조금 걱정은되는데 질문드려요ㅠ

findAll() 메서드로 fetch 는 default로 하면 lazy로 되더라구요..

ManytoOne 이더라도요..

그 이유가 find all이라서 많은 데이터를 가져오게 되니까  jpa 에서 일부러 그렇게 전략을 짠건지요..?

제가 이해한게 맞는지 확인차 질문 올립니다.

5
MinSu Chae 프로필

docker 설치에 관한 질문입니다! MinSu Chae 3달 전

본 강좌를 따라하기위해 docker 설치를 알아보았습니다.

하지만, 역시 장애물이 생기더군요..ㅎㅎ;

docker toolbox 를 깔아서 테스트를 해보려고 하는데 실패했습니다 ㅜ.ㅜ

그래서 Toolbox는 삭제하고 VMWare를 깔고 거기에 리눅스OS로 docker를 설치하려고 합니다. (도커가 리눅스 기술이라 들어서..)

이렇게 해도 강의 예제를 따라하는데 지장이 없을까요?

(=> intellij 터미널에서 도커를 사용할 수 있는건가요?)

docker windows desktop을 설치하려는데 그거는 windows 10 pro 밖에 지원이 안되서 설치를 못했습니다.

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