월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 스프링 데이터 JPA
flushAutomatically 질문드립니다.
삭제된 글입니다
- 스프링 데이터 JPA
flushAutomatically에 대해서..
삭제된 글입니다
- 스프링 데이터 JPA
EntityManager의 merge()
삭제된 글입니다
- 미해결스프링 데이터 JPA
ㅎㅎ 강의 마지막에 PostRepositoryTest로실행하신것 같습니다.
콘솔 확인해보시면..ㅎㅎ 뭐 크게 문제는 없었습니다.
- 미해결스프링 데이터 JPA
인텔리제이 어노테이션들 속성 빨간밑줄에러..
안녕하세요. 다음과 같은 빨간밑줄들이 자꾸 잡히길래 혹시 해결할 수 있는 방법이 있나 여쭤보고싶습니다.. 에러없이 실행은 되더라구요! 그냥 무시하면 되는데 git에 올릴때 에러난다고 리뷰하라고 뜨는게 불편해서 여쭈어보아요!!
- 스프링 데이터 JPA
안녕하세요. addStudy() 관련 질문입니다.
삭제된 글입니다
- 미해결스프링 데이터 JPA
테스트에 @Transactional 추가해도 안되네요..
기선님 안녕하세요! 저번에 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테스트는 왜 에러가 나는지 모르겠습니다..ㅠ
- 미해결스프링 데이터 JPA
QuerydslJpaRepository가 deprecated되었다네요
저도 SimpleJpaRepository를 상속받아도 테스트가 성공합니다
- 해결됨스프링 데이터 JPA
양방향 매핑과 객체 그래프 탐색 질문
안녕하세요. 이번 강의에서 양방향 관계로 매핑했을때 오너 엔티티에서 관계를 맺어주는 코드가 필수고 종속 엔티티에서 관계를 맺어주는 코드는 optional하다고 설명을 해주셨는데요 예를 들어 강의에서처럼 Study(오너), Account(종속) 엔티티가 있을때 객체에서는 study.setOwner(account)만 해주면 Study 테이블과 Account 테이블에 데이터가 잘 들어가잖아요 근데 객체측면에서 account.getStudies()와 같이 종속 엔티티에서 객체 그래프 탐색이 필요한 경우에는 account.getStudies().add(study)가 optional하지 않고 필수적인거 맞나요? 코드 작성해서 실행은 해봤는데 확실히 알고싶어서 질문드립니다. @OneTyMany(mappedBy)로 JPA가 어디까지 해주는건지 헷갈리네요. 감사합니다.
- 미해결스프링 데이터 JPA
JPA 쿼리 날리는것 관련 질문입니다!
기선님 안녕하세요! JPA에서 쿼리를 한번만 날려야 할 것 같은데, 왜 두 번 날리는지 궁금해서 여쭤봅니다. 아래에 두 사진이 있고 각각 설명을 달아놓았습니다. 사진1) 테스트 코드 JPA에 대해 강의를 들은것을 떠올려보면, JPA가 워낙 똑똑해서, 어차피 findAll()을 한 후 allPost.get(0)을 통해 동일한 첫 번째 객체에 대해서만 두 번 assert체크를 할 거니까, select 쿼리를 한번만 날리고, 가져온 동일 객체에 대해 assert체크를 두 번 해야한다고 생각했습니다. 그런데 select 쿼리문이 아래와 같이 두 번 날라갔습니다. 2) 테스트 결과 로그 왜 쿼리문이 한 번만 날라가지 않고 두 번 날라간 건가요?
- 미해결스프링 데이터 JPA
라이브러리간 호환 문제
안녕하세요. 스프링부트 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점대와 호환되지 않았던건지 확인하고싶은데 어디서부터 알아봐야할지 감이 잡히지 않습니다. 조언부탁드립니다.
- 미해결스프링 데이터 JPA
QueryDSL 관련해서 질문드립니다.
안녕하세요. 강의를 듣던 중 테스트가 실패해야하는데 정상적으로 실행이 되어 질문드립니다. 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(); }
- 미해결스프링 데이터 JPA
findAll() 메서드
안녕하세요.. 우선 다른 질문들에 답변이 없어서 답변이 달릴까 조금 걱정은되는데 질문드려요ㅠ findAll() 메서드로 fetch 는 default로 하면 lazy로 되더라구요.. ManytoOne 이더라도요.. 그 이유가 find all이라서 많은 데이터를 가져오게 되니까 jpa 에서 일부러 그렇게 전략을 짠건지요..? 제가 이해한게 맞는지 확인차 질문 올립니다.
- 미해결스프링 데이터 JPA
docker 설치에 관한 질문입니다!
본 강좌를 따라하기위해 docker 설치를 알아보았습니다. 하지만, 역시 장애물이 생기더군요..ㅎㅎ; docker toolbox 를 깔아서 테스트를 해보려고 하는데 실패했습니다 ㅜ.ㅜ 그래서 Toolbox는 삭제하고 VMWare를 깔고 거기에 리눅스OS로 docker를 설치하려고 합니다. (도커가 리눅스 기술이라 들어서..) 이렇게 해도 강의 예제를 따라하는데 지장이 없을까요? (=> intellij 터미널에서 도커를 사용할 수 있는건가요?) docker windows desktop을 설치하려는데 그거는 windows 10 pro 밖에 지원이 안되서 설치를 못했습니다.
- 미해결스프링 데이터 JPA
강의시 해상도 낮추고 찍어주세요
15.6인치 노트북으로 강의 시청하는데 녹화시 해상도가 너무 높으니 글씨가 작아 잘 보이지 않습니다.
- 해결됨스프링 데이터 JPA
Persistent 옵션을 사용해야만 저장이 되는 부분이 잘 이해가 되지 않습니다ㅠ
안녕하세요!! 관계 맵핑 강의에서는 account.getStudies().add(study); study.setOwner(account); 이런식으로 양방향 관계 설정 후 값을 확인 하면 값이 잘 들어간 것을 볼 수 있었는데 이번 강의에서도 setter에 값을 넣고 save 까지 완료하였으므로 둘 다 Persistent 상태가 되었다고 생각이 드는데 Post post = new Post();post.setTitle("DATA JPA 언제보나");Comment comment = new Comment();comment.setComment("빨리 보자"); 이 부분에서는 실제로 값이 들어가지 않았고 cascade Persistent 옵션을 사용해줘야 값이 전달이 되어서 들어간 것을 볼 수 있었습니다. 전 강의와 지금 강의에서의 차이점이 잘 이해가 되지 않는데 이 부분에 대해서 알려주실 수 있으실까요? 미리 감사드립니다!!
- 미해결스프링 데이터 JPA
스프링 데이터 JPA 옵셔널 처리
public interface MemberRepository extends CrudRepository<Member, Long> { } --- private final MemberRepository memberRepository; Member member = memberRepository.findById(memberId).get(); Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress());
- 미해결스프링 데이터 JPA
org.hibernate.LazyInitializationException( could not initialize proxy ) 에러 질문합니다!
안녕하세요. 게시글을 등록하는 기능을 구현중인데, LazyInitializationException 에러를 해결 못하고 있습니다. 테이블 관계(Account - Post) 는 양방향 관계로 설정하였고, 다음과 같이 설정했습니다. Account 테이블 @Entity@Getter@Setterpublic class Account implements UserDetails { @Id @GeneratedValue private Integer accountNo; // 다른 컬럼들 생략... @OneToMany(mappedBy = "account") private List<Post> post = new ArrayList<>(); Post 테이블 @Entity@Getter@Setterpublic class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer postNo; @ManyToOne @JoinColumn(name = "accountNo") private Account account; //다른 컬름들 생략... public void setAccount(Account account) { if(this.account != null){ this.account.getPost().remove(this); } this.account = account; this.account.getPost().add(this); } 문제가 발생한 로직 함수 부분 @PostMapping("")public ResponseEntity enrollPost(@RequestParam("file") MultipartFile multipartFile, @RequestParam("content") String content, @RequestParam("score") float score, @AuthenticationPrincipal Account account) throws Exception{ Path fileNameAndPath = Paths.get("./images/",multipartFile.getOriginalFilename()); try{ Files.write(fileNameAndPath, multipartFile.getBytes()); }catch (IOException e){ throw new InvalidImageException("이미지 업로드에 실패했습니다."); } Post post = new Post(); post.setScore(score); post.setContent(content); post.setPostPic(fileNameAndPath.toString()); post.setAccount(account); << 문제가 발생한 부분!! ############# Post save = postRepository.save(post); 위와 같습니다. 문제가 발생한 부분은 아래 함수를 처리하다가 오류가 생겼습니다. 위의 post.setAccount(account) 부분에서 public void setAccount(Account account) { if(this.account != null){ this.account.getPost().remove(this); } this.account = account; this.account.getPost().add(this); << 문제가 발생한 지점!! ##############} account.getPost()를 가져오는 부분에서 Lazy초기화에러가 발생했습니다. 해당 문제는 Account의 post @OneToMany 컬럼에 fetch = FetchType.EAGER 설정을 주면 쉽게 해결이 되는데, Post의 FetchType을 Eager로 주게 될 경우, 유저를 조회할 때마다 항상 Post를 조회하는게 성능상 문제가 될것같아서 위와 같은 방식은 사용하고 싶지 않습니다. @PostMapping 함수 로직을 실행하기전에 @AuthenticationPrincipal Account account 인증권한 확인하는부분에서 Accont의 데이터를 한번 조회해오는데, 로그는 다음과 같습니다. /* select generatedAlias0from Account as generatedAlias0where generatedAlias0.email=:param0 */ selectaccount0_.accountNo as accountN1_0_,account0_.accountId as accountI2_0_,account0_.accountName as accountN3_0_,account0_.accountPwd as accountP4_0_,account0_.authority as authorit5_0_,account0_.bio as bio6_0_,account0_.email as email7_0_,account0_.instagram as instagra8_0_,account0_.profilePic as profileP9_0_,account0_.regDate as regDate10_0_,account0_.twitter as twitter11_0_,account0_.updDate as updDate12_0_,account0_.useStateCode as useStat13_0_ fromAccount account0_whereaccount0_.email=? Account 테이블에서 Post를 참조하고 있는 리스트를 가지고 오지 않아서 에러가 발생하는것 같은데, 어떻게 하면 Account가 참조하고 있는 Post정보를 가지고올 수 있을까요? 에러가 발생한 로그는 아래와 같습니다. // 2020-01-20 22:04:40.867 ERROR 6330 --- [nio-8098-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.toffeestory.backend.account.Account.post, could not initialize proxy - no Session] with root cause//// org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.toffeestory.backend.account.Account.post, could not initialize proxy - no Session// at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:602) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]// at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:217) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]// at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:581) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]// at org.hibernate.collection.internal.AbstractPersistentCollection.write(AbstractPersistentCollection.java:408) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]// at org.hibernate.collection.internal.PersistentBag.add(PersistentBag.java:386) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]// at com.toffeestory.backend.post.Post.setAccount(Post.java:55) ~[main/:na]// at com.toffeestory.backend.post.PostController.enrollPost(PostController.java:55) ~[main/:na]
- 미해결스프링 데이터 JPA
스프링 데이터 common 쿼리 실습시, Stream은 굳이 닫을 필요는 없을 것 같아요.
Stream 이 AutoClosable을 구현하지만, I/O 채널이 아닌 Stream은 닫을 필요가 없습니다. 참고 : https://docs.oracle.com/javase/8/docs/api/?java/util/stream/Stream.html
- 해결됨스프링 데이터 JPA
윈도우 환경에서 url에 localhost를 적으면 문제가 생깁니다.(수정)
localhost로 적었다가 접근이 계속 거부되어 알아본 정보입니다. 리눅스 환경이라면 현재 자신의 운영체제가 host OS이고 host OS의 5432 port로 들어온 것을 postgres_boot container의 5432 port로 연결해주지만 윈도우 home버전에서는 host OS가 자신이 아닌 도커엔진의 VM VirtualBox의 default인것으로 보입니다. container는 host OS위에서 작동하는 것으로 알고 있는데 localhost를 하면 host OS가 아닌 window 환경에 저장된 DB에서 정보를 찾는것같아 localhost를 VM VirtualBox의 default의 ip 192.168.99.100으로 바꾸었더니 해결되었습니다. String url = "jdbc:postgresql://localhost:5432/springdata"; ---> String url = "jdbc:postgresql://192.168.99.100:5432/springdata"; 제가 시도한것이 맞는건지 궁금합니다.