묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 코드 createOrderWithStock 로그에 관하여
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 강사님. 테스트코드의 @Transactional은 마지막에 rollback을 하기 때문에 dirty checking을 하지 않고, 이로 인하여 update쿼리가 전송되지 않을것이라 생각했습니다.하지만 로그에는 update stock set created_date_time=?, modified_date_time=?, product_number=?, quantity=? where id=? Hibernate: update stock set created_date_time=?, modified_date_time=?, product_number=?, quantity=? where id=?이처럼 quantity를 변경한것에 대한 update쿼리가 전송되었습니다.이 부분에 대해서 찾아본 결과 "테스트 코드 마지막에서 stockRepository.findAll() 을 통해 stock을 전체 조회할때, select쿼리가 db에 직접 날라가기 때문에 select쿼리가 수행되기전 flush()로 인하여 update쿼리가 날아갔다." 라고 이해했습니다. 제가 이해한 내용이 맞을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@RequestBody에서 ObjectError를 사용할수는 없는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@RequestBody에서 @Validated를 통해서 검증하는 방법을 찾아보니까 BindingResult를 파라미터로 같이 받으면 MethodArgumentNotValidException 예외가 터지질 않는다고 해서 BindingResult를 파라미터에서 빼고 있는데 제가 만약 ObjectError를 넣고싶어서 reject()를 사용하고 싶으면 bindingResult.hasErrors()를 통해서 제가 직접 if문으로 예외를 던지는게 맞는건가요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
클라이언트마다 별도의 쓰레드 할당 질문입니다.
클라이언트마다 별도의 쓰레드가 할당되고 각 쓰레드별로 쓰레드로컬을 가지고있어 여기에 인증객체를 가진 SecurityContext가 저장된다고 설명해주셨습니다. 근데 제가 알기로 같은 사용자더라도 서버에 요청할때마다 다른 쓰레드가 할당되는걸로 아는데 아닌가요? 맞다면 같은 사용자이더라도 요청할때마다 별도의 쓰레드가 할당되므로, 이전 요청에서 로그인인증을 통해 저장했던 SecurityContext는 사용하지 못하는거 아닌가요?
-
해결됨스프링 핵심 원리 - 기본편
스프링 핵심원리 기본편 프로그램 Source Down 문의
안녕하세요..스프링핵심원리 기본편 학습중 입니다.강의자료에 PDF 파일은 제공이 되는데 프로그램 Source 는 제공이 되지 않나요 ?프로그램 Source 는 다운 받을수 없나요 ? 확인 부탁드려요.감사합니다.
-
해결됨서버개발자 과제전형 완벽가이드 - 1편
클린한 아키텍쳐에 관하여
안녕하세요.API 서버 구현 - 1 의 내용에 대해서 질문 드립니다. package com.library.service; import com.library.controller.response.PageResult; import com.library.controller.response.SearchResponse; import문을 보면 BookQueryService 와 BookRepository 가 controller 패키지의 DTO들을 의존하고 있습니다. 3-tier architecture 에서는 한 방향으로 의존 관계가 흘러야 한다고 알고 있는데, 아키텍쳐 부분에 대해서 의견을 듣고 싶습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Member테이블에 insert가 안돼요
[질문 내용]Create 테이블은 잘 되는데 insert가 안되서요 강의처럼 @Rollback(false) 넣었는데 insert 가 안뜹니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
인텔리제이 gradle 질문드립니다..
복습하려고 다시 프로젝트 처음부터 진행중인데, 이렇게 콘솔에 찍히면서 프로그램이 중단되어버립니다..구글에 찾아봐도 정보가 없고 gradle을 refresh하면,Could not create parent directory for lock file 이런식으로 나옵니다...그래서 https://memodayoungee.tistory.com/m/55이대로 진행해봐도 안되고 인텔리제이 캐시도 삭제해봤는데도 해결이안되서.. 너무 답답해서 질문드립니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
orderList 페이지 div크기 차이
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.html코드는 같은데 입력창의 배치가 form-inline으로 안 나오는 이유가 있나요?<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header"/> <body> <div class="container"> <div th:replace="fragments/bodyHeader :: bodyHeader"/> <div> <div> <form th:object="${orderSearch}" class="form-inline"> <div class="form-group mb-2"> <input type="text" th:field="*{memberName}" class="formcontrol" placeholder="회원명"/> </div> <div class="form-group mx-sm-1 mb-2"> <select th:field="*{orderStatus}" class="form-control"> <option value="">주문상태</option> <option th:each= "status : ${T(jpabook.jpashop.domain.OrderStatus).values()}" th:value="${status}" th:text="${status}">option </option> </select> </div> <button type="submit" class="btn btn-primary mb-2">검색</button> </form> </div> <table class="table table-striped"> <thead> <tr> <th>#</th> <th>회원명</th> <th>대표상품 이름</th> <th>대표상품 주문가격</th> <th>대표상품 주문수량</th> <th>상태</th> <th>일시</th> <th></th> </tr> </thead> <tbody> <tr th:each="item : ${orders}"> <td th:text="${item.id}"></td> <td th:text="${item.member.name}"></td> <td th:text="${item.orderItems[0].item.name}"></td> <td th:text="${item.orderItems[0].orderPrice}"></td> <td th:text="${item.orderItems[0].count}"></td> <td th:text="${item.status}"></td> <td th:text="${item.orderDate}"></td> <td> <a th:if="${item.status.name() == 'ORDER'}" href="#" th:href="'javascript:cancel('+${item.id}+')'" class="btn btn-danger">CANCEL</a> </td> </tr> </tbody> </table> </div> <div th:replace="fragments/footer :: footer"/> </div> <!-- /container --> </body> <script> function cancel(id) { var form = document.createElement("form"); form.setAttribute("method", "post"); form.setAttribute("action", "/orders/" + id + "/cancel"); document.body.appendChild(form); form.submit(); } </script> </html>
-
미해결실전! 스프링 데이터 JPA
스프링 데이터 Jpa 공통 인터페이스 기능 getOne(ID)
강의 자료 3. 공통 인터페이스 기능 마지막 주요 메서드 부분 getOne(ID): 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출여기에 적힌 getOne이 스프링 데이터 JPA 2.5 부터 getById로 변경 되었고 스프링 데이터 JPA 2.6 getReferenceById로 변경되어 3.0 부터 getById도 deprecated 되었다고 들었는데 강의 자료에는 변경되어 있지 않는 것 같습니다.
-
미해결스프링 핵심 원리 - 기본편
@Component 달때 rateDiscountPolicy에는 안다는이유
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) ㅇ[질문 내용]@Component 어노테이션사용하여 자동 빈등록을할때 8:30에서 설명하듯이 rateDiscountPolicy에는 @Component는 달고fixDiscountPolicy 클래스에는 안다는 이유가 궁금합니다.빈을 등록할때 fix와 rate중 사용할려는 정책은 rat이기때문에 중복해서 빈으로 등록하지않는거라고 생각하면될까요? 추후 fix로도 쓸수있을텐데 빈으로 등록안하는 이유가 궁금합니다
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
AuthenticationManager의 HttpSecurity 사용 부분에 질문 있습니다
CustomAuthenticationFilter 관련 설명에서 AuthenticationManager는 빈이 아니기 때문에 주입받지 못해 @Bean 선언하면 안된다고 설명하셨는데요.AuthenticationManager를 bean으로 등록하고 CustomAuthenticationFilter를 bean으로 등록해서 AuthenticationManager를 주입받는 식으로 코드를 짜도 될 것 같은데 그렇게 하지 않은 이유가 securityFilterChain 내에서만 사용되기 때문에 bean으로 등록할 이유가 없기 때문인가요? 아니면 혹시 다른 이유가 있나요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
야생형 코스는 MVC1편에서 바로 넘어가도 괜찮을까요??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]노베이스에서 자바 기본편부터 차근차근 MVC1편까지 완강했네요 !! 근데 그냥 이론만 보면서 공부하니 실제로 어떻게 쓰는지 감이 안 오는 경우가 많아 저도 영한님이 말씀하신거처럼 부딪히면서 하는게 맞는거같아서 바로 실전으로 들어가고싶은데 야생형의 최저 강의조건이 어느정도인지 궁금하네요 ㅠㅠ현재 MVC 1편까지 완강했는데 MVC2편까지는 완강을 하고 들어가는게 나을까요?아니면 바로 JPA활용으로 들어가도 괜찮을까요
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@PostConstruct와 @Transactional 빈 생명주기와 함께 순서를 정리해보고 싶습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]비슷한 질문과 답변을 많이 봤는데 한번 정리한 것을 확인 받고 싶습니다. 너무 많이 질문 받아 번거로우시겠지만 확인해주시면 감사합니다 스프링 빈의 이벤트 라이프사이클은 다음과 같았습니다스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 사용 -> 소멸전 콜백 -> 스프링 종료김영한님이 답변에서 정리해주신 말씀은 다음과 같습니다@PostConstruct는 해당 빈 자체만 생성되었다고 가정하고 호출된다. 해당 빈에 관련된 AOP등을 포함한, 전체 스프링 애플리케이션 컨텍스트가 초기화 된 것을 의미하지는 않습니다. 트랜잭션을 처리하는 AOP등은 스프링의 후 처리기(post processer)가 완전히 동작을 끝내서, 스프링 애플리케이션 컨텍스트의 초기화가 완료되어야 적용된다.이를 종합해서 일어나는 순서를 더 세분화 하면 다음과 같다고 생각합니다.스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(@PostConstruct) -> 스프링의 후처리기 적용(트랜잭션 AOP 등 프록시 객체 생성) -> 후 처리가 완료된 후 빈 등록 -> 스프링 애플리케이션 컨텍스트의 초기화가 완료 되어 어플리케이션 실행-> 사용 -> 소멸전 콜백 -> 스프링 종료예제 코드에서 위처럼 hello 클래스 로그를 찍어보면 프록시 객체라고 나오는 이유는 해당 메서드가 실행되는 시점이 사용 시점에 해당하기 때문이다전체적인 내용이 맞을까요?
-
해결됨실전! 스프링 데이터 JPA
섹션 3 지연 로딩 설정 후 MemberTest 실행 후 쿼리 문
이전 강의를 수강 하면서 엔티티 조회 시 지연 로딩 설정 시 즉시 조회가 되는 게 아닌 프록시 객체가 데이터의 위치를 가지고 사용할 때에 프록시 객체가 초기화 되며 데이터베이스에 쿼리를 요청하고 데이터를 받아 온다 라고 배웠습니다. 그렇다면 테스트 메서드를 실행하게 된다면Team, Member 객체를 persist -> 영속성 컨텍스트에 Member와 Team 존재flush() -> 영속성 컨텍스트에 들어있던 엔티티를 데이터베이스에 반영 -> insert 쿼리가 실행데이터베이스에 반영되었으나 아직 영속성 컨텍스트에는 값이 존재하는 상태clear() -> 영속성 컨텍스트에 들어 있는 데이터를 초기화createQuery로 Member 엔티티를 데이터베이스에서 조회 -> Member에 대한 select 쿼리 실행영속성 컨텍스트가 초기화 되었고 team이 지연 로딩으로 설정되어 프록시 객체가 생성루프를 돌며 getTeam() 호출 시점 team_id를 기반으로 데이터베이스에 team을 조회 -> Team에 대한 select 쿼리 실행memberA 조회 후 teamA에 대한 조회 쿼리가 발생하고 memberC 조회 후 teamB 조회 쿼리가 발생이러한 과정으로 이뤄진다고 배웠는데 테스트 코드를 돌려보니 member에 대한 조회 쿼리 후 team에 대한 조회 쿼리가 발생하지 않습니다.그래서 팀의 프록시 객체가 초기화 되었는지 체크하기 위해 Hibernate.isInitialized를 사용해 찍어봤는데 제일 처음 false 로 초기화 되지 않았다고 나오나 team을 조회하는 쿼리가 발생하지 않았습니다.찾다 보니 Hibernate에 쿼리 최적화 기능으로 영속성 컨텍스트는 초기화 되었지만 메모리가 초기화 된 것은 아니므로 해당 객체가 메모리에 존재한다면 Hibernate가 쿼리를 생략하고 해당 객체를 반환한다라는 게 있던데 그것 때문에 쿼리가 나가지 않는 건지 궁금합니다. 2차 캐시가 설정되어 있지는 않습니다. 스프링 부트 3.3.4, 자바 17, Hiberante 6.5.3 입니다!* 해결 *spring.jpa.properties.hibernate.show_sql=true하이버네이트 show_sql이 주석처리 format_sql만 출력되는 상황이었습니다.정상 출력 확인했습니다!package springPJ.dataJpa.domain; import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.hibernate.Hibernate; 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 java.util.List; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional @RequiredArgsConstructor @Slf4j class MemberTest { @Autowired EntityManager em; @Test void testEntity() { Team teamA = Team.builder().name("teamA").build(); Team teamB = Team.builder().name("teamB").build(); em.persist(teamA); em.persist(teamB); Member memberA = Member.builder().name("memberA").age(10).team(teamA).build(); Member memberB = Member.builder().name("memberB").age(20).team(teamA).build(); Member memberC = Member.builder().name("memberC").age(30).team(teamB).build(); Member memberD = Member.builder().name("memberD").age(40).team(teamB).build(); em.persist(memberA); em.persist(memberB); em.persist(memberC); em.persist(memberD); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); for (Member member : members) { log.info("team.isInitialized = {}", Hibernate.isInitialized(member.getTeam())); log.info("member = {}", member); log.info("member.team = {}", member.getTeam()); } } } select m1_0.member_id, m1_0.age, m1_0.name, m1_0.team_id from member m1_0 2024-09-21T19:36:05.194+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = false 2024-09-21T19:36:05.194+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=1, name=memberA, age=10) 2024-09-21T19:36:05.197+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=1, name=teamA) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = true 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=2, name=memberB, age=20) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=1, name=teamA) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = false 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=3, name=memberC, age=30) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=2, name=teamB) 2024-09-21T19:36:05.219+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : team.isInitialized = true 2024-09-21T19:36:05.220+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member = Member(id=4, name=memberD, age=40) 2024-09-21T19:36:05.220+09:00 INFO 7696 --- [dataJpa] [ Test worker] springPJ.dataJpa.domain.MemberTest : member.team = Team(id=2, name=teamB)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
원본 클래스 인스턴스와 프록시 인스턴스 모두 힙 영역에 저장되는걸까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링에서 @Transactional을 사용하게 되면 원본 클래스자체의 인스턴스와 클래스의 프록시 객체의 인스턴스 모두 힙 영역에 생성되는데, 프록시 객체만 스프링 컨테이너에 등록되고, 프록시 객체가 클래스 원본 인스턴스 참조를 가진다 라고 이해하면 될까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용2 실행 실패
테스트는 성공을 했는데 ItemServiceApplication을 실행했는데 실행이 되질 않습니다...제가 처음에 스프링부트는 3.x.x 버전을 사용하고 있는줄 알고 MyBatis 버전을 3.0.3으로 설정하고 "테스트 실행 도중" 오류가 생겼습니다.그래서 막 build.gradle에서 이것저것 건드리다가 강사님께서 올려주신 코드를 그대로 실행한걸 깨닫고 MyBatis 버전을 2.2.0으로 낮추고 다시 build.gradle을 원래대로 돌리니 테스트 코드가 정상 실행됐는데 이제는 애플리케이션 실행이 되질 않습니다 ㅠㅠ 뭐가 문제인걸까요..오류 코드는 아래와 같이 뜹니다..org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.ConnectException: Connection refused: localhost" [90067-200]제가 작성한 코드는 아래에 구글 드라이브 링크로 첨부하겠습니다.https://drive.google.com/file/d/1w5ys_ZxhtNr5-vgNq9-B_j1Y2CEkiktR/view?usp=sharing그리고 에러 메시지는 전부 붙여넣기 하려고 했는데 본문 글자수가 초과되서 실을수가 없어요...ㅠㅠ어떤게 문제인지 알려주시면 감사하겠습니다 ㅠㅠㅠMyBatis에서 갑자기 문제가 생겼어요....
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
SecurityContextPersistenceFilter & UsernamePasswordAuthenticationFilter
SecurityContextPersistenceFilter를 사용하고 폼 로그인 처리 방식을 사용한다고 하면 UsernamePasswordAuthenticationFilter를 사용할텐데 해당 필터는 스프링 시큐리티가 인증에 성공시 자동으로 세션에 시큐리티 컨텍스트를 저장한다고 했는데SecurityContextPersistenceFilter 또한 finally에서 세션에 또 저장을 하니까 2번 저장하게 될까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
SecurityContextPersistenceFilter
안녕하세요 강의 재미있게 듣고 있습니다!SecurityContextPersistenceFilter를 사용하고 폼 로그인 처리 방식을 사용한다고 하면 UsernamePasswordAuthenticationFilter를 사용할 텐데 해당 필터는 스프링 시큐리티가 인증에 성공 시 자동으로 세션에 시큐리티 컨텍스트를 저장한다고 했는데SecurityContextPersistenceFilter 또한 finally에서 세션에 또 저장을 하니까 2번 저장하게 될까요?
-
미해결스프링 핵심 원리 - 기본편
의존성 주입
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 설명해주신 의존성 주입은 스프링에서 객체지향 코딩을잘 할 수있도록 클래스의 컴포지션을 런타임 타임에 스프링에서 결정해주는 시스템으로 이해했는데 맞을까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Controller와 Service, Repository
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]OrderApiController에서 Repository를 이용하여 전체 조회를 하고 있는데 원래 컨트롤러 단은 서비스에 의존하는 것으로 아는데 어차피 findAll()메서드의 동작이 service단에서 public List<Order> findOrders(OrderSearch orderSearch){ return orderRepository.findAll(orderSearch); }이런 식으로 만들어도 Repository것을 변경하지 않고 그대로 실행하는 것에 불과해서 Controller에서 Repository단에서 아래처럼 바로실행하는 것인가요? private final OrderRepository orderRepository;