묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
정규표현식 실습
안녕하세요 강사님. 정규표현식 실습 강의에서 궁금한 점이 있습니다. 한글만 가능하도록 정규표현식을 작성하는 것을 "^[가-힣]+$" 라고 말씀해주셨습니다. 궁금한 점은 "[가-힣]+" 라고 작성하면 한글 외의 글자가 들어와도 true라고 반환하는 케이스가 어느 경우인지 입니다. "[가-힣]+" 라고 작성해도 띄어쓰기와 ""일때도 모두 false를 반환합니다. 즉, "^[가-힣]+$" 대신에 "[가-힣]+" 라고 할 경우 어떠한 케이스들을 걸러내지 못하는지 궁금합니다. 감사합니다.
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
순수 EntityManager vs Spring Data JPA 테스트
프로젝트를 하면서 궁금한 점이 생겨 질문드립니다.@AutoConfigureMockMvc와 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) 만 적용한 상태로 테스트 코드를 작성했습니다. 그리고 @Autowired를 통해 순수 EntityManager를 주입받아서 직접 영속성을 관리하는 레포지토리가 있습니다. 그런데 직접 EntityManager를 주입받은 Repository 빈은 테스트 주입 시 EntityManager가 없다는 오류가 발생합니다. 하지만 Spring Data JPA의 JpaRepository를 상속받은 인터페이스를 @Autowired로 주입받으면 이는 문제없이 테스트가 동작합니다. 혹시 어떤 차이점이 있는지 알 수 있을까요? @Repository public class UserRepository { @PersistenceContext private EntityManager em; public User save(final User user) { em.persist(user); return user; } public Optional<User> findByEmail(final String email) { List<User> users = em.createQuery("select u from User u where u.email=:email", User.class) .setParameter("email", email) .getResultList();return users.isEmpty() ? Optional.empty() : Optional.of(users.get(0)); } } public interface UserJpaRepository extends JpaRepository<User, Long> { public Optional<User> findByEmail(final String email); } @ActiveProfiles("test") @AutoConfigureMockMvc @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) class AjaxEmailPasswordAuthenticationFilterTests extends DummyObject { @Autowired private ObjectMapper objectMapper; @Autowired private MockMvc mockMvc; @Autowired private UserJpaRepository userJpaRepository; @Autowired private PasswordEncoder passwordEncoder; @BeforeEach void setup() { userJpaRepository.save(User.builder() .email("test@gmail.com") .username("test") .password(passwordEncoder.encode("1234")).build()); } @DisplayName("이메일 기반 회원가입 유저 로그인") @Nested class LoginByEmailTests { @DisplayName("로그인 성공") @Test void success_test() throws Exception { //given String url = Endpoint.Api.LOGIN_WITH_EMAIL; EmailLoginUserRequestDto requestDto = EmailLoginUserRequestDto.builder() .email("test@gmail.com") .password("1234") .build(); //when ResultActions resultActions = mockMvc.perform( post(url) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(requestDto)) ); //then resultActions .andExpect(status().isOk()) .andExpect(jsonPath("$.id").exists()) .andExpect(jsonPath("$.redirectUrl").exists()); } } }
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
oauth, jwt관련하여 질문입니다.
안녕하세요 jwt,시큐리티 / ci/cd 강의에 이어서 계속해서 수강하고 있는 학생입니다. 좋은 강의 퀄리티 덕분에 어려운 개념들을 쉽게 정리할 수 있었습니다. 정말 감사드립니다.Spring security 서버(백엔드)가 Web page가 아닌 Mobile app과 연동하는 REST API 서버로 구현하는 방법에 대해 질문이 있습니다. 조사한 방법은 총 2가지인데요,공통 : 회원 테이블에 provider와 provider_id칼럼이 등록되어있습니다.1안https://www.inflearn.com/questions/537402/react-ios-android-등-spring-boot-가-api-서버일-경우-oauth2-연동-방법안드로이드/ios에서 oauth서버로 인증을 진행한뒤 정보를 그대로 스프링으로 던짐(액세스 토큰 포함)스프링서버에서는 액세스 토큰을 활용해 해당 OAuth 제공자에서 제공하는 API를 사용하여 검증provider와 provider_id가 유효할 경우에만 내부 회원 db에서 조회 후 jwt토큰 발급카카오공식 답변에서는 액세스 토큰을 직접 보내면 안된다하더라고요https://devtalk.kakao.com/t/oauth2/128079그러면 결국 프론트에서 인증 진행 후 정보를 받아 provider와 providerid만을 보내야하는 이야기인데 (2안)2안안드로이드/ios에서 oauth서버로 인증을 진행한뒤 http에 provider와 provider_id만 담아서 스프링 서버로 전송스프링 서버에서는 provider와 provider_id만을 가지고 내부 회원 db에서 조회 후 jwt토큰 발급2안의 경우 proivder와 provider_id를 무차별 조합해서 뚫는게 가능하지 않을까 싶어요 질문은 다음과 같습니다.oauth와 jwt를 활용해서 서버를 구축할 때 2안으로 구현하는게 맞는지 (서버에 provider와 provider_id만 보내기)1-1. 만약 아니라면 어떤 방식으로 구현해야하는지2안이 맞다면 provider와 provider_id를 무차별적으로 조합해서 보내면 쉽게 뚫리는 것이 아닐지액세스 토큰을 직접 보내 서버에서 검증하게 될 경우(1안)은 왜 위험한지가 궁금합니다.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
BCryptPasswrdEncoder를 @Spy로 사용한 이유
안녕하세요.강의 잘 들으면서 공부중입니다! 회원가입 Service 테스트 작성하는것을 보다@Spy와 @Mock의 정확한 차이가 궁금하여 질문드립니다. (언제 사용해야 할지)BCryptPasswordEncoder는 @Spy를 사용한 이유가 있을까요?@Mock을사용하면 안되는건가요? 반대로 UserRepository는 @Spy를사용하면 안되는 걸까요?? 항상 좋은 강의 잘 듣고있습니다.감사합니다
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
deleteAccount 테스트 오류
마지막 강을 들으면서 전체 테스트를 돌려보니 deleteAccount 테스트만 오류가 발생했습니다.에러 로그를 확인해보니Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FKDDVHOIEDLDMC0I8PA6JUY4X69: PUBLIC.TRANSACTION_TB FOREIGN KEY(DEPOSIT_ACCOUNT_ID) REFERENCES PUBLIC.ACCOUNT_TB(ID) (CAST(1 AS BIGINT))"; SQL statement:delete from account_tb where id=? [23503-214]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statementorg.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FKDDVHOIEDLDMC0I8PA6JUY4X69: PUBLIC.TRANSACTION_TB FOREIGN KEY(DEPOSIT_ACCOUNT_ID) REFERENCES PUBLIC.ACCOUNT_TB(ID) (CAST(1 AS BIGINT))"; SQL statement:delete from account_tb where id=? [23503-214]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statementat app//org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)account의 delete 쿼리가 실행될 때 transaction_tb의 외래키 때문에 무결성 오류가 발생한 것으로 보입니다.Transaction 엔티티에서 @ManyToOne 부분에 cascade 설정을 해줘야 할까요?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
Preflight Request 네트워크 탭에 노출되지 않음
엣지랑 크롬으로 테스트해봤는데 Preflight 헤더가 보이지 않습니다. 검색해보니 OPTIONS 요청은 네트워크 탭에 보이지 않게 되었다고 하는 글들이 많은데 어떻게 보이게 하는지 알고 싶습니다.https://stackoverflow.com/questions/57410051/chrome-not-showing-options-requests-in-network-tab이 flag 옵션도 현재는 보이지 않네요.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
@Transactional -> @Sql로 변경 시 영속성 컨텍스트 초기화 관련입니다.
@Trarnsactional로 @BeforeEach-@Test-@AfterEach가 묶여서 영속성 컨텍스트로 관리되던 게 @Sql로 변경되면 @BeforeEach에서 em.clear()할 필요도 없어지는 게 맞는 거죠? 다른 특이사항이 있다면 말씀해주시면 감사하겠습니다. account.checkOwner()에서 user.getUsername() 추가 후 쿼리 확인 결과 select user 쿼리가 나가는 것도 확인했습니다.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
.authenticated()에 걸렸음에도 403에러가 뜨는 이유가 뭔가요?
.authenticated()에 걸렸음에도 403에러가 뜨는 이유가 뭔가요?인증이 필요한 페이지임에도 권한이 필요하다는 403 에러가 떠서 401로 직접 설정하는데, 403이 뜨는 이유가 무엇인지 궁금합니다.
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
변경된 시큐리티의 filterChain에서 and() 메서드 사용은 권장하지 않나요?
기존 상속 받아서 사용하던 것 처럼 변경된 filterChain에서도 and() 메서드를 사용해서 옵션들을 빌더 연결 패턴 처럼 사용할 수 있던데 변경된 시큐리티에선 권장하지 않는 방법인지, 아니면 가독성 때문인지 궁금합니다! @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { log.debug("디버그: filterChain 빈 등록됨"); http.headers().frameOptions().disable() .and() .csrf().disable() .cors().configurationSource(configurationSource()) .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .formLogin().disable() .httpBasic().disable() .apply(new CustomSecurityFilterManager()) .and() .exceptionHandling().authenticationEntryPoint((request, response, authException) -> { CustomResponseUtil.fail(response, "로그인을 진행해 주세요", HttpStatus.UNAUTHORIZED); }) .and() .exceptionHandling().accessDeniedHandler((request, response, e) -> { CustomResponseUtil.fail(response, "권한이 없습니다", HttpStatus.FORBIDDEN); }) .and() .authorizeRequests() .antMatchers("/api/s/**").authenticated() .antMatchers("/api/admin/**").hasRole("" + UserEnum.ADMIN) .anyRequest().permitAll(); return http.build(); }
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
이클립스 VS 비주얼스튜디오 장 단점 알려주세요~
안녕하세요 강사님 ~현재 저는 이클립스 사용해서 개발중 입니다회사에 일부 신입개발자나, 젊은 분들은 비주얼스튜디오코드를 사용중이더라구요저는 아직 설치는 아직 해보지 않았지만, 처음 설정 잡기가 많이 까다롭다고 하더라구요 강사님 개발 경력이 많으시니, 최주호 강사님이 생각 하시는 이클립스에서 -> 비주얼스튜디오 로 갈아 탄다면 어떤 이점이 있고, 이런 부분은 불편해서 감안 해야 한다 설명 해주셨으면 좋겠습니다 ( 참고로 html, css, jquery, javascript 뒷단 java, sql 모든 부분 개발 유지 보수 하고 있습니다 ) 급한 부분 아니니 한가하게 시간 나실 때 답변 주세요..계속 좋은 강의 많이 올려주셨으면 좋겠습니다감사합니다. 좋은 하루 보네 세요~ #장단#장단점#비교#eclipse#비주얼스튜디오코드#visual-studio-code#visual#studio#code#비주얼#스튜디오#코드
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
Transaction 고아질문드립니다.
Transaction 도메인이Account 2개를 가지고 있는데영속성 전략이 부모객체가 삭제되면 자식 객체도 삭제된다고 생각하면, Transaction 가지고 있는 account 객체 두 개중 하나가 삭제되어도 Transaction 객체가 삭제되나요? 아니면 부모가 하나 있다고 판단해서 살아있나요?
-
해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
jwt 토큰 인증 시 Authentication 객체를 SecurityContext에 저장하는 건 이해했는데
최초 로그인 시에 Authentication 객체를 저장하는 이유가 이해되지 않아 질문드립니다..로그인 요청을 하면 사용자 인증 정보를 통해 확인 후 응답 헤더에 토큰을 실어서 반환하고Stateless 설정으로 인해 요청/응답이 끝남과 동시에 세션이 비워지는 걸로 이해했는데,토큰만 응답헤더에 실어서 보내면 끝인데 세션에 Authentication 객체는 저장 안 해도 상관 없지 않나 하는 의문이 들었습니다.. 설명해주시면 감사하겠습니다!
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
SecurityContextHolder.getContext.setAuthentication
인증 필터와는 달리 SecurityContextHolder.getContext.setAuthentication, 곧 바로 세션을 만들어주셨는데요, 이게 굳이 userDetailsService의 loadByUsername을 호출할 필요가 없기 때문인가요?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
RSA 비대칭키 질문
HS256 암호화 방식은 클라이언트로부터 JWT(헤더+페이로드+서버의 비밀키로만든 signature)를 받으면, 서버가 "비밀키"를 가지고 있어서, 서버가 만든 JWT랑 비교해서 같은지 검증하는 방식이잖아요?RSA 암호화 방식은 마찬가지로 클라이언트로부터 JWT(헤더+페이로드+서버의 비밀키로만든 signature) 받으면, 서버는 JWT의 signature를 "공개키"로 검증한다고 이해했습니다. 그래야만 "비대칭키" 방식이기 때문입니다. 여기서 질문입니다. 1. 서버는 비밀키도 있으면서 왜 굳이 공개키로 검증하는지 (비밀키만 있으면 HS256 방식을 사용하면 돼서)2. 공개키로 검증하는게 맞다면 어떤 방식으로 검증하는지 (signature를 공개키로 복호화 하면 비밀키가 나오는 방식일까요?)긴 글 읽어주셔서 감사합니다.
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
로그인을 유지하는 방법
강의에서는 한번 로그인한 회원에 대한 토큰을 Http 응답 메세지에 담아서 보냈고 Postman의 요청 헤더에 이 토큰을 담아서 로그인한 회원임을 확인 했는데 이렇게 직접 넣어주지 않고 실제 서비스에서 로그인을 유지하려고 하면 어떠한 방식으로 해야 하나요?
-
미해결스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
ConstraintMode.NO_CONSTRAINT 역할
3분 43초에 외래키가 되면 null이 될 수 없다고 하셨습니다.근데, 제가 알기론 외래키는 null을 허용합니다... 혹시, jpa에서는 기본적으로 외래키에 null을 허용하지 않는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Junit 테스트관련 질문을 드려요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 강의가 테스트가 중점은아니지만 강의에서는 mocking에대해 간단하게 언급하고 넘어가주셨는데,, 궁굼한게 조금 있어서 질문드립니다.ㅠ jUnit 테스트 작성시 Controller에 대해 작성할 수도있고, Service를 mocking할수도있고, service도 테스트하고.. 말씀하신 Entity에 비즈니스 로직도 테스트코드를 작성할 수 있을것 같습니다. 여러 테스트 코드를 짤수가 있는데 실무에서는 어디서부터 어디까지를 중점에 두고 작성하는지 궁굼합니다.. 저는 이강의를 보고 어플리케이션을 간단하게 작성하고있는데 Postman으로 하던 테스트를 Controller 테스트를 작성해서 통합테스트라고 하나요?? 그런식으로 작성하고있습니다. 무조건 mocking을해서 테스트를 작성하는게 올바른 방향인가요?? 단위테스트에 단위를 어떻게보면 좋을지 질문드려용,,, 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드에서 오류가 발생했는데 아무리 찾아봐도 원인을 모르겠습니다..
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]테스트 코드를 작성하고 실행하는데 제 테스트 코드를 못찾는 것 같습니다.. junit 잘 붙어있는데 왜 그러는 걸까요? 그리고 한글도 깨지는 것 같은데 원인을 모르겠습니다... 코드와 혹시몰라서 캡쳐본도 올립니다. java.lang.Exception: No tests found matching Method �쉶�썝媛��엯(jpabook.jpashop.service.MemberServiceTest) from org.junit.internal.requests.ClassRequest@41ab013 at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:50) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jpa 테스트 실행에서 오류 발생
안녕하세요 강사님! 양질의 교육 정말 감사합니다. 다름이 아니라 이번 JPA 파트 이전까지만 해도 잘 돌아가던 통합 테스트가 import 부분처럼 오류가 뜨기 시작했습니다. 소스코드를 강사님과 완전히 똑같이 쳤는데 무슨 문제가 있는지 알고 싶습니다