묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
중복_회원_예외() 코드 작성 질문입니다!
[질문 내용]지금까지 영한님께서 작성하신 테스트 코드 들은 Assertions.... 를 통해서 테스트하셔서 감을 익히고, 저도 테스트 케이스 작성 영상 보기 전에 미리 작성해보고 비교해보는 식으로 강의를 수강 중입니다.처음 작성한 코드입니다.@Test public void 중복_회원_예외() throws Exception { //given Member member1 = new Member(); member1.setName("Lim"); Member member2 = new Member(); member2.setName("Lim"); //when Long savedId1 = memberService.join(member1); //then Assertions.assertThrows(IllegalStateException.class, ()-> memberService.join(member2)); }위 처럼 Assertions.assertThrows를 사용하지 않으신 이유는 fail()이란 메서드의 존재와 @Test에 expected 옵션의 사용법을 알려주고자 하신 목적이신가요??어떤 테스트 케이스가 더 좋은 건가요? 그 이유도 궁금합니다!!!MemberService에 이미 명시적으로 IllegalStateException를 던져 놓았기에 더 짧은 타이핑으로 작성할 수 있는 assertThrows가 적합하다고 생각이 드는데, 강사님의 생각이 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 V4: JPA에서 DTO 직접 조회
주문 조회 V4: JPA에서 DTO 직접 조회 강의에서 OrderQueryRepository를 스프링데이터JPA를 이용해 변경하려하는데 잘 되지않아서 질문하게 되었습니다.(변수명이 바뀐 것은 제가 강의를 보면서 좀 수정해가며 작성하였습니다.)package jaein.crudpractice.repository.order.query; import jaein.crudpractice.domain.Order; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface OrderQueryRepository extends JpaRepository<Order, Long> { // @Query("select o from Order o" + // " join fetch o.student s" + // " join fetch o.loan l") // List<OrderQueryDto> findOrderQueryDtos(); // @Query("select o.id as orderId, s.name as name, o.loanDate, o.returnDate, o.status, " + // "oi.id as itemId, i.name as itemName " + // "from Order o " + // "join o.student s " + // "join o.loan l " + // "join OrderItem oi on oi.order.id = o.id " + // "join oi.item i") // List<OrderQueryDto> findOrderQueryDtos(Pageable pageable); @Query("select o.id, s.name, o.loanDate, o.returnDate, o.status " + "from Order o " + "join fetch o.student s " + "join fetch o.loan l " + "join fetch OrderItem oi on oi.order.id = o.id") List<OrderQueryDto> findOrderQueryDtos(Pageable pageable); // @Query("select oi.order.id, i.name, oi.orderPrice, oi.count " + // "from OrderItem oi join oi.item i where oi.order.id = :orderId") // List<OrderItemQueryDto> findOrderItems(Long orderId); @Query("select oi from OrderItem oi" + " join oi.item i where oi.order.id = :orderId") List<OrderItemQueryDto> findOrderItems(@Param("orderId") Long orderId); }package jaein.crudpractice.repository.order.query; import jaein.crudpractice.domain.OrderStatus; import lombok.Data; import java.util.Date; import java.util.List; @Data public class OrderQueryDto { private Long orderId; private String name; private Date loanDate; private Date returnDate; private OrderStatus status; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, Date loanDate, Date returnDate, OrderStatus status, List<OrderItemQueryDto> orderItems) { this.orderId = orderId; this.name = name; this.loanDate = loanDate; this.returnDate = returnDate; this.status = status; this.orderItems = orderItems; } }package jaein.crudpractice.repository.order.query; import lombok.Data; @Data public class OrderItemQueryDto { private Long orderId; private String itemName; private int count; public OrderItemQueryDto(Long orderId, String itemName, int count) { this.orderId = orderId; this.itemName = itemName; this.count = count; } }
-
미해결스프링 시큐리티
스프링 시큐리티 주요 아키텍처 이해 - 4. 인증 저장소 관련 질문
안녕하세요. Spring Security 강의에서 스프링 시큐리티 주요 아키텍처 이해 - 4. 인증 저장소 강의를 듣던 중 SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL); 위를 설정하여 자식 쓰레드도 동일한 Security Context를 공유하는 부분에 대해서 실습하던 중 아래와 같이 코드를 작성했는데 아무리 실행해도 계속 thread가 실행되는 컨트롤러에서 authentication 객체가 null 값을 가지는 것을 확인했습니다. "/" 가 실행되는 index 메소드에서 String strategy = SecurityContextHolder.getContextHolderStrategy().getClass().getSimpleName();System.out.println("strategy = " + strategy); 위를 통해서 출력 결과를 확인했을 때 "ThreadLocalSecurityContextHolderStrategy" 값이 나오는 것을 확인했습니다. 제가 판단하기로는 적용이 안 된 결과로 보였는데요 어느 시점에 setStrategyName를 적용해줘야 적용이 되는지 잘 모르겠습니다. 아래는 소스 코드 입니다.[SecurityCofnig]package io.security.basicsecurity;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.Customizer;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.web.SecurityFilterChain;@Configuration@EnableWebSecuritypublic class SecurityConfig4 {@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> {auth.anyRequest().authenticated(); }); http.formLogin(Customizer.withDefaults()); SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL); return http.build(); }} [Controller]package io.security.basicsecurity;import jakarta.servlet.http.HttpSession;import org.springframework.security.core.Authentication;import org.springframework.security.core.context.SecurityContext;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.web.context.HttpSessionSecurityContextRepository;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class SecurityController {@GetMapping("/")public String index(HttpSession session) {String strategy = SecurityContextHolder.getContextHolderStrategy().getClass().getSimpleName(); System.out.println("strategy = " + strategy); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); SecurityContext context = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); Authentication authentication1 = context.getAuthentication(); System.out.println("무슨 값? " + authentication1.toString()); return "home"; }@GetMapping("/thread")public String thread() {new Thread(new Runnable() {@Override public void run() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication == null) {System.out.println("Null 값임"); }}}).start(); return "thread"; }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
validateDuplicateMember 메서드에서 Unique제약 조건 관련 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여러 was가 띄워있는 웹에서 0.0000...01초까지 동일한 시간에 join()메서드가 동시에 호출되어 validateDuplicateMember()메서드 또한 동시에 호출되고 findByName()을 통한 조회가 동시에 호출될 경우에 두 클라이언트에 대한 요청에 대해서 모두 isEmpty가 true가 되어 검증 로직을 통과하게 되어 최후의 수단으로 DB단에서 name 필드를 Unique 제약조건을 두어 유일성을 가지게 하는 것은 이해하였습니다.그렇다면, Unique제약조건까지 설정한 이후에 두 클라이언트가 동시에 요청을 했을 때,1. 둘 다 DB에 insertion 되지 못하고 에러가 나나요?2. 둘 중 하나가 삽입이 되고 나머지 하나는 삽입 되지 못하나요? 그렇다면, 어떤 기준으로 둘 중 하나가 선택되나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
뭐가 문제일까여?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]왜 cd study를 경로를 찾을 수없다고 하나요?study를 c밑에 study에 저장했는데 ㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceIntegrationTest 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]package hello.hellospring.service;import hello.hellospring.domain.Member;import hello.hellospring.repository.MemberRepository;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.transaction.annotation.Transactional;import static org.assertj.core.api.Assertions.assertThat;import static org.junit.jupiter.api.Assertions.assertEquals;import static org.junit.jupiter.api.Assertions.assertThrows;@SpringBootTest@Transactionalclass MemberServiceIntegrationTest {@Autowired MemberService memberService;@Autowired MemberRepository memberRepository;@Testpublic void 회원가입() throws Exception {//GivenMember member = new Member();member.setName("hello");//WhenLong saveId = memberService.join(member);//ThenMember findMember = memberRepository.findById(saveId).get();assertEquals(member.getName(), findMember.getName());}@Testpublic void 중복_회원_예외() throws Exception {//GivenMember member1 = new Member();member1.setName("spring");Member member2 = new Member();member2.setName("spring");//WhenmemberService.join(member1);IllegalStateException e = assertThrows(IllegalStateException.class,() -> memberService.join(member2)); //예외가 발생해야 한다.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");}} 이렇게 넣었는데 오류가 납니다. 오류 메세지는 이거 WARNING: A Java agent has been loaded dynamically (C:\Users\halia\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.14.10\90ed94ac044ea8953b224304c762316e91fd6b31\byte-buddy-agent-1.14.10.jar)WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warningWARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more informationWARNING: Dynamic loading of agents will be disallowed by default in a future releaseJava HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended입니다 ,,
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
public String / Long과 public void의 차이는 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.member 클래스를 보고 있었는데요, getId는 public Long, setId는 public void, getName은 publci String으로 선언이 되는데 무슨 차이가 있는지 여쭤봐도 될까요?!
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@EqualsAndHashCode
주문 조회 V4: JPA에서 DTO 직접 조회 제공해주신 피피티에서는 @EqualsAndHashCode 를 사용하는데 강의에서는 제가 못 본것 같습니다.. @EqualsAndHashCode 를 사용하신 이유가 있을까요? 강의 중 9분 34초 에서 본 OrderQueryDto는 @Data만을 사용했습니다.
-
해결됨스프링 시큐리티
최신 spring security 기준 web.ignoring 관련 질문입니다
현재 최신 spring security 및 spring 3.2.1 버전을 사용중입니다.강의 섹션 3-2번강의에서 web.ignoring 설정이 현재 SecurityFilterChain에는 어떻게 적용해야 될지 몰라 찾아보던 중 아래와 같은 자료를 발견하였습니다.해당 자료는 spring security 관련https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html#favor-permitall위의 주소에서 확인하였는데 이부분과 관련하여 질문드립니다. 최신 버전에서는 위의 사진과 같이 코드를 사용하는게 좋을까요? 만약 위와 같이 사용한다면 달라지는 부분이 있는지 궁금하여 질문드립니다. 현재 제가 작성한 코드는 아래와 같습니다.추가한 부분은 css, js, img, favcon.ico, webjars 입니다http .authorizeHttpRequests(Authorize -> Authorize .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/messages").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .requestMatchers("/css/**").permitAll() .requestMatchers("/js/**").permitAll() .requestMatchers("/img/**").permitAll() .requestMatchers("/favcon.ico").permitAll() .requestMatchers("/webjars").permitAll() .requestMatchers("/").permitAll() .anyRequest().authenticated() );전체 부분 @Configuration @EnableWebSecurity @Slf4j public class SecurityConfig{ @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password(new BCryptPasswordEncoder().encode("1111")).roles("USER"); auth.inMemoryAuthentication().withUser("manager").password(new BCryptPasswordEncoder().encode("1111")).roles("MANAGER","USER"); auth.inMemoryAuthentication().withUser("admin").password(new BCryptPasswordEncoder().encode("1111")).roles("ADMIN","MANAGER","USER"); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(Authorize -> Authorize .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/messages").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .requestMatchers("/css/**").permitAll() .requestMatchers("/js/**").permitAll() .requestMatchers("/img/**").permitAll() .requestMatchers("/favcon.ico").permitAll() .requestMatchers("/webjars").permitAll() .requestMatchers("/").permitAll() .anyRequest().authenticated() ); http.formLogin( formLogin -> formLogin .successHandler(new AuthenticationSuccessHandler() { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { RequestCache requestCache = new HttpSessionRequestCache(); // 이걸 이용해 세션에 원래 가고자 하는 경로 저장되어 있음 SavedRequest savedRequest = requestCache.getRequest(request, response); //여기에 저장되어있음 String redirectUrl = savedRequest.getRedirectUrl(); log.info("redirectUrl : " + redirectUrl); response.sendRedirect(redirectUrl); } }) .permitAll() ); http .csrf(csrf -> csrf. csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) ); return http.build(); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 메서드 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 연관관계 메서드 관련해서 질문 있습니다.<엔티티 설계시 주의점> 26:30에서 public void addchildCategory(Category child){ this.child.add(child); child.setParent(this); }인 것을 확인할 수 있습니다.혹시 아래와 같은 방법은 하면 안되는지 궁금하여 질문드립니다. public void addchildCategory(Category child){ this.child.add(child); this.parent = child; }
-
미해결실전! 스프링 데이터 JPA
org.springframework.data.repository.Repository를 구현한 클래스??
안녕하세요 강사님! 강의 정말 잘 듣고 있습니다.혹시 강의 자료가 잘못된 건지 아니면 제가 이해를 잘못한 건지 잘 모르겠어서 질문 올립니다.강의 자료의 해당 강의 부분을 보면 org.springframework.data.repository.Repository 를 구현한 클래스는 스캔 대상라고 되어있는데, 제가 이해한 바로는 이 부분이org.springframework.data.jpa.repository.JpaRepository 를 상속받은 인터페이스는 스캔 대상이렇게 수정되어야 할 것 같은데 맞을까요..??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 생성 안됨
별 다른 에러는 안보이고 메인에서 run 했는데 테이블 생성이 안됩니다. 어디서 부터 봐야하나요? 해당 로그 입니다.
-
미해결실전! 스프링 데이터 JPA
"섹션6 새로운 엔터티 구별방법" 강의를 보다가 실무에서 JPA 도입 시 DB의 PK, FK 생성 전략이 궁금합니다.
JPA를 도입하기 전의 DB 테이블들의 PK는 대부분 일정 규칙을 같은 문자열(ex:주문번호)이나 사용자 입력값(ex:사용자id)을 사용하고 해당 PK가 다른 테이블에서는 FK로 참고하며, 또한 타 테이블의 PK로 구성된 복합키가 PK로 많이 구성되는데...JPA를 도입하면 Long같은 generated value를 임의로 물리적 PK로 생성하고, FK는 기존 논리적 PK칼럼을 참조하는 방식으로 설계 하나요?실무에서 JPA 도입시 테이블 PK 및 FK 전략이 궁금하네요.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 취소시 해당 상품 재사용
주문을 취소할시 취소된 unique한 delivery값이 남아있는 상태여서 똑같은 delivery id를 재사용하게 하려할 때 에러가 뜨는데 해결방법이 따로 있을까요? cancel란에도 record가 남아있으면서 동시에 그 unique id가 재사용될 수 있는 방법이요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AfterEach 동작 과정 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 질문이 있어 이렇게 글을 남기게 되었습니다.13:00에서 MemberServiceTest.java의 코드package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemoryMemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; class MemberServiceTest { MemberService memberService = new MemberService(); MemoryMemberRepository memberRepository = new MemoryMemberRepository(); @AfterEach public void afterEach() { memberRepository.clearStore(); } @Test void 회원가입() { //given Member member = new Member(); member.setName("spring"); //when Long saveId = memberService.join(member); //then Member findMember = memberService.findOne(saveId).get(); assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test public void 중복_회원_예외() { //given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); /* try { // 예외 처리 memberService.join(member2); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); } */ IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // then } @Test void findMembers() { } @Test void findOne() { } }이때 테스트 코드가 잘 동작하는 이유를 모르겠습니다. MemberService로 선언한 memberService 안에는 다른 레포짙토리가 존재한다는 점 알고 있습니다. 아래 코드에서는 spring이라는 이름을 가진 회원을 회원가입하고, 중복_회원_예외를 처리하는데, 이때 memberService의 레포지토리를 활용합니다. 따라서 회원의 정보가 저장되는 것은 memverService 클래스 안의 memberRepository입니다. 하지만 afterEach 함수를 보면 그동안 회원의 정보를 저장했던 레포지토리가 아닌, 새로 선언한 memerRepository의 정보를 초기화하고 있습니다. 따라서 회원 정보를 저장한 곳과 초기화하는 곳이 다른데 어떻게 코드가 잘 작동하는지가 궁금합니다.
-
미해결스프링 시큐리티 OAuth2
25:00 PKCE 관련 질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.secret을 안보내도 된다는것 자체가 약간은 의아해서 질문드립니다. PKCE, 인가코드만 있어도, challenge, verifer 를 통해서, 인가서버로 요청하는 client 가 위조되었을 가능성이 낮기 때문에 secret을 안보내도 되도록 허용하는 것인가요? 인가 코드를 탈취당해도, PKCE를 통해서 client 가 challenge, verifier 를 통해서 알 수 있으니까..?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 기능 테스트 부분에서 질문이 있습니다!
상품 주문을 테스트할 땐 Book 객체로 받아서 테스트를 실행했는데, 상품주문 재고수량초과 테스트에선 . 왜 Item 객체로 받아서 테스트를 실행하는건가요? 차이점은 따로 없지 않나요?
-
해결됨실전! 스프링 데이터 JPA
연관관계 편의 메서드에서 mappedBy 필드에 대한 수정 로직 추가여부
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예https://www.inflearn.com/questions/25417/changeteam-%EA%B4%80%EB%A0%A8%ED%95%98%EC%97%AC-%EC%A7%88%EB%AC%B8-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 연관관계 편의 메서드 관련 질문인 위 링크의 글과 연관이 있습니다. 질문을 먼저 작성해놓고 질문 끝에 다시 언급해놓겠습니다.1) 어쩌면 필요없는 구현일 수 있는데, 이런 습관?을 들여도 괜찮은지2) 아니면 강의처럼 DB에 반영되지 않고 거의 문제가 발생할 가능성이 없는 부분은 간단하게 구현하고 넘어갈지 mappedBy로 read-only상태인 조회 전용 필드인 members는 변경 상태가 DB에 반영되지 않지만,인스턴스 입장에서는(객체지향적으로는?) 어플리케이션 런타임 시점에 변경을 해주어야한다고 생각했습니다.위 링크의 영한님 말씀처럼 데이터 변경 후 이를 즉시 재활용하는 일은 극히 드물지만 말이죠. Member 엔티티// 연관관계 편의 메서드 public void changeTeam(Team team) { // 기존에 팀이 있다면 탈퇴 if (this.team != null) { // 탈퇴를 위한 비즈니스 로직을 Team에 구현함 this.team.removeMember(this); } this.team = team; team.getMembers().add(this); }그래서 위와 같이 if 분기를 두고 소속 팀이 있는 회원은 해당 팀에서 회원 자신을 지우는 로직을 추가했습니다. this.team.removeMember(this)위 로직은this.team.getMembers().remove(this)와 같지만 의미있는 메서드를 만들어보고 싶어서 아래처럼 removeMember 를 구현했습니다.Team 엔티티// 비즈니스 로직 -> read-only 필드라서 DB에는 반영 안됨 public void removeMember(Member member) { this.members.remove(member); } null 확인 로직이 changeTeam() 내부에 있으므로 Member 엔티티 생성자는 다음과 같이 작성했습니다.public Member(String username, int age, Team team) { this.username = username; this.age = age; changeTeam(team); } 결론적으로 물어보고 싶은 질문은1) 어쩌면 필요없는 구현일 수 있는데, 이런 습관?을 들여도 괜찮은지2) 아니면 강의처럼 DB에 반영되지 않고 거의 문제가 발생할 가능성이 없는 부분은 아래처럼 간단하게 구현하고 넘어갈지// 연관관계 편의 메서드 public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); } 이렇게 두 가지 질문이 있습니다.늘 좋은 강의 해주셔서 감사합니다.
-
미해결스프링 시큐리티 OAuth2
7:50 초 authentication token 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Oauth2AuthenticationToken 이라는 것이 사실은 인가서버로의 인증을 의미하는 것이지 client 서버로의 인증이라고는 볼 수 없는 것 아닌가요? 그러니까 Oauth2 과정을 거쳤다는 것은, 해당 유저의 resource 를 auth 서버든 resource 서버든 접근이 가능하다는 것이지, 우리 서버에 인증이 되었다는 것은 아니라고 저는 이해했는데요. 왜, oauth2 프로세스가 끝나면 최초 요청지 (예를들어 localhost:8081/home -> 로그인 창으로 가서 oauth2 process 끝 -> localhost:8081/home 이라고 할때, 최초 요청지는 localhost:8081/home) 가 접근이 되는 것이죠?
-
미해결스프링 시큐리티 OAuth2
26:30 경에 userinfo 분기가 강사님과 다릅니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. OicdUserService의 아래 메서드에서 true를 반환해버리는데요. 우선 해당 함수의 if(authroization_code 이냐?) 분기를 타고, accessibleScopes가 empty 가 아닙니다. 아마 키클록에서 default 스코프가 있기 때문인거 같은데요. shouldRetrieveUserInfo 해당 영상에서는 키클록의 default 스코프가 빠진걸까요? 아니면 grant type 문제일까요? 참고로 grant type 은 별다른 옵션 없이도, registration repository에서 꺼내오는 순간 registration에는 authroization_code 입니다.