묻고 답해요
148만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
FK를 조합한 복합식별자를 사용하는 경우에는 Entity를 어떻게 해야할까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 현재 도메인 설계중이고 다음과 같이 단일 주 식별자 값 없이 두 개의 외례키를 조합하여 식별자로 사용하고자 합니다. 테이블에서 자주 사용되는 컬럼값인 id, createdAt, updatedAt, status를 아래와 같이 BaseEntity 클래스에 묶어서 관리하고 있습니다. @MappedSuperclass @Getter public abstract class BaseEntity implements Serializable { @Id @GeneratedValue private Long id; @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; @Column(length = 10) @Value("ACTIVE") private String status; public BaseEntity(LocalDateTime createdAt, LocalDateTime updatedAt) { this.createdAt = createdAt; this.updatedAt = updatedAt; } protected BaseEntity() {} } 만약 처음 테이블 설계와 같이 외례키를 조합하여 테이블을 관리하게 되면 Entity does not have primary key라는 경고 메시지가 발생합니다. 여기서 BaseEntity를 상속받는 다면 기본 키도 같이 상속받기 때문에 경고 메시지는 사라지지만 ERD와 달리 기본 키를 갖게 됩니다. ERD 설계와 같이 외례키 조합만으로 도메인을 구성할 수 있는 방법이 있을까요? 혹은 위의 ERD를 수정하여 group_member_id 기본키를 넣어주는 편이 더 좋은 설계인것인지 궁금합니다.
-
미해결
JPA의 DB조회에 대해서 질문드립니다.
안녕하세요. 스프링JPA로 블로그 게시판을 만들고 있습니다. 복잡한 기능 말고 게시판만 하나 만들어 보고 심층공부를 들어갈려고 하는중입니다. -------------------------------------------------------------------------------------------------------------------- 일단 DB는 이렇게 구성돼 있고 BLOGLIST로 게시판 목록을 관리하기 위해 BLOG_NUM에 외래키를 주고 테이블을 따로 만들어서 조인했습니다. -------------------------------------------------------------------------------------------------------------------- 그리고 엔티티를 각각 만들고 다대일 연결까지 성공해서 데이터 조회까지 됩니다. @Entity(name = "BLOG") @Getter @Setter @ToString @RequiredArgsConstructor public class Blog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="CON_NUM") private Integer con_num; @ManyToOne @JoinColumn(name = "BLOG_NUM", referencedColumnName = "BLOG_NUM") //referencedColumnName = "BLOG_NUM"~~ 은 어떤 컬럼과 연결이 됐는지 지정. private BlogList blogObj; @Column(name="CON_TITLE") private String title; @Column(name="CON_CONTENT") private String content; @Column(name ="CON_WRITEDATE") private Date writeDate; } @Entity(name = "BLOGLIST") @Getter @Setter @ToString @RequiredArgsConstructor public class BlogList { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "BLOG_NUM") private Integer blogNum; @Column(name = "BLOG_NAME") private String blogName; } ---------------------------------------------------------------------------------------------------------------------- 이런식으로 BLOGLIST테이블의 항목까지 출력을 할 수 있었습니다. 여기서부터 문제입니다. SELECT * FROM BLOG WHERE=BLOG_NUM=? 이러한 쿼리를 실행시켜서 블로그의 메뉴에서 각각의 항목을 눌렀을 때 각각의 내용을 출력하려고 합니다. ------------------------------------------------------------ 그래서 제가 시도한것은 1. 레파지토리에서 아래 주석된 메소드로 조회메소드를 만들고 public interface BlogRepository extends JpaRepository<Blog, Integer>{ List<Blog> findByTitleContaining(String searchWord); //List<Blog> findByBlogObj(Integer blogNum); } 컨트롤러에서 이런식으로 조회를 시도 해보았으나 잘 되지 않았습니다. // 게시판별 리스트 @GetMapping("/contest") public String testList(Integer blogNum, Model model){ model.addAttribute("list", blogRepository.findByBlogObj(blogNum)); return "/layouts/conList"; } ---------------------------------------------------------- 그래서 2번으로 시도한 것이 리파지토리에 쿼리 직접 넣는 것이었습니다. @Query(value = "SELECT * FROM BLOG B WHERE B.BLOG_NUM = ?", nativeQuery = true) //true는 SQL, false는 JPQLList<Blog> findAllByBlogNum(Integer BlogNum); @GetMapping("test")public String findBlog(Integer BlogNum, Model model){ System.out.println("파람:" + BlogNum); List<Blog> blog = blogRepository.findByBlogObj(BlogNum); model.addAttribute(blog); return "/layouts/conList";} 이 방식은 이렇게 파라미터를 보냈으나 Null값이 뜨고 파라미터를 가져오지 못하네요. ------------------------------- 아무래도 엔티티 설계에 제가 이해가 부족해서 그런것 같은데 엔티티에 어느 부분을 손을 보아야 제가 원하는 조회를 할수 있을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
PathVariable의 대한 검증
안녕하세요 영한님. 수정 혹은 삭제 시 pathvariable을 사용해서 처리를 했었는데요. 이 강의를 보고 조작의 위험성에 대해서 고민이 되었습니다. 실제 사용자가 해당 리소스에 대한 권한이 있는지 체크해야 한다 라고 말씀하셨는데요. 예제의 내용으로 보안을 해야 한다면 itemId와 사용자 Id로 상품 조회 후 결과 값이 있으면 해당 리소스에 대한 권한이 있는 사용자로 판단 고로 수정 혹은 삭제가 가능으로 처리 하면 되겠습니까?? 그리고..수정은 주로 PutMapping을 사용하는데 예제에서는 PostMapping을 사용하셨더라구요. 이건 영한님의 개인 취향 일까요?? 아니면 PutMapping을 안쓰시는 이유가 있으면 알려주십시아. 질문 다시 정리하자면. 1. pathvariable로 수정, 삭제 시 가장 좋은 검증 방법 2. PutMapping 혹은 DeleteMapping에 대한 영한님의 의견을 듣고 싶습니다. 코로나 조심하세요. 영한님. 항상 좋은 강의 감사합니다 !
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
자바에서 valid하는 것과 JS로 valid하는 경우
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 자바에서 valid하는 것과 JS로 valid하는 경우 커스터마이징이 JS가 좀더 쉬워보이는데 자바로 하는게 더 효율적인가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpa insert, update
안녕하세요 선생님! 해당 강의를 보면 복습하는 중에 특정 필드만 예시) insert into post (created_date, last_modified_date, created_by, last_modified_by, comment_cnt, content, like_cnt, member_id, post_type, post_id) values ('2022-03-11T13:27:50.059+0900', '2022-03-11T13:27:50.059+0900', 'test', 'test', 0, 'java.io.StringReader@1afdc204', 0, 2907, 'picture', 3142);p6spy 를 통해 쿼리를 보면 java.io.StringReader@주소 와 같은 형식으로 특정 필드만 값이 아닌 저렇게 쿼리가 찍히는데 이유를 알 수 있을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
수업을 듣던중 질문이있습니다
allocation 옵션에서 메모리에 저장해서 쓰신다고 하셨는데 처음 호출할 때 1부터 51까지 호출하여 메모리에 저장하여 사용하는게 맞나요? 맞다면 영속성 컨텍스트가 메모리 역할을 하는지 궁금합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA에서 findById, findByName에서 궁금한게있습니다.
package hello.hellospring.repository; import hello.hellospring.domain.Member; import javax.persistence.EntityManager; import java.util.List; import java.util.Optional; public class JpaMemberRepository implements MemberRepository { private final EntityManager em; // build.gradle에서 data-jpa를 등록함 // 스프링부트가 자동으로 EntityManager 만들어줌 public JpaMemberRepository(EntityManager em) { this.em = em; } // 저장, 조회, 업데이트는 쿼리 짤 필요 없음 @Override public Member save(Member member) { em.persist(member); // persist=영구저장-> setId등 모든것을 해줌 return member; } @Override public Optional findById(Long id) { Member member = em.find(Member.class, id); return Optional.ofNullable(member); } // 리스트로 탐색 시 @Override public Optional findByName(String name) { List result = em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); return result.stream().findAny(); } @Override public List findAll() { // 객체를 대상으로 쿼리를 날림 -> entity 자체를 select하는 것임 List result = em.createQuery("select m from Member m", Member.class) .getResultList(); return result; // return em.createQuery("select m from Member m", Member.class) // .getResultList(); } } 여기에서 findById는 sql없이 찾을 수 있는데 findByName은 쿼리를 작성해주는데, 이유가 어떤건가요? 혹시 id의 경우 제가 db에 넣는게아니라 컴퓨터에서 직접 넣어주는거고 name은 제가 입력해서 db에 넣기 때문인가요? 그리고 findByName에서 sql을 이용해서 특정 데이터를 뽑아내면 list로 나오는데, findById의 경우는 리스트로 나오는게 아닌가요,,?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
org.hibernate.TransientPropertyValueException 질문드립니다.
https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21720?tab=curriculum&volume=1.00 프로젝션(SELECT) 강의 4분쯤 보던중 오류를 만나게 되었습니다. java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpql.domain.Member.team -> jpql.domain.Team at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:151) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1366) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1349) at jpql.JpqlMain.main(JpqlMain.java:27) 찾아보던 중 ManyToOne 또는 OneToMany 관계시 Team의 FK 값 을 영속화 하지 않은 채 Member를 영속화 하여 오류가 난다고 하여 2가지 해결책을 찾아보았습니다. 1. Team 을 생성후 영속화, 그리고 member.setTeam(team) 으로 팀을 멤버에 추가 2. @ManyToOne(cascade=CascadeType.ALL) 로 영속성 전이 설정 하지만, 강의를 보던중 4:20 초 영상을 보니 강사님의 예제 실행시 TEAM_ID 는 NULL로 들어간 것이 확인 되었습니다. 위의 1번은 Team을 set 했기 때문에 FK 가 당연히 있었고, 2 번을 실행시 FK 값은 있었지만 Team의 name이 Null로 값이 들어가 있었습니다. @ManyToOne의 optional이나, mappedBy의 nullable에 대해 설정은 하시지 않은거같은데 제가 빠트린 무언가 있을까요 ?! Member.java ``` @Entitypublic class Member { public Member(){ } @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne @JoinColumn(name = "TEAM_ID", nullable = true) private Team team = new Team(); ``` > Team.java ``` @Entitypublic class Team { public Team() { } @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); ``` > JpqlMain.java ``` Member member1 = new Member();member1.setUsername("member1");member1.setAge(35);em.persist(member1);em.flush();em.clear();List<Member> result = em.createQuery("SELECT m FROM Member m", Member.class) .getResultList();Member findMember = result.get(0);findMember.setAge(28);tx.commit(); ```
-
미해결실전! 스프링 데이터 JPA
JPA Dirty Checking - open session in view
안녕하세요 JPA Dirty Checking 관련 질문 드립니다. 우선 환경은 Spring Boot 입니다. public void test() { OrderInfo orderInfo = new OrderInfo(); orderInfo.setStatus("test"); oRepo.save(orderInfo); OrderInfo findOrderInfo = oRepo.findById(orderInfo.getId()).get(); findOrderInfo.setStatus("zzzzzzz"); } 위와 같은 코드가 있다고 할 때 Open session In view 설정과 @Transactional 에 따라서 dirty checking 되는 로직에 대해서 질문드립니다. 1. Open Session in View : true @Transactional : 사용 안함 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) Hibernate: select orderinfo0_.id as id1_0_0_, orderinfo0_.status as status2_0_0_ from order_info orderinfo0_ where orderinfo0_.id=? 2. Open Session in View : false @Transactional : 사용 안함 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) 3. Open Session in View : true @Transactional : 사용 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) Hibernate: update order_info set status=? where id=? 4. Open Session in View : false @Transactional : 사용 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) Hibernate: update order_info set status=? where id=? 1 번의 경우 영속성 컨텍스트가 각각의 트랜잭션에서 끝나서 select 문이 나가는 것으로 보입니다. 2번의 경우 OSIV로 인해 영속성 컨텍스트가 끝까지 남아서 select문이 안나가는 것으로 보입니다. 3번의 경우도 OSIV와 Transaction으로 인해 영속성 컨텍스트안에 있는 객체를 가져오기에 select 문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다. 4번의 경우 트랜잭션 범위내에 있는 영속성 컨텍스트에서 찾아오기에 select문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다. dirty checking 의 경우 영속성 컨텍스트가 관리하고 있는 엔티티에 대해서 스냅샷을 저장 후 변경이 되면 나가는 것으로 알고 있습니다. 그럼 이 때 2번의 경우 영속성 컨텍스트가 남아서 select문이 안나간다고 생각을 하는데 왜 dirty checking 이 안되는 이유가 있을까요??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
리버스 프록시와 차이점이 뭘까요?
아직 이것저것 공부중인 학생입니다. 오늘 어쩌다 리버스 프록시란 단어를 듣게되어 찾아보았는데 이곳에서 설명하는 gateway service가 리버스 프록시의 역할을 하는 거 같은데 맞는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
IntelliJ Plugin 질문
저도 간단한 질문하나... 영한 님 강의 동영상에 보면 인텔리J 도구에 왼편에 Line No 옆에 나타나는 아이콘들이 나타나게 하려면 어떤 플러그인을 깔아야 하는 건가요? 혹시 유료 버전에서만 나타나는 건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Runwith, springboottest어노테이션이 없이 테스트 하면 어떻게 되나요?
이전에는 그 어노테이션 없이 test를 진행했던것같은데 이번에는 저 어노테이션이 추가가되어있네요 어떤 차이인거죠? runwith 어노테이션은 junit에 내장된 러너를 사용하는 대신 어노테이션에 정의된 러너 클래스(springrunner.class)를 사용한다는데.. junit에 내장된 러너랑 어노테이션에 정의된 러너클래스랑은 무슨차이인건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성 컨텍스트와 트랜잭션에 대한 질문입니다.
안녕하세요 영한님. 늘 강의 잘 듣고 있습니다. 강의에서는 Controller단에서 찾아서 넘기면 JPA와 관계가 없는 애가 넘어온다고 하셔서 아래 코드로 테스트 해보았는데, 값이 변경되길래 조금 찾아보았고, 제가 이해한 것이 맞는건가 확인차 질문 올립니다. 1. Spring에서 Controller단의 경우 트랜잭션 범위 밖이기 때문에 읽기만 가능하며, 읽을때에도 영속성 컨텍스트에 등록은 된다.(기본적으로 open-in-view : true이기 때문에) 2. 하지만 말 그대로 "읽기"이기 때문에 persist / merge / flush 등을 호출시 에러를 터트려 트랜잭션 범위 밖에서는 값을 변경할 수 없다. 3. 그럼에도 아래의 코드로 item의 price와 name이 변경되는 것은 1번에 의해 item은 영속성 컨텍스트로 관리되고 있었기 때문이고 orderService의 order()가 종료될 때 플러시 발생 -> 더티체킹 동작시 DB에서 불러왔을때와 다르니 정상적으로 update 발생4. 만약 application.yml에서 open-in-view : false로 변경 시컨트롤러단에서 find 한 엔티티들은 영컨에 등록되지 않아 더티체킹도 안될 뿐더러 넘겨받은 member / item을 service단에서 그대로 사용하려 할 경우 에러 발생 (org.hibernate.LazyInitializationException: could not initialize proxy) ``` @PostMapping("/order") public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, @RequestParam("count") int count) {// orderService.order(memberId, itemId, count);// 테스트 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); item.setPrice(88888); //더티체킹이 일어나는 시점은 트랜잭션 종료 지점이라 해당 지점에서는 변경이랑 관련이 없다. //그래서 트랜잭션이 있는 서비스 메소드 부분을 주석쳐버리면 변경은 일어나지 않는다.// 얘네는 다 에러// entityManager.flush();// memberRepository.save(member);// itemRepository.save(item); orderService.order(member, item, count); return "redirect:/orders"; } @Transactionalpublic Long order(Member member, Item item, int count) { item.setName("변경된 책 이름"); //배송정보 생성 Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); delivery.setStatus(DeliveryStatus.READY); //주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); //주문 생성 Order order = Order.createOrder(member, delivery, orderItem); //주문 저장 orderRepository.save(order); return order.getId();} ``` 으로 이해했는데 맞는지 모르겠습니다...
-
미해결스프링 핵심 원리 - 기본편
JPA 이야기가 나와서 개인적으로 궁금한 내용을 질문드립니다!
안녕하세요, 존경하는 갓영한님 JAVA진영에서 JPA가 중요하다 하여 개인적으로 궁금했던 추상적인 질문을 남깁니다. 1. JPA에 대한 깊은 개념이 없는 현 개발 환경?이라면, JPA를 사용하여 중요한 데이터를 조작하는 것은 굉장히 위험하다고 개인적으로 생각됩니다. 구체적인 예를 들어 결제 모듈 api연동했을 경우, 현금관련 부분은 굉장히 민감하고 보안적으로도 조심드럽게 다루어야 하는 data라 생각됩니다.이러한 중요한? 민감한 데이터도 JPA를 사용하여도 크게 문제가 없을까요? 아니면 다른 일반적인 데이터들은 JPA를 사용하고, 이러한 특별한 경우에만 Mybatis와 같은 좀 더 안정적?(query 지향적?)인 방법을 사용하여야 할까요?추가적으로, 배민에서는 수 많은 결제들이 수 없이 이루어지는데 이 엄청난 트랙픽을 받으면서도 순수 JPA를 이용하여 처리 가능하게 하였는지 궁금합니다.2. JPA도 결국 서드파트 프에임워크라 판단됩니다. 고로 버전에 따라 지원하지 않는 신규 업데이트된?(오라클DB, MySql, 마리아DB 등등) query문들이 존재할 수 있다 생각합니다.따라서 JPA를 쓰는 가장 큰 장점인 orm에서 지원하지 않을 경우, 만약 해당 업데이트된 기술이 필요한 상황이라면 JPA와 Mysql과 같은 프레임워크를 동시에 사용하는게 해결방법일까요? 좀 더 좋은 해결 방법이 있을까여?추가적으로 JPA와 querydsl로도 표현 할 수 없는 query들이 존재할 경우들이 있을까여? 만약 그러하다면 어떻게 처리하는 방법이 있을지 궁금합니다.이상입니다.늘 좋은 명강의 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
sink connect 생성시 fail 발생문제
WorkerSinkTask{id=my-sink-connect3-0} Task threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerTask) org.apache.kafka.connect.errors.ConnectException: Tolerance exceeded in error handler at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:178) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:104) at org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:495) at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:472) at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:328) at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:232) at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:204) at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:185) at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:235) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.apache.kafka.connect.errors.DataException: JsonConverter with schemas.enable requires "schema" and "payload" fields and may not contain additional fields. If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration. at org.apache.kafka.connect.json.JsonConverter.toConnectData(JsonConverter.java:370) at org.apache.kafka.connect.storage.Converter.toConnectData(Converter.java:87) at org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$1(WorkerSinkTask.java:495) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:128) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:162) ... 13 more [2022-03-06 11:22:24,134] ERROR WorkerSinkTask{id=my-sink-connect3-0} Task is being killed and will not recover until manually restarted (org.apache.kafka.connect.runtime.WorkerTask) sink connect 생성시 위와 같은오류가 발생합니다. 구글링 하여 connect-standalone 파일의 설정을 false로 하여도 동일하게 오류 발생하고 해결을 못하고 있습니다. key.converter.schemas.enable=false value.converter.schemas.enable=false
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 초기화 시 만들어지는 실제 엔티티
프록시 객체가 초기화 할 때 영속성 컨텍스트를 통해서 실제 엔티티를 생성하고 생성된 실제 엔티티를 프록시 객체의 target 변수에 참조해준다고 하셨는데 이 때 만들어진 실제 엔티티는 영속성 컨텍스트에 존재하고 있는 건가요? 그렇기 때문에 getReference() -> 초기화 -> find()의 과정을 했 을 때 find() 시점에 select 쿼리문이 안나오는 게 맞나요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api 응답객체 네이밍 및 new에 대해
안녕하세요. 강의 너무 잘 보고 있습니다. 좋은 컨텐츠를 제공해주시는 인프런과 영한님, 서포터분들께 감사드립니다. api응답 객체 네이밍에 대해 질문이 있습니다. 등록,수정의 경우 응답객체 네이밍이 ~~Response 조회의 경우 MemberDTO 를 Result로 래핑해서 보내는데 DTO와 Response로 네이밍하는 기준이 있는지 궁금합니다. 또 하나는, 좀 엉뚱한 질문일 수도 있는데 응답시마다 new를 통해 응답객체를 생성하는데 대규모 시스템에 성능에 크게 문제가 없는지와 응답 객체를 싱글톤으로 만드는 패턴같은것도 있는지 궁금합니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
SetterInjection 사용 지양에 대한 문의입니다.
안녕하세요 영한님. 강의 늘 잘 듣고 있습니다.이번 강의를 듣던 중 Setter Injection 사용 지양에 대한 이유를 제가 제대로 이해하지 못해 질문 올립니다.Repository의 경우 런타임에 한 번 주입시켜놓으면 수정할 일이 없는데 굳이 그것을 Setter 메소드로 열어놓아 유지보수시 추적을 힘들게 할 필요 없다...이런 느낌으로 이해했는데 맞는지 알고 싶습니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컨트롤러 단에서 프록시 객체 초기화
안녕하세요. 강의를 듣다 궁금하게 있어서 질문드립니다. 강의 중 for문을 돌려서 강제로 프록시를 초기화하는 부분이 있는데요. 제가 프록시 강의를 듣기로는 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때는 프록시를 초기화하면 문제가 발생하는 것으로 알고 있습니다. 그리고 트랜잭션이 걸려있는 서비스단에 트랜잭션이 끝나면 영속성 컨텍스트가 끝나는 것으로 알고 있는데요. 현재 코드는 서비스가 아닌 Repository에서 바로 값을 가져오고 있고 해당 클래스는 트랜잭션이 걸려있지 않기 때문에 아직 영속성 컨텍스트가 끝나지 않아 컨트롤러에서 프록시 초기화가 가능한 것인가요?
-
미해결실전! Querydsl
DTO 사용 범위에 대한 질문
강의에서 일반적으로 repository에서 만든 dto를 service와 controller에서 사용한다고 하셨습니다. 그런데 이전 강의에서 tuple은 repository계층에서만 사용하고 service나 controller에서 사용하는건 비추한다고 하셨습니다. tuple의 경우엔 하부 구현기술에 class이니 앞단에서 알면 좋지 않다.(jpa를 바꾸게 되는 경우 수정할 로직이 많아진다) 라고 이해했는데요. dto도 비슷하지 않을까 생각이 들었습니다. repository에서 만든 dto를 바꾸게 될 경우 앞단에서 수정할 로직이 많으니까요. dto와 tuple(resultset 등)은 다르게 보아야 하는걸까요? repository에서 만든 dto는 repository나 service에서까지만 사용하고 controller에서는 새로운 dto로 매핑하는게 맞을까요? 아니면 repository는 뒷단(안쪽) 영역이니 앞쪽에서 의존성을 가져가도 된다고 생각하는게 맞을까요?