묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP @Component로 Bean 등록 처리할 경우에 관한 질문입니다.
https://www.inflearn.com/community/questions/48156/aop-timetraceaop-%EB%A5%BC-component-%EB%A1%9C-%EC%84%A0%EC%96%B8-vs-springconfig%EC%97%90-bean%EC%9C%BC%EB%A1%9C-%EB%93%B1%EB%A1%9D@Configuration 파일 내에서 @Bean 어노테이션을 사용하여 TimeTraceAop.java 파일을 빈으로 등록하는 경우, 참조 문제가 발생하는 부분에 대해 위 다른 분이 작성해주신 글을 통해 이해가 잘 갔는데요, 그럼 @Component 어노테이션을 활용하여 등록하는 경우에는 동일한 @Around 구문을 통해 명시된 @Around("execution(* hello.hellospring..*(..))")를 사용하는 경우 문제가 발생하지 않는 것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
단축키 작동 안됨
단축키 설정을 했는데 tdd 도 안되고 sout 도 안되는 이유는 무엇일까요? 참고로 build.gradle 파일은 아래와 같습니다plugins { id 'java' id 'org.springframework.boot' version '3.4.0' id 'io.spring.dependency-management' version '1.1.6' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } 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') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } testImplementation 'junit:junit:4.13.2' } tasks.withType(Test) { useJUnitPlatform() }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
junit 안됨
https://drive.google.com/file/d/1M-NYH5etfTZPV5kMZzuiOWaBjA7bR3XR/view?usp=sharing위는 제 프로젝트 파일입니다 강의 파일에 나와있는부분을 복붙해도 오류나고testImplementation("junit:junit:4.13.2")이렇게 해도 오류납니다.Assert 부터 안되는데 뭐가 잘못된걸까요?
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
SpringCloud Gateway 연동
https://github.dev/ishrhrl39/3-3.Microservice강의중 유레카 대쉬보드에는 아이템 서비스가 잘 표현되는데 왜 postman 요청은 404가 뜨는지 원인을 못찾겠네요..라우팅쪽 문제인것같은데..
-
미해결실전! 스프링 데이터 JPA
컬렉션 조회 관련
배운거를 적용하면서 쿼리 개선을 하고 있었는데, 혼자 해결해보려고 했으나 컬렉션 조회가 같이 섞이면서 이해가 잘 안 되는 것 같아 질문을 남기게 되었습니다.게시글 목록을 불러올때 태그이름 리스트를 같이 필요하기 때문에 관련 memePostTags와 Tag까지 같이 조회를 해야하는 상황입니다.테이블 관계가 MemePost 1 : N MemePostTag 1 : 1 Tag 이렇게 되어있을때getMemePost5 메서드와 getMemePost6메서드 둘 중에 어느 것이 더 나은 방법인지, 아니면 더 나은 다른 방법이 있는지 궁금합니다.getMemePost5의 경우는 MemePostTagRepository에서 Tag까지 fetch join으로 불러오고, Map 객체에 postId를 key로 저장해서 태그 이름을 조회합니다.getMemePost6의 경우는 페이징으로 조회한 후 postIds를 in절로 postTag와 tag를 fetch join합니다. 컬렉션 조회의 경우 페이징을 안할 경우 fetch join으로, 페이징을 할 경우 batch size로 하라는 것까지는 이해가 되었는데, 이 경우에는 postTags를 batch size로 가져오고, 그에 다한 tag도 batchsize로 가져와 추가로 두번의 쿼리가 더 나가게 되어서 다른 방법을 고안해내다가 점점 미궁으로 빠지는 것 같아서 질문을 남기게 되었습니다 😂 public Slice<MemePostSummaryResponse> getMemePosts5(int page, int size, MemePostSort postSort, Long userId) { Pageable pageable = PageRequest.of(page, size, postSort.toSort()); Slice<MemePost> memePostSlice = memePostRepository.findSliceAll(pageable); List<Long> postIds = getPostIds(memePostSlice.getContent()); // MemePostTag와 Tag를 한번에 fetch join 하나의 쿼리로 하되, MemePostTagRepository에서 entitygraph를 통해 fetch join Map<Long, List<String>> postTagNames = memePostTagRepository.findTagsByMemePostIdIn(postIds) .stream() .collect(groupingBy(tag -> tag.getMemePost().getId(), mapping(tag -> tag.getTag().getName(), toList()))); //좋아요도 하나의 쿼리로 Set<Long> likedPostIds = new HashSet<>(memePostRepository.findLikedPostIds(postIds, user)); List<MemePostSummaryResponse> responses = memePostSlice.getContent().stream() .map(mp -> new MemePostSummaryResponse( mp, likedPostIds.contains(mp.getId()), postTagNames.getOrDefault(mp.getId(), Collections.emptyList()) )) .toList(); return new SliceImpl<>(responses, pageable, memePostSlice.hasNext()); } public Slice<MemePostSummaryResponse> getMemePosts6(int page, int size, MemePostSort postSort, Long userId) { Pageable pageable = PageRequest.of(page, size, postSort.toSort()); Slice<MemePost> memePostSlice = memePostRepository.findSliceAll(pageable); List<Long> postIds = getPostIds(memePostSlice.getContent()); // MemePostTag와 Tag를 한번에 fetch join memePostRepository.findAllWithTagsInPostIds(postIds); //좋아요도 하나의 쿼리로 Set<Long> likedPostIds = new HashSet<>(memePostRepository.findLikedPostIds(postIds, user)); List<MemePostSummaryResponse> responses = memePostSlice.getContent().stream() .map(mp -> new MemePostSummaryResponse( mp, likedPostIds.contains(mp.getId()), mp.getTagNames() )) .toList(); return new SliceImpl<>(responses, pageable, memePostSlice.hasNext()); } public interface MemePostRepository extends JpaRepository<MemePost, Long>, MemePostRepositoryCustom { @Query("SELECT mp FROM MemePost mp where mp.deletedAt IS NULL") Slice<MemePost> findSliceAll(Pageable pageable); @Query("SELECT mp.id FROM MemePost mp " + "JOIN MemePostLike mpl ON mpl.memePost = mp " + "WHERE mp.id IN :postIds AND mpl.user = :user") List<Long> findLikedPostIds(@Param("postIds") List<Long> postIds, @Param("user") User user); @Query("SELECT mp FROM MemePost mp " + "LEFT JOIN FETCH mp.memePostTags mpt " + "LEFT JOIN FETCH mpt.tag " + "WHERE mp.id In :postIds") List<MemePost> findAllWithTagsInPostIds(@Param("postIds") List<Long> postIds); } public interface MemePostTagRepository extends JpaRepository<MemePostTag, Long> { @EntityGraph(attributePaths = {"tag"}) List<MemePostTag> findAllByMemePostId(Long postId); @EntityGraph(attributePaths = {"tag"}) List<MemePostTag> findTagsByMemePostIdIn(List<Long> memePostIds); } public class MemePost { public List<String> getTagNames() { return memePostTags.stream() .map(mpt -> mpt.getTag().getName()) .toList(); } }
-
미해결스프링 부트 - 핵심 원리와 활용
스프링 컨테이너 등록 스프링 라이브러리 오류
가이드대로 스프링 mvc를 추가하는데 추가가 되지 않아서 이후 진행이 안되고 있습니다. 코드를 작성하고 저장하면 자동으로 라이브러리가 생성되는 방식이 아닌가요? 어떻게 해야하는지 알려주시면 감사하겠습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
@Builder 관련 문의
생성자를 private로 하고 그 위에 빌더패턴을 사용하는데,이러면은 결국에 모든 곳에서 생성자에 접근 가능하다는 얘기인데 private를 쓰고 builder를 하시는 이유가 있나요 ?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
프로젝트 생성시 dependencies에 spring web starter 안뜸
dependencies에 spring web strater 검색해도 안뜨는데 어떡해야하나요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Tomcat
[질문 내용]안녕하세요,강의 중에 궁금한점이 있어 글 남깁니다. 스프링 부트 스타터에 톰캣이 인베디드 되어서 저절로 가져오기 때문에 서버에 따로 톰캣을 설치할 필요가 없다고 하셨는데,그렇다면 각 프로젝트를 서버에 띄우게 되면 모두 톰캣이 멀티 인스턴스로 띄우고 각 프로젝트는 모두 다른 포트를 사용해야하는걸까요? 만약 그렇다면 각 프로젝트에 톰캣 포트 세팅을 따로 해주어야하는데 해당 부분은 서버에서 하는게 아닌 프로젝트를 배포할때 세팅 파일에 따라 세팅이 되는 걸까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
오류?
Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] Database driver: undefined/unknown Database version: 8.3 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown실행과 테이블 다 잘 만들어 지는데 이런 로그가 계속 뜹니다.제 mysql 문제일까요?mac os 사용중이고 강의처럼 docker를 통해 띄우는게 아닌 홈브류로 mysql을 다운받아서 쓰고있었어서 그대로 쓰는중입니다
-
미해결실전! 스프링 데이터 JPA
똑같이 코딩했는데 널익셉션이 떴는지 모르겠습니다
실전! 스프링데이터 jpa에서8강을 듣고있는데 memberRepository 파일도 영상과 똑같이 코딩했는데 왜 안되는지 모르겠습니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
2024년 11월 기준 설치 방법입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]오랜만에 다시 복습하러 들어와서 처음부터 보는데 역시 설정이 반이네요 ㅎㅎh2 측에서 DB 자동 create를 막아두면서 시작부터 막히신 분들이 많은것같습니다.h2에서 제공하는 데이터베이스 직접 생성 방식을 사용하는 것을 권장드립니다.링크강의와 동일하게 진행하기 위해서는 URL 입력부분만 잘 입력해주시고나머지 모두 엔터로 넘어가신 후에 quit로 탈출하시면 됩니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
HashMap에서 stream과 filter를 거처 List가 될 때 정렬순서
강의 4:33 의 코드입니다. @Test void findItems() { //given Item item1 = new Item("itemA-1", 10000, 10); Item item2 = new Item("itemA-2", 20000, 20); Item item3 = new Item("itemB-1", 30000, 30); log.info("repository={}", itemRepository.getClass()); itemRepository.save(item1); itemRepository.save(item2); itemRepository.save(item3); //둘 다 없음 검증 test(null, null, item1, item2, item3); test("", null, item1, item2, item3); //itemName 검증 test("itemA", null, item1, item2); test("temA", null, item1, item2); test("itemB", null, item3); //maxPrice 검증 test(null, 10000, item1); //둘 다 있음 검증 test("itemA", 10000, item1); } void test(String itemName, Integer maxPrice, Item... items) { List<Item> result = itemRepository.findAll(new ItemSearchCond(itemName, maxPrice)); assertThat(result).containsExactly(items); } MemoryRepository의 HashMap은 순서를 보장하지 않는데, 강의에서 실습을 할 때는itemRepository.save(itemOO) 순으로 넣은대로 List로 변환되는것 같습니다. test(null, null, item1, item2, item3);이 테스트는 매번 일관되게 나와야하는데 항상 item1, item2, item3 순으로 잘 통과되는 이유가 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
pointcut.setExpression 문자열에 컨트롤+마우스 좌클릭
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 pointcut.setExpression 문자열에 컨트롤+마우스 좌클릭하면 선언부로 이동 되는데 저는 되지 않습니다. 인텔리제이 올팩 구독해서 쓰고 있습니다. 뭔가 설정같은게 달라서 그럴까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
mysql 연결 관련 에러 질문있습니다
안녕하세요 선생님. 실습 과정중 mysql과 연결이 잘 안 되는 것 같아 질문드립니다 처음에 있었던 에러였는데요 화면 접속 자체는 잘 되는데 이름과 나이를 저장하면 2024-11-28 16:57:49.886 ERROR 13764 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.group.libraryapp.dto.user.request.UserCreateRequest]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.group.libraryapp.dto.user.request.UserCreateRequest (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]] with root cause com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.group.libraryapp.dto.user.request.UserCreateRequest (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]이런 오류가 떴습니다. 검색해보니 UserCreateRequest에 기본 생성자를 만들라고 해서 만든 후 실행하니 이 오류는 안뜨긴합니다. 인자 있는 생성자가 있었는데 왜 기본 생성자를 만들어야하는건가요? 지금 제 코드가 꼬여서 그런걸까요?또한 에러 해결 방법으로 애노테이션 누락: Jackson 라이브러리에서 객체를 직렬화/역직렬화할 때 필요한 애노테이션이 누락되었을 수 있습니다. 예를 들어, 생성자에 @JsonCreator와 각 필드에 @JsonProperty를 추가해 보세요.이런 방법을 추천하는데 이건 무엇인가요?? 위 에러 고친 이후에는 SQL 문법 오류가 발생하는데요 선생님과 똑같이 문법을 사용했는데 왜 오류가 생기는지 모르겠습니다.. sql에 테이블 자체는 잘 생성되어있는 상태입니다
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
404 HTTP 상태 코드
선생님 안녕하세요 MVC01에서 코드를 이상 없이 작성한 거 같은데 계속해서 404 에러 코드가 발생해서 한 번만 확인해주시면 감사하겠습니다.https://github.com/normaldeve/SpringMVC
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원리포지토리 테스트케이스 작성 첫 테스트
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]회원 리포지토리 테스트 케이스 작성중 4:43 test 결과저만 -1 나오는게 비정상인가요?package hello.hello_spring.repository; import hello.hello_spring.domain.Member; import org.junit.jupiter.api.Test; class MemoryMemberRepositoryTest { MemberRepository repository = new MemoryMemberRepository(); @Test public void save() { Member member = new Member(); member.setName("spring"); repository.save(member); //repository.findById(member.getId()); Member result = repository.findById(member.getId()).get(); System.out.println("result = " + (result == member)); } }
-
미해결스프링 핵심 원리 - 기본편
ac.getBean(빈이름, 타입), ac.getBean(타입)
[질문 내용]@Test @DisplayName("모든 빈 출력하기") void findAllBeans() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); // 스프링에 등록된 모든 빈 이름을 조회한다. for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); // 스프링 컨테이너에서 빈 이름으로 빈 객체(인스턴스)를 조회한다. System.out.println("name(key) = " + beanDefinitionName + ", object(value) = " + bean); } } 위 코드에서 getBean() 메소드에 배열 변수를 foreach 문에 담아 beanDefinitionName을 매개변수에 놓아져 있습니다. 그런데 스프링 빈 조회 - 기본 설명문에서 ac.getBean(빈이름, 타입) 과 ac.getBean(타입) 2가지 조회 방법이 있는데 Object bean = ac.getBean(beanDefinitionName); 코드 에서는 빈이름인지 타입인지 잘 분간이 안돼서 모호하게 보입니다. 왜 이게 가능한 건지 설명해주세요.
-
미해결실전! 스프링 데이터 JPA
Projection 부분 듣고있는데 의문점
의문점이있습니다. public interface UsernameOnly { String getUsername(); }이런식으로 사용자 이름만 가져올수있게 하는건 알겠는데 그냥 레파지토리에 @Query("select m.userName from Member m ")그냥 이런식으로 하면되는거아닌가요?굳이 projection안쓰고?햇갈립니다
-
해결됨스프링 핵심 원리 - 기본편
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
[질문 내용]@Test @DisplayName("모든 빈 출력하기") void findAllBeans() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = : " + beanDefinitionName + ", object = : " + bean); } }김영한 강사님께서 ac.getBean(beanDefinitionName);의 값을 대입할 때 타입이 Object라고 한 것이 type을 지정하지 않아서 그렇다고 하셨는데 String[] beanDefinitionNames = ac.getBeanDefinitionNames(); 에서 보면은 String[] 배열에 담아 놓은 것을 확인할 수 있습니다. 즉 beanDefinitionName 들은 타입이 String이니까 String[] 배열에 담을 수 있다고 저는 생각하는데 무엇 때문에 type 을 지정하지 않아서 Object라고 하신건지 궁금합니다.