월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 데이터 JPA
질문 있습니다.
1. Runwith와 assertThat이 제대로 먹질 않습니다 ㅠㅠ assertThat같은 경우에는 해당 패키지경로를 검색해서 찾아서 import static org.assertj.core.api.Assertions.*; 이런식으로 수동 입력을 하였으나 Runwith는 https://junit.org/junit4/javadoc/latest/index.html 해당하는곳에서 레퍼런스를 찾았으나 패키지에 보이질 않네요 원래 패키지를 하나하나 찾아가며 등록해야하는건가요?? 아니면 설정이나 의존성이 잘못된 걸까요??
- 미해결스프링 데이터 JPA
윈도우환경일경우에는
postgreSQL를 그냥 단순설치하고 따라 하면 될까요? 반드시 docker의 컨테이너 생성을 해야하는지 궁금합니다..
- 미해결스프링 데이터 JPA
createUserId, updateUserId 와 같은 로그성 컬럼에 대한 문의를 드립니다
현재 JPA 도입을 검토중에 있고, 팀원들이 스터디로 JPA를 학습하고 있습니다. 지금 고민 중인 것이 있어 강사님께 질문을 드립니다. 보통 아래의 로그성 컬럼을 추가하여 해당 엔터티를 누가 생성/수정했는지 기록하고 있습니다. 엔터티 조회 (목록 조회) 시에도 최종 수정자 정보를 join을 해서 보여줘야 되고요. 예: Post table (PostEntity) 예: created_at, create_user_id, updated_at, update_user_id 질문) 이 경우, PostEntity의 create_user_id, update_user_id 컬럼에도 relation을 추가하는 것이 일반적인 관례인가요? @ManyToOne(... 생략) UserEntity createUser; @ManyToOne(...생략) UserEntity updateUser; Relation을 추가하자니, 거의 대부분의 Entity에 FK 가 생겨 뭔가 낭비같은 느낌이 들고... Relation을 추가 안하자니, 등록자, 최종사용자 정보를 Join을 할수 가 없네요. (RawQuery로 받아내야 하는..) 실무에서는 위 같은 경우 어떻게 해결하는지 문의를 드립니다. 미리 답변에 감사드립니다.
- 미해결스프링 데이터 JPA
이 강의 혹시 git 있나요?
있다면 알려주세요!
- 해결됨스프링 데이터 JPA
트랜잭션 readonly 질문 드립니다.
기선님 안녕하세요. 강의를 보던 중 트랜잭션 readonly 속성에 대해서 궁금증이 생겨서 질문 남겨 봅니다. 조회성 메소드에 @Transaction(readonly = true) 속성을 선언하면 내부적으로 플러시가 발생하지 않게 되고, 이로인해 더티체킹을 하지 않아 성능상 이점이 있다고 설명을 해주셨는데요. 제가 이해도가 부족해서 그런지 아래와 같은 궁금증이 생겼습니다. - 단순 조회성인데 트랜잭션을 안걸면 안되나요? - 트랜잭션을 걸지 않으면 플러시도 발생하지 않아서 위의 이점을 누릴 수 있지는 않나요? - 영속 컨텍스트는 트랙잭션 별로 생성 되는 것이기 때문에 영속 컨텍스트의 이점을 누릴려면 트랜잭션을 사용 해야 되는 건가요? - 1차 캐시 등... - 트랜잭션을 선언 하지 않으면 쿼리 조회시 영속화가 되지 않나요? - 강의과 연관된 내용은 아니지만 트랜잭션 readonly 옵션을 알아보다가 블로그 글을 보고 잘 모르는 부분이 있어서 JPA 특성인지 궁금하여 질문 남겨 봅니다. 블로그에 (https://kwonnam.pe.kr/wiki/springframework/transaction) 아래와 같은 내용이 작성되어 있는데요. 이부분이 JPA 특성인 것인지... 어떤 상황에서 아래와 같이 동작이 되는지 궁금합니다. 단, 읽기 작업만 하더라도 트랜잭션을 걸어주는 것이 좋다. 트랜잭션을 걸지 않으면 모든 SELECT 쿼리마다 commit을 하기 때문에 성능이 떨어진다. 명시적으로 트랜잭션을 걸어주면 마지막에 명시적으로 commit을 해주면 되며, commit 횟수가 줄어서 성능이 좋아진다. 이해도가 부족한 상태라 질문이 일관성이 없이 질문을 드렸네요. 항상 좋은 강의 만들어 주셔서 감사합니다.
- 미해결스프링 데이터 JPA
ImportBeanDefinitionRegistrar에 왜 override 안되나요?
따라서 해보는데 상속자체가 안되네요 ㅠㅠ 강제로 @Override해봐서 해봐도 빨간줄로 method does not override method from its superclass 라네요
- 미해결스프링 데이터 JPA
람다식...? 질문입니다
안녕하세요 선생님 다름이 아니라 post.getComments().forEach( c-> { sout (c.getComment()) 이런 부분에 대해서 공부하고 싶어서 구글에 람다식 이라고 검색 해봤으나 따로 인터페이스에서 추상메소드를 구현하는 것 만 나오고 선생님 강의에 나오는 저러한 문법은 안나오는데 검색 키워드좀 알려주실수 있나요?
- 해결됨스프링 데이터 JPA
DomainClassConverter 사용 관련해서 MethodArgumentConversionNotSupportedException 에러가 납니다.
27강 DomainClassConverter 관련 수업을 들으며 코드 동일하게 따라치며 강의 듣고 있는데요, DomainClassConverter 사용 전 @PathVariable 을 사용하여 Long 으로 id 를 받아와서 repo 로 부터 엔티티를 꺼내 리턴하는 방식으로 동일한 테스트 코드에서 이상 없이 돌아갑니다. 하지만 DomainClassConverter 를 사용하는 취지로 @PathVariable("id") Post post 와 같이 작성한 뒤 테스트를 돌려보면 테스트가 돌아가지 않습니다. 구체적인 코드는 아래와 같습니다. DomainClassConverter 사용 전 코드입니다. @GetMapping("/posts/{id}") public String getPost(@PathVariable Long id) { Optional<Post> byId = postRepository.findById(id); Post post = byId.get(); return post.getTitle(); } DomainClassConverter 기능을 사용하기 위해 변경한 코드입니다. @GetMapping("/posts/{id}") public String getPost(@PathVariable("id") Post post) { return post.getTitle(); } 테스트 코드 입니다. @Test public void getPost() throws Exception { // Arrange Post post = new Post(); post.setTitle("jpa"); postRepository.save(post); // Act ResultActions actual = mockMvc.perform(get("/posts/" + post.getId())).andDo(print()); // Assert actual.andExpect(status().isOk()); actual.andExpect(content().string("jpa")); } 발생하는 예외 로그 입니다. Hibernate: call next value for hibernate_sequence Hibernate: insert into post (created, title, id) values (?, ?, ?) 2020-06-18 18:30:50.714 TRACE 86203 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [TIMESTAMP] - [null] 2020-06-18 18:30:50.715 TRACE 86203 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [VARCHAR] - [jpa] 2020-06-18 18:30:50.715 TRACE 86203 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [BIGINT] - [1] 2020-06-18 18:30:50.752 WARN 86203 --- [ main] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'com.github.callmewaggs.commonweb.post.Post'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.github.callmewaggs.commonweb.post.Post': no matching editors or conversion strategy found] MockHttpServletRequest: HTTP Method = GET Request URI = /posts/1 Parameters = {} Headers = [] Body = null Session Attrs = {} Handler: Type = com.github.callmewaggs.commonweb.post.PostController Method = com.github.callmewaggs.commonweb.post.PostController#getPost(Post) Async: Async started = false Async result = null Resolved Exception: Type = org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException ModelAndView: View name = null View = null Model = null FlashMap: Attributes = null MockHttpServletResponse: Status = 500 Error message = null Headers = [] Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = [] MockHttpServletRequest: HTTP Method = GET Request URI = /posts/1 Parameters = {} Headers = [] Body = null Session Attrs = {} Handler: Type = com.github.callmewaggs.commonweb.post.PostController Method = com.github.callmewaggs.commonweb.post.PostController#getPost(Post) Async: Async started = false Async result = null Resolved Exception: Type = org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException ModelAndView: View name = null View = null Model = null FlashMap: Attributes = null MockHttpServletResponse: Status = 500 Error message = null Headers = [] Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = [] java.lang.AssertionError: Status Expected :200 Actual :500 <Click to see difference> ...생략 단순히 제가 오타가 있다거나 하는 문제인가요? 검색을 해봤는데도 해결책을 찾기 어려워서 질문 올립니다.
- 해결됨스프링 데이터 JPA
엔티티의 이름은 JQL에서 쓰임 이게정확히 무슨말인가요?
엔티티의 속성값 name이 jql에서만쓰인다는건가요? 아니면 엔티티는 무조건 sql이 아닌 jql에서만 쓰인다는건가요?
- 미해결스프링 데이터 JPA
update 쿼리 관련 질문
우선 자바 문외한 인데 강사님 강의 스프링 부트 부터 시작해서 jpa 까지 들으면서 공부하고 있습니다. 좋은 강의로 자바에 입문하게 도와주셔서 감사합니다. 스프링 데이터 JPA : Update 쿼리 메소드 강좌 중의 테스트 코드를 @DataJpaTest 로 하면 insert -> update -> select 쿼리가 실행 되면서 title 이 jpa -> Spring 으로 바뀌는 것이 확인 됩니다. 그런데 @SpringBootTest 로 하면 insert -> select 쿼리만 실행 되고 update 쿼리는 실행 되지 않아 테스트는 실패합니다. 테스트 어노테이션이 바뀌니까 다른 결과가 나오는지 잘 이해가 되지 않습니다. findAll 이 실행 되기 전에 dirthchecking(?) 을 하면서 데이터를 맞춰주니까 update 쿼리가 실행 되어야 맞는것 같은데요..무슨 차이일까요? @Testpublic void updateTest() throws Exception { Post post = new Post(); post.setTitle("jpa"); Post newPost = postRepository.save(post); newPost.setTitle("Spring"); List<Post> posts = postRepository.findAll(); assertThat(posts.size()).isEqualTo(1); assertThat(posts.get(0).getTitle()).isEqualTo("Spring");}
- 미해결스프링 데이터 JPA
하이버네이트 , JPA, SpringDataJPA 질문이 있습니다.
Hibernate는 jpa의 구현체이고 spring-data-jpa는 jpa를 편하게 쓰기 위한 모듈이라는데 spring-data-jpa와 hibernate의 관계는 어떻게 되나요?
- 해결됨스프링 데이터 JPA
jpa 이점중에 동일성보장이 왜 장점인지 자세히 알고싶습니다..
강의내용중에 동일성보장에 대한 장점을 듣고 정확히 어떤 사례에 이점인지 궁금하여 구글링을 해봤는데 시원하게 원하는 내용을 찾지 못하였습니다. ㅠㅠ 어떤 상황에서 동일성보장에 대한 장점을 이해할수 있을까요
- 해결됨스프링 데이터 JPA
똑같이 작성후 select * from account;
똑같이 작성후 select * from account; 를 해도 아무변화가 일어나지않네요 .. 왜그럴까요? ㅠㅠ 적용이 안된다고 해야하나.. 오류는 일어나지않습니다. package me.whiteship.demospring;import org.hibernate.Session;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;@Component@Transactionalpublic class JpaRunner implements ApplicationRunner { @PersistenceContext EntityManager entityManager; @Override public void run(ApplicationArguments args) throws Exception { Account account = new Account(); account.setUsername("whiteship"); account.setPassword("jpa"); Session session = entityManager.unwrap(Session.class); session.save(account); }} spring.datasource.url=jdbc:postgresql://localhost:5432/springdataspring.datasource.username=postgresspring.datasource.password=passspring.jpa.hibernate.ddl-auto=updatespring.jpa.properties.hibernate.jdbc.lob.non_contxtual_creation=true public void run(ApplicationArguments args) throws Exception { Account account = new Account(); account.setUsername("aaaaa"); account.setPassword("jpa"); Session session = entityManager.unwrap(Session.class); session.save(account); System.out.println(account.getUsername()); System.out.println(account.getPassword()); }} 이렇게 출력해보니까 2020-06-11 15:39:08.303 INFO 18983 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2020-06-11 15:39:08.312 INFO 18983 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' aaaaa jpa 2020-06-11 15:40:08.323 INFO 18983 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 나오긴나오는것 같은데 터미널에는 아~무 이상이 없어요 ㅠㅠ email도 추가 되지않았구요 혹시 이것도 관계가 있을가요? springdata=# \list List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ------------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | springdata | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) Acces privileges.. 데이터베이스 지우면 springdata없다고 인텔리제이에서 오류나고, 생성하면 username, password는 커녕 account 테이블 생성조차 안되네요 ㅠㅠ
- 미해결스프링 데이터 JPA
spring sql = 해서 테이블 생성했는데 테이블이 없어요..
\dt 확인해도 없고 계속 헤매다가 그냥 터미널에 똑같이 CREATE TABLE ACCOUNT (id int, username varchar(255), password varchar(255)); 입력하고 \dt하니까 테이블이 나오네요... 똑같이 따라하는데 왜이리 어마어마한 오류가 나오는지 ㅠㅠ 이 강의 20분짜리 듣는데 6시간걸리네요.. 그걸떠나서 왜 그런가요? 터미널에 수동으로 테이블생성을 하기전에 run을 또 했을때는 이미 accout테이블이 존재해! 라고뜨더라구요.. 근데 \dt하면 안나옴... 뭐 commit이라도 해줘야하는건가 postgresql처음이라.. 기종은 mac이고 똑같이 postgresql써서 따라하고있었어요 --- 그 다음 데이터 넣는것도 적용이 안되더군요 라기보단 다른곳에서 생성되고 있나... 아! 그게 아니라 밖에서 터미널은 바로바로 적용되는데 인텔리제이의 터미널은 적용이 안되나봐요 ㅠㅠ 인텔리제이가 아닌 밖의 터미널에서 검색하면 또 보임.. 왜이러죠?
- 미해결스프링 데이터 JPA
Custom Repository에 @Repository와 @Transactional
안녕하세요. 항상 강의 잘듣고 있습니다. 다름이 아니라 Custom Repository의 구현체에서 @Repository와 @Transactional이 꼭 필요한지 궁금해서 아래 코드에서 @Repository와 @Transactional을 제외한체 테스트 코스를 실행시 정상적으로 통과되었습니다 그래서 현재 궁금한게 Custom Repository에서 @Repository와 @Transactional은 필요없는 것인지. 그리고 만약 필요하다면 어떤 이유로 필요한 것인지 궁금합니다. 감사합니다. @Repository @Transactional public class PostCustomRepositoryDefault implements PostCustomRepository<Post> { @Autowired EntityManager entityManager; @Override public List<Post> findByPost() { System.out.println("custom findMyPost"); return entityManager.createQuery("SELECT p FROM Post AS p",Post.class).getResultList(); } @Override public void delete(Post entity) { System.out.println("custom delete"); entityManager.remove(entity); } }
- 미해결스프링 데이터 JPA
질문이 있습니다 .
서브쿼리를 나타내는 방법에 대해서 질문 드립니다 . 예를 들어서 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로 바꿀려면 어떤게 필요한지 잘 모르겠습니다 .
- 미해결스프링 데이터 JPA
Optional 관련 질문있습니다.
스프링 데이터 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); } }
- 미해결스프링 데이터 JPA
@Transaction 처리 질문입니다.
@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; }
- 미해결스프링 데이터 JPA
EqualsAndHashCode와 관련하여 질문드립니다.
안녕하세요 뒤늦게 강의를 알게되어 보고있습니다. 강의를 진행하시면서 작성하시는 코드를 직접 따라해보며 생긴 질문들이 있어 질문드립니다. 먼저 저는 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 필드만을 사용해 구현하는 방법은 권장하지 않는 방법인지 궁금합니다.
- 미해결스프링 데이터 JPA
@Temporal(TemporalType.TIME) 사용할 시에 타임존
안녕하세요 좋은 강의 잘 듣고 있습니다..^__^ 타임존 관련 질문이 있어 글 남기게 됐습니다. @Temporal(TemporalType.TIMESTAMP) 사용할 시에 타임존은 해당 데이터베이스의 타임존에 맞게 저장이 되나요? 아니면 애플리케이션의 타임존에 맞게 저장이 되나요? @Temporal을 사용할 때 만약 타임존이 다를 경우에 타임존 문제를 어떻게 해결해서 사용하는지 궁금합니다~