안녕하세요. 기본적인 내용이라 질문 드리긴 부끄럽지만 헷갈리는 부분이 있어서 질문드립니다.. em.find(Member.class, member.getId()) 를 할 때입니다. Identity 전략을 사용하면, member.setUsername(" ")만 해주고 em.persist(member)를 하게 되면, DB로 쿼리가 날라가서 id를 얻어온 후 1차 캐시에 member를 구분할 식별자인 id와 member 정보들이 저장되어 있는 것을 이해했습니다. 그러면 persist를 하면서 1차 캐시에 id와 member가 저장이 된 상태일 텐데, 영속 컨텍스트를 초기화하는 작업 후에 프록시 객체를 불러오는 작업을 합니다. 이 때 member의 id를 알려면 DB로 find 쿼리가 날아가야 하지 않나요? 제가 아리송했던 부분은 10분 40초쯤에, flush로 인해 쓰기지연 저장소에 담겨있던 insert 쿼리가 날아가고, em.clear로 1차캐시를 비워준 상태입니다. 이 상황에서 1차 캐시가 비어있는데 어떻게 find query 없이 database를 타지않고 Id를 바로 받을 수 있는 것인지 의문이 생겼습니다. 레퍼런스를 찾을 때는 이미 id값을 파라미터로 넣어서, 값이 있기 때문에 터치를 안하고 DB쿼리가 필요 없다고 하셨는데 현재 Identity 전략이기에 DB를 거쳐야 ID를 알 수 있는 것이 아닌가요..? 어떻게 바로 member.getId()를 알 수 있는 것인지 궁금합니다.
안녕하세요 강사님~ 강의 재미있게 보고있습니다. 강의 마지막쯤 스프링에서 주입해주는 엔티티매니저는 동시성문제 없이 동작한다고 설명 해주셨는데 JPAQueryFactory를 Bean으로 등록하거나 상위 클래스 생성자에서 미리 할당하고 사용해도 문제가 없는지 궁금합니다. 또 현업에서도 예제처럼 querydsl을 사용 할 때마다 JPAQueryFactory를 할당해서 사용 하시는지도 궁금합니다.
안녕하세요! 강사님 강의를 듣다 궁금한게 있어서 질문 남깁니다. 1. 강의 초반 @Setter는 현업에서 가급적 사용하지 않는다고 하셨는데 그 이유에 대해서 좀 더 자세히 알 수 있을까요? 2. mappedBy = "team" 이렇게 설정 해주셨는데 연관관계 주인의 클래스명을 소문자로 적어주면 되는건가요?
성능 문제로 템플릿 엔진보다는 웹 프레임워크 vue.js react.js angular.js를 쓴다고 들었습니다. 여기 강의에서 thymeleaf 템플릿 엔진을 사용했는데, spring에서 템플릿 엔진을 꼭 써야하는지 아니면 간단하게 예제로써만 사용하고 나중에는 react.js vue.js angular.js같은 웹 프레임워크를 사용하는 지 궁금합니다.
/user/[id].js 로 Link 태그를 통해 접근했을 때 userInfo 가 null 인 에러를 해결하려고 이것저것 해보던중 /user/[id].js 안에 { /* <title>{userInfo.nickname}님의 글</title> <meta name="description" content={`${userInfo.nickname}님의 게시글`} /> <meta property="og:title" content={`${userInfo.nickname}님의 게시글`} /> <meta property="og:description" content={`${userInfo.nickname}님의 게시글`} /> <meta property="og:image" content="https://nodebird.com/favicon.ico" /> <meta property="og:url" content={`https://nodebird.com/user/${id}`} /> */ } Head 안에 위 부분을 주석처리하니까 정상적으로 렌더링 되었어요! 혹시 원인이 뭔지 알 수 있을까요? 스크립트가 실행되기 전 Head 안에 userInfo 를 찾다가 에러를 나는 것인지.. 다른 이유에서인지.. 그리고 제로초님 깃헙 클론받아서 실행할 때 next 디펜던시 버전을 9.5.3으로 변경해서 실행해보니 저와 동일한 에러가 났었어요 혹시 확인 가능하실까요?
[INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 15:20 min [INFO] Finished at: 2020-10-03T22:38:25+09:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project spring-petclinic: There are test failures. [ERROR] [ERROR] Please refer to C:\Users\ESE\IdeaProjects\spring-petclinic\target\surefire-reports for the individual test results. [ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. [ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called? [ERROR] Command was cmd.exe /X /C ""C:\Program Files\Java\jdk-15\bin\java" -javaagent:C:\\Users\\ESE\\.m2\\repository\\org\\jacoco\\org.jacoco.agent\\0.8.5\\org.jacoco.agent-0.8.5-runt ime.jar=destfile=C:\\Users\\ESE\\IdeaProjects\\spring-petclinic\\target\\jacoco.exec -jar C:\Users\ESE\AppData\Local\Temp\surefire8945284040995119689\surefirebooter10487122512194559164 .jar C:\Users\ESE\AppData\Local\Temp\surefire8945284040995119689 2020-10-03T22-38-15_705-jvmRun1 surefire8445944312646886691tmp surefire_01288502121873472979tmp" [ERROR] Error occurred in starting fork, check output in log [ERROR] Process Exit Code: 1 [ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called? [ERROR] Command was cmd.exe /X /C ""C:\Program Files\Java\jdk-15\bin\java" -javaagent:C:\\Users\\ESE\\.m2\\repository\\org\\jacoco\\org.jacoco.agent\\0.8.5\\org.jacoco.agent-0.8.5-runt ime.jar=destfile=C:\\Users\\ESE\\IdeaProjects\\spring-petclinic\\target\\jacoco.exec -jar C:\Users\ESE\AppData\Local\Temp\surefire8945284040995119689\surefirebooter10487122512194559164 .jar C:\Users\ESE\AppData\Local\Temp\surefire8945284040995119689 2020-10-03T22-38-15_705-jvmRun1 surefire8445944312646886691tmp surefire_01288502121873472979tmp" [ERROR] Error occurred in starting fork, check output in log [ERROR] Process Exit Code: 1 [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669) [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282) [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857) [ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81) [ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192) [ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105) [ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957) [ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289) [ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:193) [ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) [ERROR] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:564) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) [ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) [ERROR] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:564) [ERROR] at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:39) [ERROR] at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:122) [ERROR] at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:61) [ERROR] [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 상기 에러 발생하는데 구글링을 해봐도 번역을해봐도 스텍오버플로우 글을 뒤져봐도 도저히 해결할수가없습니다 도와주세요 ... 답보다 해결방법을 알고싶습니다 도와주세요 고수님들 윈도우 사용자입니다....
활용편에서 dto로 리턴해야 하는 중요성을 배웠었는데요. dto클래스를 꼭 요청에 필요한 필드로만 구성해야 하나요? 어떤곳은 username만, 어떤곳은 age 또는 2개다 이렇게 하나의 엔티티에서 여러개의 dto를 만들면 이름짓기도 애매할텐데 엔티티랑 똑같이 dto를 만들고 필요한것만 생성자나 set하고 나머지는 null로 응답하면 문제가 있을까요?
안녕하세요 선생님, 명강의 늘 감사드립니다. 바로 본론으로 들어가겠습니다. 질문 내용은 다음과 같습니다. 16:47에서 말씀하시는 캐싱이라는 뜻에 대한 상세한 개념을 정리하고자 질문을 드립니다. 캐시의 추상적인 개념은 나중에 요청을 결과를 미리 저장해두었다가 빠르게 서비스를 해준다는 의미로 인지하고 있습니다. 1. 컴퓨터 자체에서의 캐시 메모리에 캐싱한다는 것인지, DB 자체에서 내부적인 캐시에 데이터를 캐싱? (데이터를 가지고 있다) 한다는 의미인지 궁금합니다. 2. 만약 DB 자체에서의 캐쉬라면 DB의 캐시와 컴퓨터의 캐시 메모리의 차이점이 무엇인지 궁금합니다. 예를 들어 DB 자체의 캐시란 요청을 결괏값을 컴퓨터 캐시 메모리에 올려놓고 트랜잭션이 완료되기 전에 재사용하는 의미인지 궁금합니다. 3. 일반적으로 알고 있는 웹서비스의 구조는 다음과 같습니다. 일반적으로 마이바티스를 사용할 경우 다음과 같은 구조가 된다고 알고 있습니다. [Look aside cache] jpa 를 사용하면 다음과 같은 구조가 되나요? 감사합니다. 출처 : https://www.youtube.com/watch?v=mPB2CZiAkKM
itemService 에서 change 메서드 호출해서 넣어주고, Book 엔티티 쪽에서 change 메서드를 만들어주었습니다. 기능은 정상 동작하나, 이게 최적된 방법인지는 잘 모르겠습니다. 강사님이 말씀하신 변경감지를 이용한 부분인데, 컨펌한번 받아보고자 이렇게 올렸습니다. 조언부탁드립니다 . 감사합니다.
안녕하세요, html 파일 수정시 ctrl + shift + f9 단축키로 recompile하면 서버 재시작 없이 변경사항이 적용 되는줄 알았는데 리컴파일 할때마다 서버자체가 재시작 되면서 데이터베이스의 테이블도 다 드랍했다 생성합니다. ddl-auto: create으로 해놓긴 했지만 리컴파일 할때 서버 재시작이 안되고 반영되는줄 알았는데 무조건 서버 재시작이 되는건가요?
수정을 시도하는 Book객체는 새로 만들어진것이잖아요 강사님. 이 Book객체는 이미 DB에 한번 저장이 되었다고 했는데 persist를 한적도 없고 db를 통해 find 한 객체도 아닌데 어떻게 이게 준영속 객체가 되는것이지요?????? 단지 그냥 Book이란 객체를 만들고 set으로 평범한 값을 넣어줬을 뿐인데.. 만약 set을 하고 em.persist(book) 을 해주면 뭐 영속성컨텍스트에 올라갈것이지만요... 그냥 book은 단순 객체가 아닌 이유를 이해하기가 정말 어렵습니다.ㅠ 기존식별자를 가지면 준영속이라고 하셨는데 book에 set을하여 id를 박는순간 이것은 준영속인것인가요? id는 식별자니까요 @PostMapping ( "items/{itemId}/edit" ) public String updateItem ( @ModelAttribute ( "form" ) BookForm form , @PathVariable String itemId) { Book book = new Book() ; book.setIsbn(form.getIsbn()) ; book.setAuthor(form.getAuthor()) ; book.setStockQuantity(form.getStockQuantity()) ; book.setPrice(form.getPrice()) ; book.setName(form.getName()) ; book.setId(form.getId()) ; itemService .saveItem(book) ; return "redirect:/items" ; }
영한 쌤!!! @Transactional을 Service에 말고 Repository에 달면 안되나요? 그리고 @Transactional 은 Test 폴더 안에서만 rollback을 시키는건가요? 아니면 SpringBootTest 어노테이션 안에서만 rollback 이 되는건가요?