묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
수업중 질문
안녕하세요 수업을 듣던 중 질문을 남깁니다. 값 타입 컬렉션은 불변객체로 사용하라하셔서 값 변경을 못한다고 알고있습니다. 그래서 Entity로 승격을하면 setter를 원래 두면 안되지만 두었다하고 값을 고치게 된다면 Address address = new Address("서울"); member1.getAddressHistory(address) member2.getAddressHistory(address) address.setCity("부산"); 위의 코드를 실행했을 때 서울의 값으로 들어가나요
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
member는 생성 메서드를 만들지 않은 이유가 있나요?
member는 생성 메서드를 따로 만들지 않고 그냥 MemberRepository에서 저장, 조회를 했는데 Order와 OrderItem에만 생성 메서드를 만들어줬나요? 단지 단순한 로직(다른 엔티티에서 값을 가져와서 처리하는 비즈리스 로직이 없어서)이라서 Member 엔티티는 생성 메서드를 만들어 주지 않은 건가요?
-
미해결실전! 스프링 데이터 JPA
@Path variable로 Id를 받을 때 궁금증
강의를 듣다가 궁금한게 생겼는데요 Id 같은 PK의 경우에 좀 중요한 정보라고 생각을 합니다. 사용자 입장에서는 자동적으로 매겨진 pk인 id를 모르겠지만 이것을 사용자 측에서 저장하고 server와 주고 받는것이 맞는건지 궁금합니다. 공부를 하는 입장이라 실무에서는 어떤 방식으로 사용자 정보를 조회하도록 하는지가 너무 궁금합니다. ID정도는 넘겨줘도 상관이 없는건가요? 아니면 이러한 정보를 절대 전송하면 안되고 매번 session에서 꺼내야 하는건가요? cookie 에서 이 값을 저장해도 무방한가요? 무엇이 나은가요? ㅠㅠ cooki Id
-
미해결
엔티티 매니저 없이도 DB 값 저장이 가능한건가요??
안녕하세요 영한님 강의로 JPA, SPRING DATA JPA 공부중인 초보 입니다 강의 하나를 완강했음에도 제가 아직 전반적인 구조에 대해서 이해를 못한건지 잘 이해가 안되는 부분이 있어서요.. 강의에서는 항상 엔티티 매니저를 통해 ~.persist() 로 DB에 저장을 해서 자연스럽게 저렇게 저장을 하는거구나 했는데 한 예제 프로젝트를 보니까 게시글 crud를 엔티티 매니저 일절 사용 없이 구현하더라구요 분명 스프링 데이터 JPA 를 이용한 예제인것 같은데 이게 원래 가능한걸까요?? 가능하다면 엔티티 매니저는 왜쓰는지도 궁금합니다 검색해봐도 감이 잘 안잡혀서요 ㅠㅠ 영한님 강의 레포지토리 예제 레포지토리
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1:N관계인 경우 Join 유무
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요. Team team = new Team(); team.setId(1L); team.setName("t1"); em.persist(team); Member mem1 = new Member(); mem1.setName("aaa"); mem1.setTeam(team); em.persist(mem1); Member mem2 = new Member(); mem2.setName("bbb"); mem2.setTeam(team); em.persist(mem2); Member mem3 = new Member(); mem3.setName("ccc"); mem3.setTeam(team); em.persist(mem3); em.clear(); em.flush(); // Team newTeam = em.find(Team.class, 1L); // System.out.println(newTeam.toString()); // List<Member> ML = newTeam.getMembers(); // System.out.println("test:"+ML.get(0).getName()); Member newMember = em.find(Member.class, 1L); System.out.println("test:"+newMember.getTeam().getName()); tx.commit(); 1:N관계인 Team Member를 DB에서 가져올때 서로 양방향 연관관계인 경우 Team에서는 join없이 2번의 쿼리를 날려서 조회하고Member에서는 외래키를 사용하여 join문으로 1번의 쿼리로 조회를 하더라구요.혹시 이 두가지가 왜 이런 차이가 나는지 알 수 있을까요? Team에서 Member를 가져올때 충분히 기본키를 활용하여 가져올 수 있을텐데요
-
미해결자바 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