묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
권한처리를 위한 세션강제주입
/api/admin 요청 시 권한만을 체크하기 위해 id 와 role 만 있는 객체를 시큐리티세션에 저장했다고 하셨는데만약 username 이나 email 이 필요한 경우라면 그 로직도 BasicAuthenticationFilter 를 상속받은 필터에서 doFilterInternal() 메서드 안에서 강제주입을 할때 username 과 eamil을 가져와서 시큐리티 세션에 강제주입하는건가요 ?
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
JwtVO 를 인터페이스로 만든 이유
JwtVo 를 왜 인터페이스로 생성하신지 궁금합니다 !
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
계좌 조회 질문드립니다
강의 마지막에 첨부해주신 깃허브엔 Account 관련 패키지가 아예 없네요 ㅜ.ㅜ 이전 강의에서 계좌 조회 컨트롤러, 서비스 숙제 내주신 것 해보고 있는데 잘 안돼서요. 혹시 깃허브 주소가 있을까요?
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
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깃주소입니다.
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
DummyObject 에 대하여
DummyObject 클래스의 newUser와 newMockUser 메서드 용도가 헷갈립니다..newMockUser 는 테스트할 때 Mock환경에서 User객체를 간편하게 만들기 위해 따로 만든 메서드인가요 ?newUser는 용도를 잘 모르겠어요
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
DTO를 이너클래스로 계속추가하는 이유
bank.dto.user 패키지안에 req, resp 패키지를 만들어서 각각 DTO 클래스를 추가하는것과선생님이 하신 UserReqDto , UserRespDto 에 이너클래스로 추가하는건 무슨차이가 있나요 ???
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
Builder 사용 궁금
제가 선생님 포토그램 강의를 들을 때는 엔티티클래스 위에 @Builder 어노테이션을 붙혔는데 이번강의에서는 엔티티클래스 내부에 생성자를 만들고 생성자메서드 위에 @Builder 어노테이션을 사용한 이유가 있을까요 ?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
authenticationEntryPoint 질문
굳이 authenticationEntryPoint 에 들어갈 내용을 CustomREsponseUtil 로 빼는 이유가 무엇인가요 ??실무에서는 따로 뺄 만큼 들어가는 내용이 길어지나요 ? ?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
로그아웃 질문입니다.
안녕하세요 강사님.현재 강의를 듣고 로그인과 회원가입은 서버에 구축하는 것으로 이해하였습니다.혹시 로그아웃의 경우에는 어떻게 처리를 해줘야 하는건지 궁금합니다. 현재 강의에서 쓴 코드를 백엔드로 쓰고, 프론트엔드는 리액트를 한번 사용해서 로그인했을떄 반환하는 토큰을 저장하려고 하는데 로그아웃 버튼을 눌렀을 떄는 어떻게 처리해야하는지 궁금합니다...! 로컬스토리지에서 토큰을 지우는 작업만 하는지, 아니면 서버에서 처리해줘야 하는지와 구현 방식도 혹시 가르쳐주실수 있으면 조언 주시면 너무나 감사하겠습니다.. 좋은하루되세요!!!
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
윈도우 10 : c:/ file already exists 문제
안녕하세요MySql 중형 테스트 연동을 보고 있습니다IntegrationTest 상속받아서DayoneTestApplicationTests 실행하면ERROR: for dwneh9yir6mh_local-db-migrate_1 Cannot start service local-db-migrate: error while creating mount source path '/c/경로/dayonetest/db/migration': mkdir /c: file existsCreating dwneh9yir6mh_local-db_1 ... doneERROR: for local-db-migrate Cannot start service local-db-migrate: error while creating mount source path '/c/경로/db/migration': mkdir /c: file existsEncountered errors while bringing up the project.코드들도 혹시 옥타 있을까봐 복붙으로 수정하였고test docker-compose.yaml 노션에 있는 거 그대로 복붙했습니다.도커 데스크탑에서 컨테이들이 올라오는 건 확인했는데시작이 안되네요앞선 local compose.ymal은 호스트 경로는 문제가 없었습니다.도커 컴포즈 도커 데스크탑 모두 업데이트 리스타트 해보고볼륨 내려보고 이미지 삭제하고 초기화도 해도 안되는데 무슨 문제인지 알 수 있을까요?
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
JaCoCo 레포트 파일이 안생깁니다.
안녕하세요. 강의 잘 듣고 있습니다.노션에 있는 그대로 코드를 작성했는데 아무리 테스트가 끝나도jacoco 안에 파일이 안생깁니다. 그래서 terminal 에서 ./gradlew jacocoTestReport 를 했는데BUILD SUCCESSFUL 은 나오는데 파일이 안생기는데 이유를 모르겠습니다!
-
해결됨쥬쥬와 함께 하루만에 끝내는 스프링 테스트
localstack 이 deprecated 되서 이렇게 수정했습니다.
안녕하세요. 강의 잘 듣고 있습니다.localstack 이 deprecated 가 되어서 조금 수정이 필요해서 고쳐보았습니다. 노션에도 의존성에 버전을 작성해야 동작을 해야 하더라구요. testImplementation "org.testcontainers:localstack:1.19.0" DockerImageName imageName = DockerImageName.parse("localstack/localstack:0.11.2"); aws = (new LocalStackContainer(imageName)) .withServices(LocalStackContainer.Service.S3) .withStartupTimeout(Duration.ofSeconds(600)); aws.start(); 전 이렇게 수정해서 고쳤습니다!
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
jwt + OAuth2 문의
안녕하세요 현재 jwt 코드 리뷰 까지 듣고수업 코드를 참고해 oauth2 + jwt를 만들어보고 있는데요응답한 jwt토큰이 요청 헤더에 포함되지 않는 문제를도무지 해결하지 못해서 질문드립니다 ㅠㅠ OAuth2 로그인-> loadUser에서 유저 정보를 받아 임시 세션에 저장 -> 핸들러에서 토큰 생성후 응답. 순서로 만들었습니다. OAuth2User 구현체에 유저 정보 세팅해 임시 세션에 저장시켰습니다.@Service public class CustomOauth2UserService extends DefaultOAuth2UserService { @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(userRequest); UserEntity userEntity = new UserEntity(); userEntity.setProvider(userRequest.getClientRegistration().getClientName()); userEntity.setUsername(oAuth2User.getAttribute("name")); userEntity.setEmail(oAuth2User.getAttribute("email")); userEntity.setRole("ROLE_USER"); // oAuth2User 와 userEntity 로 OAuth2User 구현체 생성 return new DefaultOauth2User(userEntity, oAuth2User.getAttributes()); } }핸들러로 넘어와 토큰을 생성하고 응답 헤더에 추가시켰습니다.JwtProcess나 JwtVO는 선생님 코드랑 똑같이 만들었습니다.@Component public class Oauth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { DefaultOauth2User oAuth2User = (DefaultOauth2User) authentication.getPrincipal(); String jwtToken = JwtProcess.create(oAuth2User); response.addHeader(JwtVO.HEADER, jwtToken); getRedirectStrategy().sendRedirect(request, response, "/"); } }시큐리티 설정파일입니다.cors설정인 configurationSource도 선생님과 같습니다.@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { private final CustomOauth2UserService userService; private final Oauth2SuccessHandler successHandler; @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ http.headers().frameOptions().disable(); http.csrf().disable(); http.httpBasic().disable(); http.cors().configurationSource(configurationSource()); http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().permitAll() .and() .oauth2Login() .loginPage("/loginForm") .successHandler(successHandler) .userInfoEndpoint().userService(userService); return http.build(); } 구글 로그인 시 /로 리다이렉트는 정상적으로 됩니다.그런데 크롬 개발자 도구를 보면 response 헤더에는 jwt토큰이 있는데요청 헤더에는 jwt토큰이 없습니다... 프론트 쪽은 html 파일들만 생성했는데 혹시 자바스크립트로 뭔가 해줘야 하나요?검색 결과들 참고해서 만들었는데 혹시 oauth2와 jwt를 합치는 방향 자체가 틀렸을까요? 아니면 구글에서 받은 access토큰이 jwt인가요?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
JPQL 동적쿼리 부분 - > QUERYDSL 마이그레이션 후 질문
querydsl설정은 각종 블로그 보고 설정 적용을 한상태입니다. 일단 엔티티 구조가Transaction 엔티티에서Accout 엔티티를 @MantToOne 다대일 단방향 매핑중이고,입출금 내역 조회부분에서 jpql 부분을 그대로 챗 gpt 에 querydsl 기준 동적쿼리 코드를 돌려보면이런 코드를 알려줍니다 우선 여기서 질문이WithdrawAccount, DepositAccount라는 클래스는 없고 Account를 참조 하는데 QWithdrawAccount, QDepositAccount Q클래스가 필요한 이유를 모르겠습니다.저 코드를 해당 코드와 같이 바꿨습니다 그리고 테스트 코드를 돌려보면 transaction.withdrawAccount is not a root path 라는 에러가 나는데root path 관련 질문글 찾아보면" 이를 해결하려면 from 절에서 해당 객체를 다시 선언해주면 됩니다. 즉, querydsl에서는 join을 할 때 alias를 줘서 해당 객체를 다시 선언해주는 방식으로 작성해야 해결할 수 있습니다. "이런 답변이있는데변경 된 코드에서 innerjoin의 오른쪽 파라미터에 별칭을 잘못 줘서 에러가 나는거 같긴 한데QTransaction.transaction.withdrawaccount 와 같은 별칭을 부여하면 안되는 걸까요,,?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
username으로 select를 왜하는지 잘모르겠습니다...
하이버네이트가 로그인한 user의 username으로 조회하는 쿼리를 발생시키는데 어떤 이유로 이게 발생되는지 잘모르겠습니다,,,!!! 컨트롤러 들어가기 전부터 조회가 되던데 어떠한 이유로 쿼리가 발생하는지 너무 궁금해서 질문글을 작성하게 되었습니다 ㅠㅠㅠ!!!
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
로그아웃은 Redis를 사용해야하는 건가요?
로그인시 Redis에도 정보를 담아서 로그아웃시에 제거 하는 방식으로 가야 하려나요?
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
vs code setting에서 gradle
안녕하세요 강사님!질문 올립니다.vs code 세팅 중 3번째 gradle 설치에서 gradle for java를 설치한 뒤에 아래와 같은 문구가 뜹니다.구글링 해보니 이전에 했던 스프링 프로젝트의 gradle 버전과 겹쳐서 발생하는 에러라고 하더라고요.C:\Users\사용자\.gradle\caches에 들어가서 캐시를 전부 삭제했습니다.그런데 위 그림이 계속 떠요.다른 extensions이나 이전 스프링 프로젝트 데이터를 전부 지우고, 구글에 나온 방법은 거의 다 해봤는데 며칠동안 해결을 못했습니다. cache.propertiesgradle.version=8.2.1 build.gradleplugins { id 'java' id 'org.springframework.boot' version '2.7.14' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'shop.metacoding' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } gradle-wrapper.propertiesdistributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists 살려주십셔
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
스프링 시큐리티 관해서 좀더 찾아봤는데 이과정들이 강의에선 언급이 안되었지만
HTTP요청이 들어오면 Servlet 컨테이너에서 요청을 받는다.Servlet 컨테이너 내의 필터들이 동작하는 중간에 DelegatingFilterProxy Filter가 요청을 받으면 springSecurityFilterChain 이름으로 생성된 빈을 AnnotationConfigServletWebServerApplicationContext 객체에서 찾는다.이 찾은 Filter Bean이 바로 FilterChainProxy다.그 후에 FilterChainProxy Bean에 요청을 전달한다. 이제 FilterChainProxy에서 필터들을 이용하여 보안처리를 진행한 후 최종적으로 SpringMVC의 DeispatcherServlet에 전달하여 요청에 대한 Servlet 처리를 하게 된다. ==유저가 서버에 요청을 보낸다.요청이 DelegatingFilterProxy 필터를 만나고 FilterChainProxy에 위임되어 등록되어 있는 SecurityFilterChain들의 조건과 매칭한다. 이번 예제에서는 어떤 요청이든 인증을 받도록 했다.매칭되는 SecurityFilterChain이 있는 경우 해당 필터 체인으로 흐름이 이어진다.필터 체인을 돌면서 여러 처리를 하고 AuthenticationFilter를 만나 인증을 수행한다.AuthenticationFilter에서는 AuthenticationToken을 만들고 AuthenticationManager에게 인증 여부를 요청한다.AuthenticationManager는 내부의 AuthenticationProvider들 중 처리할 수 있는 AuthenticationProvider에게 인증 여부를 요청한다.AuthenticationProvider는 UserDetailsService를 통하여 유저 정보를 가져온다.위에 과정들이 이루어지고 있긴 한거죠? 강의에선 언급이 안되었지만,,, 깊게 파고들수록 어렵네요
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
회원가입 컨트롤러 만들기 - User.java의 role
@Enumerated(EnumType.STRING)@Column(nullable = false)public UserEnum role; //ADMIN,CUSTOMERUser.java의 role이 위외 같이 nullable=false로 되어있다보니 에러가 뜨는것 같습니다.UserController의 UserRespDto userRespDto = userService.signIn(userReqDto);를 실행했을때UserService의 34번 라인에서 아래와 같이 에러가 뜨네요강사님 코드랑 조금 다른 부분이 있긴합니다. dto에 빌더패턴을 사용중이긴 한데... 음 이거때문에 에러를 뱉는건 아닌거 같긴 합니다.물론, User.java에서 아래와 같이 코드를 수정해주면 문제없이 잘됩니다.@Enumerated(EnumType.STRING)@Columnpublic UserEnum role; //ADMIN,CUSTOMER저만 안되는 부분인지.. 아니면 (nullable = false)를 빼고하는게 맞는건지 궁금해서 질문드려요!감사합니다.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
인가 처리 로직에 대한 문의
안녕하세요 JWT 를 사용하여 Security 를 통해 애플리케이션을 ㄱ구축해봤었는데, 그 당시에는 JWT Token 을 강사님이 사용해주신 부분과 다르게 사용하였는데 문의 사항이 생겨서요!궁금한 부분은 verify() 를 하는 부분입니다. JwtToken 에는 ID 정보만을 넣었습니다. 그걸 통해서 verify 이후에 AuthorizationFilter 에서 직접 Member 를 DB 에 저장되어 있는지 확인하여 가져온 이후 LoginUser 정보를 만들어 SecurityContext 에 저장하였습니다. 강사님의 코드는 TOKEN 정보가 있는지, TOKEN 정보가 있으면 거기서 ID 와 ROLE 정보를 가져올 수 있는지만을 확인하고 있습니다. 이렇게 하면 TC 에서 확실히 간단해지는 면모도 있고, 사실 JWT 토큰 자체도 그렇게 의존할만한게 아닌 것으로 알기 때문에 의존성을 줄일 수도 있는 것 같고, 스프링 단에서도 어떤 방식으로 지속적인 구현을 하면 (가령, SecurityContext 에 저장된 사람의 정보가 필요할 때 비로소 id 를 가지고 와서 확인하는 등) 괜찮을 것 같다고 생각이 들었습니다.보통 실무에서는 어떤 방식으로 하는지 궁금합니다!