묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코딩 몰라도 OK! CursorAI로 시작하는 개발 생활 (웹/초급)
노션 링크가 없다고 나와요
커서 및 vscode 설치 방법다운로드를 받지 않으신 분들은 차분히 다운로드를 받으신 다음 아래의 Node.JS를 설치 해주세요해당 노드 링크 클릭하면The page you are looking for cannot be found!Please ask the owner of the page for an updated link.로 나옵니다!
-
미해결스프링 핵심 원리 - 고급편
스프링부트 3.0 이슈에 대한 정리
'프록시패턴과 데코레이터패턴.pdf' p.7 하단의 설명을 이해하는데 시간이 많이 걸렸습니다.다른 수강생분들도 참고하실 수 있도록 정리했습니다. 부트3.0버전에서 나타나는 현상위 상황에서 http://localhost:8080/v2/request?itemId=hello 으로 접근하면 아래와 같은 결과가 나옵니다. 수동등록하여 컨트롤러 Bean이 생성됐다 하더라도위 @RequestMapping 만으로 컨트롤러 로 '인식' 할 수 없음 (부트 3.0부터) 개선 1 (부트3.0)@RequestMapping 과 @ResponseBody ==> @RestController 로 교체시도이렇게 만들면 컨트롤러 로 '인식'할 수 있다.하지만 아래처럼 빈충돌로 애플리케이션 구동자체가 안된다.(@RequestMapping 을 쓰던 이전에는 컴포넌트 스캔이 대상이 아니여서 자동구성 빈이 생성되지 않았고오직 수동구성 빈만 생성됐음)(@RestController로 변경하면서 컨트롤러로 인식하게 됐지만자동구성으로 빈이 등록돼버리고 , 수동구성 빈 등록으로 덮어쓰기를 시도하려하지만 스프링부트는 스프링과 달리 이것을 허용하지 않고 빈충돌 에러를 발생시킴) 위 현상은 v1, v2에서만 발생한다. ('수동구성으로 진행되도록 유도된 예제'에서 불청객으로 자동구성이 발생)반면 v3에서는 발생하지 않는다. (자동구성으로 진행됐기 때문) 따라서 자동구성 대상이 되지 않도록 v3 패키지경로를 컴포넌트스캔지정하여 v1, v2를 스캔대상에서 제외시킨다. 개선 2 (부트3.4)@RequestMapping 과 @ResponseBody ==> @RestController 로 교체이렇게 만들면 컨트롤러 로 인식할 수 있다.위 개선1과 달리 빈충돌없이 애플리케이션 구동이 잘 된다. (빈이 덮어써지게 3.4는 개선됐나보다)
-
해결됨Jenkins를 이용한 CI/CD Pipeline 구축
'jenkins 설치 및 설정'에서 사용하는 터미널의 위치
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 섹션 2에 'jenkins 설치 및 설정' 강의에서 나오는 터미널의 위치가 어디인가요?Work 디렉토리안에 git 이랑 이런거 다 설치해서 여기서 run 실행하려고 하는데 안됩니다. 위치가 잘못되었는지 확인 부탁드립니다.docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure jenkins/jenkins:lts-jdk11 이전강의에서도 docker 관련된 것들은 다 안되어서 pull 받거나 할때 다 도커데스크탑에서 받았습니다.
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
강의자료
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ppt로된 강의자료가 어디 업로드 되어있나요?어디서 다운로드 받을수 있는지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
DI 적용 중 순환 참조 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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] └─────┘
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
orphanRemoval=true으로만 적용시 DELETE SQL 동작 안함
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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 버튼을 눌러야합니다!
-
미해결스프링 핵심 원리 - 고급편
스프링부트 3.0 이슈에 따른 컴포넌트 스캔 패키지경로
안녕하세요.위 문제에서 패키지를 v3까지 디테일하게 지정을 했는데요.hello.proxy.app.v1 와 hello.proxy.app.v2 관점에서는 어떻게 해석할 수 있는지 궁금합니다. v3는 스프링부트3.0 이전과 이후 달라진 이슈에 영향을 받지 않아보입니다.v1, v2는 어떤 영향을 받는 것인지 알 수 있으면 전체적으로 이해가 될 것같아 질문드립니다.(v1, v2에는 @Controller, @RestController가 없습니다.따라서 빈 자동등록은 부트3.0 이전 이후 모두 동작하지 않을 것으로 기대됩니다)
-
해결됨친절한 블렌더 - [LV.1] 기초 모델링
창틀 두께가 건물 안쪽으로 들어가요
-19:49, 강의 보면서 창틀을 따라 만드는데 창틀이 건물안으로 들어가요 ㅠ옵셋을 -1이 아닌 1로 하면 강의영상처럼 건물밖으로 나오기는 합니다. 선생님과 똑같이 따라하는데 왜 반대로 되는지 궁금합니다.
-
미해결게임 캐릭터를 위한 3ds Max 리깅의 기초
7:55 에서 자기자신의 z축을 부모의 x에 정렬하면 안되나요?
그러면 어떻게 되나요?
-
해결됨홍정모의 따라하며 배우는 C언어
반복문에서 증감식( i++와 ++i 차이)
#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에서는 반복문에서 증감식을 작성할 때 일부러 전위연산자를 사용하는건가요?다른 언어나 강의를 들을 때는 대부분 후위연산자로 증감을 했었는데 특별한 이유가 있는건지 궁금해서 질문을 드립니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
[다른 질문 파생 질문] DI 적용 시 순환 의존성 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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편, 멀티스레드와 동시성
정적내부클래스 new 로 생성에 관한 질문(인터럽트-시작1강 중...)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.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를 써서 만드나요?? 정적 내부 클래스는 외부 클래스의 정적 멤버처럼 동작하기 때문에, 외부 클래스의 이름을 통해 접근해야 하는거 아닌가요?. 따라서 newThreadStopMainV1.MyTask() 형태로 생성해야하는거 아닌가요?? 정적내부클래스도 바로 다이렉트로 new MyTask() 로 생성해도 되는건가요 ?? 너무궁금합니다..
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
한글 파일 팝업 안뜨게 하기 에서 계속 false 가 리턴 되네요
안녕하세요. 한글 2014에서 실습하고 있는 중입니다.레지스트리에 저장할 폴더가 없어서 밑에 질문 올리신 분의 글을 보고 레지스트리에 등록을 하고 PC를 재부팅했는데도 리턴값이 false로 나오고 있습니다. 뭐가 문제일까요?ㅠㅠ 제 레지스트리 화면입니다
-
미해결비전공 기획자 및 관리자를 위한 IT 필수 지식
강의 자료 요청합니다!
안녕하세요! 미리보기로 살짝 맛보다 좋은 강의 같아서 결제했습니다.혹시bokcy1234@gmail.com으로 강의교안을 받아볼 수 있을까요? 수업 들으며 메모해두고 싶어서요!
-
해결됨대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [이론편]
Redis SSD
안녕하세요 이미 커뮤니티에 올라온 글인데 제대로 이해를 못한 것 같아서요.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
-
해결됨대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [이론편]
Redis Collection BitMaps
안녕하세요 강의를 듣다가 잘 이해가 안가는 부분이 있어서 질문드립니다.비트맵을 사용할 때, 사용자 수가 100만명인데 실제 사용자 수는 100명인 경우 메모리 낭비가 발생한다는 부분은 이해했습니다.이를 위해 구분자가 있는 데이터를 지정하고 활용하는 것이 좋다고 말씀하셨는데 구분자가 있는 데이터가 어떤 것인지 제대로 이해가 안 가서 질문드립니다.. 섹션3 - BitMaps Collectionshttps://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
-
미해결실무자를 위한 구글애널리틱스(GA4+GTM) 활용법(25년 Update)
강의자료
중간중간 강의 자료를 캡쳐하고 싶은데 방지되어 있더군요.자료는 공개되지 않는건가요?
-
미해결스프링 핵심 원리 - 고급편
스프링로드맵2 스프링기본편의 구성과 사용분리
안녕하세요. 스프링로드맵 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()); } }위 코드를 설명하실 땐 구성 이라고 표현하셨는데요. (구성과 실행을 분리) 이것도 전략패턴이라고 말할 수 있나요? 전략패턴에서는 구성대신 조립 이란 설명으로 다르게 표현하셨습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
[JPA 더티체킹] 조회한 엔티티에 대해 update할 때, 실제 update 값은 기존 엔티티 필드 값들과 모두 동일해도 update 쿼리가 실행되는 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]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문을 일일이 필드마다 비교해야하는 로직을 추가하는 것 말고는 다른 좋은 방법이 없을까해서 질문 남깁니다..
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
클라이언트 컴포넌트의 사전 렌더링 질문
안녕하세요, 우선 강의 너무 잘 들었습니다.사전 렌더링에 대한 부분에서 궁금중이 있어 문의를 남깁니다. 클라이언트 컴포넌트 또한 서버에서 JS 실행을 통해 서버 측에서 사전 렌더링이 된다는 것을 알고 있습니다.다만, 서버에서 실행되는 사전 사이드 렌더링의 경우 useEffect, useState 등과 같은 훅은 어떤 식으로 실행이 되는지 궁금합니다. 왜냐하면 서버 클라이언트에서는 훅 사용이 불가능한 것으로 알고 있는데, 이는 곧 서버에서 훅을 사용하지 못한다는 뜻으로 이해하고 있어서요.만약 해당 훅 들이 서버에서 실행되지 않고, 컴포넌트에 마운트 된 이후에 실행 되는 것이라면, 컴포넌트 return 문 안에 있는 State나 로직들은 undefined 인 상태에서 렌더링 되어 Client에 HTML 형태로 전달 되는 것일까요? 또한 비슷한 질문인데, 사전 렌더링에서 local storage, DOM 조작 등과 같이 Client에서만 접근 가능한 API에서는 어떤 식으로 사전 렌더링이 진행되는지, 그리고 초기 HTML을 그릴 때는 해당 값들을 어떻게 처리하는 지 궁금합니다. 좋은 강의 감사합니다!