[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예/ 아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 / 아니오 ) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요, 현재 <JPA와 DB 설정, 동작확인> 내용을 (09:13) 따라가면서 듣고 있는데 import하는 Assert 부분에서 오류가 납니다. <강의> <내 코드> 구글링해서 찾아보니까 (https://aonee.tistory.com/2) build.gradle에 밑 내용 넣으면 된다고 하는데 다른 방법이 있나요? 강의에서는 안 넣어도 잘 되는 것 같아서 여쭤봅니다. 또 제가 devtools 동작오류가 있어서 (https://www.inflearn.com/course/스프링부트-JPA-활용-1/unit/24277?tab=community&q=152186) 질문에서 알려준 사이트 내용대로 build.gradle에 apply plugin: 'idea'를 적었습니다. 저는 이 부분을 바꾸지 않는 선에서 오류를 해결하고 싶어서 다른 방법을 찾고 싶습니다. 추가) 비슷한 질문 보니까 build.gradle를 올리면 좋다고 하셔서 추가합니다. https://www.inflearn.com/course/ 스프링부트 -JPA- 활용 -1/unit/24279?tab=community&q=580709 <bulid.gradle> plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } apply plugin: 'idea' group = 'jpabook' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
안녕하세요 좋은 강의 감사드립니다. 하이버네이트에서 지연 로딩 사용 시, 지연 로딩된 객체가 초기화 되었음에도 불구하고 필드 접근 시 null이 조회되는 현상에 대해서 질문드립니다. 간단하게 현상을 재현하면 다음과 같습니다. 위와 같이 Member가 Team을 지연 로딩으로 설정한 경우이며, 예시를 위해 Team의 name을 public으로 설정하였습니다. 그리고 다음 코드를 실행하면 발생하는 결과는 다음과 같습니다. 이와같은 오류의 원인을 찾아본 결과 stackoverflow에서 지연 로딩으로 설정된 Proxy 객체의 필드는 모두 null로 세팅한다고 얘기해주었습니다. 그러나 관련된 공식 자료를 찾아볼 수가 없어 정확한 작동 원리에 대해 알고 싶어 질문드립니다. 또한 비슷한 현상으로 스프링에서 Proxy 타입으로 생성된 Bean에 대해서는 내부 필드들을 null로 할당하는 것이 있습니다. 이는 공식 문서에 따르면 Spring AOP에서 메서드 실행 조인 포인트만 제공하며, 필드 가로채기에 대해서는 지원하지 않는다고 나와있었습니다. 혹시 지연 로딩된 프록시 객체의 필드가 null로 세팅되는 현상이 위와 관련있는 현상인지에 대해서도 궁금합니다. 관련된 스프링 공식문서는 다음과 같습니다. https://docs.spring.io/spring-framework/docs/3.0.x/spring-framework-reference/html/aop.html 또한 지연 로딩과 null 세팅에 관한 스택 오버플로우 링크는 다음과 같습니다. https://stackoverflow.com/questions/8945365/jpa-hibernate-proxy-not-fetching-real-object-data-sets-all-properties-to-null 너무 긴 질문 죄송합니다. 항상 감사합니다.
5:38 초 부근 member 접근 할때 get 을 쓰면 안된다고 테스트니까 그냥 진행하신다고 하셨는데 이게 어떤의미인지 설명 가능할까요? 한 entity 에 대해서 직접적으로 접근 하기 보다는 dto 같은 전달 객체를 이용해서 가지고 와야 된다. 뭐 이런 뜻인건지 좀더 설명을 듣고 싶어 질문 올립니다!
## EnumMap Javadoc에 따르면 "when the map is created. Enum maps are represented internally as arrays. This representation is extremely compact and efficient." -> hashmap 은 key를 bucket에 저장하고각 bucket이 linked list를 참조 하고 있음. (linkedlist에는 hash(key)가 같은 element가 들어감) 그런데 enummap 의 경우 key로 사용할 값이 제한되어 있으므로, 그 갯수만큼 길이를 가진 array를 선언하고. 해당 index에 값을 넣으면 됨. ## EnumSet Javadoc에 따르면 "when the set is created. Enum sets are represented internally as bit vectors." -> hashset은 hashmap 과 같은데 map의 value가 있다 없다를 표현하는 지시자 같은 값이 들어감. enumset은 값이 있다 없다만 표시하면 되니까 enummap 처럼 array로 구현하지 않고 10101011 같은 bitvector로 구현이 가능.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 그 GenerationType.SEQUENCE 전략 일때 allocationSize를 지정하면 DB에 key값(id)을 얻기위해 디비에 매번 쿼리를 날리는게 아닌 일정 개수마다 쿼리를 날리기에 최적화가 된다고 하셨고, 그 원리는 메모리를 이용하기 떄문이다라고 하셨습니다. (질문1) 여기서 만약에 어플리케이션이 이중화가 되어있으면, 메모리를 이용한 key값(id) 설정이 조금 이상해질것 같기도한데, 이 부분에 대해서 이상이 없나요? (질문2) 이상이 없다면, 어떻게 처리하는지 알 수 있을까요?
안녕하세요 강사님, PasswordChangeForm 을 재정의 하는 부분에서 질문이 있어 글 남깁니다. 1. PasswordChangeForm은 SetPasswordForm을 상속받기 때문에 clean_new_password2를 오버라이딩하여 해당 함수가 기존 대로 실행 될때 단순히 old_password와 같은지 비교하는 로직을 추가한게 맞나요? 2. clean_new_password2를 오버라이딩 할 때, super().clean_new_password2()를 하지 않고 self.cleaned_data.get('new_password2')를 하게 기존의 pw1==pw2 확인하는 로직이 사라져 버리기 때문에 문제가 생기는 것이 맞나요? (실험결과 new_pw1, new_pw2 를 다르게 넣으면 new_pw1 으로 변경이 됩니다). 즉 super()... 를 적어줘야 기존 로직을 지킬 수 있는 것이죠? 3. clean_new_password1은 새로운 함수를 정의한 것인데 clean_ 이 앞에 붙었기 때문에 PasswordChangeForm의 로직이 동작할 때 무조건 해당 함수가 실행이 되는 것이 맞나요? 이 함수가 실행되는 시점이 궁금합니다. 감사합니다.
안녕하세요! '스프링 통합 테스트' 강의 중 궁금한 사항이 생겨서 올립니다. @Transactional 어노테이션을 붙이면 각 테스트 항목 실행 후 롤백한다고 하셨는데, insert문 실행됐을 때 자동 업데이트되는 키 값은 계속 증가합니다. 왜 이 값은 롤백이 되지 않는지 문의드립니다. 감사합니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 제목 그대로 Dockerfile 이 꼭있어야 docker-compose 도 할 수 있는 건가요? 아니면 docker-compose 단독으로 사용이 가능한가요?
Assertions.assertEquals(result,member); 하고 assertThat(member).isEqualTo(result); 에서.. 위 메소드는 실행시간이 23ms이고 아래 메소드는 실행시간이 70ms로 나오는거 같은데.. 아래 문법이 더 좋은점이 있나요?..
안녕하세요 질문 사항이 있어 글을 남깁니다. 구글링을 통해 Member findMember = memberService . findOne ( savId ). get (); 부분이 오류가 있다는 것을 알았습니다. 그리고 나서 다시 로직을 보면서 다시 하여도 똑같은 오류가 발생해 글을 올립니다. MemberServiceTest package com.test.inflearn.service ; import com.test.inflearn.domain.Member ; import org.assertj.core.api.Assertions ; import org.junit.jupiter.api.Test ; import java.util.Optional ; //회색 import static org.junit.jupiter.api.Assertions . * ; /회색 class MemberServiceTest { MemberService memberService = new MemberService (); @Test void 회원가입 () { //given ( 뭔가가 주어졌을 때 ) Member member = new Member (); member . setName ( "hello" ); //when ( 이걸로 실행 했을 때 ) Long savId = memberService . join ( member ); //then ( 결과가 이게 나와야 한다 .) Member findMember = memberService . findOne ( savId ). get (); Assertions . assertThat ( member . getName ()). isEqualTo ( findMember . getName ()); } @Test void findMembers () { } @Test void findOne () { } } MemberService package com.test.inflearn.service ; import com.test.inflearn.domain.Member ; import com.test.inflearn.repository.MemberRepository ; import com.test.inflearn.repository.MemoryMemberRepository ; import java.util.List ; import java.util.Optional ; public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository (); /** * 회원 가입 */ public Long join ( Member member ) { // 같은 이름이 있는 중복 가입 X validateDuplicateMemory ( member ); // 중복 회원 검증 memberRepository . save ( member ); return member . getId (); } private void validateDuplicateMemory ( Member member ) { memberRepository . findByName ( member . getName ()) . ifPresent ( m -> { throw new IllegalStateException ( " 이미 존재하는 회원 입니다 ." ); }); } /** * 전체 회원 조회 */ public List < Member > findMembers () { return memberRepository . findAll (); } public Optional < Member > findOne ( Long memberId ) { return memberRepository . findById ( memberId ); } } repository = MemberRepository(인터페이스) package com.test.inflearn.repository ; import com.test.inflearn.domain.Member ; import java.util.List ; import java.util.Optional ; public interface MemberRepository { Member save ( Member member ); Optional < Member > finById ( Long id ); Optional < Member > findByName ( String name ); List < Member > findAll (); Optional < Member > findById ( Long memberId ); // Optional<Member> findById(Long memberId); } repository = MemberRepository (클래스) package com.test.inflearn.repository ; import com.test.inflearn.domain.Member ; import java.util. * ; public class MemoryMemberRepository implements MemberRepository { private Map < Long , Member > store = new HashMap <> (); private static long sequence = 0L ; @Override public Member save ( Member member ) { member . setId ( ++ sequence ); store . put ( member . getId (), member ); return member ; } @Override public Optional < Member > finById ( Long id ) { return Optional . ofNullable ( store . get ( id )); } @Override public Optional < Member > findByName ( String name ) { return store . values (). stream () . filter ( member -> member . getName (). equals ( name )) . findAny (); } @Override public List < Member > findAll () { return new ArrayList <> ( store . values ()); } @Override public Optional < Member > findById ( Long memberId ) { return Optional . empty (); } //test 를 한번 할때 마다 지워준다 . public void clearStore () { store . clear (); } } domain = Member package com.test.inflearn.domain ; public class Member { private Long id ; private String name ; //get, set public Long getId () { return id ; } public void setId ( Long id ) { this . id = id ; } public String getName () { return name ; } public void setName ( String name ) { this . name = name ; } } 오류 메시지 at java.util.Optional.get(Optional.java:135) at com.test.inflearn.service.MemberServiceTest.회원가입(MemberServiceTest.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)