묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
테스트 v3_4와 v4 모두 오류가 발생합니다.
https://drive.google.com/file/d/1n_YIwUiIsidlVs38Oq6rPsBjoO8HgW1T/view?usp=drive_link 강의자료 코드도 복붙해보고 소스파일 올려주신거도 열어봤는데 오류가 발생합니다. h2데이타베이스 내렸다 다시 켜봐도 안됩니다 ㅠ 로그를 보니까 OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended오류가 뜨고 멤버 테이블도 존재하지 않는다고 합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
NotEmpty 속성 적용 관련
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요./api/v1/members 에서는 NotEmpty를 멤버 클래스에서 적용함 public class Member { ~~ 중략 @NotEmpty private String name; ~~ 중략 } /api/v2/members 를 테스트 하면서 멤버 클랫스에서는 @NotEmpty 를 제거하고 MemberApiController 내부에 이너 DTO 클래스에 @NotEmpty 속성을 넣으면 API 에서 빈값을 넣어도 그냥 통과시켜 버립니다. public class Member { //중략 private String name; //@NotEmpty 제거 //중략 } public class MemberApiController { //중략 @Data static class CreateMemberRequest { @NotEmpty private String name; } //중략 } 강사님의 의도는 V2가 엔티티에 독립성은 보장 프레젠테이션 레이어의 체크 사항을 엔티티 레벨로 가져오지 않고 DTO를 사용하여 결합을 느슨하게 하려고 보이는데 그러한 의도로 코드 수정하면 원하는 결과가 나오지 않습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HandlerExceptionResolver 시작 8분 7초에서 질문입니다.
package com.example.exception.resolver; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import java.io.IOException; @Slf4j public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof IllegalArgumentException) { log.info("IllegalArgumentException resolver to 400"); response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage()); return new ModelAndView(); } } catch (IOException e){ e.printStackTrace(); } return null; } } package com.example.exception.api; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ResponseStatusException; @Slf4j @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("bad")) { throw new IllegalArgumentException("잘못된 입력 값"); } return new MemberDto(id, "hello " + id); } @Data @AllArgsConstructor static class MemberDto { private String memberId; private String name; } } if (ex instanceof IllegalArgumentException) {위에 코드가 "ex" 객체가 IllegalArgumentException 클래스의 인스턴스인지를 확인합니다.근데 ex객체가 어디 선언되어있나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링DB 2 :: 테스트 - 데이터 베이스 연동 오류
추가 질문입니다. @Data 보다는 @Getter @Setter를 쓰는게 좋다고 하셔서@Getter @Setter를 쓰고 별도 생성자도 만들었는데.......@Getter @Setter를 @Data로 변경 햤을 때 오류가 발생하지 않는 이유를 알려주세요. https://www.inflearn.com/questions/1258907/%EC%8A%A4%ED%94%84%EB%A7%81db-2-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EB%8F%99-%EC%98%A4%EB%A5%98
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서블릿 필터 - 인증 체크 강의 질문있습니다.
18분 4초에서 6초 사이 로그인 하면 상품목록으로 바로 보여야 하는데 제코드는 홈 화면으로 갑니다.return "redirect:"+redirecURL;를 작성하면 로그인 전화면이 보여줘야 하는데 안보여집니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
서블릿 필터 - 인증 체크 질문입니다.
public class LoginController { private final LoginService loginService; private final SessionManager sessionManager; @PostMapping("/login") public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) { if (bindingResult.hasErrors()) { return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if (loginMember == null) { bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; } //로그인 성공 처리 //세션이 있으면 있는 세션 반환, 없으면 신규 생성 HttpSession session=request.getSession(); //세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember); return "redirect:/"; }@Slf4j public class LoginCheckFilter implements Filter { private static final String[] whitelist={"/","/members/add","/login","/logout","/css/*"} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest=(HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); HttpServletResponse httpResponse=(HttpServletResponse) response; try{ log.info("인증체크 필터 시작{}",requestURI); if (isLoginCheckPath(requestURI)){//화이트 리스트가 아닐 때 true반환 로그인 상태가 필요한 사이트이라면 log.info("인증체크로직실행{}",requestURI); HttpSession session = httpRequest.getSession(false); if (session==null || session.getAttribute(SessionConst.LOGIN_MEMBER)==null){ log.info("미인증 사용자 요청{}",requestURI); //로그인으로 redirect httpResponse.sendRedirect("/login?redirectURL="+requestURI);//로그인 되면 다시 반환된 페이지로 로그인 return; } } //화이트 리스트일 때 chain.doFilter(request,response); }catch (Exception e){ throw e;//예외 로깅 가능하지만, 톰캣까지 에외를 보내주어야 한다. }finally { log.info("인증체크필터종료{}",requestURI); } { } }public String loginV3( 안에 HttpSession session=request.getSession(); 세션이 없으면 무조건 생성인데요.class LoginCheckFilter는 httpRequest.getSession(false);이거는 왜 false인가요? 로그인과 관련된 페이지 잖아요. 로그아웃의 경우 없애버릴꺼여서 세션을 만들지 않는것까지 이해했는데요.
-
미해결
get 방식과 post 방식 질문드립니다.
public class OrderController { private OrderService orderService; private MemberService memberService; private ItemService itemService; @GetMapping(value = "/order") public String createForm(Model model) { List<Member> members = memberService.findMembers(); List<Item> items = itemService.findItems(); model.addAttribute("members", members); model.addAttribute("items", items); return "order/orderForm"; } @PostMapping("/order") public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, @RequestParam("count") int count) { orderService.order(memberId, itemId, count); return "redirect:/orders"; } } 제가 http관련 수업을 들었지만, 코드로 적용할 때, 좀 헷갈리는 부분이 있어서 질문드립니다. @GetMapping은 기본적으로 "order" url에 이동했을 때, 실행되는 것이 맞나요?order 페이지로 이동했을 때, 자동으로 createForm 메소드가 실행돼서 모델에 members와 items를 담고 order/orderForm으로 전달하는 절차가 맞나요? 반대로 @PostMapping은 기본적으로 "order" url에서 값의 전달이나 변경이 있을 때, 실행되는 것이 맞나요?order url에서 값을 입력하고 버튼과 같은 동작을 누르면, 그 때 order 메소드가 실행돼서 매개변수로 넘어온 memberId, itemId, count로 주문해서 저장하는 것이 맞나요? 결론적으로 차이점을 말하자면, get방식은 해당 url로 접속했을 때 실행되는 것이고, post는 해당 url에서 값을 변경이나 전달할 때 실행되는 것이 맞나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
강의에서 나온 Service 레이어 테스트에 대해서 질문이 있습니당
강사님은 classicist를 지향한다고 했는데, classicist의 단위 테스트는 데이터베이스와 같은 공유 의존성을 테스트 대역(mock)으로 대체해야 한다는 것으로 알고 있는데 유연한 사고(?)로 classist를 지향하지만 통합 테스트로 단위를 확인하는 것을 좋아한다 정도로 정리하면 좋을까요? 아니면 H2를 사용했으니 테스트 대역을 운영환경보단 빠른 환경으로 교체했으니 여전히 단위 테스트라고 생각을 하시는 걸까요?service 레이어를 통합 테스트로 안 짜는 팀에서 classicist를 지향한다면 DB에 대한 의존성을 어떻게 대체하는지 간단한 예제라도 보여주실 수 있을까요? ㅠ
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
예외를 전환할떄 기존 예외 포함이 무슨 말인가요?
체크예외에서 런타임 예외로 변경할 때 cause 생성자를 포함 해야한다는 의미인건가요? 그리고 기존 예외가 포함된다는게 어떤 말인지 잘 모르겠습니다. 어떻게 기존 예외가 포함이 되는건가요? 또 예외출력 로그를 보고 어디가 문제인지 어떻게 판단하고 수정을 하는건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
34강 postman에서 send 하고 status=200 -> mysql에서 조회가 안되요
포스트맨에서 등록성공후 Mysql에서 person, address 테이블 확인하면 데이타가 없거든요.근데 Mysql 팝업메뉴에서 auto-commit 을 선택하면 갱신되서 데이타 보여요. Libraryapp 테스트할때도 UI화면에서 CUD하면 Mysql에서바로 안보이고 auto-commit을 해줘야 갱신이 되드라고요.@Transactional 에서 commit 하는건지요?맞다면 왜 mysql에서 commit을 따로 해줘야 할까요..제가 mysql 툴을 안써봐서 문의드려요^^
-
해결됨스프링 핵심 원리 - 기본편
UnsatisfiedDependencyException에러가 안잡힙니다.
[질문 내용]여기에 질문 내용을 남겨주세요.https://drive.google.com/file/d/1fuxg2PcUZOT1bxTbwcTS5ZLdbO-Iz_M5/view?usp=drive_link현재 제 프로젝트 압축파일을 구글 드라이브에 업로드했습니다. 현재 듣고 있는 강의는 섹션7. 조회한 빈이 모두 필요할 때, List,Map입니다.듣고 있는 부분은 8분34초 입니다. https://www.inflearn.com/questions/1089023/이 답변을 참고해서 해결방안 2, 해결방안 3을 모두 적용해봤지만 오류가 해결되지 않고있습니다.어떤작업을 해야할까요..?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
중요한 런타임 예외를 안잡아주면 시스템은 어떻게 되나요?
예시로 설명해주신 NetworlClient클래스의RuntimeConnectionEx 예외를 실제 시스템에서 잡지 않고 무시하면 서비스를 이용하는 고객들에게 어떤 문제가 발생하였는지 인지 시켜줄 수 없게되고 고객들은 연결이 안되는 서비스를 무한 로딩한 상태로 대기 하게 되는건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.다음과 같은 오류가 발생하는데 어떻게 해결하나요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
웹 프로젝트가 아닌 앱 프로젝트를 할 떄도 spring web을 사용하나요?
강의 내용이 어려워서 다시 마음 잡을겸 처음부터 보고 있습니다.강의 내용을 들으면서 앱도 웹 기반 동작을 하기 때문에 벡엔드 개발은 클라이언트에 의존하지 않는다고 이해 하였는데 웹 개발이 아닌 앱 개발을 할때도 start.spring.io 사이트에서 spring web을 다운 받으면 되는건가요?+ 현제 스프링 db1편을 수강중인데 db2편까지 수강을 마치면 db연동까지 가능한(동시에 여러 사용자가 사용하는) 프로젝트를 개발하는것이 가능한가요? 아니면 나머지 강의인 스프링 고급과 핵심원리 활용까지 수강을 하여야 하나요?
-
미해결스프링 핵심 원리 - 기본편
findAllBean 테스트 오류(member를 빈으로 등록하라는 오류)
[질문 내용]여기에 질문 내용을 남겨주세요. 섹션 7의 조회한 빈이 모두 필요할 때, List, Map 강의 위치 => 05:02 @Autowired에 빨간 밑줄이 가서 다른 질문글을 찾아보고 DiscountService에 @Component 어노테이션을 달아줬습니다.그래도 똑같은 오류가 뜹니다. package hello.core.autowired.allbean; import hello.core.AutoAppConfig; import hello.core.discount.DiscountPolicy; import hello.core.member.Member; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; public class AllBeanTest { @Test void findAllBean(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class, Member.class ); } //기존 orderService를 수정하면 코드 수정하기 복잡해져서 테스트용 클래스 따로 만들음. @Component static class DiscountService{ private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } } }org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'member' defined in file [C:\Users\hotay\OneDrive\바탕 화면\study\core\core\build\classes\java\main\hello\core\member\Member.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'java.lang.Long' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
스프링DB 2 :: 테스트 - 데이터 베이스 연동 오류
저는 데이터를 새로 생성해서 테스트를 했는데, save와 finditems 두 군데 모두 오류가 발생합니다. 링크 :: https://drive.google.com/file/d/1i7i95iRprKTD08l5TuPj1iCOAVPDvNTT/view?usp=sharing save 오류 :: org.opentest4j.AssertionFailedError: expected: hello.itemservicedb.domain.Item@a2df0d5 but was: hello.itemservicedb.domain.Item@26d028f7 finditems 오류 :: org.opentest4j.AssertionFailedError: Expecting actual: [hello.itemservicedb.domain.Item@4cc26df, hello.itemservicedb.domain.Item@7848321e, hello.itemservicedb.domain.Item@f4f843f, hello.itemservicedb.domain.Item@7b5833ee, hello.itemservicedb.domain.Item@1e471884, hello.itemservicedb.domain.Item@27261190, hello.itemservicedb.domain.Item@543b0737]to contain exactly (and in same order): [hello.itemservicedb.domain.Item@6e46891d, hello.itemservicedb.domain.Item@48632f69, hello.itemservicedb.domain.Item@5fde1d64]but some elements were not found: [hello.itemservicedb.domain.Item@6e46891d, hello.itemservicedb.domain.Item@48632f69, hello.itemservicedb.domain.Item@5fde1d64]and others were not expected: [hello.itemservicedb.domain.Item@4cc26df, hello.itemservicedb.domain.Item@7848321e, hello.itemservicedb.domain.Item@f4f843f, hello.itemservicedb.domain.Item@7b5833ee, hello.itemservicedb.domain.Item@1e471884, hello.itemservicedb.domain.Item@27261190, hello.itemservicedb.domain.Item@543b0737]
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트에서 select 로그가 노출안되는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 테스트 케이스 중 save() 테스트와 updateItem()테스트에서 itemRepository.findById를 호출하는 부분이 있습니다.itemRepository.findById(item.getId()).get();이 경우 select 쿼리가 나가는 걸로 알고 있는데 로그에는 노출되지 않습니다.1) save()2) updateItem()강사님 화면에도 노출되지 않던데 그 이유가 있을까요??
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
RDBMS 락과 비스니스 로직 전체에 대한 락 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 영한님.항상 좋은 수업 감사합니다. 이번 수업을 통해 MySQL 또는 Postgresql와 같은 대중적인 RDBMS의 경우,서로 다른 세션에서 시작된 서로 다른 트랜잭션에서 동시에 동일 테이블의 동일 row에 대해 write operation을 수행할 때에는,별도의 Pessimistic Lock등을 사용하지 않더라도,RDBMS에서 제공해주는 기본 락이 걸리는 것으로 이해했습니다.그럼에도 불구하고 상품 주문시 상품의 재고를 감소시키는 등의,비즈니스 로직 단위의 레이스 컨디션 문제의 경우,select 후 udpate를 하게 되는데그 select에서 update되기 전 값을 읽어온다면,(read operation에 대해서는 rdbms 기본 lock이 안걸리니깐)여기서 레이스 커디션 문제가 발생하므로,비즈니스 로직 단위의 레이스 컨디션 문제를 막고자 한다면DB 락 or 레디스 등 별도의 솔루션을 적용해야 하는 것으로 이해했는데요,제가 이해한 내용이 맞을지 질문 드립니다. 감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외를 처리하는 부분에있어서 질문있습니다!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]예외를 던지거나 잡아서 처리한다는 내용에 대해 질문이 있는데요.. 어떻게 예외를 처리해야하는지 그 부분이 현재까지 본 강의로는 조금 추상적이라 이해가 부족한데 혹시 조금더 설명 해주실수 있으실까요? try catch 를 이용해서 예외 발생시 롤백을 하고 어떤 응답값을 리턴한다 같은 처리를 이야기 하는걸까요?만약 그렇다면 @Transactional을 하는 경우는 롤백은 되지만 응답에 대한 처리는 어떻게 할 수 있을까요?
-
미해결코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
@RelaxedMockK로 모킹하고 save 함수를 왜 또 모킹하는지 모르겠습니다.
안녕하세요 강사님. 강의 정말 잘 듣고 실무에 적용해보려고 합니다. 강의 내용중 createPrinceTest_success 라고 하는 테스트 코드 예시에서 @Relaxed 로 모킹을 진행하고 오류가 발생해서 princeRepository.save()를 모킹하신다고 하셨는데, 그 이유가 어떤 이유인지 궁금합니다. CreatePrince.Request 객체를 만들고 princeMakerService.createPrince(request)를 호출하여 내부의 princeRepository.save()를 통해 저장되는 것을 테스트 하는데 외부에서 princeRepository.save()를 다시 모킹을 진행하고 랜덤 값으로 Prince 객체를 리턴 받는것이 조금 이해가 되지 않아서 질문드립니다.질 좋은 강의 너무 감사드립니다. 답변 주시면 감사하겠습니다!