- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ppt로된 강의자료가 어디 업로드 되어있나요? 어디서 다운로드 받을수 있는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] FrontControllerServletV5 에서 의존성 주입을 도전해보려고 다음과 같이 코드를 작성했습니다. FrontControllerServletV5에 HandlerMappingConfig, HandlerAdapterConfig를 이용하여 handlerMappingMap, handlerAdapter를 생성자를 통한 의존성 주입을 시도했습니다. FrontControllerServletV5 @RequiredArgsConstructor @WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { private final Map<String, Object> handlerMappingMap; private final List<MyHandlerAdapter> handlerAdapters; @Override protected void service(HttpServletRequest request, HttpServletResponse response) //... } HandlerMappingConfig @Configuration public class HandlerMappingConfig { @Bean public Map<String, Object> handlerMappingMap() { Map<String, Object> handlerMappingMap = new HashMap<>(); handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4()); handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4()); return handlerMappingMap; } } HandlerAdapterConfig @Configuration public class HandlerAdapterConfig { @Bean public List<MyHandlerAdapter> handlerAdapters() { List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); handlerAdapters.add(new ControllerV3HandlerAdapter()); handlerAdapters.add(new ControllerV4HandlerAdapter()); return handlerAdapters; } } 하지만 다음과 같이 순환 의존성 에러가 발생했는데, 원인을 찾지 못하고 있습니다. 정규 빈과 내부 빈이 서로 의존하고 있다는 것인가요..? 다른 수강생 분들의 코드와 다르게 작성해보려고 했는데, 이 에러가 발생해서 원인을 찾아보려고 했지만 찾지 못했습니다, 왜 발생한 것인지 도움 부탁드립니다.. The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | frontControllerServletV5 ↑ ↓ | (inner bean)#61a91c9b defined in file [.../hello/servlet/web/frontcontroller/v5/FrontControllerServletV5.class] └─────┘
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] https://www.inflearn.com/questions/137740/orphanremoval%EA%B3%BC-cascade%EC%9D%98-%EA%B4%80%EA%B3%84 위 질문을 바탕으로 정리하자면 부모 엔티티에 있는 자식 엔티티 컬렉션에서 자식 객체를 제거하면 고아객체가 되므로 원래 JPA 스펙상 JPA 스펙상 원칙적으로 CascadeType.PERSIST이 없어도 orphanRemoval만으로 자식 삭제하는 DELETE SQL이 동작하지만 Hibernate 구현체 버그(?)로 인해 동작을 안하는 거다. 라고 정리하면 될까요? 자문자답 ============= 2024년 12월 기준으로 하이버네이트 버전을 최신으로 바꿔서 실행했는데 orphanRemoval=true만 적용해도 DELETE SQL가 정상 동작하는 것으로 보입니다. Hibernate: /* insert for hellojpa.Parent */insert into Parent (name, id) values (?, ?) Hibernate: /* insert for hellojpa.Child */insert into Child (name, parent_id, id) values (?, ?, ?) Hibernate: /* insert for hellojpa.Child */insert into Child (name, parent_id, id) values (?, ?, ?) Hibernate: select p1_0.id, p1_0.name from Parent p1_0 where p1_0.id=? Hibernate: select cl1_0.parent_id, cl1_0.id, cl1_0.name from Child cl1_0 where cl1_0.parent_id=? Hibernate: /* delete for hellojpa.Child */delete from Child where id=? ============= 수정된 pom.xml <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.6.3.Final</version> </dependency> 수정하고 Maven reload 버튼을 눌러야합니다!
안녕하세요. 위 문제에서 패키지를 v3까지 디테일하게 지정을 했는데요. hello.proxy.app.v1 와 hello.proxy.app.v2 관점에서는 어떻게 해석할 수 있는지 궁금합니다. v3는 스프링부트3.0 이전과 이후 달라진 이슈에 영향을 받지 않아보입니다. v1, v2는 어떤 영향을 받는 것인지 알 수 있으면 전체적으로 이해가 될 것같아 질문드립니다. (v1, v2에는 @Controller, @RestController가 없습니다. 따라서 빈 자동등록은 부트3.0 이전 이후 모두 동작하지 않을 것으로 기대됩니다)
#include <stdio.h> int main() { for (int i = 0; i < 100; ++i) { if (i >= 10 && i <= 20) { printf("%d ", i); } } printf("\n"); return 0; } 안녕하세세요. 코드 관련해서 궁금한 점이 있어서 질문을 드립니다. 혹시 C에서는 반복문에서 증감식을 작성할 때 일부러 전위연산자를 사용하는건가요? 다른 언어나 강의를 들을 때는 대부분 후위연산자로 증감을 했었는데 특별한 이유가 있는건지 궁금해서 질문을 드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 다른 질문들 중에 "DI 적용해보기"라는 질문과 답변을 보고 저도 DI 적용을 해보려고 했습니다. 그런데 일급 컬렉션을 사용했을 때는 발생하지 않는 순환 의존성이 일급 컬렉션을 사용하지 않을 때는 발생하는데 혹시 이유를 알 수 있을까요? 제가 참고했던 코드는 아래에 있습니다. https://www.inflearn.com/community/questions/1251450/di-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 인터럽트 시작1 부분 강사님 설명 예제중에서 갑자기 궁금해서 질문드립니다.. 제가 궁금한부분은 public class ThreadStopMainV1 { public static void main(String[] args){ MyTask task = new MyTask(); Thread thread = new Thread(task, "work"); thread.start(); } static class MyTask implements Runnable { ...................................... } } 여기서 질문 왜 정적내부클래스 MyTask()에 new를 써서 만드나요?? 정적 내부 클래스는 외부 클래스의 정적 멤버처럼 동작하기 때문에, 외부 클래스의 이름을 통해 접근해야 하는거 아닌가요?. 따라서 new ThreadStopMainV1.MyTask() 형태로 생성해야하는거 아닌가요?? 정적내부클래스도 바로 다이렉트로 new MyTask() 로 생성해도 되는건가요 ?? 너무궁금합니다..
안녕하세요 이미 커뮤니티에 올라온 글인데 제대로 이해를 못한 것 같아서요. redis를 사용할 때 기본적으로 메모리를 이용해 캐싱을 하고, AOF나 스냅샷을 저장하기 위한 용도로 SSD를 사용한다고 이해한 것이 맞을까요..? 강의 잘 듣고 있습니다 :) https://www.inflearn.com/community/questions/1400475/redis%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EC%A7%88%EB%AC%B8%EC%82%AC%ED%95%AD
안녕하세요 강의를 듣다가 잘 이해가 안가는 부분이 있어서 질문드립니다. 비트맵을 사용할 때, 사용자 수가 100만명인데 실제 사용자 수는 100명인 경우 메모리 낭비가 발생한다는 부분은 이해했습니다. 이를 위해 구분자가 있는 데이터를 지정하고 활용하는 것이 좋다고 말씀하셨는데 구분자가 있는 데이터가 어떤 것인지 제대로 이해가 안 가서 질문드립니다.. 섹션3 - BitMaps Collections https://www.inflearn.com/course/redis-%EC%95%BC%EB%AC%B4%EC%A7%80%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%9D%B4%EB%A1%A0%ED%8E%B8/unit/244780
안녕하세요. 스프링로드맵 2 스프링기본편 강의에서 MemberServiceImpl가 MemoryMemberRepository구현에 강결합되는 상황을 제시해 주셨습니다. 이후 아래 그림과 같이 인터페이스 MemberRepository에만 의존하게 끔 설계를 해주셨는데요. 이 때 AppConfig가 등장합니다. public class AppConfig { public MemberService memberService(){ System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } public OrderService orderService(){ System.out.println("call AppConfig.orderService"); return new OrderServiceImpl( memberRepository(), discountPolicy()); } } 위 코드를 설명하실 땐 구성 이라고 표현하셨는데요. (구성과 실행을 분리) 이것도 전략패턴이라고 말할 수 있나요? 전략패턴에서는 구성대신 조립 이란 설명으로 다르게 표현하셨습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 영한님! 강의 잘 듣고 있습니다. JPA 더티 체킹 관련해서 질문이 있습니다., 현재 매일 외부로부터 몇천~몇만 건의 데이터를 받아서 인터페이스 테이블에 해당 데이터의 키 값에 해당하는 데이터가 없으면 삽입, 이미 있으면, 키 값을 제외한 해당 데이터와 인터페이스 테이블에 있는 데이터의 컬럼들을 비교해서 update 치는 로직으로 구현했습니다. (해당 정보는 변경될 일이 거의 없기 때문에 매일 테이블을 delete insert 하는 방식보다는 효율적인 방식이라고 생각되어 채택하였습니다.) 로직은 간략하게 다음과 비슷합니다. (실제 컬럼 수는 훨씬 많습니다.) List<UserInfoRequest> users = objectMapper.readValue(decryptedData, objectMapper.getTypeFactory().constructCollectionType(List.class,UserInfoRequest.class)); List<UserInterfaceEntity> existingUsers = UserInterfaceRepository.findAll(); List<UserInterfaceEntity> userListToAdd = new ArrayList<>(); for (UserInfoRequest request : users) { UserInterfaceEntity existingUser = existingUsers.stream() .filter(user -> user.getEmail().equals(request.getEmail())) .findFirst() .orElse(null); /** 기존 인터페이스 테이블에 존재하지 않는 사용자 정보이면 */ if (existingUser == null) { UserInterfaceEntity newUser = UserInterfaceEntity.builder() .email(request.getEmail()) -- PK .name(request.getName()) .address(request.getAddress)) UserInterfaceRepository.save(newUser) } else { existingUser.updateUserInfo(request); } } // 엔티티 클래스 public void updateUserInfo(UserInfoRequest request){ this.name = request.getName(); this.address = request.getAddress(); '''실제로는 컬럼수가 더 많습니다''' } 저는 이러한 상황에서 existingUser가 존재하면 request로 들어오는 데이터가 아예 변경이 되지 않았을 수도 있고, 데이터의 어떤 컬럼 값이 변경됐을 지 모르기 때문에 일일이 if문으로 비교하는 것보다는 모든 컬럼을 update 하는 방식을 취했고, 제가 기대했던 결과는 같은 값이 들어오면 DB에 update 쿼리가 나가지 않는 것을 기대했습니다. 그런데, 실제로 existingUser가 존재하고, request의 모든 필드값과 exsitingUser 의 모든 필드 값이 다 같은 건에 대해서도 update 쿼리가 DB에 나가더라구요. JPA 더티체킹의 경우 최초 조회한 시점에 스냅샷을 떠두고, 커밋 시점에 변경된 엔티티에 대해서만 UPDATE 쿼리가 나가는 것으로 알고 있는데, 왜 필드 값이 실제로는 변경되지 않았음에도 UPDATE 쿼리가 나가는 것일까요? 이 부분에서 실제로 필드 값이 변경된 경우에만 update 쿼리를 실행하고 변경되지 않은 경우에는 update 쿼리를 막으려면 if문을 일일이 필드마다 비교해야하는 로직을 추가하는 것 말고는 다른 좋은 방법이 없을까해서 질문 남깁니다..
안녕하세요, 우선 강의 너무 잘 들었습니다. 사전 렌더링에 대한 부분에서 궁금중이 있어 문의를 남깁니다. 클라이언트 컴포넌트 또한 서버에서 JS 실행을 통해 서버 측에서 사전 렌더링이 된다는 것을 알고 있습니다. 다만, 서버에서 실행되는 사전 사이드 렌더링의 경우 useEffect, useState 등과 같은 훅은 어떤 식으로 실행이 되는지 궁금 합니다. 왜냐하면 서버 클라이언트에서는 훅 사용이 불가능한 것으로 알고 있는데, 이는 곧 서버에서 훅을 사용하지 못한다는 뜻으로 이해하고 있어서요. 만약 해당 훅 들이 서버에서 실행되지 않고, 컴포넌트에 마운트 된 이후에 실행 되는 것이라면, 컴포넌트 return 문 안에 있는 State나 로직들은 undefined 인 상태에서 렌더링 되어 Client에 HTML 형태로 전달 되는 것일까요? 또한 비슷한 질문인데, 사전 렌더링에서 local storage, DOM 조작 등과 같이 Client에서만 접근 가능한 API에서는 어떤 식으로 사전 렌더링이 진행 되는지, 그리고 초기 HTML을 그릴 때는 해당 값들을 어떻게 처리 하는 지 궁금합니다. 좋은 강의 감사합니다!
선생님 안녕하세요. 우선 오늘 최종 합격하여 소식을 전하게 되었습니다. 다만, 다름이 아니라 점수가 좀 턱걸이인지라.. 담주에 예정된 최종 결과에서 합격예정이 불합격으로 바뀌는 사례가 있는지 궁금합니다. 제가 알기로는 불합격 사례에서 합격 한 사례는 있는 것으로 아는데 반대 사례가 있는지요?? 우선 정말 감사드립니다. 큰 도움이 되었습니다.
config-service, discovery-service, apigateway-service, user-service, order-service를 각각 build한 다음 java -jar [각 service 파일]의 명령으로 구동시키고 postman으로 전체 애플리케이션의 동작을 확인한 결과 전체적으로 잘 동작합니다. 그런데 이 파일들을 각각 docker container로 생성하고 실행하였더니, user-service에 대한 서비스 요청(예를 들면, 127.0.0.1:8000/user-service/users)을 실행하면 403 forbidden 오류가 발생합니다. 무엇이 문제인가요? 강의에 나온 것처럼 docker container는 모두 다음과 같이 생성하였습니다. 문제의 발생 가능성을 줄이고자 mariadb는 사용하지 않고 h2DB를 사용하고 있으며, zookeeper와 kafka를 사용하지 않았습니다. - docker network 생성 docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 ecommerce-network - rabbitMQ 컨테이너 생성 docker run -d --name rabbitmq --network ecommerce-network -p 15672:15672 -p 5672:5672 -p 15671:15671 -p 5671:5671 -p 4369:4369 -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest rabbitmq:management - configuration 컨테이너 생성 docker run -d -p 8888:8888 --network ecommerce-network -e " spring.rabbitmq.host =rabbitmq" -e "spring.profiles.active=default" --name config-service him333/config-service:1.0 - discovery 컨테이너 생성 docker run -d -p 8761:8761 --network ecommerce-network -e " spring.cloud .config.uri= http://config-service:8888 " --name discovery-service him333/discovery-service:1.0 - apigateway 컨테이너 생성 docker run -d -p 8000:8000 --network ecommerce-network -e " spring.cloud .config.uri= http://config-service:8888 " -e " spring.rabbitmq.host =rabbitmq" -e "eureka.client.serviceUrl.defaultZone= http://discovery-service:8761/eureka/ " --name apigateway-service him333/apigateway-service:1.0 - order 컨테이너 생성 docker run -d --network ecommerce-network --name order-service -e "eureka.client.serviceUrl.defaultZone= http://discovery-service:8761/eureka/ " -e "logging.file=/api-logs/orders-ws.log" him333/order-service:1.0 - user 컨테이너 생성 docker run -d --network ecommerce-network --name user-service -e " spring.cloud .config.uri= http://config-service:8888 " -e " spring.rabbitmq.host =rabbitmq" -e "eureka.client.serviceUrl.defaultZone= http://discovery-service:8761/eureka/ " -e "logging.file=/api-logs/users-ws.log" him333/user-service:1.0