엔티티에서 Setter 를 사용하지 않아야 변경점을 줄일 수 있어 유지보수 할 때 유리하다고 하셔서 최대한 사용을 자제하려고 하는데요, 연관관계 메소드를 만들 때, setter 를 사용해서 만드셨는데 없이 만들 수 있는 방법이 있을까요? // Order - Delivery 연관관계 메소드 public void setDelivery(Delivery delivery){ this.delivery = delivery; delivery.setOrder(this); // Delivery 의 setter 사용 }
2021-06-26 기준으로 작성된 글입니다. 강의와 같이 마켓플레이스에서 STS를 검색하면 STS4만 나오고 STS3는 나오지 않습니다. STS3가 중단되었기 때문입니다. 이경우 다음 방법으로 해결할 수 있습니다. 1. 먼저 https://spring.io/tools 로 접속한뒤 " Spring Tool Suite 3 wiki " 링크를 찾아 접속합니다. 2. https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3 로 들어가면 STS3 버전별로 설치할 수 있는 링크가 있습니다. 이중 각 버전별로 하단 부분에 "p2 repositories" 라는 부분이 있습니다. 3. 본인의 이클립스 버전에 맞는 링크를 복사한뒤 이클립스에 들어가 Help탭 > Install New Software... 를 클릭한뒤 링크를 붙여넣습니다. 4. 모든 항목을 체크한뒤 설치를 진행합니다. 4-1) 만약 "version 1.8.0_291 of the jvm is not suitable for this product. version 11 or greater is required" 와 같은 오류가 나올 수 있습니다. 이것은 자바 버전이 맞지 않아 생기는 문제입니다. 저는 자바8버전을 사용하고 있었는데, 기 설치된 자바8, 이클립스를 모두 지운뒤 자바11, 새 이클립스로 재설치하는 방식으로 문제를 해결했습니다. 혹시 에러가 발생한다면 댓글로 공유해주시면 감사하겠습니다🙂 출처 : https://velog.io/@silverbi99/Spring-스프링-프레임워크-STS3-설치-및-환경설정
안녕하세요. 훌륭한 강의.. 완강하고 공부하던중 문득 의문이 들었습니다. GET에서 던져준 Form과 POST의 Form은 같은 객체일까? 하고 보니 다른 주소값의 객체이더라구요. 혼자 고민을 조금 해보았습니다. 생각해보니 POST에서 넘어온 것은 JSON형태의 데이터를 객체화?? 시켰을 뿐인 것일테니 당연한 결과 이겠더라구요.. 이어서 궁금한것은 GET에서의 Form의 역할 입니다. 그저 어떤 필드가 정의되어 있는지 알려줄 뿐인걸까요?? 그 대상은 타임리프인?? 그렇다면 BookForm.class 나 다른 방법을 통해 알려 줄 수 있을텐데 이런 방법을 택한 이유가 뭘까요?? 메모리 낭비와 코드의 간결함(가독성과 개연성 있는 문맥)을 저울질 했을 때 후자가 훨씬 가치 있는 거라서 그런걸까요??
1. EntityTransaction.commit 하면 flush() 가 먼저 일어난다. 2. 영속성 컨텍스트에 있는 변경 내용을 DB에 동기화한다. (쓰기지연SQL에 있는 SQL을 전송한다. , 저장은 안됌!) 3. 마지막으로 데이터베이스의 Commit을 하여 저장이된다. 이렇게 이해했는데 맞을까요 ?
JPA가 쓰기지연으로 인해 한 트랜잭션 안에서 엔티티를 몇개를 persist 하던간에 commit을 만나기 전까지는 1차캐시 저장소와 쓰기지연 sql 저장소에 각각 보관해두다가 commit을 만나면 DB에 insert 쿼리를 날리는거 맞나요 ?? 그렇다면 batch_size 옵션이 전 무의미하다고 느껴져서요 !! 어차피 이 옵션이 있던지 없던지 한번에 쿼리는 날리는데 어떤의미가 있는지 잘 와닿지가 않습니다.
C언어를 안쓰고 자바로 개발 공부하고 있는 학생인데, 운영체제에 대해 공부하고자 강의를 수강 중입니다. 1강을 따라 설치를 하고 있는데요, gcc는 C언어를 컴파일해주는 gnu인 것 같은데(아니라면 정정해주세요) 검색해보니 자바로 실습하기 위해선 gcj를 설치해야 하는 듯 하여 sudo apt-get install gcj 명령어를 실행했는데 설치가 되지 않네요. 어떻게 하면 될까요?
안녕하세요 강사님 항상 좋은 강의와 피드백 감사드립니다 다름이 아니라 이번에 강의 중 '회원가입' 테스트를 그대로 따라 코딩하였으나 실행에 오류가 뜹니다. 관련하여 사진과 오류글을 그대로 올려보니 한 번 확인해주시면 감사하겠습니다! java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [jpabook.jpashop.JpashopApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'memberRepository' for bean class [jpabook.jpashop.repository.MemberRepository] conflicts with existing, non-compatible bean definition of same name and class [jpabook.jpashop.domain.MemberRepository] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ... 25 more Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'memberRepository' for bean class [jpabook.jpashop.repository.MemberRepository] conflicts with existing, non-compatible bean definition of same name and class [jpabook.jpashop.domain.MemberRepository] at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:349) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:287) at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:296) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:250) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:207) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:175) ... 38 more
3-4연속부분수열에서 i가 증가할 수록 j루프에서 반복 횟수가 줄어드는 경우에도 o(n2)이 되는 이유가 궁금합니다! 그리고 sum==m 인경우에는 sum-=arr[lt]를 하면 당연히 sum보다 작아지니까 sum+=arr[rt]-arr[lt]를 바로 해주면 한단계가 줄어들지 않나요! sum이 m보다 같을때도 클때랑 마찬가지로 sum-=a[lt]를 해준뒤 다시 sum<m 에 걸려서 sum+=arr[rt]를 하는 이유가 궁금합니다! 코드를 간단하게 해주야해서 그런건가요! 그리고 원소에 m보다 큰 수가 포함되어있는 경우 lt를 증가시키다보면 lt보다 rt가 커지지 않나요..!!?
안녕하세요! 선생님 강의 잘 보고 있습니다. 강의를 보며 MyBatis로 개발된 프로젝트에 JPA를 적용해보고 있는데요. change 라는 메소드를 도메인객체에 작성하신 부분에 질문이 있습니다. 기존 프로젝트에서는 update 나 휴면계정처리 같은 메소드를 모두 dao에 배치했었는데 JPA를 적용하는 과정에서 update, 휴면계정처리 또는 로그인 상태 확인 과 같은 메소드는 어디에 배치하는 것이 좋을지 헷갈리기 시작합니다. 질문이 미시적인데요. 결과적으로 domain, repository, service, controller 에 배치되는 로직의 기준에 대해 팁을 알고 싶습니다. 맞는 말인지는 모르겠지만 예시를 들자면 아래와 같이요. ex) repository에는 DB에 접속이 꼭 필요한 메소드만 작성한다.
그 회색 창 html을 보시면 class="jumbotron"으로 되어 있을텐데 부트스트랩4까지 지원해주던 클래스입니다. 부트스트랩5로 올라가면서 빠졌다고 합니다. 현재 부트스트랩 가장 최신 버전이 5.0.1이기 때문에 저처럼 최신 버전 받았다가 엥 왜 얘만 안되지 하시는 분이 있으실까봐 관련 정보를 남깁니다. 부트스트랩 4를 이용하시면 문제 없고 어차피 디자인적인 요소라 크게 신경 안쓰고 넘어가셔도 될 것 같습니다. - 부트스트랩5 점보트론 변경 정보 https://getbootstrap.com/docs/5.0/migration/#jumbotron - 부트스트랩4 다운로드 링크 https://getbootstrap.com/docs/4.6/getting-started/download/ - 다운로드 없이 cdn으로 적용하기 https://www.inflearn.com/questions/151764
안녕하세요. orderItems.stream().forEach(o -> o.getItem().getName()) ; orderItem 반복문 돌 때 getName을 하거나 getprice, getstockQuantity를 넣어도 모든 필드가 로딩이 되는데 왜 그런건지 이해가 잘 안가는데 간단한 설명 부탁드려도 될까요?
Member member = new Member() ; member.setUsername( "kim" ) ; em.persist(member) ; List<Member> resultList = em.createNativeQuery( "select MEMBER_ID, city, street, zipcode, USERNAME from MEMBER" ) .getResultList() ; for (Member member1 : resultList) { System. out .println( "member1.getUsername() = " + member1.getUsername()) ; } java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class jpabook.jpashop2.domain.Member ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; jpabook.jpashop2.domain.Member is in unnamed module of loader 'app') at jpabook.jpashop2.JpaMain.main(JpaMain.java:66) 6월 21, 2021 5:34:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/jpashop2] 6월 21, 2021 5:34:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections close ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:h2:tcp://localhost/~/jpashop2 형변환 할수 없다고 하는 에러가 나는데요.. List<Member> resultList = em.createNativeQuery( "select MEMBER_ID, city, street, zipcode, USERNAME from MEMBER", Member.class ) .getResultList() ; 이렇게 고치면 ERROR: Column "INSERT_MEMBER" not found [42122-200] javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1613) at org.hibernate.query.Query.getResultList(Query.java:165) at jpabook.jpashop2.JpaMain.main(JpaMain.java:63) 이런 에러가 나오고요... 그래서 Member 에서 BaseEntity를 extends 를 않하면 잘 돌아갑니다... 이유가 뭘까요?? BaseEntiy도 첨부하겠습니다
안녕하세요 . 페치 조인 강의를 들으며, 일대다 에서 데이터가 뻥튀기 된다는 말이 1. 다대일의 관계의 경우 - 예를들어, Member - Team이 다대일 관계인 경우, "Member입장에서" 데이터가 뻥튀기 되지 않는다. 2. 일대다의 관계 경우 - 예를들어, Team - Member가 일대다 관계인 경우, "Team입장에서" 데이터가 뻥튀기 된다. 이런 의미인가요? 사실 각 Member, Team 테이블에 데이터가 동일한 조건 하에서, Team inner join Member나 Member inner join Team는 결과가 같다고 생각했기에, 입장에 따라 뻥튀기냐 아니냐로 갈리나도 이해했는데 맞는건지 궁금합니다. 감사합니다
제가 RememberMe 설정 중 문제가 발생하여 해당 부분이 잘 안풀려 강사님께 질문 드립니다. 로그인 한 사용자 정보가 필요하여 AuthenticationProvider 에서 하단 캡쳐화면 처럼 설정을 하였습니다. 그리고 RememberMe 기능을 하단 캡쳐 화면 처럼 설정 하였습니다. 설정 후 rememberMe 기능 사용 시 로그인이 안되는 문제가 발생을 하였습니다. 그래서 디버깅 하여 확인 시 하단 캡쳐 화면과 같이 해당 부분에서 (TokenBasedRememberMeService에서 UserDetails user = getUserDetailsService().loadUserByUsername(username);) 다시 사용자를 다시 조회를 하여, email 파라미터의 값이 객체가 들어와서 로그인이 안되는 문제가 발생 합니다. 제가 RememberMe 기능 과 @AuthenticationPrincipal 어노테이션을 이용해서 Dto의 사용자 정보를 둘 다 사용을 하고 싶은데 이 경우 어떻게 해야하는지 구글링을 봐도 안나와서 강사님께 여쭤봅니다. 좋은 강의 해주셔서 감사합니다.
안녕하세요 영한님 강의 재밌게 잘 듣고 있습니다. 간단한 질문이 있습니다~! group by를 한 다음에 Tuple teamA = result.get(0); 으로 알려주셨는데 0번 index로 가져온 결과값이 Team B가 아니라 Team A에 관한 집계 결과를 보장하는지 궁금합니다. (내부적으로 정렬 같은 방식이 일어나는건가요..??ㅎㅎ)
안녕하세요. 김영한 팀장님. ' 컴포넌트 스캔과 자동 의존관계 설정 ' 강의 02:35 쯤 ' MemberConroller ' 클래스의 멤버변수로 ' MemberService ' 타입의 멤버변수를 선언할 때 final 키워드 를 설정한 이유에 대한 질문입니다. Java에서 final 키워드가 붙은 멤버변수는 쉽게 말해 '변할 수 없다.' 라는 의미를 가지게 됩니다. 저는 스프링에서 다루는 Bean은 '특별한 설정 설정(Scope)'이 없는 경우 싱글톤 형태로 스프링 컨테이너에 등록되어 상황에 따라 다른 클래스의 의존 주입 객체로 사용할 수 있는 것으로 이해하고 있습니다. 이러한 이유로 현재 MemberController에서는 Setter 메소드도 선언되지 않았으니 생성자를 통한 의존 주입 이후에는 MemberService 타입의 멤버변수가 변경될 가능성이 없다고 보아 final 키워드를 사용하지 않아도 되지 않을까? 하는 의문이 들었습니다. 그럼에도 불구하고 final 키워드를 사용한 이유가 궁금합니다! 미리 답변 감사드립니다.