묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
강사님 질문입니다!
저는 페이징과 검색위주로 보고자 이 강의를 구매하게되었습니다. 프로젝트 진행중이라서 게시판이나 답글은 많이 해봤어서 페이징으로 넘어가고싶은데.. 이럴려면 페이징 이전의소스가 필요해서요.. 프로젝트가 만히 급해서.. 혹시 회차별로 소스코드제공이 가능할까요? ㅠㅠ..
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
9:27 에 나오는 부분 찾아봤습니다.
public static MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables) { return MockMvcRequestBuilders.get(urlTemplate, urlVariables) .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); }위의 코드는 RestDocumentationRequestBuilders의 get()입니다.Spring REST Docs2 - 요청, 응답필드의 9:27에서 하신 말씀 듣고 상속 관계이지 않을까하는 생각이 들었고 궁금해서 들어가보니 상속이 아닌RestDocumentationRequestBuilders의 get()에서 내부적으로 MockMvcRequestBuilders의 get()를 호출해주더라구요.MockMvcRequestBuilders가 추상클래스지만 get()이 static으로 선언되어 있어 상속을 해도 오버라이드를 할 수 없기에 저런 식으로 만들었지 않았을까?라고 추측을 해봤습니다.그러면서 추가적으로 위의 클래스들이 추상클래스로 만들어져 있고 메소드가 전부 static으로 선언되어 있는 것에 대해 이유가 궁금했습니다.추상클래스는 추상 메소드를 선언하고 상속을 하면서 오버라이드를 통한 다형성을 위해 사용한다고 알고 있었는데 여기서는 다른 목적과 방식으로 사용하고 있는 것처럼 보였기 때문입니다.그래서 검색을 해봤지만 키워드를 잘못 선택했는지명확하게 답을 찾지는 못했고, 추상 클래스와스태틱 메소드에 대해 각각 찾아보면서"객체 생성 제한과 메모리 이득 때문인가?"라는 생각이 들더라구요.하지만 추상클래스도 익명객체를 사용하면 객체 생성이 가능해지는 걸로 아는데 그래서인지RestDocumentationRequestBuilders는 생성자도 private으로 선언해 익명 객체로도 생성이 안되게 막아 놨지만 MockMvcRequestBuilders같은 경우는 생성자를 따로 막아 놓지 않아서 익명 객체로 생성이 가능하더라구요. 이렇게 차이를 두는 이유는 뭔가요??그리고 위의 클래스들처럼 선언한 이유도 궁금합니다.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
회원수정 프로파일 컨트롤러에서 수정하신부분
폼에서 히든으로 프로파일 넘겨버려도 될까요?저만 안되는줄 알고 그렇게 처리했더니 정상작동하길래 혹시나 나중에 안좋은 코드일까해서 여쭈어봅니다!
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AbstractAuthenticationProcessingFilter내에서 HttpServletResponse값이 안들어갑니다
@Bean public SecurityFilterChain httpSecurity(HttpSecurity http) throws Exception { return http.cors().disable() .csrf().disable() .httpBasic().disable() .formLogin().disable() .authorizeRequests().anyRequest().authenticated() .and() .addFilterAt(authFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterAt(jwtFilter(), UsernamePasswordAuthenticationFilter.class) .build(); } @Bean public WebSecurityCustomizer webSecurityCustomizer() { return web -> { web.ignoring().requestMatchers().antMatchers("/h2/**"); }; } @Bean public AuthFilter authFilter() throws Exception { var authFilter = new AuthFilter(); authFilter.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); authFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("/")); authFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler("/error")); return authFilter; }설정은 위와 같이 했습니다.@Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { super.successfulAuthentication(request, response, chain, authResult); String SECRET = "secrsdkfjhjh4243j234jh2SDdsfjhgsdfhjgjFQQQQdasd1et"; Claims claims = Jwts.claims(); claims.put("username", SecurityContextHolder.getContext().getAuthentication().getName()); String compact = Jwts.builder() .setClaims(claims) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 1시간 .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); response.addHeader("Authorization", compact); response.addCookie(new Cookie("token", compact)); }위와 같이 설정을 했는데 http 요청 테스트를 해보면 설정한 값이 하나도 들어가 있지않습니다.컨트롤러나 OncePerRequestFilter에서 값을 넣어보면 잘 적용됩니다..
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AWS 과금 조심!
질문글은 아니지만 혹시 저처럼 AWS랑 안 친하신 분들을 위해 과금 조심하시라고 올립니다. 강의 내용에도 설명 해주시지만, 고정IP(아마존에서는 Elastic IP Addresses, 탄력적 IP라고 부르네요)를 생성하고 인스턴스를 연결 안 하거나, 연결된 인스턴스가 running상태가 아니면 하루에 0.12USD정도 나가는 것 같네요.(저는 인스턴스에 연결만 해두면 되는 줄 알고 연결된 인스턴스 꺼놨다가 요금 나갔네요ㅜ.. 수업료가 그나마 싸서 다행입니다. )AWS 강의까지 진행하시는 분들은 참고하셔서 진행하시면 좋을 것 같아요!
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
jquery 버전차이로 이미지가 안보일수도 있나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이미지 경로도 정확한데도 불구하고 이미지가 뜨지않아서깃에 올려두신 코드의 상단부분만 복사 붙여넣기하여 이미지가 뜨게 바꿨는데제 기존 코드와 비교해보니 jquery의 버전이 다르더라구요단순히 버전차이일까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
테스트(Matchers.is) 질문드립니다.
.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(Matchers.is(2)))위 코드와 아래코드 모두 정상적으로 통과하는걸 확인하였는데요.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(2))수업에서는 Matchers.is()를 사용하셨는데 위 코드 문맥에서 is()를 굳이 왜 사용하셨는지 궁금해서 질문드립니다.
-
미해결스프링 시큐리티
9:03쯤에 프로그램 실행 후 갑자기 브레이크 포인트가 잡히는 이유
브레이킹 포인트 잡는것도 생략하시고, 이건 강사님께서 매번 그러시는것 같고,제가 여쭤보고싶은건 지금 form에다가 아이디와 패스워드를 입력하고 로그인 버튼 누른과정을 생략하시고 브레이킹 포인트가 잡힌부분이 갑자기 보이게끔 편집을 하신건가요??
-
미해결스프링부트 시큐리티 & JWT 강의
jwt 로그인시 패스워드 검증
JWT 로그인 부분에서username만 검증하고password는 검증하는 부분이 안보이는거 같은데 맞나요? @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("UsernamePasswordAuthenticationFilter :: JwtAuthenticationFilter()"); // 1. id, pw 받아서 try { // x-www-form-urlencoded 로 요청시 // BufferedReader br = request.getReader(); // String input = null; // while((input = br.readLine()) != null){ // System.out.println(input); // } // System.out.println(request.getInputStream().toString()); // json 으로 요청시 ObjectMapper om = new ObjectMapper(); User user = om.readValue(request.getInputStream(), User.class); // 토큰 만들기 UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()); // PrincipalDetailsService의 loadUserByUsername() 이 실행된 후 정상이면 Authentication이 리턴됨 // DB에 있는 username과 password가 일치한다. Authentication authentication = authenticationManager.authenticate(authenticationToken); // 매니져가 인증을해서 Authentication 객체를 만들어줌 PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal(); // System.out.println("ㅍㅍㅍ " + principalDetails.getUser().getUsername()); // 이게 조회가 된다는건 로그인 됫다는뜻 // System.out.println("---------------------------------"); // authentication 객체가 Security session 영역에 저장을 해야하고 그방법이 return return authentication; } catch (IOException e) { e.printStackTrace(); // 에러낫을때 떠넘겨 버리면 밑에 코드가 unreacheable 되서 컴파일 에러 } // 2. 정상인지 로그인 시도를 authenticationManager로 하면 PrincipalDetailsService loadUserByUsername() 가 실행됨 // 3. PrincipalDetails 를 세션에 담고 => 세션에 값이 있어야 권한 관리가 된다. (권한관리 안할거면 세션에 안담아도 됨) // 4. JWT 토큰을 만들어서 응답해주면 // System.out.println("================================"); return null; }사용자 입력(username, password)만 받아서 검증없이 Authentication 객체 만들고 있고@Service @RequiredArgsConstructor public class PrincipalDetailsService implements UserDetailsService { private final UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { System.out.println("PrincipalDetaiilsService :: loadUserByUsername()"); User userEntity = userRepository.findByUsername(username); System.out.println("DB Connection :: UserRepository"); return new PrincipalDetails(userEntity); } }loadUserByUsername 에서도 username 만 받아서 엔티티 생성하는데 어디서 password 검증도 하는건지 궁금합니다.
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
mapper 이용을 할 때 500 에러가 나고 있습니다.
controller 단에서 호출하는 mapper 가 오류가 나고 있습니다... 화면에서 crud 시킬때 500에러:Request processing failed; nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to kr.board.entity.MemberUser근본이유:java.lang.ClassCastException: java.lang.String cannot be cast to kr.board.entity.MemberUser kr.board.controller.MemeberController.memRegister(MemeberController.java:118). controller에서 syso 찍어가며 넘어가야할 값들이 다 들어있는것을 확인했습니다.그런데도 매퍼 접근하려고하면 오류가 나고 있습니다.콘솔에서의 오류:Exception in thread "main" java.lang.NullPointerException at kr.board.controller.BoardRestController.wifiInfoInsert(BoardRestController.java:66)
-
미해결스프링 시큐리티
deprecate된 authorizeRequests와 access인자 관련
강의를 따라가다 antMatchers와access 관련해서 도움이 되고자 글을 남깁니다.(1) access스프링 시큐리티에서 authorizeRequests가 deprecate되면서 hasRole('ADMIN') or hasRole('SYS')에 인자로 문자열만 받을 수 있게 되었습니다.이로 인해 특정 경로에 대한 인가를 2개 이상의 role에 주고 싶을시 hasAnyRole을 사용해야 합니다.(2) antMatchersdeprecate된 authorizeRequests 대신 스프링에서 사용을 권장하는 authorizeHttpRequests를 사용한 사용자별 인가를 설정하는 코드입니다. // 스프링 시큐리티 5.4에 맞춘 강의 예제 http .authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests .requestMatchers("/user").hasRole("USER") .requestMatchers("/admin/pay").hasRole("ADMIN") .requestMatchers("/admin/**").hasAnyRole("ADMIN", "SYS") .anyRequest().authenticated());
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
배포 질문있습니다.
안녕하세요. 해당 강의로 배포를 배우고 있습니다. 현재 별개로 진행하는 스프링부트 프로젝트에서 레디스를 도커를 이용해 (docker-compose up) 실행하고, 스프링 프로젝트를 실행하는 형태로 진행하고 있습니다. 이러한 경우는 배포를 어떻게 해야할지를 모르겠습니다.원격 ec2 서버에도 마찬가지로 docker desktop 및 redis를 설치하여 실행한 뒤, 스프링부트 프로젝트를 실행해야 할까요?
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
enum방식이 실무에서 자주 쓰이는 편인가요??
안녕하세요 호돌맨님 이번 강의 내용중 3번 enum을 이용한 방식에 대한 궁금증이 생겨서 질문 드립니다.제가 생각했을때 enum방식은 제한적이라 실무에서는 자주 쓰이지 않을 것 같다는 의문이 생겼습니다.제한적이라고 생각했던 부분은reflection을 이용한 인스턴스 생성이므로 스프링이 제공해주는 AOP프록시나 DI의 혜택을 받을 수 없다.입니다.예시로 들어주신 AnimalSerivce의 구현 클래스들은 트랜잭션이나 기타 AOP기능을 하용하지 않고, 주입받아야 하는 의존성도 없어서 괜찮지만 만약 Controller -> Service를 호출하는 동일한 구조로 호출 대상이 되는 Service가 AOP프록시나 DI등의 처리가 필요한 클래스라면 AOP미적용, 또는 newInstance() 호출 시 예외 발생등의 문제가 발생할 것으로 보입니다.실제로 실무에서 변수값에 따라 서로 다른 클래스 컴포넌트를 호출해야하는 상황에서 enum방식이 자주 쓰이나요??
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
16강 mysqldb 연동이 안되어요
mysql cmd로 서버연결하는거 안되네요 오류가 자꾸 나요cmd창이 아주 순식간에 떳다가 사라져요 그래서 동영상으로 찍고 캡쳐했어요해결방법 찾아보는데 너무 힘들어서 질문 올립니다 ㅠ아 참고로 맥북에 부트캠프로 윈도우 사용중입니다 그래서 그런걸까요?그냥 cmd랑 mysql 전부 다 잘 되는데 저것만 실행이 안되네요..
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
스프1탄을 보기 전에 나프1,2탄은 필수일까요?
안녕하세요. 현재 회사에서 일하고 있는 초보개발자입니다. 현재 강사님의 로드맵을 따라서 모든 강의를 사서 차근차근 보고있는 중인데,현재 회사에서 스프링으로 신규 프로젝트를 진행할 것 같아서 스프1탄을 먼저 보려고 하는데, 나프1탄과 나프2탄을 필수적으로 보고 스프1탄을 봐야할까요?나프1탄과 나프2탄은 보기에는 시간적으로 여유가 많이 없을 것 같아서 질문드립니다ㅠ
-
미해결스프링 시큐리티
UrlSecurityMetadataSource 클래스의 reload() 메서드 질문이 있습니다!
좋은 강의 잘 보고 있습니다. 감사합니다.섹션 5. "실전프로젝트 - 인가 프로세스 DB 연동 웹 계층 구현"의 "6) 웹 기반 인가처리 실시간 반영하기"강의를 보다 의문이 생겨 질문을 남기게 되었습니다.UrlSecurityMetadataSource 클래스에 다음과 같은 reload() 함수가 있습니다.여기서 "securityResourceService.getResourceList()"의 반환값과 "requestMap"의 타입이 똑같으니requestMap = securityResourceService.getResourceList();으로 바로 객체를 할당하면 될 것 같았는데, Iterator를 사용하여 put 하시는 것이 성능상의 문제나 다른 이슈가 있어서 이렇게 작성을 하신건지 의문이 들었습니다.새로운 List를 바로 할당하지 않고, 기존 List 객체를 유지하신 이유가 궁금합니다!감사합니다.// UrlSecurityMetadataSource 클래스 public void reload() { LinkedHashMap<RequestMatcher, List<ConfigAttribute>> reloadedMap = securityResourceService.getResourceList(); Iterator<Map.Entry<RequestMatcher, List<ConfigAttribute>>> iterator = reloadedMap.entrySet().iterator(); requestMap.clear(); while (iterator.hasNext()) { Map.Entry<RequestMatcher, List<ConfigAttribute>> entry = iterator.next(); requestMap.put(entry.getKey(), entry.getValue()); } }
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
H2 가 아닌 mysql DB 를 사용중인데 조그만한 질문이 있습니다.
재기동을 했음에도 불구하고 쿠키값이 그대로 남아있는 현상이 있어서 원하는 요청이 정상적으로 이루어지지 않았던 문제가 있었습니다.이상해서 원인을 파악하다보니 현재 전 mysql DB 를 연결하여 사용중이었고, 호돌맨님은 H2 DB 를 사용중이시더라구요.그래서 재기동을 할때마다 쿠키값이 삭제되고 다시 생성이 되지 않았던 건데 혹시 이런 상황에서 조언이 될 만한 링크나 키워드를 알려주실 수 있으실까요??제가 직접 삽질하면서 찾아보고 해결해보려구요 ㅠㅠ(현재는 매번 재기동 할때마다 쿠키값을 직접 삭제해주면서 강의를 따라가고 있습니다)
-
해결됨스프링 시큐리티
invalidSessionUrl, expiredUrl
아래와 같이 최대 허용 가능 세션 수를 설정하고,테스트 해보려고 했는데 /invalid 나 /expired 페이지로 이동하지 않고 /login 페이지로 이동하는데 뭐가 문제인지 모르겠습니다.http .sessionManagement() .invalidSessionUrl("/invalid") .maximumSessions(1) .maxSessionsPreventsLogin(true) // false도 테스트 해봄 .expiredUrl("/expired");
-
미해결스프링 시큐리티
파라미터 userId, passwd도 디폴트인가요??
파라미터 userId, passwd도 디폴트인가요??
-
미해결스프링 시큐리티
이전에 발급된 토큰
9:20초 쯤에 이전에 발급된 토큰이 있다고 말씀해주셨는데 이전이라는게 언제를 말씀하시는건가요 ? 서버를 재가동시키고 아무것도 안하고 지금 요청만 보냈을뿐인데 어떻게 갑자기 CSRF관련 토큰이 있는건가요??저는 강의 똑같이 따라했는데 csrfToken값이 null이나옵니다.