월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 스프링 데이터 JPA
여기다가 올려서 죄송해요..
삭제된 글입니다
- 미해결스프링 데이터 JPA
@Service 클래스에서 Repository 객체 사용
쇼핑몰 사용자를 엔티티로 표현했습니다 사용자가 mkaeOrder 함수 호출시 쇼핑몰 객체에게 연락이 가게 했습니다 쇼핑몰은 연락을 받으면 배송준비를 출력 하고유저의 id를 받아서 유저 정보 DB에서 가져와 정보를 출력하게 코딩했습니다 테스트 코드는 위와 같습니다 결과는 NullPointer Exception이 발생합니다. 선장님 이유를 ㅠㅠ 잘모르겠습니다
- 미해결스프링 데이터 JPA
CascadeType.REMOVE & Detached 상태 질문
안녕하세요 본 강의 후반부에 있던 CascadeType.REMOVE와 엔티티의 Detached로의 상태변화 관련 질문 드립니다! 1. 강의상에 출력된 sql 콘솔 출력 화면을 보니 Post 타입 오브젝트를 remove할 경우 자식 오브젝트 Comment 들에 대한 delete 쿼리가 (총 두번)실행 되었음을 알 수 있습니다. 보통 DDL에서 fk를 생성할 때 ON DELETE CASCADE와 같이 하여 부모 로우가 삭제될 경우 이를 참조하는 자식 로우도 삭제하게 할 수 있는 것으로 알고 있습니다. 명시적으로 DELETE 쿼리가 실행되는 것으로 보아 CasecadeType.REMOVE의 경우는 위 단락에서 말씀드린 fk 제약조건과는 다른 방법으로 보입니다. 제 생각(위 두 방법이 다른것인지)이 맞는지 그리고 CascadeType.REMOVE 방식과 같이 DB가 아닌 EntityManager가 관계를 제어?하게 하는 방법의 이점이 따로 있는 것인지 질문드립니다! 2. DETACHED : 강의에서 트랜잭션이 끝나서 Session 밖으로 나왔을때 엔티티의 상태가 DETACHED 상태가 된다고 하셨습니다. 또한 강의 노트상에 Persistent상태에서 Detached 상태로의 전이는 Session.evict(), close() 등의 메서드가 호출되어야 된다고 되어있습니다. 이 두가지로부터 궁금증이 생겨 질문드립니다. 엔티티상태가 Detached가 되는 것이 1)하이버네이트 EntityManager(Session)가 직접(내부적으로) TransactionManager 타입 오브젝트를 이용하거나해서 트랜잭션을 관리 후 Session.evict()와 같은 메서드를 호출하는 방식으로 자동으로 상태가 변화되는 것인지 아니면, 2) (스프링 데이터 JPA가 아닌 하이버네이트만 사용하는 상황에서) 개발자가 트랜잭션이 필요하면 TransactionManager를 사용하고 commit() 되었다면 그 때에 직접 Session.evict()를 호출해야하는 것인지가 궁금합니다. 강사님께서 서비스와 리파지토리 레이어에 대해서도 말씀하셨습니다. 이로부터 서비스 메서드 레벨 단위로 트랜잭션이 진행되는 경우를 생각해보았습니다. 위와 같이 트랜잭션이 서비스 메서드 단위로 진행될 경우 1)의 방법보다 2)이 방법으로 진행되는 것이 더 맞는 것 같지만 강의상에서는 (제가 이해하기로는)상태 변화가 저절로 되는 것 같이 이해가 되어 정확히 알고자 질문드립니다! 답변 부탁드리겠습니다. 감사합니다!
- 미해결스프링 데이터 JPA
잘 이해 안가시는 분들
https://book.naver.com/bookdb/book_detail.nhn?bid=9252528 위 책을 보시고 다시 한번 강좌 보시면 한결 더 이해가 잘 됩니다. 책 보고 나서 다시 설명 들으니 짧은 시간안에 핵심을 콕 찝어주셨다는 생각이 드네요 :)
- 미해결스프링 데이터 JPA
기본 Repository 커스터마이징 했을 경우.. 질문 있습니다.
강사님이 알려주신 방법인 SimpleRepository를 QuerydslJpaRepository로 변경하지 않아도... 테스트가 성공합니다. 혹시 스프링 버전 변경에 따라서 변경된것인지저의 프로젝트에 무언가 오류가 있는것인지 .. 궁금합니다. 현재 제 스프링 버전은 5.1.6 부트 버전은 2.1.4 입니다.
- 미해결스프링 데이터 JPA
JpaRepository를 상속한 interface PostRepository의 구현체는 없는건가요 ?
안녕하세요. 강사님 JPA 강의 정말 잘 듣고 있습니다. JpaRepository를 상속한 interface PostRepository를 주입받아서 테스트를 진행하는데 구현체 클래스가 없는데 어떻게 실행되는지 이해가 안갑니다.
- 해결됨스프링 데이터 JPA
죄송한데 잘 이해가 안되서요 ..
board와 comment는 1:N 관계입니다 comment 테이블에서 board_Id 칼럼을 FK로 쓰고있구요 그러면 board글 no 3에 첫번쨰 댓글을 달았을때 @Entity(name="Board") @Table(name = "board") public class Board { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "board_id") private Integer boardId; @Column private String content; } @Entity(name="Comment") @Table(name="Comment") public class Comment { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="commentId") private Integer commentId; @Column(nullable = false) private String comment; @ManyToOne @JoinColumn(name ="board_id") private Board board; } 이렇게 클래스를 정의 했다면 UI화면에서 글번호 3번의 글에서 첫번째 댓글을 저장할떄 .. 일단 board의 3번쨰 글정보가 들어있는 객체를 가져와야 하니까 int boardNo = 3; Board boardOne = boardRepository.getOne(boardNo ); comment.setBoard(boardOne); commentRepository.save(comment); 이렇게 사용하는게 맞을까요 ?? 에러가 나서요 .
- 미해결스프링 데이터 JPA
질문이 있습니다
board 테이블 (원글 부모글) comment 테이블 (댓글) 있다고 가정했을떄 .. comment가 DB에 입력이 되어야 하니까 @ManyToOne Board board; 이런식으로 들어가자나요 ??? entity 클래스에서요 근데 sql적으로 보면 board글의 몇번에 comment 자나요 ? ex ) boardId=10 번의 코멘트 10개 뭐 이런식이니까 boardId를 Comment클래스에 @ManyToOne을 적용시킬떄는 아무 표기를 안해줘도 되는건가요 ??? 그럼 만약에 글번호 5번에 대한 코멘트를 저장할려면 @ManyToOne 만 명시하고 레포지토리.save(comment객체); 이런식으로 해도되는걸까요 ? 그러면 부모글의 몇번글에 대한 코멘트인지 모르지 않나요 ?? 아직 초짜라 강의 2번쨰 듣는데 ..궁금한게 있어서 질문드립니다 .
- 미해결스프링 데이터 JPA
질문이 있습니다
게시판에 글상세페이지의 댓글을 구현하고 있는데요 Board가 부모글 comment가 댓글이라고 가정을 했을시에 부모글 하나에 댓글 여러개니 1:N 관계 자나요 ? 그러면 이럴경우에 주인은 어느쪽으로 해야될까요 댓글을 저장할때요..insert가 들어가는곳이 댓글쪽이니까 Comment클래스가 주인이 되서 ManytoOne이 되야 하는걸까요 ?
- 해결됨스프링 데이터 JPA
데이터 입력/수정시 entity 의 필드 갱신
좋은 강의 감사합니다. 😃 jap 를 이용한 기능구현 중 궁금한 사항이 있어 문의 드립니다. 저장작업 직후 DB 에서 생성된 timestamp 정보를 entity filed 와 연동시키는 방법이 없을까요? webApp 의 시간을 사용할 수 없는 상황입니다. 😭 감사합니다. * 목표 EntityManager 의 clear 를 사용하지 않고 입력/수정작업 후 DB 에서 생성되는 timestamp 값을 entity 에 담아 API 응답 * 상태 1. DB 의 timestamp 기능을 이용하여 데이터의 입력/수정시간을 자동생성 하도록 팀내 합의 2. entity 에 입력시간, 수정시간 필드가 존재하나 query 에서 insert, update 시 사용하지 않도록 처리 (insertable = false, updatable = false) 3. 신규 데이터의 입력/수정 작업 후 DB 에는 timestamp 값이 생성되나 save or saveAndFlush 작업 후 리턴받는 entity 의 값은 null 인 생태 4. 컨트롤러에서 서비스의 저장작업 후 다시 조회를 하더라도 cache 값이 조회됨 5. EntityManager 를 이용하여 clear 후 조회 시 DB 값을 정상조회 PostEntity.java @Getter @Setter @Entity @Table(name = "post") @EntityListeners(AuditingEntityListener.class) public class PostEntity implements Serializable { private static final long serialVersionUID = -6794700285084640362L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; //DB timestamp @Column(insertable = false, updatable = false) private LocalDateTime inDt; //DB timestamp @Column(insertable = false, updatable = false) private LocalDateTime upDt; } PostController.java @RestController @RequestMapping("/api/v1") @Api(value = "API Manage") public class PostController { @Autowired PostService postService; @ApiOperation(value = "Create Post") @PostMapping("/post") public ResponseEntity<PostEntity> postCreate() throws Exception { PostEntity newPost = postService.postCreate(); long createdId = newPost.getId(); System.out.println("np : in : " + newPost.getInDt()); //null System.out.println("np : up : " + newPost.getUpDt()); //null PostEntity rePost = postService.postGet(createdId); System.out.println("rp : in : " + rePost.getInDt()); //null System.out.println("rp : up : " + rePost.getUpDt()); //null return new ResponseEntity<PostEntity>(newPost, HttpStatus.OK); } } PostService.java @Service public class PostService { @Autowired private PostRepository postRepo; @Transactional public PostEntity postCreate() { PostEntity post = new PostEntity(); post.setTitle("new post create"); PostEntity newPost = postRepo.save(post); return newPost; } @Transactional(readOnly = true) public PostEntity postGet(long postId) throws Exception { PostEntity searchPost = postRepo.findById(postId) .orElseThrow( () -> new Exception("resource not found") ); return searchPost; } }
- 미해결스프링 데이터 JPA
22강 커스텀 리포지토리 질문
백선장님이 알려주신 코드만 단독 테스트 하면 오류가 나지 않는데 위와 같은 파일들과 백선장님 코드가 존재하는 상태에서 테스트 하니깐 에러가 발생합니다 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'postRepo': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.example.demo.demo.repo.PostCustomRepo.findMyPost()! No property findMyPost found for type Post! [에러 메시지] --------------- 왜 프러퍼티를 찾지 못한다고 하는지 잘 모르겠습니다.
- 해결됨스프링 데이터 JPA
관계매핑에 관한 조언 좀 부탁드립니다.
인프런 개인개정으로 Restful API 강좌 듣고 큰 도움 받았습니다. 사내 프로젝트 진행하면서 JPA 가 필요해 이 강좌를 듣고 있는데요. 아직 전부 강좌를 보진 못했습니다. 프로젝트 진행하면서 막막한 부분이 있어 고민하다고 기선님께 여쭤봅니다. 조언 좀 부탁드려도 될까요? Event 클래스와 Account 계정이 매핑관계가 있습니다. ( 아마 기선님이 manager 필드로 선언했던 걸로 기억합니다. ) 저는 JWT 토큰을 이용해 리소스서버를 인증서버와 분리해서 구축했습니다. 토큰에 필요한 정보를 담아 리소스 서버를 호출합니다. JWT 의 경우 별도의 토큰스토어가 없어 Account 객체를 저장할 수 없습니다. 일단, 대안으로 인증시 Client 에게 JWT 안에 account Id 를 담아 응답했습니다. Client 는 인증서버에서 받은 이 JWT 토큰으로 리소스서버의 create-event API 를 호출하는데요. 이 경우 리소스 서버에서 @AuthenticationPrincipal 로 Account 객체를 추출할 수 없어, JWT 안에 있는 account Id 로 repository 통해 DB에서 Account 객체를 얻어, Event 에 주입하고 Event 를 생성합니다. Account 객체를 맵핑관계로 갖고 있는 모든 Entity( Event 같은 ) 는 리소스 서버 호출 시 항상 이렇게 DB 에서 Account 를 얻어 와야 하는 상황인데요. Event 클래스에 Account '객체' 를 매핑하지 않고 Account 의 'id' 만 매핑 관계로 설정할 순 없을까요? 그럼 리소스서버에서 Event 생성시에 Account 객체를 매번 쿼리하지 않고 요청 JWT 에 들어있는 'id' 만 Event 에 설정하고 생성할 수 있을텐데요. 혹시 이런 매핑관계를 설정할 수 있을까요? ( 객체가 아닌 객체의 id 로 매핑관계를 설정 ) 혹시 이런경우 Account 객체를 id 만 설정해서 생성하고 Event 객체에 주입한 후 Event 를 생성하기도 하나요??? 조언 부탁드립니다. 감사합니다.
- 미해결스프링 데이터 JPA
영속성 전이 관련해서 질문드립니다.
안녕하세요, 좋은 강의 감사드립니다. 영속성 전이 관련해서 궁금한 부분이 있어 질문드립니다. OneToMany(이하 Parent, cascade = CascadeType.ALL) - ManyToOne(이하 Child) 의 관계가 있을 때 Parent에 아래와 같은 메소드가 있는 상태입니다. public void addChild(final Child child) { this.getChildList().add(child); child.setParent(this); } Parent를 새로 save한 뒤, Child를 add하면 Parent insert, Child insert 모두 정상적으로 수행됩니다. 하지만 update 시에는 Parent를 update한 뒤 Child를 새로 add해도 Parent update만 수행되고 Child는 insert되지 않는데요, cascade = CascadeType.ALL 로 영속성 전이를 설정해도 PERSIST - PERSIST, MERGE-MERGE, 이런 식으로 같은 타입의 상태만 전이가 되는 것인지 궁금합니다. 설명이 잘 되었는지 모르겠네요. 답변 기다리겠습니다, 감사합니다.
- 미해결스프링 데이터 JPA
JPA를 사용한 대부분의 쿼리들
JPA를 사용한 쿼리들은 특정 컬럼을 명시하지 않는 이상 모든 컬럼을 다가지고 오는데 성능상에 문제는 없나요??제가 생각하기엔 성능상의 문제가 있을 것 같은데.만약에 있다면 쿼리마다 Projection을 만들어서 사용을 해야하나요?현업에서는 어떻게 사용하고 있는지 궁금합니다.
- 미해결스프링 데이터 JPA
lob.non_contextual_creation=true 설정해도 에러 나는분
저 설정을 해도java.lang.reflect.InvocationTargetException: null 에러가 발생해서프로퍼티에spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false를 추가하는것으로 해결했습니다
- 미해결스프링 데이터 JPA
질문이 있는데요
@Value에 (#{target.up + ' '+ tartget.down}")이라고 하셨는데 여기서 target 은 자동으로 찾아가는건가요 아니면 따로 설정을 해줘야 하는건가요 ?
- 미해결스프링 데이터 JPA
질문드립니다
EntityGraph( attributePaths="post")이렇게 되면 post 클래스를 알아서 찾아가는건가요 ???
- 미해결스프링 데이터 JPA
jpa가 db에서 create table 을 안해도 도메인객체를 실행하면 create 되는게 맞나요 ?
강사님! 강의 잘듣고있습니다. JPA 처음 입문해서 기초적인 질문드립니다. 저는 당연히 account라는 table을 만들고 나서 도메인객체랑 맵핑하는 건줄 알았는데 drop table하고 실행해보니깐 table이 생성되어있네요. 그럼 프로젝트 진행 할때, db에서 테이블을 안만들고 java 도메인 객체 중심으로 테이블 생성하고 진행하나요 ? .. Mybatis만 쓰다가 JPA 처음 써보니깐 신세계이면서도 어떻게 설계를 하지 ? 이 생각부터 듭니다. ㅠㅠ
- 미해결스프링 데이터 JPA
manytoone testcode 작성
아래와 같이 간단한 entity를 생성한다고 했을때,테스트코드에서는 한번에 조회가 되지만 실제 webcontroller에서 호출했을때는member를 조회하고 team을 한번더 조회하게 됩니다.testcode에서 비슷하게 하려고 member객체를 json으로 출력하게 했는데도똑똑하게 알아서 채워주고있는데요. 아래 코드를 보면public class Member {@Id @GeneratedValue(strategy = GenerationType.AUTO)Long id;String name;@ManyToOne @JoinColumnTeam team;}public class Team {@Id @GeneratedValue(strategy = GenerationType.AUTO)Long id;String name;}@Testpublic void select() throws JsonProcessingException { Team team = new Team(); team.setName("팀1"); Team saveTeam = teamRepo.save(team); Member member = new Member(); member.setName("학생1"); member.setTeam(saveTeam); memberRepo.save(member); Member member1 = new Member(); member1.setName("학생2"); member1.setTeam(saveTeam); memberRepo.save(member1); List<Member> all = memberRepo.findAll(); ObjectMapper mapper = new ObjectMapper(); String jsonInString = mapper.writeValueAsString(all); System.out.println(jsonInString);}wecontroller에서 List<Member>로 데이터 리턴시 n+1조회문제가 발생하는데요-------Hibernate: select member0_.id as id1_0_, member0_.name as name2_0_, member0_.team_id as team_id3_0_ from member member0_Hibernate:selectteam0_.id as id1_10,team0_.name as name2_10fromteam team0whereteam0.id=?unittest에서는Hibernate:selectmember0_.id as id10,member0_.name as name20,member0_.team_id as team_id30frommember member0_[{"id":3,"name":"학생1","team":{"id":1,"name":"팀1"}},{"id":4,"name":"학생2","team":{"id":2,"name":"팀2"}}]team_name이 조회쿼리에도 없는데도 알아서 데이터를 불러와서 결과를 넣어주는 모습을 보이는데@DataJpaTest에서 webcontroller 호출하는 것과 동일한 결과를 얻어보려면 어떤식으로 테스트를해야할까요?..controller test코드를 작성해야할까요?..
- 미해결스프링 데이터 JPA
<version>42.2.2</version> 임포트가 안됩니다.
우선 version 작성시 컨트롤 스페이스시 해당 버전을 조회해 주지 못하고임의로 42.2.2로 작성해도 임포트를 제대로 해주지를 못하네요.우클릭 maven > reimport 클릭해도.. 안됩니다....