월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 데이터 JPA
양방향 관계 설정 무한루프 질문드립니다
강의 해주신 내용을 참고하여 두개의 Entity (Question, Answer)에 관계맵핑을 해주었습니다. @ManyToOne private Question question; @OneToMany(mappedBy = "question") private List answers = new ArrayList(); public void addAnswer(Answer answer) { this.getAnswers().add(answer); answer.setQuestion(this); } 그리고 Answer를 return값에 넣어서 json값으로 사용하려고 했는데요, Answer->Question->Answer...이렇게 json값이 무한루프를 돌아버리네요 어떤 부분에서 그렇게 되는건지 알려주시면 감사하겠습니다
- 미해결스프링 데이터 JPA
이름으로 쿼리메소드 생성 vs QueryDSL vs Specification
실제 프로젝트에 적용하려고 하니 이름으로 쿼리메소드를 생성하는 방법은 메소드 이름이 너무 길어져서 못쓸꺼 같아서 QueryDSL이나 Specification을 사용하려고 하는데 무엇을 사용할 지 고민이 됩니다.구글링 결과 QueryDSL이 Specification보다 type-safe하고 심플하게 작성할 수 있다는 장점때문에 많이 선호하는 것 같아 보입니다.백기선님은 이름으로 쿼리메소드 생성, QueryDSL, Specification 중 어떤 방법을 선호하시나요?? 그리고 선호하시는 이유가 무엇인지 궁금합니다.
- 미해결스프링 데이터 JPA
꼭 Serializable ID 를 써야 하는지 알수 있을까요?
(사진)
- 미해결스프링 데이터 JPA
`@Transactional(readOnly = true)`에대한 질문입니다.
@Transactional(readOnly = true) 속성에 대해서 질문이 있습니다. 기본 Isolation Level 설정은 데이터베이스의 default 속성을 따라가게 되는걸로 알고 있습니다. 만약 mysql을 사용한다면 REPEATABLE_READ level을 택하지만 @Transactional(readOnly = true)을 설정하면 Isolation level이 READE_UNCOMMITED으로 변경되서 성능상의 이점이 있다는 것으로 이해했습니다. 제가 이해한것이 맞을까요?
- 미해결스프링 데이터 JPA
postRepository 에 작성한 findByTitlecontains 이 구현되는 원리가 궁금합니다.
강의에서 알려주신 postRepository 안의 findByTitleContains 는 spring data가 어떤 키워드를 보고title이라는 컬럼에 like 검색으로 풀리는지가 궁금합니다. ^^;;시험삼아 findByTitleContainig 요렇게 메소드를 작성했을때는 동작하고 findContainingTitle은 illegalArgumentException이 발생하더라구요.알려주신다면 큰 도움이 될것 같습니다 ( )
- 미해결스프링 데이터 JPA
Select 없이 Update만 하고 싶은 경우 베스트 프랙티스가 있을까요?
안녕하세요 백기선님.운영중인 프로젝트에 JPA를 적용하다가 Select 없이 Update만 할 경우를 자주 마주합니다.멤버의 Id와 변경할 포인트를 전달 받아 포인트를 업데이트 하려하면아래와 같은 순서로 진행해야합니다.Member member = memberRepo.findById(id)member.setPoint(member.getPoint + point);memberRepo.save(member) 이때 member를 select 하는 구문 없이 이번강의에서 알려주신@modifying(clear...,flush...)와 @query를 이용하면 좋겠다는 생각이 들었거든요.만약 pointUpdate(memberId, pointAmount)라는 서비스를 제공할 때,clear와 flush를 보장한다면 서비스를 사용하는 사람도 안심하고 쓸 수 있을것 같구요.무엇보다 매력적인건 select 한번을 줄일 수 있는 점 같습니다.테스트 코드에서는 테스트 객체 생성을 위한 create 구문이 있어서백기선님께서 말씀주신 방향으로 가는게 최적케이스 같습니다.하지만 기존에 영속화된 엔티티 대상으로 update만 날리기 위해서는어떤 방법이 더 효율적이라고 생각하시는 지, 주로 사용하시는 패턴이 있으신지 궁금합니다.
- 미해결스프링 데이터 JPA
8분 20초 updatedPost 와 postUpdate 객체 비교 부분이 이상합니다.
8분 20초 updatedPost 와 postUpdate 객체 비교 부분이 이상합니다.말씀으로는 객체가 복제되어 updatePost만 영속화 되는것이고, 두개의 객체는 같지 않다. 라고 말씀 주셨는데 테스트 코드를 보면 '같다' 라고 표현되어지고 테스트 결과 또한 성공합니다.어떤것이 맞는지 궁금합니다.
- 미해결스프링 데이터 JPA
JPA에서 Multiple datasource 를 어떻게 설정하는지 궁금합니다.
https://www.inflearn.com/dwquestion/jpa%EC%97%90%EC%84%9C-multiple-datasource-%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94%EC%A7%80-%EA%B6%81%EA%B8%88%ED%95%A9%EB%8B%88%EB%8B%A4-2/이성균님의 질문에 주신 답변을 보고추가로 질문을 드리고 싶어서요...Repository와 Entity를 1개의 패키지로 유지해서Master/Slave Datasource로 구동시키는 방법은 어떻게 해야할까요?(동일한 TABLE Schema니 Repository와 Entity가 다를 이유는 없긴하지만요...)Master는 Read/Write가 가능하고, Slave는 Read만 가능한 상황이죠.Service에서 Transactional(readOnly)의 true/false에 따라 Datasource를 선택하고 싶습니다.이렇게는 불가능...한건가요?꼭 다른 package로 구성해서만 할 수 있는건가요?
- 미해결스프링 데이터 JPA
JpaRepository를 상속한 interface는 누가 Bean으로 만들어주나요?
@EnableJpaRepositories를 해야 하지만그렇지 않은 경우에도 Bean으로 등록되는데...그렇다면 어떤 애노테이션이나 어떤 것때문에그리 되는지 말씀을 안해주셔서요...
- 미해결스프링 데이터 JPA
SELFJOIN 구성에 관해 질문 드립니다.
안녕하세요 두번째 질문 드립니다.시스템 개발하다 보면 필요한 코드들을 한곳에 모아 놓은 테이블로 만들어 관리 하고 계층 구조를 Tree 형태로 유지 하기 위해 self-join 방식을 사용하곤 했습니다.jsp에서도 같은 기능을 하는 객체를 만들어 사용하고 싶은데.. 쉽지 않아 질문 드립니다.이것 저것 옵션을 붙여 봤는데.. 생각 같이 안나와서 이게 가능한 접근 인지도 잘 모르겠네요..코드는 아래와 같습니다.이렇게 하고 호출하면 루프를 돌다 에라가 나는데..상호참조 할때 처럼 옵션을 줘도 별반 차이가 없는것 같고..답답해서 질문 드립니다.Domain public class CodeTree { @Id @SequenceGenerator(name = "seq_codetree", sequenceName = "seq_codetree", allocationSize = 1, initialValue = 100) @GeneratedValue(generator = "seq_codetree") private Long codeTree_; private String codeTreeName; private int codeTreeOrder; @Lob @Type(type = "org.hibernate.type.TextType") private String codeTreeNote; @ManyToOne() @JoinColumn(name = "codeTreeUp") private CodeTree codeTreeUp; @OneToMany(mappedBy = "codeTreeUp") private List<CodeTree> codeTreeMember; private String codeTreeValue1; private String codeTreeValue2; private LocalDateTime createDate; private LocalDateTime modifyDate;}Controller @Autowired private CodeTreeRepository codeTreeRepository; @RequestMapping(value = "/code", method = RequestMethod.GET) public ResponseEntity codeAll() { return new ResponseEntity<>(codeTreeRepository.findAll(), HttpStatus.OK); }감사합니다...
- 미해결스프링 데이터 JPA
운영중에 엔티티(테이블구조)를 변경하는경우
안녕하세요 기선님 질문이있습니다.운영중에는 spring.jpa.hibernate.ddl-auto 설정을 보통 validate 로 세팅할 것 같은데보수라던지 기능 추가로 인해서 엔티티의 설정이 변하게 되는 경우 보통 어떻게 처리하나요혹시 DB에 직접 접근하여 설정을 바꿔주나요?? 수업을 듣다 문득 궁금해져서 질문드립니다.!
- 미해결스프링 데이터 JPA
HATEOAS 관련 질문 드립니다.
HATEOAS 관련 질문 드립니다.강의 잘 보고 있습니다.hateoas 관련 기능을 따라 배 보고 있는데.. 이 부분은 따라 해도 잘 되지 않네요hateoas 기능을 사용하지 않는 경우에는 별 문제가 없는데..예제에서 보여주신 방법으로 hateoas 기능을 추가 하면 아래와 같은 로그가 뜨고화면도 아래와 같습니다.뭐가 문제일까요??바쁘시겠지만 답변 부탁 드립니다.감사합니다.<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id="created">Wed Nov 28 13:42:39 KST 2018</div><div>There was an unexpected error (type=Internal Server Error, status=500).</div><div>Could not marshal [PagedResource { content: [Resource { content: cmars.springboot.hateoas.Account@34829253, links: [] }, Resource { content: cmars.springboot.hateoas.Account@3902fe0, links: [] }, Resource { content: cmars.springboot.hateoas.Account@22ffbfaa, links: [] }, Resource { content: cmars.springboot.hateoas.Account@6cc2fe4e, links: [] }, Resource { content: cmars.springboot.hateoas.Account@4c72f98f, links: [] }, Resource { content: cmars.springboot.hateoas.Account@4e1f30ce, links: [] }, Resource { content: cmars.springboot.hateoas.Account@1142c448, links: [] }, Resource { content: cmars.springboot.hateoas.Account@6a8968a0, links: [] }, Resource { content: cmars.springboot.hateoas.Account@31ec5aff, links: [] }, Resource { content: cmars.springboot.hateoas.Account@642954c, links: [] }, Resource { content: cmars.springboot.hateoas.Account@1a56148, links: [] }, Resource { content: cmars.springboot.hateoas.Account@2048c5b4, links: [] }, Resource { content: cmars.springboot.hateoas.Account@73a058e0, links: [] }, Resource { content: cmars.springboot.hateoas.Account@61da5b2d, links: [] }, Resource { content: cmars.springboot.hateoas.Account@4b5fd97f, links: [] }, Resource { content: cmars.springboot.hateoas.Account@2d5cd0c5, links: [] }, Resource { content: cmars.springboot.hateoas.Account@5ccaead6, links: [] }, Resource { content: cmars.springboot.hateoas.Account@6f7ac151, links: [] }, Resource { content: cmars.springboot.hateoas.Account@5a5b79e0, links: [] }, Resource { content: cmars.springboot.hateoas.Account@114a4096, links: [] }], metadata: Metadata { number: 0, total pages: 2, total elements: 30, size: 20 }, links: [<http://localhost:8080/account?page=0&size=20>;rel="first", <http://localhost:8080/account?page=0&size=20>;rel="self", <http://localhost:8080/account?page=1&size=20>;rel="next", <http://localhost:8080/account?page=1&size=20>;rel="last"] }]: null; nested exception is javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: "org.springframework.hateoas.Resource" ??? ? ?????? ??? ? ???? ??? ???? ? ????.]</div></body></html>@RestControllerpublic class AccountController {@Autowiredprivate AccountRepository accountRepository;@RequestMapping(value = "/account", method = RequestMethod.GET)public PagedResources<Resource<Account>> accountAll(Pageable pageable, PagedResourcesAssembler<Account> assembler) { int contNum = 10; while (contNum > 0) { Account account = new Account(); account.setAccountId(" 아디디 " + contNum); account.setAccountName("이름 " + contNum); accountRepository.save(account); contNum--; } return assembler.toResource(accountRepository.findAll(pageable));// 로그 --------------[com.sun.istack.internal.SAXException2: "org.springframework.hateoas.Resource" 유형은 이 컨텍스트에서 인식할 수 없으므로 요소로 마셜링할 수 없습니다.]]}@RequestMapping(value = "/accounts", method = RequestMethod.GET)public ResponseEntity accountAll(Pageable pageable) { return new ResponseEntity<>(accountRepository.findAll(pageable), HttpStatus.OK);} // 정상출력}
- 미해결스프링 데이터 JPA
findById()와 findAll()의 차이점이 궁금합니다.
예제를 따라 보고 하다가 문의가 있습니다.강사님의 경우 UPDATE를 테스트 코드에 작성을 하실때 아래와 같이 하셨습니다,Post save = savePost();save.setTitle("hibernate");List<Post> posts = postRepository.findAll();assertThat(posts.get(0).getTitle()).isEqualTo("hibernate");위 의 경우 발생되는 쿼리를 보면 UPDATE & SELECT 쿼리가 모두 발생합니다.저는 아래와 같이 findAll() 대신에 findById() 메서드를 통해 테스트 해보았습니다.Post save = savePost();<p>save.setTitle("hibernate");Optional<Post> post = postRepository.findById(save.getId());assertThat(post.get().getTitle()).isEqualTo("hibernate");테스트 결과는 Pass이나 발생되는 쿼리를 보면 실제 DB쪽으로는 UPDATE, SELECT 쿼리 모두 발생하지 않습니다.JPA Query 메서드인 findAll() 와 findById()가 차이가 있는 것인지 궁금합니다.늘 빠르게 피드백 주셔서 감사드립니다.
- 미해결스프링 데이터 JPA
테스트 범위 관련 질문 있습니다.
JpaRepository.save() 강의에서 나오는 테스크 코드를 실행을앞의 JPA 웹 기능때 작성한 테스트 코드에서 실행해보고 있었습니다.앞의 강의는 웹 기능 테스트라 테스트 범위가 @SpringBootTest 이였는데,그 상태에서 save() 기능을 테스트 해보니,첫번째 savedPost.setTitle("JPA01"); 에서는 INSERT 쿼리가 발생이 됐으나,두번째 savedPost.setTitle("JPA02"); 에서는 UPDATE 쿼리가 발생하지 않았습니다.그리고 아래 코드에서 post 객체와 savedPost객체도 PersistenceContext에서 persistence 상태가 되지도 않는것 같습니다.물론 @SpringBootTest 대신에 @DataJpaTest로 하면 정상적으로 수행됩니다.테스트 범위에 따라 persistence 전이 상태가 다른지 궁금합니다. Post post = new Post(); post.setTitle("JPA01"); Post savedPost = postRepository.save(post) ; assertThat(entityManager.contains(savedPost)).isTrue(); // FAIL!! assertThat(entityManager.contains(post)).isTrue(); // FAIL!! List<Post> all =postRepository.findAll(); all.forEach(s->s.getTitle()); System.out.println("=================================================="); savedPost.setTitle("JPA02"); List<Post> all2 =postRepository.findAll(); all2.forEach(s->s.getTitle());
- 미해결스프링 데이터 JPA
요청이 많은 API에서 JpaRepository에서 save시 lock발생
안녕하세요.요청이 많은 API에서 JpaRepository를 사용하여 데이터를 저장하고 있습니다.'''repository.save(logs);'''이럴때 DB에서 lock이 걸려 모든 dbconnection이 밀리게 됩니다.보통 이럴떄는 어떻게 처리하나요?
- 미해결스프링 데이터 JPA
양방향 관계 설정 시, @Data 어노테이션 관련 사용 질문 있습니다.
우선 아래 질문 드렸는데 굉장히 빠른 답변 감사드립니다 ^^ 한 가지 더 질문이 있습니다. 양방향 관계 설정 예제를 따라해보다가 @OneToMany 조건으로 사용되는 Account 객체에 getter/setter 메서드를 별도로 설정하지 않고 Lombok의 @Data 어노테이션을 사용하였습니다. 이때, Convenient Method를 선생님과 동일하게 입력을 하니 아래와 같이 StackOverflowError가 발생이 됩니다. java.lang.StackOverflowError: null<p> at java.util.HashMap$KeyIterator.<init>(HashMap.java:1451) ~[na:1.8.0_31] at java.util.HashMap$KeySet.iterator(HashMap.java:912) ~[na:1.8.0_31] at java.util.HashSet.iterator(HashSet.java:172) ~[na:1.8.0_31] at java.util.AbstractSet.hashCode(AbstractSet.java:122) ~[na:1.8.0_31] 그래서 아래와 같이 Optional 조건이라고 하신 객체 설정 부분을 주석 처리를 하니 에러가 발생이 안되고 정상 처리 됩니다. public void addStudy(Study study) { // this.getStudies().add(study); study.setOwner(this); } JPA 사용시 @Data 어노테이션 사용 관련 주의해야될 사항이 있는 것인가요? 감사합니다
- 해결됨스프링 데이터 JPA
단방향 관계와 양방향 관계 관련되어 문의 드립니다.
@ManyToOne 단방향으로 관계 설정하는 경우와@ManyToOne+@OneToMany를 통해 양방향 관계로 설정하는 경우, DB 상으로 생성된 컬럼이나 데이터가 동일한데 이 두가지에 대한 차이점은 무엇인가요?DB 상에 데이터가 동일한데 굳이 양방향 관계를 사용하는 이유가 궁금합니다.감사합니다
- 미해결스프링 데이터 JPA
docker에서 postgresql 사용 관련 문의 드립니다.
postgresql 사용중 문의 드립니다. 아래와 같이 psql 을 사용하려고 하면 아래와 같은 경고문이 뜹니다. postgres@93a997b0c1a8:~$ psql springdata psql: FATAL: role "postgres" does not exist postgres@93a997b0c1a8:~$ 그래서 docker 교재의 컨테이너 생성 script를 아래와 같이 변경했습니다. docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=postgres -e POSTGRES_DB=springdata --name postgres_boot -d postgres 위와 같이 수정하는 것이 맞는 것인가요?
- 미해결스프링 데이터 JPA
@Id @GeneratedValue 질문드립니다.
책이나 강의에서 대부분 @GeneratedValue 를 사용하여PK를 자동으로 생성하게 해주는 예제로 많이 진행이 된 것 같습니다.그런데 제가 궁금한것은 저렇게 PK를 숫자로 자동할당 받는 방법으로 하면인덱스를 활용할 수 없지 않나요?편의성으로 보면 @GeneratedValue 가 좋지만성능면에선 떨어질 것 같아서 문의드립니다.
- 미해결스프링 데이터 JPA
insert 순서 질문
mysql환경에서 account와 study entity에 대한 generated value를 auto(default)로 두면sequence 기반으로 동작하는거같습니다.그런데 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 두면auto_increment 기반으로 동작합니다.위 두개의 설정이 아래의 코드 결과가 다르게 출력됩니다.entityManager.persist(account);entityManager.persist(study);Account keesun = entityManager.find(Account.class, account.getId());print(keesun.getUsername());전자의 경우(sequence기반) 1차캐시에서 데이터를 가져오기때문에print 가 먼저 찍히고 난후 insert query가 동작합니다.후자의 경우(auto_increment기반) insert query가 먼저 실행된 후print가 찍힙니다.무슨 차이때문에 이런건가요?