HashSet 최적화
미해결
김영한의 실전 자바 - 중급 2편
우리가 ArrayList 에서 LinkedList로 넘어온 이유가 배열 메모리 확보로 인한 낭비로 인해 경우에 따라서 LinkedList 를 사용해야한다고 알고 있는데, set 에서도 ArrayList 처럼 배열 메모리를 확보해두고 배열의 크기를 2배씩 늘리는 식으로 작동하나요 ?
- java
- 객체지향
- 코딩-테스트
- 알고리즘
172만명의 커뮤니티!! 함께 토론해봐요.
미해결
김영한의 실전 자바 - 중급 2편
우리가 ArrayList 에서 LinkedList로 넘어온 이유가 배열 메모리 확보로 인한 낭비로 인해 경우에 따라서 LinkedList 를 사용해야한다고 알고 있는데, set 에서도 ArrayList 처럼 배열 메모리를 확보해두고 배열의 크기를 2배씩 늘리는 식으로 작동하나요 ?
미해결
Next + React Query로 SNS 서비스 만들기
안녕하세요 선생님. "Suspense로 Streaming하여 최적화하기(feat. loading.tsx, error.tsx)" 강의 내용중에 궁금한점이 있어 질문드립니다. 강의에서 5:42 ~ 6:35 시간 구간에서의 내용에 관해서 이해가 잘 안되는 부분이 있는데요. 홈 화면에 처음 들어올 때에는 로딩스피너가 안보이고 탐색하기 등 다른 페이지에서 홈 화면으로 들어오면 로딩스피너가 보이는 이유를 설명해주시는 부분입니다. 홈 화면에 처음 들어왔을 때에는 홈 화면에 해당하는 page.tsx를 서버에서 다 그려주기 때문에 로딩 상태가 없어서 로딩스피너가 안보이고, explore에 있다가 클라이언트에서 홈으로 넘어갈 때에는 explore에서 홈 페이지를 새로 로딩을 하기 때문에 로딩 스피너가 뜨는거라고 설명해주셨는데요. "explore에서 홈 페이지를 새로 로딩을 한다" 라는게 무슨 말인지 잘 모르겠습니다 ㅠ page.tsx가 CSR이 된다는 것인가요? 저는 어떤 페이지에 들어오면 그 페이지에 해당하는 page.tsx가 실행되는걸로 알고 있었는데 아닌가요? 홈의 page.tsx는 서버 컴포넌트인데 왜 홈에 처음 들어왔을 때만 page.tsx가 서버에서 실행되고 그 이후에는 마치 클라이언트에서 데이터 패칭하고 그에 따라 렌더링이 되는것처럼 "로딩"이라는 상태가 존재하는것인지가 궁금합니다.
미해결
김영한의 실전 자바 - 기본편
[질문 내용] 상속 단원에 문제와 풀이 관련해서 질문이 있습니다. 영한님께서는 상위 클래스의 필드에 접근하기 위해서 자식 클래스의 생성자 부분에서, super(name, price)을 사용하고 계십니다. 그 이유는 부모 클래스의 생성자가 기본 생성자가 아니기에, super을 생략하지 않고, 적은 것이지요. 여기서. 부모 클래스의 생성자를 기본 생성자로 하고, 자식 클래스의 생성자 부분에서 name과 price를 불러들어와 값을 저장하고 싶을 때 this.name = name; this.price=price; 로 접근해도 괜찮은가요? (부모 클래스의 필드가 public이였을 때)
미해결
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
spring: config: activate: on-profile: local datasource: url: "jdbc:h2:mem:library;MODE=MYSQL;NON_KEYWORDS=USER" username: "sa" password: "" driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.H2Dialect h2: console: enabled: true path: /h2-console --- spring: datasource: url : "jdbc:mysql://localhost/library" username : "root" password : "비번" driver-class-name : com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect 2024-08-18 22:03:44.064 INFO 4232 --- [ main] c.g.libraryapp.LibraryAppApplication : Starting LibraryAppApplication using Java 11.0.23 on SeungWon with PID 4232 (C:\Users\Administrator\Desktop\library-app\library-app\build\classes\java\main started by Administrator in C:\Users\Administrator\Desktop\library-app) 2024-08-18 22:03:44.064 INFO 4232 --- [ main] c.g.libraryapp.LibraryAppApplication : The following 1 profile is active: "local" 제대로 다 작성을 한거같ㅌ은데 로그에 local이라고 나오는데 도서관리 웹으로 가면 이전에 넣어둔 데이터도 그대로 있고, H2WebConsol은 화이트레벨이 뜹니다ㅜ 현재 인텔리제이 무료버전이라 프로파일 바꾸는건 구글랑해서 햤는데 뭐가 문제인가요?
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
실행 단계에서 아래와 같은 오류가 발생했습니다. 어떻게 처리해야 할까요..? ERROR: Connection is broken: "java.net.ConnectException: Connection refused: localhost" [90067-199] Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:179) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:9) Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:363) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:282) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:260) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:401) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:112) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:75) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:100) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 14 more Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.ConnectException: Connection refused: localhost" [90067-199] at org.h2.message.DbException.getJdbcSQLException(DbException.java:617) at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) at org.h2.message.DbException.get(DbException.java:194) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:435) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:317) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148) at org.h2.Driver.connect(Driver.java:69) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38) ... 29 more Caused by: java.net.ConnectException: Connection refused at java.base/sun.nio.ch.Net.pollConnect(Native Method) at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:554) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:602) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:633) at org.h2.util.NetUtils.createSocket(NetUtils.java:103) at org.h2.util.NetUtils.createSocket(NetUtils.java:83) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:115) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:431) ... 34 more
미해결
스프링 시큐리티 OAuth2
Cannot invoke " org.springframework.security .oauth2.client.OAuth2AuthorizedClient.getAccessToken()" because "oAuth2AuthorizedClient" is null] with root cause keycloak 버전은 : 21.1.2 @GetMapping("/oauth2Login") public String oauth2Login(Model model, HttpServletRequest request, HttpServletResponse response) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); OAuth2AuthorizeRequest oAuth2AuthorizeRequest = OAuth2AuthorizeRequest .withClientRegistrationId("keycloak") .principal(authentication) .attribute(HttpServletRequest.class.getName(), request) .attribute(HttpServletResponse.class.getName(), response) .build(); OAuth2AuthorizationSuccessHandler successHandler = (authorizedClient, principal, attributes) -> { oAuth2AuthorizedClientRepository .saveAuthorizedClient(authorizedClient, principal, (HttpServletRequest) attributes.get(HttpServletRequest.class.getName()), (HttpServletResponse) attributes.get(HttpServletResponse.class.getName())); System.out.println("authorizedClient : " + authorizedClient); System.out.println("principal : " + principal); System.out.println("attributes : " + attributes); }; auth2AuthorizedClientManager.setAuthorizationSuccessHandler(successHandler); OAuth2AuthorizedClient oAuth2AuthorizedClient = auth2AuthorizedClientManager.authorize(oAuth2AuthorizeRequest); model.addAttribute("oAuth2AuthorizedClient", oAuth2AuthorizedClient.getAccessToken().getTokenValue()); return "home"; } keycloak: clientId: oauath2-client-app clientSecret: HPWAsKr9dEy9DPU1babedRmpstowiXOs clientName: oauath2-client-app authorizationGrantType: client-credentials clientAuthenticationMethod: client_secret_basic provider: keycloak <form sec:authorize="isAnonymous()" action="#"> <p><input type="button" onclick="authorizationCode()" value="AuthorizationCode Grant"/></p> <p><div sec:authorize="isAnonymous()"><a th:href="@{/oauth2Login(username='user',password='1234')}">Password flow</a></div></p> <div sec:authorize="isAnonymous()"><a th:href="@{/oauth2Login}">Client Credentials Flow Login</a></div> </form> @Configuration public class AppConfig { @Bean public DefaultOAuth2AuthorizedClientManager auth2AuthorizedClientManager(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository oAuth2AuthorizedClientRepository) { OAuth2AuthorizedClientProvider oAuth2AuthorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder() .authorizationCode() .password() .clientCredentials() .refreshToken() .build(); DefaultOAuth2AuthorizedClientManager defaultOAuth2AuthorizedClientManager = new DefaultOAuth2AuthorizedClientManager(clientRegistrationRepository, oAuth2AuthorizedClientRepository); defaultOAuth2AuthorizedClientManager.setAuthorizedClientProvider(oAuth2AuthorizedClientProvider); defaultOAuth2AuthorizedClientManager.setContextAttributesMapper(contextAttributeManager()); return defaultOAuth2AuthorizedClientManager; } private Function<OAuth2AuthorizeRequest, Map<String, Object>> contextAttributeManager() { return oAuth2AuthorizeRequest -> { Map<String, Object> contextAttributes = new HashMap<>(); HttpServletRequest httpServletRequest = oAuth2AuthorizeRequest.getAttribute(HttpServletRequest.class.getName()); String userName = httpServletRequest.getParameter(OAuth2ParameterNames.USERNAME); String userPassword = httpServletRequest.getParameter(OAuth2ParameterNames.PASSWORD); if(StringUtils.hasText(userName) && StringUtils.hasText(userPassword)) { contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, userName); contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, userPassword); } return contextAttributes; }; } } 이렇게 됩니다. 현재 상황으로 문제가 되어 있는 부분이 없는 것 같습니다. 어디부터 다시 확인해야 될지 조언 부탁드립니다.
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="jakarta.persistence.jdbc.user" value="sa"/> <property name="jakarta.persistence.jdbc.password" value=""/> <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpashop"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> chmod 755 h2.sh ./h2 swh 다 해봤는데 안되네요.. 어떻게 해결하나요? 이전 hello-jpa에서 따라하던 test의 경우는 데이터베이스 정상적으로 연결이 되었는데 실습때 jpabook에서 사용할 jpashop은 연결이 안되는데 어떻게 해결하나요? 경로는 맞고 바탕화면에 h2에 bin에 파일들은 정상적으로 있습니다 구글링을 하여 따라해봐도 위 사진처럼 됩니다.
미해결
김영한의 실전 자바 - 기본편
안녕하세요 선생님 , 자바에 대해 깊이 학습하고자 다시 기초부터 배우고있는 주니어 개발자입니다. 다름이 아니라 현재 목차에서 데이터와 기능들이 분리되어 있는것은 유지보수 관점에서 힘들기때문에 그 둘을 묶기위한 설계가 객체지향이라고 이해를 했는데요. 스프링 관점에서 보면 데이터의 무결성을 지키기위해 데이터(dto) 와 서비스는 분리하는 설계를 하는것으로 알고있습니다. 일반 자바와 스프링은 조금 다른 시각으로 바라봐야 할까요?
해결됨
[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
어제는 잘됬는데 오늘 다시 해보니까 계속 오류가 생겨서 무슨 문제일까요? 서버에서도 에러가 뜨고 어제는 잘됬는데요 어제는 오류 안떳는데 오늘은 뜨고요 이거 다운받아야 할까요? 네트워크는 잘 작동을 하는데요. 페이로드랑 응답에는 에러가 뜨네요. 어제는 분명이 됬는데 오늘 이러니까 이유를 모르겠어요 ㅠ 다른 섹션도요
해결됨
서버개발자 과제전형 완벽가이드 - 1편
안녕하세요 강사님 좋은 강의 감사드립니다. readme파일을 잘 작성하는 것도 과제전형을 진행하는데 중요한 요소라고 들었는데 예제 소스에 작성된 readme 파일 형식으로 실제 과제전형 시에 제출하기에는 조금 부족해보이는데 보통 어떤 형식으로 작성하시는 편이신가요? 또는 이 부분은 꼭 들어갔으면 하는 요소가 있을까요?
해결됨
[풀스택 완성] Supabase로 웹사이트 3개 클론하기 (Next.js 14)
강사님 강의를 이제 막 듣기 시작한 수강생입니다! 지금 리코일 기본 문법 관련 강의를 듣던중 궁금증이 생겨 질문드립니다. 클라이언트 페이지 하위의 페이지는 모두 클라이언트 페이지로 바뀌는 것으로 이해하고 있었는데 전역에 리코일 프로바이더로 감싸주는 형태로 사용하게 되면 부분적으로 클라이언트 페이지가 되는 것인가요?! 어떻게 이해하면 좋을지 궁금합니다!
미해결
Java 마이크로서비스(MSA) 프로젝트 실습
강의 따라 하고있습니다만.. ci/cd 지식이 없는경우?? 기존에는 깃만 사용하다가 강의들으면서 처음 사용하게되었습니다. 강의내용 처럼 ci/cd메뉴를 설정하는것을 따라하는 방법이 있을까요? 아래는 제가 깃러너?랑 깃랩 설치한 부분입니다. 따로 추가 설정해야 하는 부분이 있을까요? 동영상의 내용과 비슷하게 진행할수가 없습니다. 깃 런너 설치도 여러번 해야지 설치가 생각보다 잘 안됩니다.. 깃랩을 처음 사용하는 사람이다보니까 런너 부터 연결해서 .gitlab-ci.yml? 그것을 한다음에.. 깃랩에 msa 프로젝트 올려야하는것같은데.. 처음부터 설명이 없으시니까 우왕자왕하게되네요.. 파이프라인 어떻게해야할지 모르겠습니다. 진행이 어렵습니다. 깃랩을 하는데 있어서 CI/CD메뉴가 처음부터 없으면 어떻게해야하면 좋을까요?
미해결
김영한의 실전 자바 - 중급 2편
LinkedHashSet 을 수업중에 HashSet 처럼 자세히 다룬 적이 있나요? 아무리봐도 못 찾겠어서요! 왜 LinkedHashSet 이 입력한 데이터대로 출력하는지 코드를 통해 이해를 하고 싶습니다.
미해결
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 연결 후 localhost:8080 연결 시 계속 서버 거부가 다음과 같이 뜹니다. 그래서 h2 재연결 후 상태를 확인해봤는데 다음과 같이 떴습니다. h2 설치 과정은 다음과 같습니다.
미해결
자바 ORM 표준 JPA 프로그래밍 - 기본편
둘의 차이가 뭔가여?? Character character = characterRepository.findByUserId(userPrincipal.getId()).orElseThrow(CharacterNotFoundException::new); List<Quest> quests = character.getQuests(); 현재 프로젝트 중인데 이 강의를 들으면서 느낀점은 qeustRepository.findByCharacter(character)를 하는 경우와 character.getQuests의 차이가 궁금합니다. 어떤게 더 좋은방식이구 각자의 장단점이 있을까요? https://www.inflearn.com/community/questions/66107/member%EC%99%80-order%EA%B0%84%EC%9D%98-%EC%96%91%EB%B0%A9%ED%96%A5-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4 추가로 이거랑 질문이 관련이 있는걸까요?
해결됨
[풀스택 입문] Firebase보다 10배 좋은 Supabase
로펀 선생님 supabase 자료가 거의 없길래 firebase를 최근에 공부했었습니다 그러다 선생님의 강의를 발견하게되었습니다. supabase를 공부함에 있어서 제가 react는 공부한적 있었는데 next.js는 없습니다. next.js를 어느정도로 알아야할까요? 앞으로 supabase를 공부함에 있어 next.js를 깊게 알아야할까요?
미해결
김영한의 실전 자바 - 중급 1편
안녕하세요 열거 타입은 매개변수로 못 쓰나요?? 빨간 불이 계속들어오는데 어떻게 해결하면 좋을까요? package class05EnumClass; public class AuthGradeMain { public static void main(String args[]){ AuthGrade[] authGradeList = AuthGrade.values(); for(AuthGrade grade : authGradeList){ printGrade(); } //AuthGrade authGrade 매개변수를 넣을때 에러가 발생 private static void printGrade(AuthGrade authGrade){ System.out.println(authGradeList); } } } package class05EnumClass; public enum AuthGrade { GUEST(1,"손님"),LOGIN(2,"로그인 회원"),ADMIN(3,"관리자"); private final int level; private final String description; private AuthGrade(int level, String description){ this.level=level; this.description=description; } public void getAuthGrade(AuthGrade authGrade){ System.out.println("레벨"+authGrade.level+"등급"+authGrade.description); } public int getLevel(AuthGrade authGrade){ return authGrade.level; } public String getDescription(AuthGrade authGrade){ return authGrade.description; } }
미해결
김영한의 실전 자바 - 중급 1편
4강 레퍼클래스 로또 번호 생성기 질문 있습니다. package class04wrapperClass; import java.util.Random; public class Lottery { public static void main(String args[]) { //랜덤 생성자 선언 ==> 로또 값이 그때 그때 바뀜 Random random = new Random(); //로또 범위 지정 배열 int[] randomArray = new int[6]; //로또 배열에 로또 값 넣기 for (int i = 0; i < randomArray.length; i++) { int randomValue=random.nextInt(45)+1; randomArray[i]=randomValue; if (randomArray[i]==randomArray[i++]||randomArray[i]==0) randomArray[i]=random.nextInt(45)+1; } for(int i =0; i<randomArray.length; i++){ System.out.print(randomArray[i]+" , "); } } } 이렇게 풀었는데 이것도 올바른 풀이 일까요???
해결됨
[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
import React, { useState, MouseEvent } from "react"; import * as S from "./mypoint.index.styles"; import TapPointLoading from "./mypoint_loading"; import TapPointBuying from "./mypoint_buying"; import TapPointAll from "./mypoint_all"; import TapPointSelling from "./mypoint_selling"; export default function MyPoint(): JSX.Element { const [selectedValue, setSelectedValue] = useState<{ name: string; index: number; }>({ name: "전체내역", index: 0, }); const MyPageHeadInfoButton = [ { name: "전체내역", component: <TapPointAll /> }, { name: "충전내역", component: <TapPointLoading /> }, { name: "구매내역", component: <TapPointBuying /> }, { name: "판매내역", component: <TapPointSelling /> }, ]; const onClickTap = ( event: MouseEvent<HTMLDivElement>, index: number ): void => { const newValue = event.currentTarget.id; setSelectedValue({ name: newValue, index, }); }; // 버튼 클릭으로 해당 data 값을 보여주기 위함 const renderData = (): JSX.Element | undefined => { return ( <S.TableWrap> {/* 해당 탭의 배열의 객체 name통해 컴포넌트 가져옴 */} {MyPageHeadInfoButton.map((el) => { if (el.name === selectedValue.name && el.component) { return <div key={el.name}>{el.component}</div>; } return null; })} </S.TableWrap> ); }; return ( <S.Wrap> <S.MyPageHeadWrap> <S.MyPageHeadBtn> {/* 서브 탭 버튼 */} {MyPageHeadInfoButton.map((el, index) => ( <S.MyPageInfoBtn key={el.name} id={el.name} onClick={(event) => onClickTap(event, index)} selected={selectedValue.name === el.name} > {el.name} </S.MyPageInfoBtn> ))} </S.MyPageHeadBtn> </S.MyPageHeadWrap> <S.MyPageBodyWrap> {/* 해당 탭 data */} <div>{renderData()}</div> </S.MyPageBodyWrap> </S.Wrap> ); } 이렇게 탭을 클릭을 해서 해당 컴포넌트가 보이도록 했습니다. 그러면서 각각의 API data도 받아와 cache에 저장을 하도록 해 추가 API 요청이 일어나지 않도록 했는데 여기서 로그아웃을 하고 다른 아이디로 로그인을 하면 이전의 로그인 했던 data가 그대로 남아있어 최신 data를 가져오기 위해 여러가지 방법으로 시도했습니다. 로그아웃 시 useApolloClient를 활용해 cache를 삭제 했습니다. 이렇게 하면 다시 로그인 한 유저의 data를 잘 가져오는데 로그아웃을 하면서 cache data가 삭제되니 다른 API, Board, Markets 등 해당 page의 사용한 query문의 data를 다시 요청하는 문제가 있습니다. refetch()로 query문을 선언하면 해당 refetch()를 실행하지 않아도 API 요청이 일어나 refetchQueries를 사용해 data 최신화 하려는데 그렇게 되면 모든 탭을 refetch 해줘야 되는 문제가 있습니다. 각 탭 이동마다 API 요청 나가는게 싫어서 fetchporicy나 refetch()를 사용 하지 않았는데 보통 어떻게 사용을 하나요? 로그인에 의한 data는 탭 이동마다 refetch를 시켜주는게 좋을까요? 그리고 구매, 충전 등 하면 바로 MyPoint에 업데이트 되도록 client.writeQuery / readQeury 나 refetchQueries를 사용했는데 이런 결제 정보 같은거는 refetch로 실시간으로 data를 가져오는게 좋겠죠? 로그인, 로그아웃은 LayoutHeader에서 사용하고 있습니다.
해결됨
김영한의 실전 자바 - 기본편
안녕하세요. 이전 7강의 메모리 구조와 헷갈리는 부분이 있어서 질문드립니다. 7강의 자바 메모리 구조에서는 다음과 같이 메서드는 공통됐기 때문에 메서드 영역에서 관리한다고 이해했습니다. 그러나 상속 부분에서는 힙영역에서 메서드를 관리하고 사용하는 것처럼 되어있어서 헷갈립니다. 설명을 편리하게 하고자 이렇게 설명하신 걸까요?? 잘못 이해한 부분이 어딘지 모르겠습니다 ㅠㅠ 감사합니다.