[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] @PostConstruct나 @Transactional이나 둘 다 프록시인데, 프록시는 보통 외부에서 호출을 하면 가로채서 먼저 프록시 메소드를 실행하고 넘겨주는데, 저거는 둘 다 프록시라 뭐를 해야할 지 몰라서? 프록시 메소드는 하나만 실행되서? 같이 쓰지 않는건가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] allEq를 만들기 위해서, private BooleanExpression allEq(MemberSearchCondition condition){ return usernameEq(condition.getUsername()) .and(teamNameEq(condition.getTeamName())) .and(ageGoe(condition.getAgeGoe())) .and(ageLoe(condition.getAgeLoe())); } 이런 식의 코드를 만들기 위해서는 null 대신 빈 표현식을 반환해야 하는데, new BooleanExpression()은 안되는 모양이예요. 그래서 찾아봤더니, null 대신 Expressions.TRUE를 중립조건으로 반환하게 하는거예요. 근데 이러면 나가는 쿼리가, /* select member1.id, member1.username, member1.age, team.id, team.name from Member member1 left join member1.team as team where true and team.name = ?1 and true and true */ select m1_0.member_id, m1_0.username, m1_0.age, m1_0.team_id, t1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id where true and t1_0.name=? and true and true 이렇게 true로 섞여서 나가지만, 저런 것들은 DB내에서 최적화 해줘서 문제가 없다고 해요. 근데 아무래도 익숙하지 않은 상황에서는 다른 분이 보았을 때 저게 뭐지? 왜 저 쿼리가 나가지? 라는 생각을 할 것 같아요. 그런데, 저 and true를 보고 아, 동적 쿼리를 사용했나? 라고 생각할 수 있는 사람끼리 본다면 굉장히 괜찮은 방법 같아요. 근데 여튼간에 보여지는 것 자체에는 의미없는 쿼리가 나가는 거라서, 유지보수 면에서 좀 그럴 것 같다는 생각이 들어서요. 실무에서는 어떤가요?
package jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember() throws Exception{ //given Member member = new Member(); member.setUsername("memberA"); //when Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } } 위에는 제가 작성한 코드고 아래가 오류 내용입니다. 어떻게 해결해야할까요? java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@7971c2a9 testClass = jpabook.jpashop.MemberRepositoryTest, locations = [], classes = [jpabook.jpashop.JpashopApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceLocations = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@50eac852, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@6a192cfe, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@1dde4cb2, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@42e99e4a, org.springframework.boot.test.context.SpringBootTestAnnotation@5c96f405], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:143) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:127) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:241) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 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:247) 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:191) 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$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:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'javax.persistence.jdbc.url', 'hibernate.connection.url', or 'hibernate.dialect')
jpa 프로그래밍 기본편 강의 질문으로 localdatetime이 빨간줄이 계속 나는데 문제가 뭘까요? 파일 공유 하겠습니다. https://drive.google.com/drive/folders/1RGt1WO-WGyNj029uUambw0K1efMINqwl?usp=sharing
일대다 관계에서 List<Member> members= new ArrayList<>(); getMembers라고 조회하면 프록시 객체가 아니라 PersistantBag으로 감싸고 안에 회원 한명을 조회하던 여러명을 조회던 그때 참조하는 Member를 전부 가져오고 거기서 꺼내서 주는거같아요. 이렇게 하는 이유는 연관관계 주인이 대상테이블에 있기 때문이라고 이해를 했습니다. 주테이블에 연관관계 주인으로 설정한다고 해도 데이터베이스 테이블 구조는 다 쪽에 외래키 칼럼이 있기 때문에 일 쪽에서는 자신을 참조하는 테이블 레코드를 알수 없기때문에 (조회를 하건,수정을하건,삭제를 해야 그때 조회하는걸로 알고 있습니다.) 지연 로딩이 불가능하고 즉시로딩이 되는거같은데 이렇게 이해하는게 맞을까요?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요. 4강 종료 후 도서관 책 등록 강의를 듣기 위해서 인텔리제이 실행을 시켰는데,모든 어노테이션들이 다 빨간줄로 되면서 사용할 수 없다는 식으로 나옵니다.build.gradle 들어가서 새로고침도 해보고, web부분 주석 후 새로고침도 해봤는데 빨간줄은 계속 나와있습니다.갑자기 왜 이러는 건지, 해결방법 알려주실 수 있으실까요?ㅠㅠ
안녕하세요. 강의를 들으면 실습하던중 강의와 다른 내용이 있어서 질문 드립니다. Spring REST Docs를 만들어내는 과정에서 gradle의 build나 asciidoctor 태스크를 실행했는데, build 폴더에 변환된 index.html이 생성이 되지 않습니다. 강의에서 사용하는 환경과 다른점은 스프링부트 3이상 버전을 사용한다는 점밖에 없고, 운영체제, 나머지 build.gradle이나 테스트 코드는 모두 동일한데, 변환된 html이 생성되지 않는 이유가 있을까요? + 추가로 build 시에 생성되는 bootJar 파일을 압축을 해제해서 보았더니 내부의 BOOT-INF/classes/static 에도 index.html 파일이 들어가있지 않았습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] @Override public Page<MemberTeamDto> searchPageSimple(MemberSearchCondition condition, Pageable pageable) { List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name )) .from(member) .leftJoin(member.team, team) // where 방식이 더 좋은 이유는 무엇일까? 재사용성이 좋아진다. 이게 가장 큰 객체지향의 특징인데 이걸 이용할 수 있음! .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); int totalSize = content.size(); log.info("total size = " + totalSize); return new PageImpl<>(content, pageable, totalSize); } serachSimple을 아래와 같이 작성하였습니다. fetchResults가 deprecated 되어서 이렇게 작성하였는데 postman에서 실행결과 total 페이지가 들어간 수로만 나옵니다. 이유를 알 수 있을까요??
일대다 관계에서 컬렉션을 조회하면 조회 결과 테이블을 엔티티에 매핑하다보니 JPA는 그대로 중복된 객체를 반환한다고 이해를 했습니다. 그런데 중복을 제거하기 위해서 Distinct 연산자를 붙이면 쿼리에도 Distinct가 들어가면서 SQL이 실행이 되는데요 영속성 컨택스트에서 같은 식별자를 가진 엔티티는 동일성을 보장하니까 불필요한 SQL이 포함된 Distinct보다 HashSet<>으로 중복을 제거하는 방법은 별로일까요?
@Getter @RequiredArgsConstructor public class ErrorResponse { private final String code; private final String message; } 여기서 @Getter 애노테이션을 쓰는 이유가 무엇일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 실전 예제에서 추가된 카테고리랑 딜리버리에 @Column이 추가되지 않은 이유는 DB Table까지는 사용하지 않을 거여서라고 생각하면 될까요? Order나 Member에는 @Column이 있는데 다른 곳은 또 @Column이 없고.. 어디서 어떻게 써야할지 확신이 안갑니다 ㅜ
소스파일 https://drive.google.com/file/d/1Laef4VrgEfQ0--86aUf1ENR9yi4LSwXF/view?usp=sharing 강사님이 하신대로 따라하는 중인데 처음 MemberRepositoryTest를 실행할 경우 테스트가 통과됩니다. 이후 @Rollback(false)를 추가해서 실행할 때부터 에러가 납니다. h2 DB를 삭제하고 처음부터 다시 해봐도 똑같이 처음 한번은 통과하고 그 다음부터 에러가 납니다. 아래는 로그 전문입니다. https://drive.google.com/file/d/1sLImPcsiNvBY04ZOmBWe6fVansFaWWPi/view?usp=sharing
저도 잠깐 생각해봤는데, 이 Projections.fields라는 건 리플렉션 방식을 이용한다고 함. 뭔지는 잘 모르겠으나, 객체의 구체적인 타입을 알지 못하더라도 해당 객체의 멤버변수, 메서드 등에 접근할 수 있도록 해주는 자바의 기능이라고 함. 생각해보면 private 하는 게 정말로 다른 객체에서 절대로 접근하지 못하게 할거야! 라기 보다는 유지보수, 축약하자면 캡슐화를 위해 함. 근데, 필드에 주입 할 수 있다는 것 자체가, 주입할 판이 있어야 함. 주입할 객체가 있어야 함. 그래서 비어있는 생성자가 필요한 듯.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 저는 bean이라 하면 뭐에 의해 관리되는 하나하나 개개의 단위? 라고 생각했어요. 스프링 빈. 영속성 컨텍스트에 의해 관리되는 엔티티들도 약간 그런 느낌으로.. 근데 여기서 bean이라는 메소드 명을 들으니 뭐라고 생각해야 될 지 모르겠어요.