묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
실제 구동은 되지만 테스트는 실패합니다.
강사님 현재 스프링과 JPA 기반 웹 애플리케이션을 듣는 중입니다.여러 번 반복하면서 개발 흐름을 파악하는 중인데요.AccountControllerTest에서 회원 가입 테스트- 잘못된 입력값을 테스트하는 중인데, 실제로는 구동이 잘 되지만 테스트 중에는 매번 테스트 실패로 뜹니다. 코드는 다음과 같습니다.@Test @DisplayName("회원 가입 테스트 - 잘못된 입력값") public void signUpSubmitTest_wrong() throws Exception{ mockMvc.perform(post("/sign-up") .param("nickname", "yena") .param("email", "yenice") .param("password", "12354") .with(csrf())) .andDo(print()) .andExpect(status().isOk()) .andExpect(view().name("account/sign-up")); }깃허브 주소: https://github.com/KrillM/studyclub이 문제를 넘어가기에는 앞으로 수업을 들으면서, 이후 포트폴리오를 만들 때 발목을 잡을 것 같아 질문합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Junit5 테스트 시, JDK 17 stackoverflow error 해결 문의드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]jdk 17로 사용하고 있는데회원 리포지토리 테스트 케이스 작성 강의를 보면서Hashmap과 Long 때문에 stackoverflow error가 발생하는데 어떻게 해결해야 하나요?
-
미해결토비의 스프링 부트 - 이해와 원리
독립 실행형 스프링 애플리케이션까지 본 수강생입니다. 질문있습니다.
질문은 다음과 같습니다...!====Spring Container 제작시, 자기자신을 Bean으로 등록하는 이유==== 코드를 수정했습니다.Servlet Container, DispatcherServlet을 Bean으로 등록하는 코드를 config 패키지의 클래스로 따로 빼버렸습니다.[ :이유:ComponentScan은 자기자신을 탐색범위에 넣지 않는다->클래스 내부의 Configuration을 찾지 못한다-> Configuration만 외부로 빼면 자기자신을 Bean으로 등록하지 않아도 된다] Spring Container를 만드는 과정에 Servlet Container를 만들지 않습니다. 분리시켰습니다.(순서대로 만들어진다는 느낌을 받기위해...) 다음은 제가 작성한 main 문의 코드입니다.@ComponentScan public class DemoApplication { public static void main(String[] args) { //Spring Container 구성정보 AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); // Bean 등록 applicationContext.register(DemoApplication.class); //Spring Container 실행(초기화) applicationContext.refresh(); // ========================================= //Servlet Container 구성정보 ServletWebServerFactory serverFactory = applicationContext.getBean(ServletWebServerFactory.class); //servlet 만들기 DispatcherServlet dispatcherServlet = applicationContext.getBean(DispatcherServlet.class); dispatcherServlet.setApplicationContext(applicationContext); //Servlet Container 인스턴스 WebServer webServer = serverFactory.getWebServer(servletContext -> { servletContext.addServlet("dispathcerServlet", dispatcherServlet).addMapping("/*"); }); //서버 실행 webServer.start(); } }1번의 이유로,// Bean 등록 applicationContext.register(DemoApplication.class);이걸 주석처리했습니다.같은 클래스내에 ApplicationContext가 있고, 생성도 완료한 시점이기 때문에, 본인이 Bean에 직접 접근해서 꺼내 써도 된다고 생각했습니다.실제로도 직접 Bean을 꺼내서 주입시켜버립니다. ServletWebServerFactory serverFactory = applicationContext.getBean(ServletWebServerFactory.class); DispatcherServlet dispatcherServlet = applicationContext.getBean(DispatcherServlet.class); 따라서 저는, Spring Container가아래 2줄의 코드에서 Bean을 다 생성하고 DI까지 완료한줄 알았습니다.//Spring Container 구성정보 AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); // Bean 등록 //applicationContext.register(DemoApplication.class); //Spring Container 실행(초기화) applicationContext.refresh();어차피 서블릿 환경 설정도 저 어딘가에서 ComponentScan 해서 Bean으로 등록하기 때문에자기자신을 Bean으로 등록하는건 필요 없는줄 알았습니다. 그리고 발생한 에러 입니다.No qualifying bean of type 'org.springframework.boot.web.servlet.server.ServletWebServerFactory' available =======주석만 풀면 잘 돌아갑니다. 왜이럴까요...?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Argument Resolver. HTTP 메시지 컨버터
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]@RequestBody타입의 파라미터 컨트롤러가 호출되기전에 @RequestBody의 argument를 처리하는 Argument Resolver가 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하고 생성한 파라미터를 컨트롤러로 넘겨주는 것이다.Argument Resolver안에 HTTP 메시지 컨버터가 있다고 생각을 해도 괜찮을까요?Argument Resolver도 매우 다양한게 존재하고, HTTP 메시지 컨버터도 매우 다양하게 존재한다고 하셨는데 Argument Resolver-HTTP 메시지 컨버터가 쌍을 이룬다고 생각해도 될까요?Argument Resolver가 처리할 수 있는 argument는 결국 HTTP 메시지 컨버터가 생성해주는 것으로 이해했습니다.저는 이렇게 이해를 했는데 혹시 다르게 이해한 부분이 있을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
궁금한게 있습니다.
언제 @MockBean 쓰고@Mock + @InjectMocks 을 이용하나요?? @MockBean은 자동으로 DI해주니 @MockBean 쓰는게 낫지 않나요?? 제가 설명해주신걸 놓친거 같은데..다시한번 설명 부탁드리겠습니다.미리 감사드릴게요.
-
미해결스프링 핵심 원리 - 기본편
request scope관련
request scope로 http요청을 받으면 쓰레드 풀로 비동기적으로 실행되는건가요?그리고 LogDemoController의 MyLogger myLogger = myLoggerProvider.getObject();와LogDemoService의 MyLogger myLogger = myLoggerProvider.getObject();가 어떻게 같을 수 있나요? objectProvider가 http요청에 따라 bean을 구분해서 가져올수있는건가요?
-
미해결스프링 핵심 원리 - 기본편
component scan에 관련해서
밑에 코드 중에 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);이 코드가 이해가 안되서 질문 드립니다. 강사님이 이렇게 코드를 작성하면 자동으로 component scan이 된다고 하셨는데, 밑에 ClientBean과 PrototypeBean은 @Component어노테이션이 없습니다. 따라서 @Autowired도 안되는거 아닌가요?? package hello.core.scope; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import static org.assertj.core.api.Assertions.assertThat; public class SingletonWithPrototypeTest1 { @Test void singletonClientUsePrototype(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(2); } @Scope("singleton") static class ClientBean{ private final PrototypeBean prototypeBean; @Autowired public ClientBean(PrototypeBean prototypeBean) { this.prototypeBean = prototypeBean; } public int logic(){ prototypeBean.addCount(); return prototypeBean.getCount(); } } @Scope("prototype") static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init = " + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }
-
미해결스프링 핵심 원리 - 기본편
싱글턴 빈 객체의 생명 주기
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]싱글턴 빈 객체의 경우 스프링의 생명주기와 함께 하나요? 즉 스프링이 빈을 등록할 때 생성이 되어서 스프링이 종료 될 때 빈도 destroy 되는 것일까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
동시세션제어 관련 질문이 있습니다!!
안녕하세요. 영한님 강의를 들으며 스프링을 공부하고 있는 학생입니다!!mvc 2편 로그인 처리 관련 부분을 듣다가 (HttpSession을 이용하는 부분)궁금한 것이 떠올라서서로 다른 브라우저 두 개를 키고 같은 사용자 계정으로 로그인을 해보았는데요,서로 다른 세션이 생성되는 것을 보고이런 식이면 같은 사용자에 대해 세션들이 굉장히 많이 생성될 수 있을테니깐 공격당하기 쉽겠다라는 생각이 들었습니다.그래서 구글링을 해보았는데요, 동시세션제어 전략들에 대해서 알게되었고그를 사용하기 위해 Spring Security를 사용한다는 것을 알게되었습니다.그래서 검색을 통해 알게 된 정보를 바탕으로 아래와 같이 SecurityConfig.java 파일을 만들어서 작성하였는데요.@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http.sessionManagement() .maximumSessions(1) .maxSessionsPreventsLogin(true); return http.build(); } }제가 기대한 것과 다르게 동시세션제어가 이루어지지 않았습니다...검색을 한참을 해보았는데 마땅한 정보를 얻지 못하여 이렇게 질문 드립니다!! 어떻게 해야 동시세션제어 전략을 적용할 수 있을지 답변해 주시면 정말 감사하겠습니다!
-
미해결스프링 핵심 원리 - 기본편
싱글톤의 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]멤버 서비스는 싱글톤을 사용해도 문제가 없다고 생각하는데 멤머 리파지토리(메모리 맴버 리파지토리)도 싱글톤을 사용해도 문제가 없나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트 3.1.3버전 CGLIB
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.스프링 부트 3.1.3버전 CGLIB스프링 부트 3.1.3버전으로 해당 강의를 따라가던 중 proxyCheck() 테스트의 로그가 CGLIB$$0이 출력됩니다. 테스트는 성공하였지만 영한님처럼 프록시 객체의 해시코드가 16진수로 이루어진 값이 아니라 0이 나옵니다. 혹시 몰라서 부트를 2.7.14로 다운그레이드 했더니 영한님과 비슷하게 16진수의 해시코드가 나오더라구요. 혹시 스프링부트3 버전 이상부터 프록시 객체의 해시코드 값이 변경된 걸까요?
-
미해결스프링부트 시큐리티 & JWT 강의
안녕하세요 강사님 핸들러 질문있습니다
현재 제 상황은 이러합니다Oauth2Service에서 검증을 하고여기서 회원 생성을 할 수 있습니다. (현재는 빼놓은 상태)그리고 successhandler까지 구현했습니다.이 상태입니다.근데 저는 로그인을 성공했을 경우,핸들러를 타지 않고 8080:/ 주소로 이동합니다. 이러한 경우에 어떻게 토큰을 발급하고 적용할 수 있는지 모르겠습니다.apply로 정의한 함수때문에 핸들러를 거치지 않는 걸까요?apply로 정의한 함수는 강사님 JWT 강의랑 똑같습니다.
-
미해결스프링 시큐리티 OAuth2
keyclock page not found 오류
clientFundamentals 클라이언트앱 커리큘럼을 실습하고 있는데요저는 9090 포트를 프로젝트의 서버 포트로 설정하고8080으로 키클락을 띄운상태인데요server: port: 9090 spring: security: oauth2: client: registration: # 클라이언트 설정 keyclock: authorization-grant-type: authorization_code # Oauth 2.0 권한부여타입 client-id: oauth2-client-app # 서비스 공급자에 등록된 클라이언트 아이디 client-name: oauth2-client-app # 클라이언트 이름 client-secret: XkPnnSZ9RLdMX6vJBsgcbTIL7gtYJ8m8 # 서비스 공급자에 등록된 클라이언트 비밀번호 redirect-uri: http:localhost:9090/login/oauth2/code/keyclock # 인가서버에 권한 코드 부여 후 클라이언트로 리다이렉트하는 위치 authorizationGrantType: authorization_code clientAuthenticationMethod: client-secret-basic # 클라이언트 자격증명 전송방식 scope: openid,profile,email # 리소스에 접근 제한 범위 provider: # 공급자 설정 keyclock: authorization-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/auth # oauth 2.0 권한 코드 부여 엔드포인트 issuer-uri: http://localhost:8080/realms/oauth2 # 서비스 공급자 위치 jwk-set-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/certs token-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/token user-info-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/userinfo user-name-attribute: preferred_username user 아이디로 로그인시 강나님처럼 do you grant these access privilliges? 화면이 뜨지않고http://localhost:8080/realms/oauth2/login-actions/localhost:9090/login/oauth2/code/keyclock?state=kCCPxAYfg3uXfG7M_vmcVzq4FVQIldvt_3viiZlE0U0%3D&session_state=09a4fb12-19eb-4f15-991e-24365d7b5b05&code=6b7b3d33-8f8f-4979-8bfe-e038f7a275a4.09a4fb12-19eb-4f15-991e-24365d7b5b05.2912d929-159d-4403-b7cb-7e7cb0d24f5e 해당 URI 로 이동하면서 we are sorry... page not found가 뜹니다어떤부분이 누락되서 오류가 나는건지 모르겠습니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
경로 패키지 자동생성??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]인텔리제이 에서 자동으로 경로패키지도 만들어주나요 ?강의내에서 WEB-INF/views/new-form.jsp 를 만들어놓지 않았는데패키지도,jsp파일도요 이렇게 선언했다고 해서 인텔리제이에서 감지해서 자동으로 패키지경로+jsp파일까지 만들어줄수가있나요? 미리 만들어져있길래 소름이 돋아서 물어봅니다
-
해결됨스프링 핵심 원리 - 기본편
리스트는 출력이 되는데 맵이 출력이 안되요...
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]김영한 강사님의 스프링 핵심 원리 -기본편 을 수강중입니다. 리스트와 맵으로 받아오는 부분을 듣고 있는데 리스트는 정상 출력 되지만, 맵이 정상 출력이 되지 않습니다. 또한 @Autowired가 빨간줄이 뜨며 에러표시가 됨니다... 에러 메시지는 autowired members must be defined in valid spring bean 이렇습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 사용자인데 빌드는 어디서 어떻게 하신건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]윈도우 사용자는 cmd에서 하는건가요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
최초 세팅 오류
안녕하세요.최초에 스프링부트 파일을 열고 모델을 빌드했을 때 문제가 발생하여 질문 남깁니다.자바 버전의 문제인가 싶어 java8, java17 둘 다로 해봤는데 여전히 오류가 사라지지 않습니다.오류로그와 plugins는 다음과 같습니다.No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.1.3 was found. The consumer was configured to find a library for use during runtime, compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.2.1' but:plugins { id 'java' id 'org.springframework.boot' version '3.1.3' id 'io.spring.dependency-management' version '1.1.3' }감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
v5 구조에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]제가 V5구조를 제대로 이해했는지 헷갈려서 질문글 올렸습니다.핸들로 = 컨트롤러 라고 생각하고있으며,핸들러 매핑 정보에서 컨트롤러를 찾아오고,핸들러 어댑터 목록에서 찾아온 핸들러(컨트롤러)를 처리할 수 있는 어댑터를 찾아온다. 어댑터가 없는 경우 해당 컨트롤러는 지원하지 않는 컨트롤러여서 다른 컨트롤러로 개발을 해야한다.어댑터가 있는 경우, 찾아온 어댑터의 파라미터로 핸들러 매핑 정보에서 찾은 핸들러를 파라미터로 넘겨줌으로써 사용하고자 하는 핸들러를 내부 호출하고 아케텍처 구조에 맞게 처리하여 ModelView를 반환해준다.아키텍처 구조에 맞게 처리한다는 것은 v4 컨트롤러는 view-name을 반환하지만 FrontController에서는 view-name이 아닌 ModelView 객체를 사용해야하니 어댑터 내부에서 ModelView를 반환하도록 처리한다는 의미입니다.이러한 아키텍처를 사용하면 A개발자는 v1 컨트롤러로, B개발자는 v2 컨트롤러로 개발을 하고싶을 수 있는데, 이때 핸들러 어댑터를 통해 실제 컨트롤러를 호출하기 때문에 핸들러 어댑터가 서로 다른 컨트롤러를 맞춤 스펙으로 내부에서 처리(110v -> 220v 바꿔주기)해주기때문에 개발의 유연성이 확대로 이해했습니다.혹시 잘못 이해한 부분이 있을까요?
-
해결됨스프링 시큐리티 OAuth2
키클록 서버 종료후 realm 삭제
안녕하세요.키클록 종료 후 재기동 하니 만들었던 realm, client, user 가 삭제됩니다. 원래 그런건가요..?
-
미해결Practical Testing: 실용적인 테스트 가이드
강의 내용 블로그 포스팅 문의 드립니다.
안녕하세요 강사님, 다름이 아니라 강의 내용을 블로그(벨로그) 글로 정리해서 기록해도 될까 여쭤봅니다. 코드, 내용을 사용하고 싶은데 허락해주실까요? ㅠ 출처글을 항상 남기겠습니다.