묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
섹터 7강 의존관계 자동 주입 질문있습니다.
1.생성자 주입을 선택해라! 강의에서 4분22초에서 에러가 왜 나는건가요? 매개변수를 3개를 줘서 그런건가요? 2.@Autowired 필드 명, @Qualifier, @Primary 1분 56초에서 basic scan에서 왜 오류가 나는건가요?orderserviceimpl에서 discountplicy를 ratediscountplicy로 바꾸면 오류가 안나는데 왜 오류가 안나는건가요?
-
미해결스프링 부트 - 핵심 원리와 활용
설정 데이터1 - 외부 파일 강의에서 질문
안녕하세요. 강의를 듣던중 궁금한 점이 생겨 질문합니다. 강의에서 터미널에서 java 커맨드를 이용해서 jar파일을 실행시킬 때(java -jar ex.jar), 별도의 추가 옵션을 주지 않았는데, jar 파일과 같은 경로에 있는 application.properties 파일을 읽어 값을 가져오는 것을 볼 수 있는데, 이는 스프링 부트의 어느 코드에서 처리해주는 것인지 궁금합니다. (만약 같은 경로에 있지 않다면 사용되지 않는건가요?)
-
해결됨실전! 스프링 데이터 JPA
flush() 와 clear()
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]1. 스프링 데이터 JPA 가 지원하는 save를 호출하면 flush()가 나가는건가요 아니면 save를 하고 bulkAgePlus()를 호출하면서 bulkAgePlus() 에 있는 JQPL이 실행되서 flush() 가 나가는건가요 ? bulkAgePlus()를 실행하면 JPQL 실행이되고, JPQL 이 실행이 되면 flush() 가 호출이 되는데 이때 SQL쿼리문이 DB에 전송이대서 DB에는 업데이트가 되어있지만 영속성 컨텍스트는 업데이트가 안되기 때문에 clear()를 해주는게 맞는건가요 ?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MvcMemberSaveServlet 500에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의 중 MvcMemberSaveServlet 부분을 학습하는 중에 아래와 같은 에러가 뜹니다. 커뮤니티글도 확인하여 JSTL 버전을 고려하여<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 도 추가해보았지만 동일한 에러가 뜹니다.구글 드라이브 링크 남겨드립니다 ㅠㅠhttps://drive.google.com/file/d/1NUVT4JqXIfAsVtdMgY3eP3t6IWKciBLH/view?usp=sharing There was an unexpected error (type=Internal Server Error, status=500). 2023-11-17 19:51:48.018 ERROR 7520 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[mvcMemberSaveServlet] : Servlet.service() for servlet [mvcMemberSaveServlet] in context with path [] threw exception [javax.el.PropertyNotFoundException: Property [username] not found on type [hello.servlet.domain.member.Member]] with root cause
-
미해결스프링부트 시큐리티 & JWT 강의
Spring Boot 최신 버전(3.1.5)에 대하여..
질문은 아니지만 최근에 이 강의를 들으시는 분들에게 조금이나마 팁이 될까 적어봅니다.강사님께서 강의하신 3년전에는 2.3.* 버전이고,강의자료 github version 3에서도 2.7.* 버전이라 최신 버전인 3.1.*에는 안맞는 것들이 조금은 많았습니다.대부분 Spring Boot 3.*대로 업데이트 되면서 많은게 바뀌었더라고요. 그래서 작업하면서 최신 버전에서는 이렇게 하면 오류가 해결되는구나에 대해서 기억나는대로 설명해드리고자 합니다.<강사님 github Version3 SecurityConfig.java에서 filterChain 발췌>@Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .formLogin().disable() .httpBasic().disable() .apply(new MyCustomDsl()) // 커스텀 필터 등록 .and() .authorizeRequests() .antMatchers("/api/v1/user/**") .access("hasRole('USER') or hasRole('MANAGER') or hasRole('ADMIN')") .antMatchers("/api/v1/manager/**") .access("hasRole('MANAGER') or hasRole('ADMIN')") .antMatchers("/api/v1/admin/**") .access("hasRole('ADMIN')") .anyRequest().permitAll() .and().build(); } 람다 표현식 사용 권장httpServlet 오브젝트에 처음 적용시키는 csrf부터 빨간줄이 떴습니다. 설명줄을 확인해보니 스프링 시큐리티 6.1 버전부터 deprecated되었다고 하네요.자동완성을 확인해보니 밑에 있던 기존 csrf는 밑줄이 그어져있고 대신 안에 파라미터를 넣어줘야 한다고 되어있네요. 이런식으로 파라미터를 요구하는 식에는 모두 람다식 표현을 사용했습니다. http.csrf(cs-> cs.disable()) .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .formLogin(f->f.disable()) .httpBasic(h->h.disable()) .apply(new MyCustomDs1())람다식 표현은 매개변수->{매개변수 표현식} 으로 표현할 수가 있습니다. 자세한 내용은 구글링 하시면 잘 나오실 겁니다. .and() Method 삭제http의 csrf, sessionManagement, formLogin, httpBasic을 disable로 하고 .and()로 한번 끊고 나서 다음 설정을 하는 구문입니다.자동완성을 확인해보니 and() 메소드는 완전히 삭제가 된 모양이군요.and()의 역할은 다중 보안 설정 시에 사용하는 메소드입니다. SecurityConfig.java 파일에서는 처음으로 보안 설정을 한 후에 권한 설정을 하는 방식으로 진행되었습니다. 이에 따라 and() 구문으로 보안설정과 권한설정을 나누었으나, and() 메소드가 삭제됨에 따라 나누는 방법에 대해서 많은 고민을 했던 것 같습니다. <수정 내용>인프런 AI 인턴으로부터 받은 답변의 내용을 살펴보면apply() 메소드 뒤에 메소드 체이닝으로 붙여서 람다 표현식으로 하면 권한이 생성된다고 되어있습니다.한 번 해보시죠.빨간색 줄을 보면 authorizeHttpRequests 메소드가 'MyCustomDs1' 이라는 커스텀 필터 클래스의 메소드라고 인식하고, MyCustomDs1 필터 내에 authorizeHttpRequests라는 메소드가 존재하지 않음으로 오류를 띄워주는 것이라고 할 수 있겠습니다. 이에 대해, 제 방식이 정답인지는 모르겠으나 이런식으로 해결했습니다. http.csrf(cs-> cs.disable()) // 보안 설정 .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .formLogin(f->f.disable()) .httpBasic(h->h.disable()) .apply(new MyCustomDs1()); http.authorizeHttpRequests(authorize-> { // 권한 부여 // authorizeRequests가 deprecated됨에 따라 authorizeHttpRequests 사용 권장 ... // /user, /manager, /admin으로 들어가도 /loginForm으로 접근하도록 return http.build();① 보안 설정에 대한 내용을 HttpServlet 오브젝트인 http에 한번 추가를 시키고,② 메소드 체이닝을 끊어낸 다음,③ 권한 부여에 대한 내용을 추가했습니다.권한 부여 방식① authorizeRequests deprecatedauthorizeRequests 메소드도 설명란을 보면 어노테이션으로 Deprecated가 걸린 것을 볼 수 있습니다.자동완성으로 확인을 해보자면authorizeHttpRequests() 메소드를 람다식 표현으로 쓰라고 되어 있네요.② antMatchers deprecated antMatchers는 흔적도 없이 사라졌나 봅니다..requestMatchers() 메소드를 사용하시면 되겠습니다.③ hasAnyRole() 내의 parameter format 변경기존에는 hasAnyRole() 파라미터로 ROLE_USER, ROLE_ADMIN 이런식으로 앞에 ROLE_을 붙여서 권한을 부여했지만, Spring Security가 업데이트 되면서 hasAnyRole 메소드에서 권한을 부여할 때 각 role마다 앞에 자동으로 'ROLE_'을 붙여줍니다. 즉, 기존 방식대로 사용하다 보면 httpServlet 입장에서는 'ROLE_ROLE_USER', 'ROLE_ROLE_ADMIN' 이런식으로 인식하게 되어서 권한을 부여받지 못하는 부분이 있었습니다. 대략 이렇게 정리를 마치겠습니다.Spring같은 Framework의 큰 장점이자 단점은 업데이트가 수시로 된다는 점인데요.업데이트가 되면서 사용하는 데에 조금 더 편안해지겠지만, 이에 대해 인지하지 못한다면 사용할 수 없다는 점이 아닐까 생각됩니다.긴 글 읽어주셔서 감사하고, 저와 이 글을 읽으신 모든 분들의 코딩 실력이 한 발자국 더 앞설 수 있기를 기도하겠습니다.제가 작업한 프로젝트도 github에 올려놨으니 확인이 필요하시다면 한번씩 방문해주세요~http://github.com/msun0215/jwt.git 오늘의 결론 ① Spring 공식 홈페이지 업데이트 될때마다 찾아가서 확인해보자② 영어 공부 열심히 하자
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
index.html
처음에 servlet 프로젝트를 생성해서 실습을 하고섹션6부터 springmvc 라는 프로젝트를 새로 생성해서 진행을 하는데 강사님이 편리하게 실습 내용들 확인하라고 주신 index.html을각각 기본 index.html 페이지를 webapp이나 static에 넣어놓죠 그런데 springmvc 프로젝트 실습하고 복습을 위해servlet 프로젝트로 돌려서 볼려고 하니servlet 프로젝트에서 쓰던 index.html로 접속이 안되고springmvc에서 등록한 index.html만 계속 보이네요 프로젝트도 다시 실행해보고 웹 페이지 새로고침도 계속 해봤는데도 여전히 그러네요. 뭐가 문제일까요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
setter 관련 함수
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. // item.setName(name); // item.setPrice(price); // item.setStockQuantity(stockQuantity); //요런식으로 바꿔라 item.change(name,price,stockQuantity); 라고 강의에서 봤는데 그러면 item 엔티티 클래스에서 change 함수에서 item.setName(name); // item.setPrice(price); // item.setStockQuantity(stockQuantity);이걸 넣는건가요 ??
-
미해결스프링 핵심 원리 - 기본편
SRP는 이렇게 생각하면될까요?
예를 들자면 컨트롤러는 컨트롤러의 역할만 가져야하고서비스는 서비스의 역할만 가져야한다 이렇게 이해하면될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
준영속상태 ? 영속상태 질문있어요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.준영속상태랑 영속상태랑 차이점은 알겠는데요 .. Book book = new Book(); book.setId(form.getId()); book.setName ... ... 이게 기존 디비를 갔다왔다 ?라는데 BookForm 객체중에 저장된 id를 가져와서 그런건가요 ??? 그러면 객체에서 findById로 가져와서 객체새로 만든거에 아이디를 셋하는 형태는 전부 준영속 상태인건지 ... jpa가 관리하는지 안하는지 코드로 어떻게 알수있는지 정확히 모르겠어요 애가 영속성엔티티 인지 준영속성 상태인지 알수있는방법좀 알려주세요 코드상으로 봤을떄..다른글에 공통으로 걸어주신 링크봤는데도 이해가 안되요 ..ㅠㅠ Book book = new Book(); book.setId(form.getId()); book.setName ... ... 위 코드를 그러면 영속성이라고 볼려면 어디가 바껴야되요 ? 그냥 코드상 보면 BookForm이 엔티티고 이게 아이디를 가지고 있으니 디비에 저장되어 있는거고 그 아이디를 가지고 왔으니 준영속성이라고 보는건가요? 그럼 그냥 제가 임의로 Book book= new Book(); book.setId(12);이러면 어떻게 되는건가요???
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
정적 리소스와 동적 리소스를 응답으로 보낼 때
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]정적 리소스의 경우 src/main/resources/static에 있는 정적 리소스를 제공하고 동적 리소스의 경우 src/main/resources/templates에 있는 동적 리소스를 제공한다 하셨는데 이게 application.properties에 접두사와 접미사를 따로 지정해주지 않아도 스프링이 알아서 요청 url에 붙여서 해당 경로에 있는 자원을 제공해준다는 의미인가요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle 설정에 레드박스 칸이 없습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.gradle 레드박스 부분이 존재 하지 않는데 어떻게 해야 하나요?
-
미해결스프링 핵심 원리 - 기본편
@SpringBootApplication 로 실행시 궁금한 점이 있습니다.
위 사진은 @SpringBootApplication 이 달린 Core3Application을 실행해본 후 스프링컨테이너 내부에 어떤 스프링빈이 있는지 확인하는 코드입니다. 여기서 궁금한 점이 Core3Application을 실행하면서 MemoryMemberRepository 와 같이 @Component 어노테이션이 붙은 클래스들은 @SpringBootApplication 에 있는 컴포넌트 스캔에 의해서 한 번, AutoAppConfig가 스프링빈으로 등록되면서 AutoAppConfig의 컴포넌트스캔이 작동하여 총 두 번 중복으로 등록되어진다고 생각되는데 이 경우에는 왜 빈 충돌 오류 메세지가 발생하지 않았는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 에러 질문드립니다.
package com.service.com.service; import static org.junit.Assert.assertEquals; import javax.persistence.EntityManager; import javax.transaction.Transactional; 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 com.service.com.domain.Member; import com.service.com.repository.MemberRepository; @RunWith(SpringRunner.class) @SpringBootTest @Transactional public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Autowired EntityManager em; @Test public void 회원가입() throws Exception{ Member member = new Member(); member.setName("Kim"); // when Long saveId = memberService.join(member); // then assertEquals(member, memberRepository.findOne(saveId)); } @Test(expected = IllegalStateException.class) public void 중복_회원_예외() throws Exception { Member member1 = new Member(); member1.setName("kim"); Member member2 = new Member(); member2.setName("kim"); fail("예외가 발생해야 한다"); } } 2023-11-16 20:00:08.269 INFO 22664 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@1c3b9394 testClass = MemberServiceTest, testInstance = com.service.com.service.MemberServiceTest@5cc152f9, testMethod = 중복_회원_예외@MemberServiceTest, testException = java.lang.AssertionError: Expected exception: java.lang.IllegalStateException, mergedContextConfiguration = [WebMergedContextConfiguration@6f2cfcc2 testClass = MemberServiceTest, locations = '{}', classes = '{class com.service.com.JpashopApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@4310d43, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3527942a, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@4f80542f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@576d5deb, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@2794eab6, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@3972a855], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true, 'org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]java.lang.NoSuchMethodError: org.junit.platform.engine.TestDescriptor.getAncestors()Ljava/util/Set;at org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener.getTestClassNames(StackTracePruningEngineExecutionListener.java:50)at org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener.executionFinished(StackTracePruningEngineExecutionListener.java:39)at org.junit.platform.launcher.core.DelegatingEngineExecutionListener.executionFinished(DelegatingEngineExecutionListener.java:46)at org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener.reportEngineFailure(OutcomeDelayingEngineExecutionListener.java:83)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:203)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:94)at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:52)at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:70)at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)plugins {id 'java'id 'org.springframework.boot' version '2.7.17'id 'io.spring.dependency-management' version '1.0.15.RELEASE'} group = 'com.example'version = '0.0.1-SNAPSHOT' java {sourceCompatibility = '11'} 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-validation'implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.projectlombok:lombok'runtimeOnly 'com.h2database:h2'developmentOnly 'org.springframework.boot:spring-boot-devtools'testImplementation 'org.springframework.boot:spring-boot-starter-test'//JUnit4 추가testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' tasks.named('bootBuildImage') {builder = 'paketobuildpacks/builder-jammy-base:latest'} tasks.named('test') {useJUnitPlatform()}이거 어디가 잘못된걸까요 예제 파일 다운받아서 4로 해도 마찬가지고 5로 해도 마찬가지로 나오네요 ..
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
Mysql테스트중 에러발생
2023-11-16 18:20:48 Creating network "fqata9qnvuci_default" with the default driver 2023-11-16 18:20:48 Creating fqata9qnvuci_local-db-migrate_1 ... 2023-11-16 18:20:48 Creating fqata9qnvuci_local-db_1 ... 2023-11-16 18:20:50 Creating fqata9qnvuci_local-db-migrate_1 ... error 2023-11-16 18:20:50 2023-11-16 18:20:50 ERROR: for fqata9qnvuci_local-db-migrate_1 Cannot start service local-db-migrate: error while creating mount source path '/c/Users/Recorvery/Desktop/Workspace/dayonetest/db/flyway.conf': mkdir /c: file exists 2023-11-16 18:20:50 Creating fqata9qnvuci_local-db_1 ... done 2023-11-16 18:20:50 2023-11-16 18:20:50 ERROR: for local-db-migrate Cannot start service local-db-migrate: error while creating mount source path '/c/Users/Recorvery/Desktop/Workspace/dayonetest/db/flyway.conf': mkdir /c: file exists 2023-11-16 18:20:50 Encountered errors while bringing up the project.위는 도커에서 발생하는 에러로그아래는 springboot에서 발생하는 에러로그입니다.18:20:50.925 [Test worker] ERROR tc.docker/compose:1.29.2 -- Could not start container java.lang.IllegalStateException: Container did not start correctly. r.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) 18:20:50.995 [Test worker] ERROR tc.docker/compose:1.29.2 -- Log output from the failed container: Creating network "fqata9qnvuci_default" with the default driver Creating fqata9qnvuci_local-db-migrate_1 ... Creating fqata9qnvuci_local-db_1 ... Creating fqata9qnvuci_local-db-migrate_1 ... error ERROR: for fqata9qnvuci_local-db-migrate_1 Cannot start service local-db-migrate: error while creating mount source path '/c/Users/Recorvery/Desktop/Workspace/dayonetest/db/flyway.conf': mkdir /c: file exists Creating fqata9qnvuci_local-db_1 ... done ERROR: for local-db-migrate Cannot start service local-db-migrate: error while creating mount source path '/c/Users/Recorvery/Desktop/Workspace/dayonetest/db/flyway.conf': mkdir /c: file exists Encountered errors while bringing up the project. MYSQL 테스트하기를 따라하던중 에러가났습니다! 그전 강의들은 문제없이 잘봤습니다.뭐가 문제일까요 ㅠㅠ 안되서 복붙했는데도 안되네요 ㅠ https://github.com/ygy7265/dayonetest깃주소입니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
getSession
getSession()을 하게 되면 내부적으로 response에 쿠키를 넣어주나요??세션 생성 후 setAttribute를 하지 않으면 세션 저장소에는 key에 sessionId만 저장되어 있는 건가요? 즉 value는 없이 key만 존재하는 상황인가요?
-
미해결스프링 핵심 원리 - 기본편
섹션 7 의존관계 자동 주입 질문있습니다.
다양한 의존관계 주입 방법 3분11초에서요.생성자를 통해서만 이 의존관계가 주입된다는데 생성자는 뭐고 의존관계는 뭔가요?
-
미해결스프링 핵심 원리 - 기본편
섹터 6 컴포넌트 스캔 질문있습니다.
필터에서요.public class ComponentFilterAppConfigTest { @Test void filterScan(){ ApplicationContext ac= new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA =ac.getBean("BeanA",BeanA.class); Assertions.assertThat(beanA).isNull(); BeanB beanB =ac.getBean("BeanB",BeanB.class); org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,()->ac.getBean("BeanB",BeanB.class)); } @Configuration @ComponentScan( includeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = MyIncludeComponent.class), excludeFilters=@ComponentScan.Filter(type=FilterType.ANNOTATION,classes = MyExcludeComponent.class) ) static class ComponentFilterAppConfig{ }}org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'BeanA' available에러 왜나는 건가요?BeanA beanA =ac.getBean("BeanA",BeanA.class); 여기서 BeanA beanA =ac.getBean("beanA",BeanA.class);이렇게 하면 에러가 안나는데요. BeanAclass를 호출하는거 아닌가요? 2.윗 부분 추가 질문있습니ㅏㄷ.org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,()->ac.getBean("BeanB",BeanB.class));(NoSuchBeanDefinitionException 이 뒤에 class 왜붙이는거에요? 그냥ac.getBean("BeanB",BeanB.class) 실행 시 에러값(NoSuchBeanDefinitionException)이 있을 때 예외처리하는거 아닌가요? class로 또 참조하는게 있나요?3. 중복 등록과 충돌spring.main.allow-bean-definition-overriding=true 이걸 작성하지 않는이상 수동빈 등록할 때 오류가 나는걸로 이해해도 되나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Spring Security 적용 시 controller @WebMvcTest
안녕하세요 강사님 좋은 강의를 듣고 공부하면서 실무에 적용시키고 있는 중에 두 가지 문제를 만났는데 구글링으로 해결점이 보이지 않아서 강의 내용과 관련 없지만 힌트라도 얻고자 글을 남기게 되었습니다Spring boot 3.x 이상 버전이고, Spring security가 적용된 프로젝트입니다첫 번째 문제는 controller 레이어에서 @WebMvcTest를 적용 시에 검증하고자 하는 controller와 주입받은 빈 객체 이외의 뜬금없는 객체 주입 error가 발생하고 있습니다@V1RestController @RequiredArgsConstructor public class CommonController { private final CommonService commonService; private static final Logger log = LoggerFactory.getLogger(CommonController.class); @GetMapping("/term") public ResponseEntity<TermResDto> getTerm(@RequestParam("account_id") Long id) { return ResponseEntity.ok(commonService.getTerm(id)); } @GetMapping("/message") public ResponseEntity<List<UserMessageResDto>> getUserMessageList(@RequestParam("user_id") Long userId) { return ResponseEntity.ok(commonService.getUserMessageList(userId)); } @GetMapping("/notice") public ResponseEntity<List<UserNoticeResDto>> getUserNoticeList(@RequestParam("user_id") Long userId) { return ResponseEntity.ok(commonService.getNoticeList(userId)); } }class CommonControllerTest extends ControllerTestSupport { @DisplayName("현재 학기 정보를 가져온다") @Test void getCurrentTermInfo() throws Exception { // given String termName = "2023년도 2학기"; LocalDateTime startAt = LocalDateTime.of(2023, 9, 1, 00, 00); LocalDateTime endAt = LocalDateTime.of(2023, 12, 15, 23, 59); TermResDto res = TermResDto.builder() .id(1L) .name(termName) .startAt(startAt) .endAt(endAt) .build(); given(commonService.getTerm(1L)).willReturn(res); // when & then mockMvc.perform( get("/api/v1/term") ) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value("200")) .andExpect(jsonPath("$.status").value("OK")) .andExpect(jsonPath("$.message").value("OK")) .andExpect(jsonPath("$.data").isArray()); } }@WebMvcTest(CommonController.class) @ActiveProfiles("test") public abstract class ControllerTestSupport { @Autowired protected MockMvc mockMvc; @Autowired protected ObjectMapper objectMapper; @MockBean protected CommonService commonService; }순서대로 controller, controllertest, controllertestsupport 클래스 입니다 java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@2ca54da9 testClass = kr.lineedu.cha.domain.common.controller.CommonControllerTest, locations = [], classes = [kr.lineedu.cha.BaseApplication], contextInitializerClasses = [], activeProfiles = ["test"], propertySourceLocations = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@3012646b, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@416bfba7, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2aa749... at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 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 com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authController' defined in file [/Users/luca/Desktop/prod/cha-backend/out/production/classes/kr/lineedu/cha/auth/AuthController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'kr.lineedu.cha.auth.AuthService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'kr.lineedu.cha.auth.AuthService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1824) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1383) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:888) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ... 97 more에러 내용에 보면 전혀 관계가 없는 AuthService에 대한 bean error가 뜨고 있어서 질문드립니다두 번째는 외부 api와 통신해서 구현되는 로직을 openfeign으로 사용하고 있습니다. BDDMockito로 feign client를 stub해서 테스트를 짜던 중 검증이 부족할 것 같다는 생각에 wiremock을 이용해서 테스트를 진행하려 하는데 best practice를 찾지 못하고 있습니다. 혹시 이에 대한 좋은 자료나 실무에서 사용하는 테스트 케이스가 있을지 궁금해서 질문드립니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
데이터베이스쪽 이해가 안가요
안녕하세요 자바 기초를 공부하고 SPRING입문 강의를 듣고 있는 학생입니다.웹mvc와 기능 구현까지는 어찌어찌해서 흐름은 이해가 되었는데, 데이터베이스 쪽부터는 이해가 너무 안되서 힘듭니다 ㅠㅠ 데이터베이스쪽을 공부해 본적이 없어서 그런거 같은데.. 어떻게 해결하는게 좋을까요?
-
미해결실전! 스프링 데이터 JPA
QueryHint와 update 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 강의와 자료를 병행하며 공부하고있는 학생입니다. 음.. 개념에 대해 헷갈리는 부분이 있어서 질문드리는데,queryHint를 통해서 읽기전용이라고 하이버네이트에 인식 시키고 em.flush()에 update쿼리가 먹히지 않는다.라고 이해했는데 비슷한 질문글을 보니 db에는 "member2"로 들어가있다는 질문을 보고 의문이 들었습니다. 이름이 바뀌지 않아야 정상아닌가요?