코드로 배우는 React with 스프링부트 개정판3 영는 React with 스프링부트 개정판3 영풍문고 IT 코너에 메인으로 전시되어 있네요. 최근 개정판 맞죠? 너무 반가워서 ^^ 응원 하러 왔어요 ^^ 스프링 mvc의 기초를 다져준 이 강의에 꽤나 인상이 깊었나 봐요 ^^ 이어서 Reactor, webflux 강의도 기대해 봅니다 ^^)*
강의를 따라서 실행하던 도중 security 관련 의존성을 추가한 적이 없는데 l ocalhost:8000/first-service/welcome으로 접속을 하면 위 사진과 같은 경로로 리다이렉트 되면서 에러가 발생합니ㄷㅏ.어떤 이유에서 이 경로로 리다이렉트가 되는걸까요? 아래는 설정 파일들을 사진으로 First-service는 정상적으로 잘 작동됩니다
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
Module 'library-app' output path is incompatible with the Eclipse format which supports output under content root only. Make sure that "Inherit project compile output path" is not selected 혹시 배포하신 프로젝트를 제가 STS에서 실행하기 위해 인텔리제이에서 Export to Eclips를 하고 Project Status Modul에서 Eclipse를 선택하고 ok를 눌렀더니 저런 경고 문이 뜨는데.. 배포하신 프로젝트는 이클립스 환경으로 익스포트가 안되는건가요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용]@Test void bulkAgePlus(){ m emberRepository.save( new Member("AAA", 10, null)); m emberRepository.save( new Member("BBB", 15, null)); m emberRepository.save( new Member("CCC", 20, null)); m emberRepository.save( new Member("DDD", 25, null)); m emberRepository.save( new Member("EEE", 30, null)); int count = memberRepository.bulkAgePlus(18); em.flush(); em.clear(); List<Member> result = memberRepository.findByUsername("EEE"); Member findMember = result.get(0); assertThat(count).isEqualTo(3); assertThat(findMember.getAge()).isEqualTo(31); } 여기서 벌크성 연산을 할경우 엔티티 매니저를 거치지 않고 바로 업데이트를 하기에 findById 호출 전에 flush, clear하지 않으면 업데이트 이전에 save된 값이 나오는 것으로 알고 있어(캐쉬된 값) flush, clear를 해주는 것으로 알고 있는데 이때 em.flush()를 해버리면 벌크 연산 값이 아닌 그 이전 값이(save에서 저장한 값 EEE라 가정하면 31이 아닌 30) db에 업데이트 되는 꼴이라 벌크성 연산이 db에 유효하게 저장되려면 em.clear()만 실행 해야되는거 아닌가요?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강에서 수업 코드를 잘 따라 쳐서 수업 내용과 똑같은 결과를 확인 할 수 있게 되었는데요. 한 가지 의문점이 들어 질문을 남깁니다. 수업의 마지막 내용인 클린 코드 책이 이미 대출이 되있어 B사용자가 대출을 하려 했으나 대출을 클릭하는 순간 서버 내부 오류입니다. 라는 내용의 경고창이 뜨는걸 확인했는데 영상의 내용에는 진작 대출되어 있는 책입니다 라는 IllegalArgumentException으로 예외처리를 했어서 서버 내부 오류입니다 라는 내용이 아니라 진작 대출되어 있는 책입니다 떠야 하는게 아닌가요? 다음 강의에서 확인할 수 있으려나요~?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 다른 것들은 ...이 추가가 되지 않는데 OrderItem만 ...이 추가 되는 이유가 뭔가요? add를 넣었다고 해서 그런건가요?
7) Ajax 로그인 구현 & CSRF 설정에서 그 다음으로 코드를 수정하는 챕터는 지금 이 파트인거 같은데 갑자기 SecurityConfig 클래스에 customConfigurer, ajaxAuthenticationProvider, ajaxAuthenticationSuccessHandler, ajaxAuthenticationFailureHandler 메서드가 왜 있는건가요.. 하.. 이게 한 두개 챕터면 그냥 실수라고 생각하지만 지금 10챕터 이상이 이렇게 수정하면서 진행하는데 강의 이해도도 떨어지고 시간도 다 잡아먹고 뭐하는건지 모르겠습니다.. 아무리 리팩토링하셨다고 말씀하셨더라도 그럼 리팩토링한 영상을 새로 올리시거나 아니시면 리팩토링 전으로 강의가 흘러가야되는거 아닌가요...답답해서 참다가 글 남깁니다..
@Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; @Transactional //변경 public Long join(Member member) { validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } } @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } } --------------------------------------------------------------------------- // 테스트 코드 @Transactional public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("kim"); //When Long saveId = memberService.join(member); //Then assertEquals(member, memberRepository.findOne(saveId)); } } 회원 도메인 개발 파트의 마지막 강의에 있는 테스트 부분입니다 테스트는 성공이고, 테스트 결과 로그에는 member 객체에 대한 select sql이 찍힙니다 그런데 테스트 로그에 왜 select sql이 나오는지 잘 모르겠습니다 제가 이해하고 있는 내용은 이렇습니다 //When Long saveId = memberService.join(member); 위 코드에서 insert sql 이 생성되지만 내부 트랜잭션이라 커밋하지 않아서 해당 엔티티가 영속성 컨텍스트에만 추가된 상태 //Then assertEquals(member, memberRepository.findOne(saveId)); 위 코드에선 영속성 컨텍스트의 member를 가져오니 select sql 이 실행되지 않습니다 //When Long saveId = memberService.join(member); //Then assertEquals(member, memberRepository.findOne(saveId)); 그리고 테스트 코드에서 @Transactional 은 롤백이니 join()의 결과가 롤백됩니다 join() 은 롤백됬으니 테스트 결과 로그에 insert sql 이 나오지 말아야 하고, 영속성 컨텍스트의 member를 조회했으니 select sql 도 나오지 말아야 하는 것으로 예상됩니다 하지만 insert sql 은 예상한대로 테스트 결과에 나오지 않는데, select sql 은 나오는 이유를 모르겠습니다 해결했습니다 validateDuplicateMember(member) 중복 회원 검증하는 메서드에서 select sql을 호출하고 있었습니다 em.persist() 보다 먼저 호출하기 때문에 DB에서 바로 조회해오고 있었습니다 이걸 못보다니..
안녕하세요. 기억하기 인증 필터(RememberMeAuthenticationFilter) 강의를 듣다가 사소한 궁금증이 생겨 질문드립니다. 리멤버미 쿠키를 사용시 쿠키를 바탕으로 인증 정보를 가져오는 로직에서, JSESSIONID 쿠키가 만료되었을 때와 서버가 재시작되었을 때 password가 왜 다르게 불러와지는지 알고 싶습니다. 서버 재시작 시 리멤버미 쿠키로 인증 정보가 복구되지 않는 이유를 조사하던 중에 생긴 의문인데요. 제 생각으로는 쿠키에 인증 정보를 담고 있어서, 서버가 재시작되더라도 쿠키가 만료되지 않는 한 인증 정보를 복구할 수 있을 것 같았거든요. 제가 코드를 따라가서 확인한 부분은.. 리멤버미 쿠키를 생성할때 맨 마지막 필드로 makeTokenSignature 메서드의 값이 들어가는데 이 값은 String data = username + ":" + tokenExpiryTime + ":" + password + ":" + getKey(); 정보를 조합하여 만들어지는데, 여기서 getKey() 는 RememberMeConfigurer 에서 init할때 rememberMeServices 를 커스텀하게 주입하지 않으면 RememberMeConfigurer 에서 UUID.randomUUID().toString() 로 가져오기 때문에 서버가 재시작할때마다 랜덤한 값을 가지고 오더라구요. 그래서 서버가 재시작되더라도 고정된 key값을 사용하기 위해 TokenBasedRememberMeService 를 생성하여 아래와 같이 설정하였습니다. 이후에 getKey() 할때도 key로 test를 가지고 오는것을 확인하였구요. 그러면 이제 key가 고정이기 때문에 서버가 재시작되어도 리멤버미 쿠키를 바탕으로 인증을 진행하여 로그인 없이 세션이 유지될줄 알았는데?!, processAutoLoginCookie 메서드에서 아래 코드에서 exception이 발생합니다.. if (!equals(expectedTokenSignature, actualTokenSignature)) { throw new InvalidCookieException("Cookie contained signature '" + actualTokenSignature + "' but expected '" + expectedTokenSignature + "'"); } 확인해보니 유저 정보를 가져올때 password를 다르게 가져오고있더라구요. TokenSignature는 password와 여러 정보를 조합하여 만드는데, password값이 달라지니 예상값과 실제값이 차이가 나서 exception이 떨어지구요.. UserDetails userDetails = getUserDetailsService().loadUserByUsername(cookieTokens[0]); *로그인 > JSESSIONID 삭제 이후 로그인시 *서버 재시작 이후 로그인시 질문이 좀 장황했는데, 왜 password를 다르게 가져오는지 궁금합니다. 코드를 쫓아가다가 길을 잃어서 도움을 받을수 있을까 하여 질문을 남겨요.. 감사합니다.
입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
https://github.com/WooXher/kotlin-study-portfolio 백엔드 프로젝트 참여중인 인원입니다 오후부터 강의 들으면서 따라하고 있는데 첫 mysql 연결시는 3306포트가 사용중이라고 하여 3307로 변경하고 실행하였는데 테스크 커넥션에서 비밀번호가 거부되어 연결이 안되어서 넘기고 프로젝트 빌드이후로 시작하고 있는데 디비연결이 안되어서 그런지 데이터가 보이지 않았습니다. 이것저것 수정하다보니 이젠 프로젝트 자체도 연결이 안되고 있는데 어떻게 해야하나요?
입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
다운받은 파일에서 assets/vendor/quill/quill.min.js. quill.min.js가 존재하지않는데 그냥 진행해도 될까요? fragment-foot <script src="assets/vendor/quill/quill.min.js" th:src="@{/assets/vendor/quill/quill.min.js}"></script> 페이지 실행은 잘 되는데 파일이 존재하지않아서 에러가 나옵니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 해당 영상 6분 41초에서 '사실상 Member에서 Orders의 1대 다가 표현되는 이 컬렉션은 필요가 없다' 라고 말씀해주셨는데 해당 표현에 의미가 1:N 연관 관계가 필요없다는 의미가 아니라 orders속성이 필요없다는 의미가 맞을까요??