묻고 답해요
163만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
섹션8 - Spring REST Docs
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요. 강의를 100% 다 소화하지는 못했지만 일단 거진 한바퀴는 돌리면서 마지막에 문제가 생겨 질문 드립니다.plugins { id 'java' id 'org.springframework.boot' version '2.7.7' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id "org.asciidoctor.jvm.convert" version "3.3.2" } group = 'sample' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } asciidoctorExt } repositories { mavenCentral() } dependencies { // Spring boot implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' // test testImplementation 'org.springframework.boot:spring-boot-starter-test' // lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' // h2 runtimeOnly 'com.h2database:h2' // Guava implementation("com.google.guava:guava:32.1.1-jre") // RestDocs asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' } tasks.named('test') { useJUnitPlatform() } ext { // 전역 변수 snippetsDir = file('build/generated-snippets') } test { outputs.dir snippetsDir } asciidoctor { inputs.dir snippetsDir configurations 'asciidoctorExt' sources { include("**/index.adoc") } baseDirFollowsSourceDir() dependsOn test } bootJar { dependsOn asciidoctor from ("${asciidoctor.outputDir}") { into 'static/docs' } } 일단 build.gradle 내용이구요. 운영체제는 윈도우 입니다.마지막에 build 후 jar파일을 실행하여 localhost:8080/docs/index.html 을 확인해보려고 하니 접속이 되지 않아 확인해보니 resources - static 디렉토리에 index.html이 생성되지 않았음을 확인하였습니다. build 디렉토리에는 생성되어 있었구요.몇번이나 clean 후 build를 통해 build쪽에는 index.html이 생성 되는 것을 확인 하였으나, static 패키지 하위에 docs 패키지 조차 생성되지 않아 제가 뭔가 오타를 낸건지 운영체제 문제인지 질문 드리고자 합니다. 감사합니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
테스트 시행 시 롤백
게시글 조회5-페이징처리(QueryDSL) 강의 내용 이후 전체 테스트를 시행하면 PostControllerTest에서 test5, test6에서 id값을 검증할때에 이전의 테스트에서 PostRepository에 저장이 되어 test5에서는 id값이 30이어야하는데 33이고, test6에서는 30이어야하는데 63으로 이전 테스트 수행 결과가 롤백되지 않아요.BeforeEach랑 Transactional 둘 다 사용해보았는데 테스트가 독립적으로 수행되지 않습니다.찾아보니 sequence는 롤백되지 않는 것이 DB의 기본 규칙이라는데 호돌맨님은 강의에서 전체 테스트를 수행하여도 모든 테스트케이스가 통과되어서 코드에서 어떤 부분이 다른지 궁금합니다.package com.blog.controller; import com.blog.domain.Post; import com.blog.repository.PostRepository; import com.blog.request.PostCreate; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc @Transactional class PostControllerTest { // TODO ObjectMapper 공부하기 @Autowired private ObjectMapper objectMapper; @Autowired private MockMvc mockMvc; @Autowired private PostRepository postRepository; @Test @DisplayName("/posts 요청 시 출력한다.") void test() throws Exception { // given PostCreate request = PostCreate.builder() .title("제목입니다.") .content("내용입니다.") .build(); String json = objectMapper.writeValueAsString(request); // expected mockMvc.perform(post("/posts") .contentType(APPLICATION_JSON) .content(json)) .andExpect(status().isOk()) .andDo(print()); } @Test @DisplayName("/posts 요청 시 title 값은 필수다.") void test2() throws Exception { // given PostCreate request = PostCreate.builder() .content("내용입니다.") .build(); String json = objectMapper.writeValueAsString(request); // expected mockMvc.perform(post("/posts") .contentType(APPLICATION_JSON) .content(json)) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value("400")) .andExpect(jsonPath("$.message").value("잘못된 요청입니다.")) .andExpect(jsonPath("$.validation.title").value("타이틀을 입력해주세요.")) .andDo(print()); } @Test @DisplayName("/posts 요청 시 DB에 값이 저장된다.") void test3() throws Exception { // given PostCreate request = PostCreate.builder() .title("제목입니다.") .content("내용입니다.") .build(); String json = objectMapper.writeValueAsString(request); // when mockMvc.perform(post("/posts") .contentType(APPLICATION_JSON) .content(json)) .andExpect(status().isOk()) .andDo(print()); // then assertEquals(1L, postRepository.count()); Post post = postRepository.findAll().get(0); assertEquals("제목입니다.", post.getTitle()); assertEquals("내용입니다.", post.getContent()); } @Test @DisplayName("글 1개 조회") void test4() throws Exception { // given Post post = Post.builder() .title("123456789012345") .content("bar") .build(); postRepository.save(post); // expected mockMvc.perform(get("/posts/{postId}", post.getId()) .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(post.getId())) .andExpect(jsonPath("$.title").value("1234567890")) .andExpect(jsonPath("$.content").value("bar")) .andDo(print()); } @Test @DisplayName("글 여러개 조회") void test5() throws Exception { // given List<Post> requestPosts = IntStream.range(1, 31) .mapToObj(i -> Post.builder() .title("호돌맨 제목 " + i) .content("반포자이 " + i) .build()) .collect(Collectors.toList()); postRepository.saveAll(requestPosts); // expected mockMvc.perform(get("/posts?page=1&size=10") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.length()", is(10))) // .andExpect(jsonPath("$[0].id").value(30)) // sequence는 롤백되지 않음(DB 기본규칙) - mysql 계열이라면 auto_increment로 생성한 값은 commit, rollback 에 상관없이 한번 생성한 값을 그대로 유지합니다. .andExpect(jsonPath("$[0].title").value("호돌맨 제목 30")) .andExpect(jsonPath("$[0].content").value("반포자이 30")) .andDo(print()); } @Test @DisplayName("페이지를 0으로 요청하면 첫 페이지를 가져온다") void test6() throws Exception { // given List<Post> requestPosts = IntStream.range(1, 31) .mapToObj(i -> Post.builder() .title("호돌맨 제목 " + i) .content("반포자이 " + i) .build()) .collect(Collectors.toList()); postRepository.saveAll(requestPosts); // expected mockMvc.perform(get("/posts?page=0&size=10") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.length()", is(10))) // .andExpect(jsonPath("$[0].id").value(30)) .andExpect(jsonPath("$[0].title").value("호돌맨 제목 30")) .andExpect(jsonPath("$[0].content").value("반포자이 30")) .andDo(print()); } }
-
미해결실전! Querydsl
querydsl에서 groupby, having 절을 포함한 경우 페이징 처리에 관한 질문 좀 드리겠습니다!
안녕하세요 querydsl로 페이징 처리를 구현하는 도중에 어려움에 부딪혀서 질문 작성하게 됐습니다!List<CloverPayDTO.PageResponse> contents = queryFactory .select(Projections.constructor( CloverPayDTO.PageResponse.class, memberInformation.memberName, member.id, member.nickName, cloverPoint.amount.sum().coalesce(0), member.regDt, member.lastLoginTime) ) .from(cloverPoint) .rightJoin(member) .on(cloverPoint.memberId.eq(member.id)) .join(memberInformation) .on(member.memberInformation.id.eq(memberInformation.id)) .where( goeStartDateAndLoeEndDate(member.regDt, searchRequest.getRegStartDate(), searchRequest.getRegEndDate()) .and(goeStartDateAndLoeEndDate(member.lastLoginTime, searchRequest.getLastLoginStartDate(), searchRequest.getLastLoginEndDate())) .and(eqKeyword(searchRequest.getKeywordType(), searchRequest.getKeyword())) ) .groupBy(memberInformation.memberName, member.id, member.nickName, member.regDt, member.lastLoginTime) .having(goeMinCloverAmountAndLoeMaxCloverAmount(searchRequest.getMinCloverAmount(), searchRequest.getMaxCloverAmount())) .orderBy(member.regDt.desc()) .offset(pageable.getOffset()) .limit(searchRequest.getSize()) .fetch(); private BooleanExpression goeMinCloverAmountAndLoeMaxCloverAmount(int minCloverAmount, int maxCloverAmount) { if (maxCloverAmount == 0) { return null; } return cloverPoint.amount.sum().coalesce(0).goe(minCloverAmount) .and(cloverPoint.amount.sum().coalesce(0).loe(maxCloverAmount)); }위와 같이 Repository에서 데이터를 조회하고 있습니다. 페이징을 처리해야 하는 로직이라 PageableExecutionUtils를 활용하여 Page 객체를 만들어 사용하려고 하는데 group by + having 절을 활용하는 경우 countQuery를 어떤 식으로 구현해야 할지 모르겠습니다... ㅠㅠ단순 SQL인 경우 인라인뷰를 활용하여 조건에 부합하는 count를 가져오겠는데 querydsl에서 인라인뷰는 지원하지 않는다고 알고 있습니다.다른 방식으로 contents.size()를 넘겨서 처리할까 싶었지만 이게 최선인지 잘 모르겠기에 영한님은 이런 경우 어떤식으로 로직을 처리하시는지 알고 싶습니다!!감사합니다!
-
해결됨JPA & Spring Data JPA 기초
도메인과 JPA 엔티티
도메인과 JPA 엔티티를 구분하려고 코드를 작성해봤습니다.@Repository@RequiredArgsConstructorpublic class OrderRepositoryImpl implements OrderRepository {private final OrderJpaRepository orderJpaRepository;@Override public void save(final OrderJpaEntity entity) {orderJpaRepository.save(entity);}@Overridepublic Optional<OrderJpaEntity> findById(final long orderId) {return orderJpaRepository.findById(orderId)}}이러한 방식으로 JpaRepository를 주입받고 OrderRepository를 구현하는 방식입니다.public interface OrderRepository {void save(final OrderJpaEntity entity);Optional<OrderJpaEntity> findById(final long orderId);} 그런데 이때 변경감지를 사용하려면 Order가 아닌 OrderJpaEntity를 반환해야하는데 이렇게 하면 결국 Repository에도 JPA 엔티티에 의존하기 때문에 분리를 잘 하지 못했다는 생각이 듭니다..혹시 도메인과 JPA 엔티티를 분리한다면 어떠한 방식으로 하시나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate.hbm2ddl.auto 속성 적용이 안됩니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]데이터베이스 스키마 자동생성 부분에서 hibernate.hbm2ddl.auto 속성이 적용되지 않습니다. 강의에서는 drop table Member if exists 로그가 찍히는데 저는 속성이 안되는 것인지 아무것도 뜨지 않습니다. Table도 다시 생성되어야하는데 생성되지 않습니다.H2 버전은 1.4.200입니다.프로젝트 zip 파일입니다.https://drive.google.com/file/d/1-USqDSZYjzSjQuMZ4t8cQSMsS6j4ez-s/view?usp=drive_link
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
커밋이 안됩니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 위처럼 비밀번호랑 경로 전부 같게 하고 연결해서 커밋해보면 커밋이 되지 않는데 어찌해야하나요...
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
완강 후 질문이 있습니다~!
안녕하세요 재밌고 알찬 강의 제공해 주셔서 감사합니다.jpa 와 같이 findById 같은 기본적으로 제공해주는 메서드는 따로 테스트를 안해봐도 될거 같은데..queryDsl 식으로 커스텀한 쿼리를 호출할때 테스트 방법은 어떻게 해야할지 궁금합니다.. h2 와 같은 임베디드디비로 쿼리 조건과 데이터가 잘 나오는지 테스트도 짜고, 다른 인터페이스를 상속받은 구현체의 메서드에서 메모리를 사용해 stream 과 filter 식으로 데이터를 반환하는 구현체를 테스트로 다시 넣어야하는지.. h2로 테스트코드를 짜고, 확인 후, 해당 테스트 코드는 지워버려야 하는지.. 강사님은 어떻게 하고 있는지 궁금합니다.. 감사합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
26강 오류
안녕하세요! 강의 너무 잘 듣고 있습니다.26강을 따라하던 중, 다음과 같은 에러가 났는데 혼자서 해결이 되지 않아 질문 드립니다.어떤 코드를 복붙해야할지 모르겠어서 일단 에러메시지만 복사하였습니다!감사합니다..!! <추가 07.18. 오후 12시>User.java 에 @Entity 어노테이션이 빠져 있어서 추가를 하니 문제가 해결되었습니다.문제는 해결되었으나, 에러 메시지 해석이 너무 어려워서 이점만 도움을 주시면 감사하겠습니다!!2023-07-18 01:41:59.121 ERROR 8616 --- [ main] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\1876007\Desktop\study\library-app\build\classes\java\main\com\group\libraryapp\controller\user\UserController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceV2' defined in file [C:\Users\1876007\Desktop\study\library-app\build\classes\java\main\com\group\libraryapp\service\UserServiceV2.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository' defined in com.group.libraryapp.domain.user.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.group.libraryapp.domain.user.Userat org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.24.jar:5.3.24]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.24.jar:5.3.24]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.6.jar:2.7.6]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.6.jar:2.7.6]at com.group.libraryapp.LibraryAppApplication.main(LibraryAppApplication.java:10) ~[main/:na]Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceV2' defined in file [C:\Users\1876007\Desktop\study\library-app\build\classes\java\main\com\group\libraryapp\service\UserServiceV2.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository' defined in com.group.libraryapp.domain.user.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.group.libraryapp.domain.user.Userat org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.24.jar:5.3.24]... 19 common frames omittedCaused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository' defined in com.group.libraryapp.domain.user.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.group.libraryapp.domain.user.Userat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.24.jar:5.3.24]... 33 common frames omittedCaused by: java.lang.IllegalArgumentException: Not a managed type: class com.group.libraryapp.domain.user.Userat org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:583) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:85) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final]at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:75) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:233) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:182) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:165) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:76) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:325) ~[spring-data-commons-2.7.6.jar:2.7.6]at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:323) ~[spring-data-commons-2.7.6.jar:2.7.6]at org.springframework.data.util.Lazy.getNullable(Lazy.java:231) ~[spring-data-commons-2.7.6.jar:2.7.6]at org.springframework.data.util.Lazy.get(Lazy.java:115) ~[spring-data-commons-2.7.6.jar:2.7.6]at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:329) ~[spring-data-commons-2.7.6.jar:2.7.6]at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144) ~[spring-data-jpa-2.7.6.jar:2.7.6]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.24.jar:5.3.24]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.24.jar:5.3.24]... 44 common frames omittedProcess finished with exit code 1
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
sequence 전략 allocation 사이즈
2서버를 운영할 때 allocation 사이즈를 50 준다면 A B가 동시 실행될 때 A = Seq 1~50B = Seq 51 ~ 100 씩 할당 받게된다면 insert문 발생시B는 id값이 51부터 사용되어서 저장되어지나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링부트로만 하는 경우 Assertions 에러의 경우
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)넵2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)넵3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)넵[질문 내용]인텔리J 사용하지 않고 스프링부트로만 사용하는 경우여기서 어떻게 하면 될까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AuthControllerTest에서 @BeforeEach
main resources/data.sql로 설정한 파일이 테스트시적용이 되지만 @BeforeEach 메소드 내부의 UserRepository.deleteAll()동작으로 인하여 테스트시 User테이블이 비어있는 것 같습니다.알아낸게 기분좋아서 공유드립니다.호돌님 정말 좋은 강의 만들어주셔서 많이 배우고있습니다.감사합니다!!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의내용 그대로 따라했는데 bootStrap 적용이 안되어서 질문드립니다.
현재 여기까지는 잘 적용이 되었는데 그 이 후에...resources - static 안에 bootstrap v4.6 설치하여서 css랑 js를 그대로 복사해서 넣었는데.. 안됩니다 ㅠㅠrefresh나 build project 등등 해보았는데 안되어서 질문드립니다.. <!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head th:replace="fragments/header :: header"><title>Hello</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><div class="container"><div th:replace="fragments/bodyHeader :: bodyHeader" /><div class="jumbotron"><h1>HELLO SHOP</h1><p class="lead">회원 기능</p><p><a class="btn btn-lg btn-secondary" href="/members/new">회원 가입</a><a class="btn btn-lg btn-secondary" href="/members">회원 목록</a></p><p class="lead">상품 기능</p><p><a class="btn btn-lg btn-dark" href="/items/new">상품 등록</a><a class="btn btn-lg btn-dark" href="/items">상품 목록</a></p><p class="lead">주문 기능</p><p><a class="btn btn-lg btn-info" href="/order">상품 주문</a><a class="btn btn-lg btn-info" href="/orders">주문 내역</a></p></div><div th:replace="fragments/footer :: footer" /></div> <!-- /container --></body></html>home.html 소스인데 강의에서 배운 소스 그대로입니다... ㅠㅠ
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 연관관계에 관해서
@JoinColumn의 경우 주인이 되는 테이블의 컬럼을 넣는 것으로 알고 있습니다.@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)@JoinColumn(name = "MEMBER_ID")private List<AddressEntity> addressHistory = new ArrayList<>();의 코드에서 혹시 반대로 AddressEntity에서 다대일 관계를 만들어 주고 싶은 상황이라면 (현재 강사님 코드에는 AddressEntity클래스에 Member엔티티에 대한 객체가 없는 상황) AddressEntity 클래스에 @ManyToOne@JoinColumn(name = "MEMBER_ID"private Member member를 생성해주는게 맞는 궁금하여 문의 남깁니다.
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
프로젝트 compile시 npm install시 No repository field
npm install시 위와같은 오류와 함께 컴파일이 종료됩니다. 혹시 해결 방법이 있나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.close()한 경우에도 업데이트 문이 실행되는데요.
이렇게 실행했는데, 로그에 업데이트 쿼리가 찍히네요.실제 사용할때는 트랜잭션 종료 이후에 em.close() 실행될텐데...테스트 코드라서 이상한긴 한데 좀 궁금하네요.public class JpaDetachMain {public static void main(String[] args) {final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); final EntityManager em = emf.createEntityManager(); final EntityTransaction tx = em.getTransaction(); tx.begin(); try{//영속 Member member = em.find(Member.class, 10L); member.setName("111"); em.close(); System.out.println("=============="); tx.commit(); }catch (Exception e){tx.rollback(); }finally {em.close(); emf.close(); }}}
-
미해결Practical Testing: 실용적인 테스트 가이드
섹션7 - 테스트 환경의 독립성을 보장하자
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요. 강의 재미나게 잘 보고있습니다.제목에 남겨드린 강의에서 creatOrderWithNoStock의 주제와 벗어나 given절의 deductQuantity에서 예외가 발생할 수 있는 상황을 예를 들어서 설명해 주셨고, 테스트 환경에서는 가능한 생성자를 기반으로 환경을 구성하여 진행하는것이 좋다고 말씀 주셨는데 그럼 이 경우에는 Stock stock1 = Stock.create("001", 2); Stock stock2 = Stock.create("002", 1);와 같이 생성 시점에 이미 부족한 수량으로 설정 하여 테스트를 진행하여 deductQuantity를 사용하지 않고, deductQuantity의 경우 따로 단위 테스트를 통해 수량 감소를 확인하는걸로 테스트를 구성하는 식으로 가면 되는건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티 설계 관련된 질문이 있습니다
[질문 내용]배운 내용을 바탕으로 혼자 프로젝트 생각해서 만들고 있는데요어떤게 궁금한지 간단히 말씀드리면멤버라는 엔티티가 있습니다.. 멤버라는 엔티티에는 오늘의 추천 할 일이 필요하고 날마다 바뀝니다. 추천할 일은 개발자 혹은 운영자가 직접 넣는 것이구요.. 이러면 member랑 추천선행이랑 연관관계가 필요가 없지 않나요??이러면 추천선행은 ERD? 같은거 설계할때 연관관계ㅒ 없이 동떨어져있는 걸로 그리면 될까요?? 혹시라도 전에 사용했던 추천선행이 안나오게 하려면 이 경우는 연관관계를 세팅하는게 좋을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
복합키(EmbeddedId) 사용시 도커환경에서 API Empty Value 반환 이슈
안녕하세요 영한님,영한님 강의중 QueryDsl, JPA 다 시청한 수강자인데따로 복합키 복합키 EmbeddedId 를 언급하는 강의가 없어 여기에 질문 남기는점 죄송합니다,현재 복합키로 구성되어있는 엔티티를 QueryDSL로 조회하여 반환하는 API를 설계했는데 로컬 IDE 즉 제 로컬 인텔리제이에서 빌드해서 Application을 띄울 시에 원하는 시나리오대로 DB의 저장되어있는 데이터를 반환하지만, Image 환경 즉 Docker Container, ECS 환경에서 이 JAR 파일을 빌드시에 쿼리는 잘 나가지만 데이터가 불러와지지 않는 현상이 발견됩니다,(제 로컬에서 터미널을 통해 Jar파일을 빌드해도 잘 됩니다.)복합키로 구성되어있는 테이블중 다른 일반타입의 필드(컬럼)만을 조회할땐 문제가 없지만 복합키중 일부 컬럼을 같이 조회할 시 이런 현상이 발견되고 있습니다.. 이런 이슈를 겪어본적이 있으신지 아니면 이 문제에 대해 해결방법이 있는지 궁급합니다. +++@Query 어노테이션으로 네이티브 쿼리를 짜봐서 도커 환경에서 테스트 해봤는데 네이티브 쿼리는 또 정상작동을 하네요...
-
미해결실전! Querydsl
on join 을 사용할 경우 select 에 하나의 객체만 넣으면 안되나요?
@Test public void join_on() { List<Tuple> result = query .select(member, team) .from(member) .leftJoin(member.team, team) .on(team.name.eq("teamA")) .fetch(); for (Tuple tuple : result) { System.out.println(tuple); } }이게 강사님께서 설명해주신 코드입니다. 이렇게 조회하게 되면 정상적으로 tuple 에 team name 이 "teamA" 것만 포함됩니다.근데 여기서 select 에 member 만 추가하게 되면 다음과 같습니다.@Test public void select_one() { List<Member> result = query .selectFrom(member) .leftJoin(member.team, team) .on(team.name.eq("teamA")) .fetch(); for (Member member1 : result) { System.out.println(member1); System.out.println(member1.getTeam()); } }이럴 경우 member getTeam 을 통해 team 을 확인하면 "teamB" 인 team도 포함되어 있습니다. 왜 이렇게 되는지 궁금해서 sql 을 봤는데 순서대로 아래가 강사님이 짜주신 select(member, team) 으로 발생한 sql 이고select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username, t1_0.team_id, t1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id and t1_0.name=? 아래가 제가 임의로 짠 select(member) 만 해서 발생한 sql입니다.select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id and t1_0.name=?보면 select 하는 부분만 다르고 left join 하는 부분은 완벽하게 같은데.. 왜 위의 코드로 실행하면 정상적으로 teamA 만 join 되고 아래 코드로 실행하면 teamB까지 join 되는 건가요..?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
login 요청하면 404 에러가 발생합니다.
포스트맨으로 API_GW를 경유해서 http://127.0.0.1:8000/user-service/login 요청하면 404 에러가 발생합니다.근데 http://127.0.0.1:54656/login 로 바로 리퀘스트하면 200 상태가 반환됩니다.로그인만 저렇고 http://127.0.0.1:8000/user-service/users 요청하면 회원가입은 또 됩니다..어디 부분부터 잘못되었는지 찾아봐야할까요?필터부분도 오타없이 잘 되었는데.. - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/login - Method=POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment}/ - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/users - Method=POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment}/ - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** - Method=GET filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment}/