묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
코드 질문
AdminService.java에서List<MemberDto> admins = memberEntities.stream() .map(MemberEntity::toDto) .collect(Collectors.toUnmodifiableList());Collectors.toList();이 코드에서 Collercotrs.toList(); 가 의미가 있는 코드일까요? 줄바꿈도 안되어 있고, 약간 이해가 안되는 문장 같아서 질문드립니다.
-
미해결스프링 부트와 리액트로 구현하는 소셜 로그인
To-Do App
9. 스프링 부트 프로젝트 생성 하고나서 10. 일반 로그인 실행에 To-Do App과 바로 로그인이랑 이런것들 코드를 생성한적이없는데 어떻게 생겨있나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.
8분 29초에서 /logoutProc 를 겟방식으로 호출했고 로그아웃은 성공했습니다.로그아웃 성공후 /logoutSuccess 로 이동해야 하고 해당 url 은 permitAll() 입니다. 그런데 왜 로그인화면이 표시되는지 궁금합니다.강의를 조금 더 보다보니, 궁금증은 해결됐습니다. 그런데 여전히 궁금한 점은 해당 소스에 맨 아래 permitAll() 의 역할입니다. 실제 아무일도 안하는건지 궁금합니다.
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
Dto와 Entity 사용 관련 질문
안녕하세요, 57강 관련 질문입니다. Dto 클래스를 완전히 없애버리고 Entity만 사용하는 건 불가능한 건가요? Entity가 DB 관련 어노테이션을 가지고 있다는 점을 제외하면 Dto 클래스와 굉장히 유사한 형태인데, 이 두 개를 왜 꼭 따로 정의하고 사용해야 하는 것인지 이해가 잘 안 갑니다!
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
application.properties 작성 관련 질문
안녕하세요, 강의 잘 듣고 있습니다. '데이터베이스 연동하기 - I' 강의에서 application.properties 파일에spring.datasource.password=1234로 작성하셨는데, 실제로 프로젝트를 할 때에도 이렇게 비밀번호를 직접 노출하는 방식으로 작성을 하나요? 뭔가 비밀번호이다 보니 코드로 이렇게 노출시키면 안 될 것 같은 느낌이 들어서 궁금합니다!
-
미해결스프링 부트와 리액트로 구현하는 소셜 로그인과 보안 JWT 로그인
"스프링 부트와 리액트로 구현하는 소셜 로그인" 강의와 차이점이 궁금합니다.
선생님 안녕하세요!"스프링 부트와 리액트로 구현하는 소셜 로그인"강의와 차이점이 뭘까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
단원별 소스코드
안녕하세요.이제 강의를 조금씩 들어보려고 하는데 강의 pdf는 있는데 소스코드는 따로 못본거 같은데 어디서 확인할 수 있을까요? https://github.com/onjsdnjs/spring-security-master/tree/master이거인거 같은데 단원하고 코드하고 연결이 안되어있어서 각 강의 단원별 뭘 봐야되는지 알수가 없어서 너무 많은 시간이 낭비되는거 같습니다.... 체계화가 안되어있어서 시작하기 전 부터 좀 실망스럽고 당황스럽습니다. 맵핑 (단원 - 깃 브랜치) 되어있는 자료가 있으면 좋겠습니다. 감사합니다.
-
미해결스프링 부트와 리액트로 구현하는 보안 JWT 로그인
JJWT 0.12버전 이상 Jwts.parserBuilder deprecated
안녕하세요. 20강 클레임 미검증 주의 강의를 듣다가JJWT 0.12 버전에서Claims claims = Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(token) .getBody();위의 예제 코드에서 parserBuilder, setSigningKey는더 이상 0.12 이상 버전에서는 지원하지 않는 메소드라고 나와서요Claims claims = Jwts.parser() .verifyWith(key) .build() .parseSignedClaims(token) .getPayload();위의 코드로 대체하면 될지 문의 드립니다...!
-
미해결스프링 부트와 리액트로 구현하는 보안 JWT 로그인
수업 외 질문
안녕하세요 강사님 제가 알림기능을 만들려고 하는데 예를 들어 음식을 사고 영수증을 찍었을 때 OCR 기술을 이용하여 사진을 인식하여 유통기한이 임박했을때 알림이 오는 기능을 만들려고 생각중입니다. 이런 경우는 따로 ERD 를 이용해서 만들어야 할까요? 이런 기능 자체가 처음이라 질문드립니다.그리고 알림 기능은 현업에서 파이어베이스를 쓰는 게 맞을까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
CustomAuthenticationProvider 추가 관련 문의
첨부한 사진의 소스 상으로 보면 @Bean으로 두개의 customAuthenticationProvider를 등록했습니다. 그러면 @Bean으로 등록했기 때문에 이 두 커스텀 프로바이더는 처음에 parent의 providers에 추가되고,http build 하는 과정에서 빌더에 이 두 커스텀 프로바이더를 추가하니 child 쪽의 providers에도 다시 추가,http.formLogin(Customizer.withDefaults());를 호출하기 때문에 child 쪽에 DaoAuthenticationProvider 추가.최종적으로child - CustomAuthenticationProvider, CustomAuthenticationProvider2, DaoAuthenticationProverparent - CustomAuthenticationProvider, CustomAuthenticationProvider이렇게 추가되어야 하지 않나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
AOP 의존성 명칭 변경
스프링 부트 4.0부터 AOP 의존성 명칭 바뀌었으니 참고하세요. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide 4.0 이전implementation 'org.springframework.boot:spring-boot-starter-aop' 4.0 이후implementation 'org.springframework.boot:spring-boot-starter-aspectj'
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
빈 1개 등록 시 다른 해결 방법
@Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { return http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .formLogin(Customizer.withDefaults()) .authenticationProvider(customAuthenticationProvider()) .authenticationProvider(new DaoAuthenticationProvider(inMemoryUserDetailsManager())) .build(); } @Bean public AuthenticationProvider customAuthenticationProvider() { return new CustomAuthenticationProvider(); } @Bean public UserDetailsService inMemoryUserDetailsManager() { UserDetails user = User.withUsername("user") .password("{noop}1111") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } } 메소드 인자로 AuthenticationManagerBuilder랑 Authenticationconfiguration을 주입 받아서 수동으로 parent Manager가 가진 Provider를 삭제하고 추가하는 작업을 하지 말고,그냥 안전하게, 대체되었던 DaoAuthenticationProvider를 authenticationProvider()로 다시 추가하면 안 되나요?
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
IDE를 Eclipse로 설지해서 수업을 진행해도 되나요
제가 Eclipse 환경에서 수업을 들어야 하는 상황인데요 ......지금 수업 내용보니까 InteliJ를 설치하셔서 수업을하시는데..제가 Eclipse로 수업을 따라갈 수 있을까요
-
미해결스프링 부트와 리액트로 구현하는 보안 JWT 로그인
섹션 9 실전 질문
강사님 세션 9에서 Secretes Manager나 Parameter Store 를 현업에서도 깃허브 액션 하고 같이 쓰나요?이거 궁금해서 질문드립니다.
-
미해결스프링 부트와 리액트로 구현하는 보안 JWT 로그인
깃허브 코드
강사님 혹시 44강 듣고 있는데 이거 프론트엔드 코드가 깃허브에 있는것과 다른 코드인데 어디서 볼 수 있나요?
-
해결됨누구보다 빠르게 배우는 Kotlin + Springboot + JWT 로그인
10번 영상이 중간부터 시작하는 것으로 보여요
영상을 시작하면 갑자기 JwtUtils 코드가 이미 어느 정도 작성된 상태에서 뭔가 에러 체크 하시는 부분부터 시작이 됩니다
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
일정 삭제 시 예외 발생 질문과 이전 질문에 대한 추가질문드립니다.
// 컨트롤러 메서드 @DeleteMapping("/plan/{no}") public ResponseEntity<Map<String, Object>> removePlan(@PathVariable(value = "no") int no){ Map<String, Object> resultMap = plannerService.removePlan(no); return ResponseEntity.ok(resultMap); } // 서비스 메서드 @Transactional public Map<String, Object> removePlan(int no) { System.out.println("no :" + no); log.info("removePlan"); Map<String, Object> resultMap = new HashMap<>(); int result = plannerRepository.deleteByPlanNo(no); if(result > PLAN_DELETE_FAIL){ log.info("REMOVE PLAN SUCCESS"); }else{ log.info("REMOVE PLAN FAIL"); } resultMap.put("result", result); return resultMap; } // 레퍼지토리 메서드 int deleteByPlanNo(int planNo); // 삭제된 행의 개수 첫번째 질문위 코드처럼 작성을 하고 delete 버튼을 클릭하면2025-12-21 20:36:32 ERROR [[dispatcherServlet]] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.ClassCastException: class com.office.calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer (com.office.calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap')] with root causejava.lang.ClassCastException: class com.office.calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer (com.office.calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap') at jdk.proxy4/jdk.proxy4.$Proxy153.deleteByPlanNo(Unknown Source) ~[?:?] at com.office.calendar.planner.PlannerService.removePlan(PlannerService.java:124) ~[main/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) ~[spring-tx-6.2.11.jar:6.2.11] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) ~[spring-aop-6.2.11.jar:6.2.11] at com.office.calendar.planner.PlannerService$$SpringCGLIB$$0.removePlan(<generated>) ~[main/:?] at com.office.calendar.planner.PlannerController.removePlan(PlannerController.java:123) ~[main/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.11.jar:6.2.11] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936) ~[spring-webmvc-6.2.11.jar:6.2.11] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596) ~[tomcat-embed-core-10.1.46.jar:6.0] at...위 예외가 발생하면서 planner_fetch.js의 fetchRemovePlan 함수에서 catch 문에 걸리면서alert('일정 삭제 중 오류가 발생했습니다.'); 이 실행됩니다.서비스에서 deleteByPlanNo를 호출할 때 문제가 발생한 것 같은데찾아보니 레퍼지토리 메서드에 @Modifying을 붙여보라고 해서 해봤는데 해결은 안됐습니다.어떤 원인으로 위 같은 예외가 발생한거고, 어떻게 해결할 수 있는지 질문드립니다. 두번째 질문 이전 질문에서<script src="planner_fetch.js"></script><script src="planner.js"></script>위 코드는 브라우저에서 다음과 같이 처리됩니다.1. planner_fetch.js를 읽고 실행2. 그 다음 planner.js를 읽고 실행3. 이 두 파일은 각각 다른 파일이지만, 브라우저에서는 하나의 JavaScript 실행 공간에서 실행결과적으로 파일이 나뉘어 있어도 "같은 공간"에서 실행되기 때문에 서로의 전역 변수, 함수 등을 공유할 수 있습니다.하나 더 중요한 사실이 있는데요, 로딩 순서가 중요합니다.<script src="planner_fetch.js"></script><script src="planner.js"></script>위와 같은 순서라면, planner_fetch.js가 먼저 실행되고 planner.js에서 planner_fetch.js 안의 함수를 사용할 수 있습니다.하지만, 로딩 순서를 변경하면<script src="planner.js"></script><script src="planner_fetch.js"></script>다음과 같은 에러가 발생할 수 있습니다.fetchPlans(); // 에러 (아직 정의되지 않음)즉, 먼저 로드 된 파일의 함수만 사용할 수 있습니다.이렇게 답변을 주셨는데추가적으로 궁금한 점은planner.js가 나중에 로드 되어서 planner.js에 있는 함수나 변수를 planner_fetch.js에서 사용하면 정의 되지 않아서 사용을 못해야 할텐데 코드에서는 planner.js에 있는 showDetailPlanView 함수라든지 current_year같은 변수를 사용하고 있는데 에러가 발생하지 않습니다. 이 부분 질문드립니다.
-
미해결스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!
일정 등록 및 조회 부분 강의 질문입니다.
1.일정 관련 js파일이planner.js와 planner_fetch.js 파일로 나눠져 있는데planner.js에서 planner_fetch.js에 있는 함수들을 사용하고planner_fetch.js에서는 planner에 있는 함수, 변수들을 사용하던데각각 별도의 js 파일들인데 어떻게 서로 변수나 함수들을 가져다 사용할 수 있는지 궁금합니다. planner_fetch.js의 fetchGetPlan 함수에서 fetch url이 /planner/plan/3 형식이 아니라 /planner/plan?no=3 형식이던데 이렇게 사용한 이유가 있을까요??
-
미해결스프링 부트와 리액트로 구현하는 보안 JWT 로그인
로그인구현
로그인구현 직접하는줄 알고 결재했는데 직접구현하는 강의가 없는건지 제가 못찾은건지바로 서버 생성하고 배포하는걸 보여주시는데 직접구현하는거는 어디서봐야할까요?다른강의일까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?
AuthenticationProvider 객체를 추가하는 방법 중에 @Bean 어노테이션을 이욯하여 컨테이너에 등록하는 경우에 AuthentcationManager 객체를 가져와서 .authenticationProvider( customAuthenticationProvider() ); 이렇게 또 메서드를 호출시키도록 로직이 구현되어있는데 bean으로 올라간 customAuthenticationProvider 객체를 주입받아서 객체를 넣어주면 안되나요? @Beanpublic AuthenticationProvider customAuthenticationProvider() { return new CunstomAuthenticationProvider();} 위 메서드가 두번 호출되는거 아닌가 싶어서요