묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
item.html에서 체크박스가 어떻게 체크여부를 확인하는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]item.html에서 작성한 multi checkbox 입니다.여기서 th:field = "*{regions}"의 값은 item 객체에 있는 regions를 사용하는 것이고, 사용자가 체크한 key값이 들어가있는 것은 이해가 됐고th:value는 model로 보내준("SEOUL", "서울"),("BUSAN", "부산"),("JEJU", "제주")중 key값인 SEOUL, BUSAN, JEJU 값이 들어있는 것은 커뮤니티의 비슷한 질문을 확인해서 이해를 했습니다..ㅜㅜ 근데 사용자가 체크한 regions 리스트로 어떻게 체크 여부를 알 수 있는건가요..?? 저 코드에서 checked를 판단하는 코드가 어떤건지 궁금하고 헷갈립니다 ㅠ.ㅠ.....비교를 한다는게 무슨 말인지 모르겠어요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Controller 안에서 @Transaction 설정이 다른 2개의 method 호출
@Slf4j @RestController public class AController { @Autowired AService aService; @Autowired BService bService; @PostMapping("/api/v2/aaaa") public ResponseEntity<ResponseDto> postA( @RequestBody @Valid PostADto postADto, HttpServletRequest request) throws Exception { A a = aService.getA(request); HashMap<String, Object> result = bService.createB(postADto, a); .... }위 와 같이 컨트롤러에서 aService.getA(request); 와 bService.createB(postADto, user); 메서드를 호출합니다.각 메서드는 아래와 같이 선언돼있습니다.@Transactional(readOnly = true) public A getA(HttpServletRequest request) { .... return aRepository.findById(id).orElse(null); }@Transactional public HashMap<String, Object> createB(PostADto postADto, A a) { ...... bRepository.save(postADto.toB()); ...... return ...; }getA 메서드안에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly(); log 출력했을때 readonly = true로 나오고 readDB로 잘 연결됩니다. 하지만 createB 메서드안에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly(); log 출력했을때 readonly = false로 나오는데 실제로는 readDB로 연결되고 query를 발생시켜 아래와 같은 오류가 발생합니다.Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement 컨트롤러에 @transactional 을 선언하지 않았기 때문에 각 메서드에서 트랜잭션이 수행되어 getA 메서드에서는 readDB로 createB 메서드에서는 writeDB로 요청이 된다고 알고 있었는데 그런 방식으로 동작이 안되 혼란스럽습니다. 어떤 이유로 이런 문제가 발생하는지 궁금합니다. 그리고 왜 이렇게 동작하는지 어느 부분을 학습하면 좋은지 궁금합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Transactional 내부에서 트랜젝션 템플릿이 사용되나요
@Transactional 내부에서도 결국 트랜젝션 템플릿을 사용해서 트랜젝션 처리를 하는지 궁금합니다!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타임리프 param 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]타임리프 뷰 템플릿에서 param을 통하여 쿼리 파라미터에 입력된 값에 접근할 수 있다는 사실을 알고 있습니다실습해본 결과 param을 통해서 name , age와 같은 단순 타입들만 받을 수 있었는데 컨트롤러에서 @ModelAttribute의 기능과 같이 타임리프에서 객체를 파라메터로 받을 수 있는 방법이 있나요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
필터를 여기저기 옮기기 좋게 만들어보고 싶어서 고민한 방향을 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]등록 방법에는 FilterRegistrationBean 을 @Bean 으로 등록하는 방법@WebFilter 대상을 @ServletComponentScan 으로 스캔하는 방법2방법의 단점으로는 공홈에 확인 결과 내장 톰켓에서 사용된다 영상강의에 나오는 내용에 정렬순서를 지정할 수 없다고 하셨는데정렬은 @Order를 사용하면 되지 않을까요?또한 내장 톰켓을 위한 방법이기 때문에 해당 필터를 @Component로 Bean 으로 등록하면 되지 않을까요? 해당 생각대로 일단 내장 톰켓과 외장 톰켓으로 테스트 해보았습니다.우선순위의 테스트는 FilterRegistrationBean 으로 등록한 A필터 정렬순서 2로 @Order(1)와 @Component를 이용한 B필터를 확인결과@Slf4j @Component @WebFilter(urlPatterns = "/*") @Order(2)이렇게 작성하여 내장 외장 모두 잘 동작하였고 순서를 위해 @Order 기능을 확인 결과 잘 되는 것을 확인했습니다.필터를 이 프로젝트 저 프로젝트 옮기며 꽂아서 쓸수있게 만들고 싶어서 이렇게 고민했는데이 방법이 혹시 문제점이 있을 까요?또는 제가 잘못 생각한 부분이 있을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
consumes="*\/*" 오타일까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6. 스프링 MVC - 기본 기능.pdf 13페이지에 이 두 사진에 해당하는 내용이 있습니다.그런데consumes="*\/*"produces = "*\/*" 이건 오타인가요?인텔리제이에서 consumes="*\/*" 이렇게 해 보면 빨간 줄이 표시됩니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
인텔리제이 콘솔 한글깨짐
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요.학습 질문에서 인텔리제이 콘솔 한글깨짐에대한 글을 모두 확인해보고 해결이 되지않아서 글을 남기게 되었습니다. IntelliJ Version : IntelliJ IDEA Community Edition 2023.3.3현재 프로젝트 생성시 정보는 아래와 같습니다.Project: Gradle- GroovyLanguage : JavaSpring Boot : 3.2.2Packaging : WarJava : 21또한, Gradle 설정에서 IntelliJ IDEA로 변경하는 부분은 Spring Boot 3.2 이전에만 적용된다하여 해당 부분은 그대로 Gradle로 설정되어 있습니다. 아래는 한글 깨짐현상 이미지입니다. 아래는 콘솔 한글 깨짐을 해결하기 위해서 적용한 방법들 입니다.File Encodingshelp > Edit Custom VmOptions.. 해당 부분은 직접 설치된 곳의 파일에도 추가해보았습니다. build.gradle 에 encoding 관련 설정 추가application.properties 설정 추가Run/Debug Configurations 설정 위의 5가지 방법을 모두 적용하였지만 콘솔에서 한글깨짐은 그대로입니다.해결 방법을 알려주시면 감사하겠습니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
RequestDispatcher.ERROR_MESSAGE 빈 문자열
제가 모든 error를 정해진 form에따라 응답하고 싶은데,어떻게 할까 하다가 방법을 BasicErrorController를 커스텀해서 사용해야겠다 생각했습니다.CustomErrorController의 코드는 다음과 같습니다.그런데 응답값에 오류 message가 들어가지 않아서디버깅해봤는데, request안에 attribute안에 jakarta.servlet.error.message에 빈문자열이 들어가있는걸 확인했습니다.이게 response.sendError(400, "400에러 발생!"); 과 같이 할경우에는 message에 값이 들어가고,throw new RuntimeException("에러 발생") 과 같이 예외를 던질때만 message에 값이 담기지 않습니다.도움주시면 감사하겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2.bat 실행 안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]윈도우라 "h2.bat" 혹은 "H2.bat"으로 확인해봤는데 아무 반응이 없습니다. 여러 글을 찾아보니 자바 환경변수와도 상관이 있는 것 같더라구요. 근데 제가 jdk11, jdk17을 깔아놔서 설정을 아래 블로그를 참고해서 설정을 해놨거든요.참고) https://computer-science-student.tistory.com/467아래는 제가 설정해놓은 캡쳐화면입니다.그래서 혹시 자바 환경변수 문제일까 싶어 H2DB JDK 설정 해주는 아래 블로그도 참고하여 기존 h2.bat을 메모장에 연결하여 내용을 변경해 보았습니다.참고) https://ikcoo.tistory.com/80 기존 h2.bat 내용은 @java -cp "h2-1.4.200.jar;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Console %*@if errorlevel 1 pause 입니다.이거를 블로그처럼기존 jdk17파일이 설치돼있는 경로로 설정 ex) @C:\Program Files\Java\jdk-17\bin\java -cp "h2-1.2.127.jar;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Console %* @if errorlevel 1 pause위에 말한 환경변수 2개를 scripts 파일에 넣어놓은 경로로 설정 ex) @C:\Program Files\Java\scripts\java17 -cp "h2-1.2.127.jar;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Console %* @if errorlevel 1 pause이렇게 다 해봤는데 안됩니다.. ㅠㅠ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
14:18에서 AopCheck() 테스트하는 부분 질문드립니다
@Test void AopCheck() { log.info("memberService.class={}", memberService.getClass()); log.info("memberRepository.class={}", memberRepository.getClass()); }테스트를 실행하면 memberService.getClass()에 해당하는 부분만 CGLIB~~이 적용된, 즉 AOP가 적용된 인스턴스라는 것을 확인할 수 있었습니다. memberRepository.getClass()는 평범한 인스턴스이고 memberService.getClass()만 AOP가 적용된 인스턴스인 이유는 추측건대 @Transactional // proxy가 비즈니스 로직 대신 호출. 성공하면 commit, 런타임 예외가 터지면 rollback public void accountTransfer(String fromId, String toId, int money) throws SQLException { bizLogic(fromId, toId, money); }MemberService내의 메서드에 @Transactional이 붙어서인 것 같습니다. 클래스 레벨에 @Transactional을 붙이지도 않았는데도 클래스 정보를 가져오는 메서드인 getClass()를 통해 AOP가 적용된 인스턴스로 확인되는 이유가 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Whitelabel Error Page
[질문 내용]package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.SplittableRandom; @Controller public class HelloController { @GetMapping("hello") public String hello(Model model) { model.addAttribute("data", "hello!!"); return "hello"; } @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; } @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name) { return "hello " + name; } }똑같이 따라 쳤는데도hello-mvc / hello-string은 아래와 같이 오류가 뜹니다..!어떻게 해결할 수 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle build 오류 해결이 안됩니다ㅠㅠ!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Please set the JAVA_HOME variable in your environment to match the location of your Java installation.다른 질문 게시물을 보고 java를 설치했음에도 저렇게 뜨는데 어떻게 해결할 수 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
save()테스트 시 오류 해결 궁금증
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. save() 테스트 실행했더니 오류가 발생했습니다.구글링 통해서 아래 빨간박스 친 부분은 Gradle에서 IntelliJ IDEA로 바꿔 줬더니 오류가 해결되었는데요, 이유가 궁금해서 질문 남깁니다.++ 추가로 메인 서블릿 코드는 Gradle로 해줘야 오류가 안나는데... 이유도 알고 싶고앞으로도 실행할 때, 아래 설정 변경해 주면서 하면 되는걸까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
requestParam과 PathVariable
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]RequestParam 과 Pathvariable의 차이가 무엇인가요 ?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
타임리프문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]editForm.html에서 모든 수량파트만 타임리프 th:value 가 안먹힙니다 ㅠㅠ 왜 그런지 모르겠어요items.html에는 수정한 수량이 반영이 되지만 editForm.html의 모든 quantity 만 10으로 초기화가 되네요 ㅠ<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <link href="../css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"> <style> .container { max-width: 560px; } </style> </head> <body> <div class="container"> <div class="py-5 text-center"><h2>상품 수정 폼</h2></div> <form action="item.html" th:action method="post"> <div> <label for="id">상품 ID</label> <input type="text" id="id" name="id" class="form-control" value="1" th:value = "${item.id}" readonly> </div> <div> <label for="itemName">상품명</label> <input type="text" id="itemName" name="itemName" class="form-control" th:value = "${item.itemName}" value="상품A"> </div> <div> <label for="price">가격</label> <input type="text" id="price" name="price" class="form-control" th:value = "${item.price}" value="10000"> </div> <div> <label for="quantity">수량</label> <input type="text" id="quantity" name="quantity" class="form-control" th:value = "${item.quantity}" value="10"> </div> <hr class="my-4"> <div class="row"> <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit">저장</button> </div> <div class="col"> <button class="w-100 btn btn-secondary btn-lg" onclick="location.href='item.html'" th:onclick="|location.href='@{|/basic/items/${item.id}|}'|" type="button">취소 </button> </div> </div> </form> </div> <!-- /container --> </body> </html>
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링부트 핸들러 매핑
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]잘못된 Url 을 입력한 경우 즉, 등록한 Url 이 없을 경우 스프링부트 콘솔창에는 아무 에러도 나지 않는데, 왜 그런가요? 핸들러 매핑이 아예동작이 안되는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
강의 4:50에서 커넥션 풀 고려하는 부분 질문드립니다
리소스 정리에 관련해서 질문드립니다. con.close()의 경우, 커넥션 풀을 사용하는 커넥션일 때 close()시에 커넥션 종료가 아닌 커넥션 풀로 다시 반환된다는 것으로 이해했습니다. 그런데 con.setAutoCommit(true)로 되돌릴 때 커넥션 풀을 고려해야한다는 부분이 이해가 가지 않아서 질문드립니다. 커넥션 풀과 상관없이 오토커밋은 true로 바꿔야하는 것 아닌가 해서요. +추가 질문: 개발자가 트랜젝션 매니저를 이용한 트랜젝션을 구현한다면 따로 위의 두가지 코드를 작성해줄 필요가 없는 것 맞는가해서 질문드립니다.(ServiceV2에서의 finally 구문을 ServiceV3_1에서는 생략한 것과 같은 맥락으로) 친절한 답변 항상 감사드립니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
AopCheck() 로그가 강의와 다릅니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. memberService 부분의 로그가강의에 나온 'EnhancerBySpringCGLIB..'부분으로 나오지않고 SpringCGLIB로만 나옵니다. 오류가 나지는 않는데 강의와 동일하게 적용이 되고 있는지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
handler의 정확한 의미
안녕하세요 핸들러가 아직 머리속으로 완전히 이해가 안됐는데요제가 이해한 핸들러는bean 이름이나 anootation으로 Controller를 찾아주는것으로 이해를했는데요 이게 아니라면 핸들러의 정확한 뜻이 뭘까요?조금 헷갈리네요 ㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원서비스(MemberService) 부분
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 우선 회원 서비스 테스트 부분 까지 강의를 듣다가 궁금한 점이 생겨 문의 드립니다. 1. MemberRepository 인터페이스를 상속하는 MemoryMemberRepository에서 store라는 이름을 가진 map에 각 반환값들 저장 2. 그 후 MemberService에서 "private final MemberRepository memberRepository;" 인터페이스 사용 및 생성자 주입 방식을 통해 DI를 구현하는 것 까지는 알겠는데, 아래 회원가입 및 전체 회원 조회 시 사용되는 memberRepository.save(member); 혹은 memberRepository.findAll(); 여기서 말하는 memberRepository가 인터페이스 자체에서 값을 불러오고 거기에 저장이 되는건지, 정확히 무엇인지 궁금합니다. 여기까지 제가 이해한 내용이 맞는지 궁금하기도 하고, 2번 부분에서 memberRepository가 정확히 어디에 저장이 되고 데이터가 불러와지는지가 궁금합니다!