묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
8:41 질문
@PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } 파라미터로 들어온 값으로 UpdateMemberResponse를 만들어주지 않고 memberService.findOne을 통해 하는 이유가 있을까요?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
무결성 제약조건이 위배되는 경우에 대한 예외처리에 대해 질문드립니다
안녕하세요 강사님. Kotlin + JPA에 대해 마땅히 질문남길 곳이 없어서 질문드리게 되었습니다😅 Book 엔티티에서 name을 유니크 키로 지정해서 중복된 값을 설정하려고 하면 아래처럼IllegalArgumentException을 던져주게 하는 코드를 작성하고자 했습니다.@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) try { bookRepository.save(book) } catch (e: DataIntegrityViolationException) { throw IllegalArgumentException("이미 등록된 도서입니다.") } }그런데 JPA의 영속성 컨텍스트로 인해 @Transactional이 붙은 메소드에서 DataIntegrityViolationException를 처리해주기 위해선 flush()를 직접 호출해서 쿼리를 실행시켜야 한다는 것을 알게되어 아래와 같이 코드를 수정했고, 테스트 코드에서 정상적으로 IllegalArgumentException이 처리되는 것을 확인할 수 있었습니다.@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) try { bookRepository.save(book) bookRepository.flush() } catch (e: DataIntegrityViolationException) { throw IllegalArgumentException("이미 등록된 도서입니다.") } }이렇게 코드를 작성해놓고 보니 하나의 메소드에서만 이렇게 무결성 제약조건 위배에 대한 처리를 한다면 상관이 없겠지만 여러 메소드에서 무결성 제약조건을 위배하는 경우에 대해 각기 다른 메시지를 담은 예외를 던지게 된다면 중복 코드가 너무 많이 발생할 것 같다는 생각이 들더라구요. 이런 경우에 아래처럼 확장함수와 람다를 사용해서 예외 처리를 해도 괜찮을까요?inline fun <reified T, ID, R> JpaRepository<T, ID>.flushOrThrow(exception: Throwable, block: JpaRepository<T, ID>.() -> R): R { try { val result = block() flush() return result } catch (e: DataIntegrityViolationException) { throw exception } }@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) bookRepository.flushOrThrow(IllegalArgumentException("이미 등록된 도서입니다.")) { save(book) } }이런 방법을 썼을 때 코드가 너무 복잡해지진 않을지, 협업을 하는 경우에 문제가 되진 않을지, 이런 경우가 발생하면 다른 분들은 어떤 방법을 사용하시는지 고민되어 질문 남깁니다!🙏
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
pageStart 생성시점이 궁금합니다.
BoardMapper.xml의 pageStart가 어디서 생성이 되는지 헷갈려서요 ㅠㅠ...Criteria.java에서 getPageStart()로 만들어준것 같은데.통상 VO에서 getter setter를 만들때 private int pageStart; <-- 이런식으로 선언하고 아래에서 getter, setter를 만들어주는데 여기서는 지금 바로 getPageStart만 만들어주고 있는것 같습니다.근데도 pageStart라는 변수에 값이 들어가는것 같은데 lombok.Data에 의해서 getPageStart()가 자동으로 pageStart를 만들어주는것인가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
게시물과 첨부파일의 연관관계 매핑 방법
안녕하세요해당 강의를 너무너무 잘 보고있고, 학습내용을 토대로 사이드 프로젝트를 진행 중입니다.그런데 대표적인 예로 게시물과 첨부파일의 연관관계 매핑을 어떤 식으로 진행해야 하는지 헷갈려서 질문 드립니다. 제가 생각한 방법은 두 가지가 있습니다.첫 번째는 게시물과 첨부파일의 관계에서 게시물 쪽에 단방향 매핑 하는 방법과,두 번째는 게시물과 첨부파일의 관계에서 어떤 매핑도 없이 첨부파일 아이디만 게시물 DB에 저장하는 방식입니다.두 방법 모두 첨부파일을 먼저 영속성 컨텍스트에 저장한 후 게시물을 등록할 수 있는 방법으로 아는데, 실무에서는 어떤 식으로 관계를 설정하고 있는지 궁금합니다!
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
변경감지를 통한 데이터 변경에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 김영한님 JPA강의를 모두 듣고 개인프로젝트를 하던 중에 궁금한 점이 생겨서 질문 올리게 되었습니다.김영한님께서 데이터의 업데이트는 변경감지를 통해서 하는 것이 좋다고 말씀하셨던 게 기억이 나는데요. 물론 변경감지만을 이용하라는 말씀은 아니시겠지만 변경감지를 통한 업데이트를 어디까지 사용해야 하는 가에 대해서 좀 의문이 생겼습니다.예를 들어 이런 경우입니다.회원이 게시판을 조회하면 조회수를 조회수를 증가시키는 로직인데요. (조회수 증가와 게시판 조회를 서로 다른 트랜잭션으로 했음)이럴 때에 변경감지를 통해서 조회수를 증가시킬 경우에 변경감지를 통해 변경된 값이 그대로 update되는 형태를 취하는 것인데, 이럴 경우 요청이 한 번에 많이 들오면 update순서가 보장되지 않아 정확한 조회수 증가가 이뤄지지 않을 것 같았습니다. 하지만 그렇다고 LOCK을 걸자니 조회수 하나 때문에 게시판 조회까지 LOCK이 걸려 조회 속도를 낮추는 것도 문제인 듯 하였습니다. 생각해 보면 이러한 조회수 증가는 쿼리를 UPDATE .. SET column = column +1 이런 식으로 만들고 처리하면 현재 컬럼의 값을 기준으로 1씩 증가하기 때문에 LOCK을 걸 필요도 없고 순서에 상관없이 일관된 값이 보장될 것 같은데 변경감지를 통해 값을 업데이트 하는 방식을 사용하면 현재 조회된 Entity의 조회수 값에 1을 추가하고 그 값으로 직접 UPDATE되는 형태라서 문제가 된 것이 아닐까 싶었습니다.이런 경우 UPDATE쿼리를 따로 날려 주는 방식이 더 효율적인 방식이 맞을까요? 실무에서는 어떤 방식을 취하고 있는 지 궁금합니다..!
-
해결됨실전! Querydsl
from절 서브쿼리를 아직 querydsl에서 지원하지않나요?
하이버네이트 6.1인가 6.2였나부터 from절 서브쿼리를 지원한다고 어디서 줏어들었었는데,아직 queryDSL에선 지원하지않나요? queryDSL 깃헙 최신릴리즈버전도 21년도라서 없을거같기도 한데 예전에 무슨 하이버네이트 서브파티쓰면 queryDSL로 할수있다고 어디서 들어서 그거로 어떻게 안되나 싶어서 궁금해서 질문드립니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@ModelAttribute 질문
@PostMapping("/members/new") public String create(@Valid @ModelAttribute MemberForm form, BindingResult result) { if (result.hasErrors()) { return "members/createMemberForm"; } Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode()); Member member = new Member(); member.setName(form.getName()); member.setAddress(address); memberService.join(member); return "redirect:/"; }@GetMapping("/members/new") public String createForm(Model model) { return "members/createMemberForm"; }이런식으로 @ModelAttribute를 사용하여 코드를 짜보려고 하니 에러가 나왔고, 아마 html에서 memberForm 객체가 없어서 이용하지 못했고, 결국 매핑에 문제가 생겨 출력(?)을 하지 못해서 그런 것 같은데 예전 스프링 MVC강의에서는 @ModelAttriute를 이용해 코드를 잘 작성했던 거 같은데 왜 이번 강의에서는 사용하지 않았는지 궁금합니다. @PostMapping("/members/new") public String create(@Valid MemberForm form, BindingResult result) { MemberForm이 어떻게 파라미터로 받을 수 있는지 궁금합니다. (이미 Model에 객체가 있으면 파라미터로 받듯이 받을 수 있는 건지?) 위의 코드를 이용해서 웹페이지를 만드려면 createMemberForm.html 에서<form role="form" action="/members/new" th:object="${memberForm}" method="post">이부분 대신 html 파라미터를 넘겨주는 식으로 고쳐야하는 것 일까요? html을 잘 몰라 질문드립니다.
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
자주 나오는 질문 - DTO에 @Allargs, @Noargs 문제
실행할 때 IntelliJ IDEA 가 아닌 Gradle로 돌려야 합니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService에서는 find 메서드를 만들지 않은 이유가 따로 있나요 ?
ItemService에서는 ItemRepository의 기능을 위임받아 저장 및 검색 기능을 구현했는데OrderService에서는 검색기능을 구현하지 않았더라구요. ItemService에서 위임 받는 것 처럼 하면 간단할 것 같은데 굳이 만들지 않고 OrderRepository의 findOne기능을 사용하는 이유가 따로 있는 것일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
프로젝트 1:n 단방향 매핑 부탁드립니다.
https://drive.google.com/file/d/1tCpv16Aj0Q-U95EPxE43t-Y-8L1lidhy/view?usp=share_link Letter과 Member을 ManyToOne로 매핑하려고 했는데 데이터베이스를 보니 자꾸 null이 떠서 올립니다.. 파일은 에러가 생기기 전 잘 실행이 되는 파일입니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
유레카 클라이언트 설정 질문 (eureka.clinet.fetch-registry : true)
eureka.clinet.fetch-registry : true 의미가 클라이언트가 유레카 서버를 통해 다른 서비스 정보를 얻기을 수 있다고 알고있습니다. 여기서 궁금한 점이 있는데인스턴스가 다른 인스턴스의 정보가 필요한 이유가 자신이 받은 요청이 다른 인스턴스의 서비스가 필요할 떄가 있어서 그런 건가요??
-
미해결실전! Querydsl
searchPageSimple 테스트코드 질문
강의 내용에서 memberRepository.searchPageSimple 의 코드에 orderBy 가 없는데 result가 member1, member2, member3인 것을 어떻게 보장하는 건가요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test/resources/application.yml이 없으면
main/resources/application.yml 을 따라가게 되는 건가요 ? 자바에서는 디비를 사용하고 싶고, test에서만 메모리 DB를 사용하고 싶다면 아무런 내용이 없는 application.yml를 test/resources 아래 생성만 하면 되는 건가요 ?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
회원가입 인증 메일 확인
accountService 애서 processNewAccount 을 Account newAccount = saveNewAccount(signUpForm);;newAccount.getGenerateEmailCheckToken();accountRepository.flush();sendSignUpConfirmEmail(newAccount);로하면@Transactional 을 메서드 상단에 선언을 안해도 해결이 가능한데요. @Transactional 를 사용하지않고강제로 플러시를 해준경우에 추후에 문제가 될만 소지가 있을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpql size에서 질문이 있습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.try { Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setUsername(" 유저 "); member.setAge(10); member.setTeam(team); member.setMemberType(MemberType.ADMIN); em.persist(member); em.flush(); em.clear(); String query = "select size(t.members) from Team t"; List<Integer> resultList = em.createQuery(query, Integer.class).getResultList(); System.out.println(resultList.size()); for (Integer s : resultList) { System.out.println("s = " + s); } tx.commit(); }코드는 위와 같이 작성하였습니다. 실제로 팀을 하나 넣었고 count가 1로 측정되는 것을 확인해보고 싶어서 테스트해 보았는데 java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class java.lang.Integer ([Ljava.lang.Object; and java.lang.Integer are in module java.base of loader 'bootstrap') at org.example.Main.main(Main.java:36)위와 같은 에러가 발생햇습니다. Team에 멤버가 들어 있는것도 확인을 하였고 resultList가 for문 안에서 돌면서 등록된 게 하나 이니까 1이 출력될 것이라 예상햇는데 ClassCastException이 발생하더군요. 여러가지 생각해 보았는데 답이 나오질 않아서 질문드립니다!제가 어딘가 잘못 사용하고 있는 것일까요??
-
미해결실전! Querydsl
SearchTest 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Test public void searchTest() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); MemberSearchCondition condition = new MemberSearchCondition(); condition.setAgeGoe(35); condition.setAgeLoe(40); condition.setTeamName("teamB"); List<MemberTeamDto> result = memberJpaRepository.searchByBuilder(condition); Assertions.assertThat(result).extracting("username").containsExactly("member4"); }테스트를 돌렸는데 member4만 가지고있다고 밑의 에러가 발생했습니다 . jparepository의 메서드 문제일까요?? 아래는 memberjparepository입니다public List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition) { BooleanBuilder builder = new BooleanBuilder(); if(hasText(condition.getUsername())){ builder.and(member.username.eq(condition.getUsername())); } if(hasText(condition.getTeamName())){ builder.and(team.name.eq(condition.getTeamName())); } if(condition.getAgeGoe() != null) { builder.and(member.age.goe(condition.getAgeGoe())); } if(condition.getAgeGoe() != null) { builder.and(member.age.goe(condition.getAgeLoe())); } return queryFactory .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.as("teamName") )) .from(member) .leftJoin(member.team, team) .fetch(); }
-
미해결실전! Querydsl
delete 후에도 em.flush, clear 가 필요한가요 ?
@Test public void bulkDelete() { long count = queryFactory .delete(member) .where(member.age.gt(18)) .execute(); System.out.println("----------- bulk 연산 직후 / em.flush, clear 전 1 -----------"); List<Member> result = queryFactory .selectFrom(member) .fetch(); for (Member member : result) { System.out.println("member = " + member); } System.out.println("----------- bulk 연산 직후 / em.flush, clear 전 2 -----------"); // em.flush(); // em.clear(); System.out.println("----------- em.flush, clear 후 1 -----------"); List<Member> result2 = queryFactory .selectFrom(member) .fetch(); for (Member member2 : result2) { System.out.println("member2 = " + member2); } System.out.println("----------- em.flush, clear 후 2 -----------"); }update와 달리 delete에서 출력해봤을 때,em.flush 하기 전에도 10살이 회원 한명만 뜨는데delete bulk 연산 후에는 update와 달리 flush, clear가 없어도 상관없나요 ?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
2023년 4월 중순 openfeign 에러 관련
안녕하세요. 저같은사람이 없기를 바라며 오류 해결법을 올립니다...환경은 23년 기준 스프링부트. 스프링클라우드 모두 최신버전입니다. (대신 강의처럼 maven이 아닌 gradle입니다)23년 4월중순부터 강의를 잘 따라하다가 빌드후 실행하면 user-service에서 에러가 나는겁니다.openfeign 관련 에러였습니다. org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'rabbitConnectionFactory': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:264) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:221) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:413) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:419) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:370) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1036) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1003) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.cloud.context.named.NamedContextFactory.destroy(NamedContextFactory.java:113) ~[spring-cloud-context-4.0.1.jar:4.0.1] at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:200) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:587) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:559) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1177) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:520) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1170) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1084) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.4.jar:3.0.4] at com.example.userservice.UserServiceApplication.main(UserServiceApplication.java:20) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-3.0.4.jar:3.0.4] 2023-04-24T23:38:38.274+09:00 INFO 14780 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-04-24T23:38:38.274+09:00 INFO 14780 --- [ restartedMain] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down' 2023-04-24T23:38:38.480+09:00 WARN 14780 --- [ restartedMain] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method failed on bean with name 'inMemoryDatabaseShutdownExecutor': org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-214] 2023-04-24T23:38:38.481+09:00 INFO 14780 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-04-24T23:38:38.484+09:00 INFO 14780 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2023-04-24T23:38:38.486+09:00 INFO 14780 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2023-04-24T23:38:38.509+09:00 INFO 14780 --- [ restartedMain] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2023-04-24T23:38:38.534+09:00 ERROR 14780 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [E:\study\1.Web\2.BackEnd\MSA\user-service\out\production\classes\com\example\userservice\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'orderServiceClient': Error creating bean with name 'com.example.userservice.client.OrderServiceClient': FactoryBean threw exception on object creation at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1344) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1188) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:961) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[spring-context-6.0.6.jar:6.0.6] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.4.jar:3.0.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.4.jar:3.0.4] at com.example.userservice.UserServiceApplication.main(UserServiceApplication.java:20) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-3.0.4.jar:3.0.4] Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'orderServiceClient': Error creating bean with name 'com.example.userservice.client.OrderServiceClient': FactoryBean threw exception on object creation at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:712) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:692) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:481) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1408) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1405) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ~[spring-beans-6.0.6.jar:6.0.6] ... 24 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.userservice.client.OrderServiceClient': FactoryBean threw exception on object creation at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:154) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:90) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1823) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1265) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:259) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1628) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1585) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1368) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) ~[spring-beans-6.0.6.jar:6.0.6] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:709) ~[spring-beans-6.0.6.jar:6.0.6] ... 39 common frames omitted Caused by: java.lang.IllegalStateException: PathVariable annotation was empty on param 0. at feign.Util.checkState(Util.java:136) ~[feign-core-12.1.jar:na] at org.springframework.cloud.openfeign.annotation.PathVariableParameterProcessor.processArgument(PathVariableParameterProcessor.java:52) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at org.springframework.cloud.openfeign.support.SpringMvcContract.processAnnotationsOnParameter(SpringMvcContract.java:280) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:126) ~[feign-core-12.1.jar:na] at org.springframework.cloud.openfeign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:193) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:65) ~[feign-core-12.1.jar:na] at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:142) ~[feign-core-12.1.jar:na] at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:58) ~[feign-core-12.1.jar:na] at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:50) ~[feign-core-12.1.jar:na] at feign.Feign$Builder.target(Feign.java:197) ~[feign-core-12.1.jar:na] at org.springframework.cloud.openfeign.DefaultTargeter.target(DefaultTargeter.java:30) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:398) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:446) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:421) ~[spring-cloud-openfeign-core-4.0.1.jar:4.0.1] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:148) ~[spring-beans-6.0.6.jar:6.0.6] ... 50 common frames omitted Process finished with exit code 0에러는 다음과 같구요...Error creating bean with name 'rabbitConnectionFactory'를 아무리 검색해도 답이 안나오길래중간에 PathVariable annotation was empty on param 0.를 검색해서OrderSerivceClient 인터페이스에서 getOrders 함수의 @PathVariable에 value를 써주니까 에러가 사라졌습니다!! 뭔가 lib파일이 업데이트 됐다봅니다... before@GetMapping("/order-service/{userId}/orders") List<ResponseOrder> getOrders(@PathVariable String userId); after@GetMapping("/order-service/{userId}/orders") List<ResponseOrder> getOrders(@PathVariable(value = "userId") String userId); 세시간동안 gradle로 초기화해보고 별짓 다해보다 포기하려던 찰나에 해결했습니다.저같은분은 없기를 바라겠습니다... 블로그 참조 https://lemontia.tistory.com/1046 혹시 다른방식으로 해결하신분 답변 부탁드립니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
userRepository null ?
Users Microservice - JPA 수강중입니다.실습 따라서 작성하고 있는데 오류가 나는데 잘 모르겠습니다.UserServiceImpl 에서ModelMapper mapper = new ModelMapper();mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);UserEntity userEntity = mapper.map(userDto, UserEntity.class);userEntity.setEncryptedPwd("encrypted_password");여기까지 값이 잘 찍히다가 userRepository.save(userEntity); <-- 여기서 오류가 납니다. 2023-04-24T21:55:59.923+09:00 ERROR 3608 --- [o-auto-1-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "com.example.userservice.jpa.UserRepository.save(Object)" because "this.userRepository" is null] with root causejava.lang.NullPointerException: Cannot invoke "com.example.userservice.jpa.UserRepository.save(Object)" because "this.userRepository" is null at com.example.userservice.service.UserServiceImpl.createUser(UserServiceImpl.java:32) ~[classes/:na] at com.example.userservice.controller.UserController.createUser(UserController.java:45) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[spring-web-6.0.7.jar:6.0.7] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[spring-web-6.0.7.jar:6.0.7] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.7.jar:6.0.7] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.0.7.jar:6.0.7] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:563) ~[tomcat-embed-core-10.1.7.jar:6.0] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.7.jar:6.0.7] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:631) ~[tomcat-embed-core-10.1.7.jar:6.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.7.jar:10.1.7] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.7.jar:6.0.7] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.7.jar:6.0.7] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.7.jar:6.0.7] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.7.jar:6.0.7] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.7.jar:6.0.7] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.7.jar:6.0.7] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.7.jar:10.1.7] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
플러시 관련 질문
영상에서 보면 플러시가 영속성 컨텍스트에 있는 1차 캐시 정보를 토대로 SQL 쓰기 지연 저장소 내용을 데이터베이스에 반영한다고 말씀해주셨습니다. 그리고 커밋되는 시점에 플러시가 자동으로 반영된다고도 말씀해주셨는데요,그런데 아래 코드를 보면 강제로 플러시를 한번 호출하고 커밋을 반영해서 플러시를 결과적으로 두번 호출한 꼴이 될텐데 왜 데이터베이스에는 데이터가 두개가 아니라 한개만 반영되어 들어간건가요?Member member = new Member(3L, "TEST_JPA"); em.persist(member); em.flush(); tx.commit();