묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
커넥션을 사용한다는 것
안녕하세요.강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요.이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데,em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요?"LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요?con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다.감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
CSR 자바스크립트
"자바스크립트 링크"가 <script> 태그에 있는 경로를 말하는 거고 클라이언트가 그 js 파일을 서버에 요청하는게 "자바스크립트 요청"이 되는건가요?서버가 그 파일을 전달하면 클라이언트가 필요한 데이터를 다시 요청한 후에 파일을 완성해서 렌더링하는 과정이 맞는지 궁금해요
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
구조 개선하기
@EnableWebSecurity @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception{ http .addFilterAt(authorizationFilter(introspector), AuthorizationFilter.class) .formLogin(Customizer.withDefaults()) .csrf(AbstractHttpConfigurer::disable); return http.build(); } @Bean public AuthorizationFilter authorizationFilter(HandlerMappingIntrospector introspector){ List<RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>>> mappings = new ArrayList<>(); RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry1 = new RequestMatcherEntry<>( new MvcRequestMatcher(introspector, "/user"), AuthorityAuthorizationManager.hasAuthority("ROLE_USER")); RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry2 = new RequestMatcherEntry<>( new MvcRequestMatcher(introspector, "/db"), AuthorityAuthorizationManager.hasAuthority("ROLE_DB")); RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry3 = new RequestMatcherEntry<>( new MvcRequestMatcher(introspector, "/admin"), AuthorityAuthorizationManager.hasAuthority("ROLE_ADMIN")); RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry4 = new RequestMatcherEntry<>( AnyRequestMatcher.INSTANCE, // default strategy = AuthenticatedAuthorizationStrategy new AuthenticatedAuthorizationManager<>()); mappings.add(requestMatcherEntry1); mappings.add(requestMatcherEntry2); mappings.add(requestMatcherEntry3); mappings.add(requestMatcherEntry4); RequestMatcherDelegatingAuthorizationManager manager = RequestMatcherDelegatingAuthorizationManager.builder() .mappings(maps -> maps.addAll(mappings)).build(); return new AuthorizationFilter(manager); } @Bean public UserDetailsService userDetailsService(){ UserDetails user = User.withUsername("user").password("{noop}1111").roles("USER").build(); UserDetails db = User.withUsername("db").password("{noop}1111").authorities("ROLE_DB").build(); UserDetails admin = User.withUsername("admin").password("{noop}1111").roles("ADMIN","SECURE").build(); return new InMemoryUserDetailsManager(user, db, admin); } }필터에 직접 RequestMatcherDelegatingAuthorizationManager를 넣는 방식으로 개선해 봤습니다 처음에는 RequestMatcherDelegatingAuthorizationManager -> RequestMatcherDelegatingAuthorizationManager 구조로 바꾸려고 했는데 access()에는 AuthorizationManager<RequestAuthorizationContext>만 가능해서 AuthorizationManager<HttpServletRequest>인 RequestMatcherDelegatingAuthorizationManager를 바로 못 넣더라구요 그래서 필터를 생성하고 필터 생성자로 RequestMatcherDelegatingAuthorizationManager를 넣는 방식을 사용했습니다
-
미해결비전공자를 위한 Spring MVC 뽀개기 기초
질문있습니다
선생님안녕하세요 질문있습니다dispatcherServlet 만들기하고난뒤web.xml파일이 자동으로 생성된다고 하셨는데web.xml파일이 아무런 변화도 없는데 이경우 어떻게 해야하나요?강의하신데로 빠짐없이 하나하나 등록하고 입력했는데web.xml파일이 자동으로 생성이 안됩니다. 답변부탁드립니다 감사합니다!
-
미해결스프링 프레임워크 입문자를 위한 따라하기
404에러나면서 웹페이지 접근되지 않는다면 아래처럼 해보는 것을 해보세요
404에러나면서 웹페이지 접근되지 않는다면아래처럼 해보는 것을 해보세요 https://velog.io/@jyysyl6/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4-%EC%98%A4%EB%A5%98-the-project-cannot-be-built-until-build-path-errors-are-resolved 저는 저렇게 해서 해결됬습니다.링크가 깨졌을 것을 방지해서 아래처럼 하는 것입니다. (1)해당 프로젝트 우클릭해서 [Properties] 들어가기(2)왼쪽 메뉴 중에서 Java Build Path에 들어가서 상단 메뉴 중 [Libraries]를 클릭한다(3)(unbound)로 뜨는 기존에 들어가있던 JRE는 삭제해주고 [Add Library]를 눌러서 JRE를 새로 추가해주면 된다(4)이중에서 [JRE System Library] 선택하고 [Next] 눌러서 넘어가기(5)그러면 추가는 것도 있고 다운받는 것도 있는데나는 워크스페이스에 설정해놨던 JRE가 보이길래 이걸로 선택해줬다체크박스 선택하고 [Finish]로 창닫기(6)제대로 추가됐는지 확인해주고 [Apply] -> [Apply and Close] 해줌
-
해결됨스프링 핵심 원리 - 고급편
오타? 및 내용 질문
안녕하세요 선생님 강의 듣다가 질문이 생겨서 글 작성해봅니다 제가 알기로 스프링 2.6 ? 이상에서 순환 참조가 자동으로 비활성 되어서 private final ObjectProvider<CallServiceV2> callServiceProvider; 을 사용해도 lazy 조회가 되지 않는것으로 알고 있습니다 그래서 application.yml 파일에서 이 설정을 true 로 바꿔주거나 test 시 @TestPropertySource(properties = "spring.main.allow-circular-references=true") 이 어노테이션을 추가하려 순환 참조를 활성화 시킨 후에 테스트 해봐야지만 정상 작동 되는걸로 알고 있는데 제가 알고 있는 내용이 다른지 궁금합니다
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
커넥션을 사용한다는 개념
안녕하세요. 강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요.이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데, em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요? "LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요?con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다.감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
프론트단 질문 검증 오류뜰시 태그를 추가하는데 alert창을 띄우는 방식으로 한다면 어떻게 달라지는지?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]프론트단 질문 검증 오류뜰시 태그를 추가하는데 alert창을 띄우는 방식으로 한다면 어떻게 달라지는지? 예를들면 검증해서 문제가 있으면 bindingresult에 담고 템플릿에 넘겨주는데 지금방식은 문제가 잇으면 input태그밑에 오류를 표시해주는데 alert창으로 표시를 하고 싶다면 프론트에서 코드가 어떻게 달라지는지 알고싶네요.자바스크립트코드에 오류가 있을시에 alert창에 ${에러문구} 이런식으로 넣어주면 되는건가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
섹션 9 계층적 권한 메소드 Deprecated
테스트 중 사용된 메소드가 곧 Deprecated 된다고 나오는데 혹시 다른 메소드 설정 방법 알려주실 수 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Transactional이고, Rollback 설정을 변경하지 않았음에도 Insert문이 실행되는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 다름이 아니라 테스트 코드를 작성하여 결과를 확인하고 있었는데 교수님의 설명과 달리 Insert문이 계속해서 출력되고 있는 것이 의문이라 여쭤봅니다. 저는 rollback을 false로 하거나 em.flush를 따로 호출해주지 않았음에도 Insert문이 출력되는 이유가 궁금합니다.참고로 저는 H2가 아니라 mysql 로컬 디비를 연결하여 개발 중인데 이 것이 사유가 되는걸까요? spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/testdb username: root password: /// jpa: hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true logging: level: org.hibernate.SQL: DEBUG org.hibernate.type.descriptor.sql.BasicBinder: TRACE package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest @Transactional public class MemberServiceTest { //테스트니까 이런식으로 해도 됨. @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //~~걸 실행하면 ~~한 결과가 나와야 함, 검증해라 (given when then) //given Member member = new Member(); member.setName("kim"); //when Long savedId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(savedId)); } @Test(expected = IllegalStateException.class) public void 중복_회원_예외() throws Exception { //given Member member1 = new Member(); member1.setName("kim1"); Member member2 = new Member(); member2.setName("kim1"); //when memberService.join(member1); memberService.join(member2); // try{ // memberService.join(member2); //예외가 발생 // }catch (IllegalStateException e){ // return; // } //then fail("예외가 발생하야 한다"); } }
-
미해결Practical Testing: 실용적인 테스트 가이드
전체 테스트 vs asciidoctor 질문
@DisplayName("챌린지를 생성한다.") @Test void createChallenge() { // given LocalDateTime startDateTime = LocalDateTime.of(2024, 11, 11, 10, 10, 30); Member member = createMember(); memberRepository.save(member); Category category = createCategory(); categoryRepository.save(category); ChallengeCreateServiceRequest request = ChallengeCreateServiceRequest.builder() .title("제목") .durationInWeeks(2) .weeklyGoalCount(3) .categoryId(category.getId()) .color("색상") .content("내용") .build(); // when ChallengeResponse challengeResponse = challengeService.createChallenge(member, request, startDateTime); // then assertThat(challengeResponse.getId()).isNotNull(); assertThat(challengeResponse.getCategory()) .extracting("id", "name") .contains(1L, "카테고리"); assertThat(challengeResponse.getRecord()).isNull(); assertThat(challengeResponse) .extracting("startDateTime", "totalGoalCount") .contains("2024-11-11 10:10:30", 6); }assertThat(challengeResponse.getCategory()) .extracting("id", "name") .contains(1L, "카테고리");afterEach를 작성해서 deleteAllInBatch로 레포지토리들을 삭제하고 있습니다. 전체 테스트에서는 아무런 문제없이 통과하는데 asciidoctor을 돌리면은 이 카테고리 아이디가 4L로 기대된다고 나옵니다.. 전체 테스트와 asciidoctor와무슨 차이가 있는건가요 ? 도대체 이유를 모르겠습니다ㅠ카테고리 레포지토리를 쓰는곳을 보면 1. CategoryControllerTest2. ChallengeControllerTest3. CategoryServiceTest4. ChallengeServiceTest -> 실패 부분 입니다..근데 컨트롤러 테스트를 제외하고,, 서비스, 레포지토리 테스트에서 afterEach 메소드 사용 deleteAllInBatch로 초기화를 시켜주고 있습니다.근데 왜 다음과 같이 나오는지 이해가 안갑니다.. 이게 전체 테스트는 잘되고 asciidoctor를 첫번째 돌릴때만 그렇고 두번째에는 또 성공합니다.. 근데 이게 문제가 ci/cd때 테스트를 실패하니까 build가 안된다는 점입니다 ㅠ.ㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:fied 가 바인딩 실패시 값을 넣어주는것을 아는데 타임리프말고 다른 템플릿은 어떻게 오류값을 넣는건지?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]th:fied 가 바인딩 실패시 값을 넣어주는것을 아는데 타임리프말고 다른 템플릿은 어떻게 오류값을 넣는건지?new FieldError("item", "itemName", item.getItemName(),....)위에 3번째 파라미터가 들어가는거같은데템플릿에서 3번째 파라미터를 어떻게 꺼내는건지 알고싶네요.
-
미해결스프링 핵심 원리 - 기본편
자바 설치
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용사전 준비물에 이렇게 있ㄴ느데IntelliJ 안에서 프로젝트 생성할때 설치하는 open JDK 와 자바 설치는 무관한 것인가요?자바를 따로 설치하지 않아도 지금까지는 문제가 없었는데 설치가 필요할까요?Open JDK 와 자바는 무슨 차이 인지 모르겠어요! 저는 현재이건 자바를 설치하지 않은 상태이죠?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Repository를 통해 프록시가 생성되려면
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]"@Repository가 붙은 클래스는 예외 변환 AOP의 적용 대상이 된다."는 내용에 대해 더 궁금한 점이 있습니다. 테스트 코드의 @Transactional를 주석 처리하고, @Import로 설정도 수정해서, JPA 대신 MyBatis나 JdbcTemplate을 적용해 봐도log.info("repository = {}", itemRepository.getClass());테스트의 이 코드를 실행하면 itemRepository가 프록시로 생성된다는 것을 확인할 수 있었습니다. JPA가 아니라 해도 @Repository가 적용되면 프록시 객체로 생성되는 것 같습니다. 그런데 이전 스프링 핵심 원리 기본 편 강의에서 사용했던 core 프로젝트에서도 한번 테스트해 봤는데//@Component @Repository public class MemoryMemberRepository implements MemberRepository { . . . } class OrderServiceImplTest { @Test void createOrder() { MemoryMemberRepository memberRepository = new MemoryMemberRepository(); System.out.println(memberRepository.getClass()); . . . } } 이 테스트를 실행해 보면 memoryMemberRepository는 @Repository가 적용되어 있음에도 불구하고 프록시 객체로 생성되지 않는 것 같습니다. 이 이유가 무엇인가요?@Repository를 통해 프록시 객체를 만드는 기능은 JPA 라이브러리가 있어야(JPA를 사용하지 않고 MyBatis를 사용하더라도) 적용되는 건가요? +) 그런데 스프링 DB 1편 강의에서 사용한 프로젝트에서도 테스트해 봤는데, 여기선 JPA 라이브러리를 받지 않았는데도 @Repository를 통해 프록시 객체가 생성되는 것 같습니다. 물론 @Transactional도 주석 처리했습니다.@Slf4j @Repository public class MemberRepositoryV5 implements MemberRepository { private final JdbcTemplate template; . . . } @Test void AopCheck() { log.info("memberService class = {}", memberService.getClass()); log.info("memberRepository class = {}", memberRepository.getClass()); Assertions.assertThat(AopUtils.isAopProxy(memberService)).isTrue(); Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); }@Transactional을 주석 처리했으므로 memberService는 프록시 객체가 아니고,@Repository가 적용된 memberRepository는 CGLIB 관련 내용이 출력됩니다. @Repository를 통해 프록시 객체가 생성되려면 어떤 조건이 필요한지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
boot에서 빈값이 들어왔을때 Integer와 int로 받을때 질문 그리고 주로 뭘 사용하는지
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]만약에 쿼리파라미터로price="" //빈값price=" " //한칸띈 빈값이렇게 들어오고Integer로 받으면 그냥 null이 들어가나요?int는 그냥 0이 들어가는건가요?테스트 해보니 그런거 같아서요.이유가 뭔가요? 자동으로 컨버터가 되는건가요? 만약에 쿼리파라미터로 price를 넣지 않으면 그냥 자동으로 null이 들어가는건가요? 그리고 숫자가 들어올때 Integer나 int 중에 주로 현업에서는 무엇으로 받는게 좋나요?뭔가 이런 사소한게 선택장애가 있어서
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
실행이 안돼요 ㅠㅠ
최신버전으로 다운 받았는데도 실행이 안돼서 강의를 진행할 수 없습니다. ㅠㅠ 어떻게 해야하나요. 자세히좀 알려주세요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
실행이 안돼요 ㅠㅠ
최신 버전으로 다운받고 했는데 실행이 안돼요.. 공부를 진행하고 싶어도 이거때문에 시간만 보내고 진행이 안돼네요 ㅠㅠ
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
외부 내부 트랜잭션 질문
이전 내용은 내부 트랜잭션이 외부 트랜잭션에 종속된다는 내용이였는데, 지금까지 테스트를 트랜잭션 매니저로 직접 생성해서 해주셨습니다.그런데 실무에서는 트랜잭션 어노테이션을 많이 쓰는데 디폴트 트랜잭션은 기존 트랜잭션이 존재하면 그대로 이어 쓰는 걸로 알고 있습니다. 이 경우가 이어 쓰는 것임에도 논리적으로 외부 내부로 구분하는 건지, 아니면 다른 옵션의 예가 따로 있는 건지 궁금합니다. 정리하자면 기존 트랜잭션을 이어 쓰는 REQUIRED 옵션이 이제까지 설명해주신 내부가 외부에 종속되는 트랜잭션인지 아니면 다른 옵션이 있는 건지 궁금합니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
CsrfCookieFilter 역할?
해당 필터는 단순히 Supplier로 감싸진 CsrfToken을 getToken()을 통해서 초기화를 진행하고 있습니다 GET 방식이면 어차피 CsrfFilter에서 바로 다음 필터로 넘어가고 POST면 CsrfFilter에서 토큰 비교를 하기 위해서 초기화를 CsrfFilter에서 하는데 CsrfCookieFilter는 왜 필요할까요? 여러 가지 케이스로 디버깅하면서 좀 더 살펴봤는데특정 페이지에서 POST 요청을 하는 버튼이 있으면 먼저 CSRF 토큰을 발급해서 클라이언트에 저장이 되어있어야 POST 요청에서 토큰을 쿠키에 꺼내어 검증할 수 있기 때문에GET 요청에도 getToken()을 통해서 초기화가 진행되고 해당 초기화 과정에 saveCookie 로직이 있기 때문에클라이언트 쿠키에 토큰이 저장되는 걸로 추측했습니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
rest api와 messagebody
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.rest api 구현은 기본적으로 자원 기반 구조로 url을 설계하는걸 포함하는데 HTTP/1.1 명세(RFC 7231) 상 get 방식은 messagebody의 사용하지 않는것을 권장하고 있고 해당 강의의 messagebody 교환 방법에 아래와 같이 교안을 제공합니다.HTTP message body 에 데이터를 직접 담아서 요청 HTTP API에서 주로 사용, JSON, XML, TEXT 데이터 형식은 주로 JSON 사용 POST, PUT, PATCH그렇다면 조회시에 get방식을 사용못하는데 json 방식의 api는 모두 rest api에 위배되거나 http/1.1 명세에 따르지 않는 방식 아닌가요?도대체 무엇인지 혼동만 줍니다.