안녕하세요, 강사님. "계좌등록 컨트롤러 테스트" 강의에서 AccountController Test 코드 작성 시, 아래와 같이 saveAccount_test()에 궁금한 점이 있습니다. 위의 테스트 코드에서 @WithUserDetails(value = "ssar", setupBefore = TestExecutionEvent.TEST_EXECUTION) 어노테이션을 선언해줘야 하는 이유를 설명해주셨습니다. 그리고 request가 JWT 토큰이 없다고 하더라도 아래의 doFilterInternal 메서드를 실행하며 if문을 통과하지 못하더라도 chain.doFilter를 통해, 결국 컨트롤러단까지 간다고 말씀해주셨습니다. 위의 doFilterInternal 메서드 작성 시, if - else 문으로 작성하지 않은 이유가 테스트를 수월하게 할 수 있기 때문이라고 말씀해주셨습니다. 제가 궁금한 점은, 실무에서도 위의 코드처럼 JWT 토큰이 없는 request를 바로 차단하지 않고 컨트롤러단까지 흘려보내는지 여부가 궁금합니다. 제가 아직 시큐리티 측면을 잘 모르기 때문에 하는 질문이라고 생각해주시면 감사하겠습니다. 실제 배포/운영 환경에서는 테스트 코드를 편리하게 짜는 것보다 보안이 더 중요한 요소라고 생각되기에, JWT 토큰이 없는 request를 바로 차단할 수 있다면 즉시 차단하고 컨트롤러단까지 흘려보내지 않는 것이 더 안전하지 않을까 하는 생각이 들었습니다. 감사합니다.
안녕하세요 강사님. 정규표현식 실습 강의에서 궁금한 점이 있습니다. 한글만 가능하도록 정규표현식을 작성하는 것을 " ^[가-힣]+$" 라고 말씀해주셨습니다. 궁금한 점은 "[가-힣]+" 라고 작성하면 한글 외의 글자가 들어와도 true라고 반환하는 케이스가 어느 경우인지 입니다. "[가-힣]+" 라고 작성해도 띄어쓰기와 ""일때도 모두 false를 반환합니다. 즉, " ^[가-힣]+$" 대신에 "[가-힣]+" 라고 할 경우 어떠한 케이스들을 걸러내지 못하는지 궁금합니다. 감사합니다.
프로젝트를 하면서 궁금한 점이 생겨 질문드립니다. @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()); } } }
안녕하세요 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안)은 왜 위험한지가 궁금합니다.
안녕하세요. 강의 잘 들으면서 공부중입니다! 회원가입 Service 테스트 작성하는것을 보다 @Spy와 @Mock의 정확한 차이가 궁금하여 질문드립니다. (언제 사용해야 할지) BCryptPasswordEncoder는 @Spy를 사용한 이유가 있을까요? @Mock을사용하면 안되는건가요? 반대로 UserRepository는 @Spy를사용하면 안되는 걸까요?? 항상 좋은 강의 잘 듣고있습니다. 감사합니다
마지막 강을 들으면서 전체 테스트를 돌려보니 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 statement org.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 statement at app//org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) account의 delete 쿼리가 실행될 때 transaction_tb의 외래키 때문에 무결성 오류가 발생한 것으로 보입니다. Transaction 엔티티에서 @ManyToOne 부분에 cascade 설정을 해줘야 할까요?
엣지랑 크롬으로 테스트해봤는데 Preflight 헤더가 보이지 않습니다. 검색해보니 OPTIONS 요청은 네트워크 탭에 보이지 않게 되었다고 하는 글들이 많은데 어떻게 보이게 하는지 알고 싶습니다. https://stackoverflow.com/questions/57410051/chrome-not-showing-options-requests-in-network-tab 이 flag 옵션도 현재는 보이지 않네요.
@Trarnsactional로 @BeforeEach-@Test-@AfterEach가 묶여서 영속성 컨텍스트로 관리되던 게 @Sql로 변경되면 @BeforeEach에서 em.clear()할 필요도 없어지는 게 맞는 거죠? 다른 특이사항이 있다면 말씀해주시면 감사하겠습니다. account.checkOwner()에서 user.getUsername() 추가 후 쿼리 확인 결과 select user 쿼리가 나가는 것도 확인했습니다.
안녕하세요 강사님 ~ 현재 저는 이클립스 사용해서 개발중 입니다 회사에 일부 신입개발자나, 젊은 분들은 비주얼스튜디오코드를 사용중이더라구요 저는 아직 설치는 아직 해보지 않았지만, 처음 설정 잡기가 많이 까다롭다고 하더라구요 강사님 개발 경력이 많으시니, 최주호 강사님이 생각 하시는 이클립스에서 -> 비주얼스튜디오 로 갈아 탄다면 어떤 이점이 있고, 이런 부분은 불편해서 감안 해야 한다 설명 해주셨으면 좋겠습니다 ( 참고로 html, css, jquery, javascript 뒷단 java, sql 모든 부분 개발 유지 보수 하고 있습니다 ) 급한 부분 아니니 한가하게 시간 나실 때 답변 주세요.. 계속 좋은 강의 많이 올려주셨으면 좋겠습니다 감사합니다. 좋은 하루 보네 세요~ #장단 #장단점 #비교 #eclipse #비주얼스튜디오코드 #visual-studio-code #visual #studio #code #비주얼 #스튜디오 #코드
Transaction 도메인이 Account 2개를 가지고 있는데 영속성 전략이 부모객체가 삭제되면 자식 객체도 삭제된다고 생각하면, Transaction 가지고 있는 account 객체 두 개중 하나가 삭제되어도 Transaction 객체가 삭제되나요? 아니면 부모가 하나 있다고 판단해서 살아있나요?
최초 로그인 시에 Authentication 객체를 저장하는 이유가 이해되지 않아 질문드립니다.. 로그인 요청을 하면 사용자 인증 정보를 통해 확인 후 응답 헤더에 토큰을 실어서 반환하고 Stateless 설정으로 인해 요청/응답이 끝남과 동시에 세션이 비워지는 걸로 이해했는데, 토큰만 응답헤더에 실어서 보내면 끝인데 세션에 Authentication 객체는 저장 안 해도 상관 없지 않 나 하는 의문이 들었습니다.. 설명해주시면 감사하겠습니다!
HS256 암호화 방식은 클라이언트로부터 JWT(헤더+페이로드+서버의 비밀키로만든 signature)를 받으면, 서버가 "비밀키"를 가지고 있어서, 서버가 만든 JWT랑 비교해서 같은지 검증하는 방식이잖아요? RSA 암호화 방식은 마찬가지로 클라이언트로부터 JWT(헤더+페이로드+서버의 비밀키로만든 signature) 받으면, 서버는 JWT의 signature를 "공개키"로 검증한다고 이해했습니다. 그래야만 "비대칭키" 방식이기 때문입니다. 여기서 질문입니다. 1. 서버는 비밀키도 있으면서 왜 굳이 공개키로 검증하는지 (비밀키만 있으면 HS256 방식을 사용하면 돼서) 2. 공개키로 검증하는게 맞다면 어떤 방식으로 검증하는지 (signature를 공개키로 복호화 하면 비밀키가 나오는 방식일까요?) 긴 글 읽어주셔서 감사합니다.
안녕하세요. 올려주시는 강의 잘듣고 도움 많이 받아 항상 감사드립니다. @Transactional의 isolation, propagation 옵션에 대한 공부를 위한 학습 테스트를 작성해보고 싶은데요. (실제 업무에서도 동시성과 관련된 테스트 커버리지를 향상시키고 싶습니다) 두 개의 쓰레드가 하나의 인스턴스에 동시에 접근하는 케이스에 대한 테스트를 작성하고 싶습니다. TransactionManager를 직접 핸들링하는건 올바른 방법은 아닐 것이라고 생각하는데, 테스트 코드 작성 단계에서 동시성 테스트를 지원하는 기능이 있을까요? JUnit5나 Mockito 라이브러리만을 활용해서 해결할 수 있는 방법이 있을지 궁금하여 질문드립니다!
안녕하세요. 기선님 테스트 코드 작성은 처음이라 강의를 들으며 해보고 있는 수강생 입니다 ! 다름이 아니라 throw 부분에 ioException이나 sqlException을 실행시키고 싶은데 에러엔 org.mockito.exceptions.base.MockitoException: Checked exception is invalid for this method! 이렇게만 뜨더라구요 근데 runtime 익셉션은 정상적으로 실행되는 걸 보면서 thenthrow는 unchecked 익셉션만 가능한건지 궁금증이 생겼습니다. 혹시 ioException이나 sqlException 처럼 checked 익셉션을 실행하고 싶으면 어떻게 하면 좋을까요? 사정상 코드의 내용을 상세히 첨부할 수 없지만 대략적으로 올려봅니다 @DisplayName("3. 실패 : DB insert 오류") public void 실패_DB_insert_오류() { //given //특정 객체 생성 when(특정 서비스).thenThrow(new sqlException()); //then - 실패 결과 assertThrows(sqlException.class, () -> { log.info("!! DB insert 오류 !! "); //when - 프로세스가 진행 }); // verify를 통해 해당 프로세스 최소 1번 호출 되었는지 확인 verify(kosService,atLeastOnce()).특정 서비스); }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 강의가 테스트가 중점은아니지만 강의에서는 mocking에대해 간단하게 언급하고 넘어가주셨는데,, 궁굼한게 조금 있어서 질문드립니다.ㅠ jUnit 테스트 작성시 Controller에 대해 작성할 수도있고, Service를 mocking할수도있고, service도 테스트하고.. 말씀하신 Entity에 비즈니스 로직도 테스트코드를 작성할 수 있을것 같습니다. 여러 테스트 코드를 짤수가 있는데 실무에서는 어디서부터 어디까지를 중점에 두고 작성하는지 궁굼합니다.. 저는 이강의를 보고 어플리케이션을 간단하게 작성하고있는데 Postman으로 하던 테스트를 Controller 테스트를 작성해서 통합테스트라고 하나요?? 그런식으로 작성하고있습니다. 무조건 mocking을해서 테스트를 작성하는게 올바른 방향인가요?? 단위테스트에 단위를 어떻게보면 좋을지 질문드려용,,, 감사합니다.