묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Entity 메소드 파라미터로 DTO를 받는 것, 괜찮을까요?
1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요? JPA 수업 수강 후, 실제 업무에 적용하는 와중에 궁금한 점이 있어서 질문 남깁니다. DB Update를 위한 Entity Method의 파라미터로 DTO를 받는 것이 프로그램 구동상에는 전혀 문제는 없는데요. Domain driven design을 구현하는데에 있어서 엔티티 메소드의 파라미터로 DTO를 집어넣는게 바람직한 설계(?) 인지 문의 드립니다. 질문의 보다 빠른 이해를 위해 샘플 코드 및 시나리오를 아래와 같이 남깁니다. - 상황 : 회원정보수정 API의 input으로 MemberDTO를 받음 - MemberDTO 내에 ContactDTO, List<AddressDTO>를 가진 구조 (Nested) class MemberDTO { ... private ContactDTO contactDTO; private List<AddressDTO> addressDTO; ... } - Service 레벨에서 memberRepository.findById() 통하여 Member Entity를 불러옴. - Member Entity와 Contact Entity은 1:1조인, Address Entity와는 1:N 조인 - Contact 및 Address 업데이트를 위해 Entity레벨에 다음의 메소드를 구현해두었으며, member.getContact().updateContact(contactDTO)로 해당 메소드를 호출 @Entity class Contact(또는 Address) { ... public void updateContact (ContactDTO contactDTO) { ... this.phoneNumber = contactDTO.getPhoneNumber(); ... ... } } 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
spring.profile.active=test 에러
안녕하세요. 강의에서 말씀해주신 /src/test/resources/application.properties 파일에서 테스트 profile설정을 완료 했는데요. ItemRepositoryTest 실행 시 테스트 profile 설정을 읽어오지 못하는 것 같아서 질문 드려요. 실행해보면 아래 메세지가 뜨고, 스프링이 띄워지는데 profile 정보가 "local"로 잡히네요. 원인을 검색해봤는데 해결 가능한 답변을 찾지 못해서 질문드립니다. ㅠ 18:03:27.880 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 18:03:27.918 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)] 18:03:28.051 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [hello.itemservice.domain.ItemRepositoryTest] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper] 18:03:28.088 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [hello.itemservice.domain.ItemRepositoryTest], using SpringBootContextLoader 18:03:28.103 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [hello.itemservice.domain.ItemRepositoryTest]: class path resource [hello/itemservice/domain/ItemRepositoryTest-context.xml] does not exist 18:03:28.105 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [hello.itemservice.domain.ItemRepositoryTest]: class path resource [hello/itemservice/domain/ItemRepositoryTestContext.groovy] does not exist 18:03:28.105 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [hello.itemservice.domain.ItemRepositoryTest]: no resource found for suffixes {-context.xml, Context.groovy}. 18:03:28.107 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [hello.itemservice.domain.ItemRepositoryTest]: ItemRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 18:03:28.176 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [hello.itemservice.domain.ItemRepositoryTest] 18:03:28.261 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [C:\workspaces\spring-db-2\itemservice-db\bin\main\hello\itemservice\ItemServiceApplication.class] 18:03:28.264 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration hello.itemservice.ItemServiceApplication for test class hello.itemservice.domain.ItemRepositoryTest 18:03:28.407 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [hello.itemservice.domain.ItemRepositoryTest]: using defaults. 18:03:28.408 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener] 18:03:28.432 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@1f6c9cd8, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@5b619d14, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@66746f57, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@447a020, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@7f36662c, org.springframework.test.context.support.DirtiesContextTestExecutionListener@28e8dde3, org.springframework.test.context.transaction.TransactionalTestExecutionListener@6d23017e, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@54dcfa5a, org.springframework.test.context.event.EventPublishingTestExecutionListener@1817f1eb, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@767e20cf, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@3a3e78f, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@301ec38b, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@17a1e4ca, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@10ded6a9, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@c5dc4a2] 18:03:28.437 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@35d08e6c testClass = ItemRepositoryTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@53d102a2 testClass = ItemRepositoryTest, locations = '{}', classes = '{class hello.itemservice.ItemServiceApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@4b8d604b, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3932c79a, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@821330f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@210ab13f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@6a4f1a55, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@4c40b76e], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true]], class annotated with @DirtiesContext [false] with mode [null]. INFO 15312 --- [ main] h.itemservice.domain.ItemRepositoryTest : The following 1 profile is active: "local"
-
미해결스프링 핵심 원리 - 고급편
test 메서드 snake case
영한님 안녕하세요. 테스트 케이스 작성하실 때, 메서드 이름을 camel 케이스가 아니라 snake case로 작성하시던데, db 강의 때도 그렇게 하셔서 궁금했는데 뭔가 이유가 있으신 건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ModelAttribute 생성자
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. ModelAttribute 사용시, 객체를 생성한후 프로퍼티바운딩을 해준다고 배웠는데, Item 클래스에는 기본생성자가 없어서 객체를 어떻게 만드나 궁금해서 soutm을 찍어보니 Item(String name, Integer price, Integer quntity) 생성자를 호출해 주더라고요, 그리고 Item 클래스에 Item() 생성자를 만들어주면 ModelAttribute이용시에 Item()생성자를 호출하는것을 확인했습니다. 여기에서 질문하겠습니다. ModelAttribute 사용시 객체를 생성할때, 여러생성자가 있다면, 어떤 생성자가 호출되는지 메커니즘이 있나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
N+1 문제를 맞게 이해한 것인지 잘 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 이번 강의를 통해 공부하면서 N+1문제를 아래와 같이 이해하였습니다. ex) 모든 주문 내역을 가져오는 경우 -> 실제로 나가는 쿼리는 select * from orders 쿼리 한방이지만, 1) 이때 지연로딩인 경우 , 조회한 order에 대해 member나 delivery를 필요로 하는 경우에 각 order별로 member나 delivery 조회 쿼리가 N번씩 나가게 되고 2) 즉시 로딩인 경우, select * from orders 라는 모든 주문 조회 쿼리 한방이 나간 후, 곧바로 조회한 order들과 연과된 member와 delivery 조회 쿼리가 이어서 나가게 된다. (단 이떄 예측할 수 없는 쿼리가 나갈 수 있음.) 즉 정리하면 즉시로딩과 지연로딩 모두 N+1 문제가 발생할 수 있지만, 즉시로딩은 예측할 수 없는 쿼리가 나갈 수도 있어 최적화 시키기 어려운 반면, 지연 로딩은 페치 조인을 사용하여 order를 조회하면서 동일 쿼리 상에서 member나 delivery도 함께 가져오게 하는방법으로 최적화 시킬 수 있으니, 지연로딩을 사용하는것이 옳다. 라고 이해하였는데, 맞게 이해한 것인지 잘 모르겠습니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
message body에 "ok"를 넣은 후, 리다이렉트시 Content-Length
[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] message body에 writer.pringln("ok"); 를 작성한 상태로, 리다이렉트를 하지않고 http://localhost:8080/response-header 를 접속하면, Response Headers에 Content-Length가 prinln을 포함하여 3으로 나오는데, http://localhost:8080/basic/hello-form.html로 리다이렉트시, http://localhost:8080/response-header의 Response Headers의 Content-Length가 0으로 나옵니다. 3으로 나와야하는 것 같은데 왜 0으로 나오나요? 0으로 나오는 이유가 궁굼합니다. HTTP 강의도 들었는데, 302는 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음(MAY)라고 알고있습니다. 여기서 본문이라함은, 메시지 바디이며 메시지 바디가 제거된 것, 즉 본문이 제거된 경우라고 이해하면 될까요? 아니면 다른 이유가 있거나, 제가 잘못 이해하고 있는지 궁굼합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
리턴 값을 받지못함.
이렇게 계속 못잡아주고있습니다 이럴 때는 어떻게 해결해야하나요 ㅜ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Batch Size에서 두 번째 Order의 ID가 IN 쿼리에 들어가는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 처음 OrderItem을 조회할 때 두 번째 Order의 ID(11)와 함께 IN 쿼리를 통해 조회됩니다. 여기서 IN 쿼리에 두 번째 Order의 ID가 들어가는 이유에 대해 생각해보았습니다. 1. 현재 Order 엔티티를 통해 OrderItem을 조회하고 있다. 2. batch가 설정되어 있기 떄문에 1차 캐시에 들어있는 Order들을 통해 최대 batch_size개 까지 IN 쿼리를 통해 조회한다. 3. 조회 대상이 된 1차 캐시에 들어있던 Order들 중에 두 번째 Order가 포함되어있었기 때문에 IN 쿼리에 두 번째 Order의 ID가 함께 들어갔다. 4. member와 delivery를 fetch하지 않았을 때도 위와 같은 이유로 한번에 조회되었다. 이런 과정을 거쳐서 같이 조회가 되지 않았나 생각해보았습니다. 제가 생각한 이유가 맞거나 혹시 틀린 부분이 있는지 궁금합니다. 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
실행환경 트랜잭션
영한님 안녕하세요. 테스트 환경에서 트랜잭션을 하는 방법은 이해하겠는데, 예제 코드의 실행환경에서는 트랜잭션 처리를 해줘야 하지 않나요? JdbcTemplate이나 MyBatis 관련 코드는 실행환경에서 따로 Transaction 처리를 해주는 게 없어서 그런데 따로 이유가 있어서 추가하지 않으신 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 열 때, build.gradle 을 생성하는 이유
안녕하세요, 먼저 수업 정말 잘 듣고 있습니다 :) https://www.inflearn.com/questions/394903 저도 비슷한 에러를 겪었는데 (저는 빌드는 되는데 sonarlint 라고 코드 에러를 리뷰해주는 프로그램에서 비슷한 warning 메시지를 주었습니다) 조언해주신 대로 프로젝트를 열 때 build.gradle 을 열어서 해결했습니다. 저는 프로젝트 작업을 할 때, recent project 로 주로 꺼내오는(?) 편인데요 (혹은 인텔리제이를 닫지 않고 계속 작업하기도 합니다) 프로젝트를 가져올 때, build.gradle을 open 하는 것과, open 프로젝트 폴더 이름 혹은 open recent project 하는 것의 차이가 있는지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
컴포넌트 스캔 방식을 이용하면 @Bean 어노테이션을 쓸 필요가 없는건가요
컴포넌트 스캔 방식 말고, AppConfig와 같은 설정파일에 수동으로 직접 빈을 등록하는 경우 @Bean 어노테이션을 써서 스프링 컨테이너에 빈을 직접 등록했는데, 컴포넌트 스캔 방식을 활용하면 이런 @Bean 어노테이션을 쓸 필요가 없는것이지요?? 그럼 @ComponentScan 과 @Bean 이 두개의 어노테이션은 표기만 다른것이지 결국 똑같은 일?(빈 등록)을 하는 녀석들인건가요 ..! (너무 기본적인 질문같아서.. 죄송합니다)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Service @Repository 해주는 이유
안녕하세요. 강의 잘 듣고 있습니다. Service 코드와 Repository 코드 관련해서 의문이 하나 있는데요. ItemServiceV1이나 JdbcTemplateItemRepository, MyBatisItemRepository 등등에 @Service랑 @Repository를 해주는 이유는 뭔지 알 수 있을까요? (JdbcTemplate, MyBatis)Config에서 새로운 ItemService와 ItemRepository를 받아서 빈으로 만들어지 거면, @Service나 @Repository는 필요 없는 게 아닌지... 혹시 다른 이유가 있으신가요? @SpringBootApplication(scanBasePackages = "hello.itemservice.web") 그리고 이 코드 때문에 @Service랑 @Repository를 붙여도 ComponentScan 대상에 제외되기 때문에 @Service랑 @Repository가 필요없을 거 같은데 아닌가영?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2연결
(사진)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
에러
안녕하세요.Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-06-29 21:39:03.114 ERROR 10435 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : 라는 문구가 콘솔창에 뜨며 안됩니다.. 왜 그런 것인가요..?ㅜ 인텔리제이로 하고있습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
안녕하세요 강의 잘듣고있는데 질문이있어요
<script th:inline="javascript"> [# th:each="user, userStat : ${users}"] var user[[${userStat.count}]] = [[${user}]]; [/]</script> 이부분에서 마지막에 [/] 은 왜적어준건가요? 혹시 몰라서 삭제하고 실행해봤더니 오류가 나더라고요. 꼮있어야하는부분인가요 그렇다면 이유는 무었인가요?
-
미해결
서울시뉴딜일자리_IT인턴 3개월 [급여월260만]지원사업안내_빅데이터 기반 서비스플랫폼 과정 [스터디,프로젝트,프론트엔드,백엔드,자바,코딩]
서울시에서 뉴딜일자리사업 일환으로 2차 서비스플랫폼개발자 양성과정으로 3개월 인턴십 (급여 월 260) 보내주는 프로그램 진행중인데 신청해보세요! 자세한 내용은 https://blog.naver.com/kjc_sh/222775806456 참고해주세요~
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
validation
2분45초쯤에 itemName이 나온 과정이 스프링 부트가 LocalValidatorFactoryBean을 Validator에 등록한후 컨트롤러에 @Validated를 타고 FieldError를 생성후 BindingResult에 담겨진 객체의 필드명을 에러코드메시지 파라미터에 넘겨줘서 itemName 공백x 라고 표시가 된건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
hello.html에서 ${data} 빨간줄
안녕하세요. 강의 정말 잘 듣고있습니다! 다름이 아니라 아..마..도? devtools dependency를 추가해주고 난 다음 발생한 것 같은데 hello.html에서 ${data} 빨간줄이 그어져 있네요. 마우스로 갖다 대보니 cannot resolve 'data'라는 문구가 뜨지만 실행 시키면 콘솔 창에 별다른 오류도 없고 devtools 등 전부 정상 작동 합니다. 어떤 것 때문에 그런것일까요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderService에서 itemService ItemRepository를 주입하는 것에 대해서 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]김영한 멘토님 덕분에 스프링에 대해서 쉽게 공부할 수 있어서 항상 감사함을 느끼고 있습니다.멘토님의 강의를 복습하던 중 궁금한 것이 생겨서 질문 남깁니다.제가 의구심을 가지는 코드 부분은 다음과 같습니다. @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class OrderService { private final MemberRepository memberRepository; private final OrderRepository orderRepository; private final ItemRepository itemRepository; /** 주문 */ @Transactional public Long order(Long memberId, Long itemId, int count) { //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); .... } .... } @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class ItemService { private final ItemRepository itemRepository; .... public Item findOne(Long itemId) { return itemRepository.findOne(itemId); } } @Repository @RequiredArgsConstructor public class ItemRepository { .... public Item findOne(Long id) { return em.find(Item.class, id); } } 여기서 제가 궁금한 점은 OrderService에서 ItemService 대신 itemRepository를 주입한 이유가 궁금합니다! 물론, 둘 다 실행은 동일하게 되지만, itemRepository를 ItemService에서만 접근하게 하고, 타 클래스에서 item에 관한 로직은 무조건 ItemService으로만 접근하는 식으로 해야 item에 관련된 로직들이 응집도가 높아지고, 모듈 간 결합도가 낮아지지 않을까요?? 멘토님의 의견이 궁급합니다!
-
미해결스프링 핵심 원리 - 기본편
appconfig
안녕하세요 김영한 개발자님 강의를 복습하다가 궁금한 점이 생겨서 질문남깁니다. appconfig class에서, 아래 코드 public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } } ... 처럼 구현 객체를 생성하고 연결하는 책임을 가진다고 하셨는데, 그럼 제 생각에는 MemberServiceImpl 클래스가 생성되기 전에 AppConfig 클래스가 먼저 실행되어야 한다고 여겨집니다. 그런데 코드 어느 부분에서도(MemberApp, OrderApp 제외) Appconfig 클래스를 호출하는 부분이 없어서 매커니즘(?)이 궁금했습니다. appConfig라는 이름의 클래스가 있으면 스프링이 자동으로 실행시켜주는 것인지, 아님 MemberApp, OrderApp과 같은 클래스를 만들어서 사용해야 하는 것인지 헷갈리는데 어떤게 맞을까요?! (여담이지만, 처음들었을 때 헷갈렸던 내용이 반복해서 들으니 이해가 자연스럽게 돼서 너무 감격스럽고 성장한 것 같아 행복합니다. 아직 궁금한점도 많고 부족하지만 꾸준히 공부하겠습니다. 좋은 강의와 항상 답변해주시는 서포터즈 분들도 감사드려요)