inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

9강 kakao api로 아이디 생성 후 오류

미해결

코드로 배우는 React 19 with 스프링부트 API서버

9강 리액트 사용자 정보 수정 중에 kakao api 연동해서 그전까지 잘되는데, 디비에 카카오 사용자 정보가 없는 상태에서 로그인을 하면 디비에 member와 member_member_role_list 두 테이블 사용자가 잘 생성됩니다. 서버에는 getClaims 함수실행에서 오류가 발생하고 DTO에 정보를 못찾는다는거 같은 오류인거 같은데 화면상에는 이렇게 나옵니다. 새로고침 후의 상태이고 그냥 localhost:3000 으로 다시 들어가서 로그인을 하면 디비에는 카카오사용자가 생성이 된 상태라 로그인이 잘됩니다.... 원인이 무엇일까요 @GetMapping("/api/member/kakao") public Map<String, Object> getMemberFromKakao(String accessToken) { log.info("access Token : {}", accessToken); MemberDTO memberDTO = memberService.getKakaoMember(accessToken); Map<String, Object> claims = memberDTO.getClaims(); String jwtAccessToken = JWTUtil.generateToken(claims, 10); String jwtRefreshToken = JWTUtil.generateToken(claims, 60 * 24); claims.put("accessToken", jwtAccessToken); claims.put("refreshToken", jwtRefreshToken); return claims; } public Map<String, Object> getClaims() { Map<String, Object> dataMap = new HashMap<>(); dataMap.put("email", email); dataMap.put("pw", pw); dataMap.put("nickname", nickname); dataMap.put("social", social); dataMap.put("roleNames", roleNames); return dataMap; } import axios from "axios" import { API_SERVER_HOST } from "./todoApi" const rest_api_key = `` const redirect_uri = `http://localhost:3000/member/kakao` const auth_code_path = `https://kauth.kakao.com/oauth/authorize` const access_token_url =`https://kauth.kakao.com/oauth/token` export const getKakaoLoginLink = () => { const kakaoURL = `${auth_code_path}?client_id=${rest_api_key}&redirect_uri=${redirect_uri}&response_type=code` return kakaoURL } export const getAccessToken = async (authCode) => { const header = { headers: { "Content-Type": "application/x-www-form-urlencoded", } } const params = { grant_type: "authorization_code", client_id: rest_api_key, redirect_uri: redirect_uri, code: authCode } const res = await axios.post(access_token_url, params, header) const accessToken = res.data.access_token return accessToken } export const getMemberWithAccessToken = async (accessToken) => { const res = await axios.get(`${API_SERVER_HOST}/api/member/kakao?accessToken=${accessToken}`) return res.data } rest_api_key에 restkey입력되어있습니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
지루한 하마 댓글 2 좋아요 0 조회수 157

DTO 설정과 서비스계층 만들기 강의에서 TodoServiceTests를 실행시켰는데 에러가 발생했습니다

미해결

코드로 배우는 React 19 with 스프링부트 API서버

강의를 따라서 코딩하고 실행시켜 봤는데 아래와 같은 내용으로 에러가 발생했습니다. 어떤 곳이 문제가 있는 알려 주신다면 감사하겠습니다. 혹시 확인하고 싶으신 게 있다면 알려 주셨으면 합니다. :: Spring Boot :: (v3.4.1) 2025-02-11T11:28:59.109+09:00 INFO 2836 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : Starting TodoServiceTests using Java 21.0.5 with PID 2836 (started by zzamp in C:\Users\zzamp\Desktop\apiserver\apiserver) 2025-02-11T11:28:59.110+09:00 INFO 2836 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : No active profile set, falling back to 1 default profile: "default" 2025-02-11T11:28:59.445+09:00 INFO 2836 --- [apiserver] [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2025-02-11T11:28:59.484+09:00 INFO 2836 --- [apiserver] [ Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 32 ms. Found 1 JPA repository interface. 2025-02-11T11:28:59.760+09:00 INFO 2836 --- [apiserver] [ Test worker] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2025-02-11T11:28:59.801+09:00 INFO 2836 --- [apiserver] [ Test worker] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.6.4.Final 2025-02-11T11:28:59.824+09:00 INFO 2836 --- [apiserver] [ Test worker] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled 2025-02-11T11:28:59.996+09:00 INFO 2836 --- [apiserver] [ Test worker] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer 2025-02-11T11:29:00.015+09:00 INFO 2836 --- [apiserver] [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2025-02-11T11:29:00.071+09:00 INFO 2836 --- [apiserver] [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.mariadb.jdbc.Connection@72f24a84 2025-02-11T11:29:00.073+09:00 INFO 2836 --- [apiserver] [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2025-02-11T11:29:00.107+09:00 INFO 2836 --- [apiserver] [ Test worker] org.hibernate.orm.connections.pooling : HHH10001005: Database info: Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] Database driver: undefined/unknown Database version: 10.11.10 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown 2025-02-11T11:29:00.552+09:00 INFO 2836 --- [apiserver] [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2025-02-11T11:29:00.580+09:00 INFO 2836 --- [apiserver] [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2025-02-11T11:29:00.892+09:00 WARN 2836 --- [apiserver] [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open -in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open -in-view to disable this warning 2025-02-11T11:29:01.216+09:00 INFO 2836 --- [apiserver] [ Test worker] o.z.apiserver.service.TodoServiceTests : Started TodoServiceTests in 2.251 seconds (process running for 3.134) Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3 WARNING: A Java agent has been loaded dynamically (C:\Users\zzamp\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.15.11\a38b16385e867f59a641330f0362ebe742788ed8\byte-buddy-agent-1.15.11.jar) WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information WARNING: Dynamic loading of agents will be disallowed by default in a future release Hibernate: select t1_0.tno,t1_0.complete,t1_0.content,t1_0.due_date,t1_0.title from tbl_todo t1_0 where t1_0.tno=? No value present java.util.NoSuchElementException: No value present at java.base/java.util.Optional.orElseThrow(Optional.java:377) at org.zerock.apiserver.service.TodoServiceImpl.get(TodoServiceImpl.java:24) at org.zerock.apiserver.service.TodoServiceTests.testGet(TodoServiceTests.java:20) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended > Task :test TodoServiceTests > testGet() FAILED java.util.NoSuchElementException at TodoServiceTests.java:20 타깃 VM에서 연결 해제되었습니다. 주소: 'localhost:4408', 전송: '소켓' 2025-02-11T11:29:32.264+09:00 INFO 2836 --- [apiserver] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2025-02-11T11:29:32.265+09:00 INFO 2836 --- [apiserver] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2025-02-11T11:29:32.268+09:00 INFO 2836 --- [apiserver] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. > Task :test FAILED 1 test completed, 1 failed FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///C:/Users/zzamp/Desktop/apiserver/apiserver/build/reports/tests/test/index.html * Try: > Run with --scan to get full insights. BUILD FAILED in 36s 5 actionable tasks: 5 executed

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
wjdwoals042 댓글 2 좋아요 0 조회수 142

커스텀 파이프에서 value의 타입이 string 이 아닐때

미해결

따라하며 배우는 NestJS

여기서 value.toUpperCase()를 먼저 실행하고 있는데, value에 toUpperCase 메소드가 없는 타입이 온다면 어떻게 될까요?

  • postgresql
  • jwt
  • nestjs
  • typeorm
정수현 댓글 1 좋아요 0 조회수 195

nestjs 기본 구조 설명에서 궁금한게 있습니다.

미해결

따라하며 배우는 NestJS

기본 구조 설명을 듣던 중에 eslintrc.js라는 폴더가 있다고 하시는데 nest가 11.0.2인 버전에서는 없는 것 같아서요. 분명 이 기능을 하는 파일은 있을 텐데.. 혹시 eslint.config.mjs가 아닐까 궁금합니다.

  • postgresql
  • jwt
  • nestjs
  • typeorm
안민선 댓글 0 좋아요 0 조회수 188

채팅에 대해서 질문이 있습니다. ㅠㅠ

미해결

... // WebSocket 연결 및 STOMP 클라이언트 설정 useEffect(() => { const token = sessionStorage.getItem("accessToken"); // 세션에서 액세스 토큰을 가져옴 const socket = new SockJS(`http://localhost:8080/ws/chat`); // WebSocket 연결 const client = Stomp.over(socket); stompClientRef.current = client; // STOMP 연결 client.connect( { Authorization: `Bearer ${token}` }, (frame) => { setConnected(true); console.log("STOMP 연결 성공", frame); // 해당 채팅방에 대한 메시지 구독 client.subscribe(`/exchange/chat.exchange/room.${roomId}`, (msg) => { const receivedMessage = JSON.parse(msg.body); if (receivedMessage.type === "PLACE") { const place = JSON.parse(receivedMessage.message); setMessages((prev) => [...prev, { type: "PLACE", place }]); } else { setMessages((prev) => [...prev, receivedMessage]); } }); }, (error) => { console.error("STOMP 연결 실패:", error); alert("STOMP 연결 실패! 서버가 실행 중인지 확인하세요."); } ); // 채팅방 목록 가져오기 fetch(`${BASE_URL}/chat/rooms`, { headers: { Authorization: `Bearer ${token}`, }, }) .then((res) => res.json()) .then((data) => setChatRooms(data)) .catch((error) => console.error("채팅방 목록 가져오기 실패:", error)); return () => { if (client.connected) client.disconnect(); }; }, [roomId]); // 메시지 보내는 기능 const sendMessage = (message, type = "TALK") => { const token = localStorage.getItem("accessToken"); stompClientRef.current?.send( `/pub/chat.message.${roomId}`, { Authorization: `Bearer ${token}` }, JSON.stringify({ sender: currentUser, message, roomId, type, timestamp: new Date().toISOString(), }) ); if (type === "TALK") setNewMessage(""); }; ... 리액트는 다음과 같이 구성하고 @Controller @RequiredArgsConstructor @Log4j2 public class ChatController implements ChatControllerDocs { private static final String CHAT_EXCHANGE_NAME = " chat.exchange "; private final static String CHAT_QUEUE_NAME = "chat.queue"; private final ChatService chatService; private final RabbitTemplate rabbitTemplate; @Override // 클라이언트에서 서버로 보낸 메시지를 메시지를 라우팅 // @MessageMapping("chat.message")로 설정하여 클라이언트로부터 /pub/chat.message 목적지로 전송된 STOMP 메시지를 처리한다. /*RabbitMQ*/ @MessageMapping("chat.message.{roomId}") /*STOMP*/ // @MessageMapping("/{roomId}") // 구독한 클라이언트에게 response를 제공할 url 정의 // @SendTo("/topic/{roomId}") public ResponseEntity<?> sendMessage( // @Payload: 메시지의 body를 정의한 객체에 매핑합니다. @Payload ChatMessageDTO message, // @DestinationVariable: 구독 및 메시징의 동적 url 변수를 설정. RestAPI의 @PathValue와 같다. @DestinationVariable int roomId) { try { ChatMessageDTO msg = chatService.sendMessage(message); log.info ("Sent message: {}", msg); if (msg != null) { // RabbitMQ으로 메시지 전송 // template.convertAndSend() 메소드를 사용하여 메시지를 RabbitMQ로 전송한다. // 메시지는 chat.exchange 로 전송되며, 라우팅 키는 room. + 메시지의 방 ID로 구성된다. rabbitTemplate.convertAndSend(CHAT_EXCHANGE_NAME, "room." + roomId, message); } else { log.error("Failed to create chat message. User might not be in the chat room. User: {}, Room: {}", message.getSender(), message.getRoomId()); } return ResponseEntity.ok().body(msg); } catch (Exception e) { log.error("Error processing message: ", e); throw new ChatException(e.getMessage()); } } @Configuration @EnableRabbit @RequiredArgsConstructor public class RabbitConfig { // Queue (큐): RabbitMQ에서 메시지를 저장하는 장소 private static final String CHAT_QUEUE_NAME = "chat.queue"; // Exchange (교환기): 메시지를 Queue로 라우팅(보내는) 역할 private static final String CHAT_EXCHANGE_NAME = "chat.exchange"; // Routing Key (라우팅 키): Exchange가 메시지를 어떤 Queue로 보낼지를 결정하는 데 사용 private static final String ROUTING_KEY = "room.*"; @Value("${spring.rabbitmq.host}") private String host; @Value("${spring.rabbitmq.port}") private int port; @Value("${spring.rabbitmq.username}") private String userName; @Value("${spring.rabbitmq.password}") private String password; // Queue 등록 @Bean public Queue queue() { return new Queue(CHAT_QUEUE_NAME, true); } // Exchange 등록 @Bean public TopicExchange exchange() { return new TopicExchange(CHAT_EXCHANGE_NAME); } // Exchange와 Queue바인딩 @Bean public Binding binding(Queue queue, TopicExchange exchange) { return BindingBuilder .bind(queue) .to(exchange) .with(ROUTING_KEY); } // RabbitMQ와의 메시지 통신을 담당하는 클래스 @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); rabbitTemplate.setMessageConverter(jsonMessageConverter()); rabbitTemplate.setRoutingKey(ROUTING_KEY); return rabbitTemplate; } // RabbitMQ와의 연결을 관리하는 클래스 @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory factory = new CachingConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setVirtualHost("/"); factory.setUsername(userName); factory.setPassword(password); return factory; } // Queue를 구독(Subscribe)하는 걸 어떻게 처리하느냐에 따라 필요함. 당장은 없어도 됨. @Bean public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setMessageConverter(messageConverter); return factory; } @Bean public RabbitMessagingTemplate rabbitMessagingTemplate(RabbitTemplate rabbitTemplate) { return new RabbitMessagingTemplate(rabbitTemplate); } // 메시지를 JSON형식으로 직렬화하고 역직렬화하는데 사용되는 변환기 // RabbitMQ 메시지를 JSON형식으로 보내고 받을 수 있음 @Bean public Jackson2JsonMessageConverter jsonMessageConverter() { //LocalDateTime serializable을 위해 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); objectMapper.registerModule(dateTimeModule()); Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(objectMapper); return converter; } @Bean public Module dateTimeModule() { return new JavaTimeModule(); } } ... @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry .setErrorHandler(stompExceptionHandler) // 소켓 연결 URI다. 소켓을 연결할 때 다음과 같은 통신이 이루어짐 .addEndpoint("/ws/chat") .setAllowedOriginPatterns("http://localhost:5173") // SocketJS를 통해 연결 지원 .withSockJS(); } @Override public void configureClientInboundChannel(ChannelRegistration registration) { log.info("--------------"); log.info("동작함"); registration.interceptors(stompHandler); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { // url을 chat/room/3 -> chat.room.3으로 참조하기 위한 설정 registry.setPathMatcher(new AntPathMatcher(".")); registry.setUserDestinationPrefix("/sub"); // 클라이언트 구독 경로 // RabbitMQ 브로커 리레이 설정 registry.enableStompBrokerRelay("/exchange", "/queue", "/topic") .setRelayHost(host) .setRelayPort(61613) .setClientLogin(userName) .setSystemPasscode(password) .setSystemLogin(userName) .setSystemPasscode(password); } ... } 이렇게 구성했는데 rabbitMQ는 도커 컴포즈로 구성했습니다. 근데 다음과 같은 문제가 발생했는데 Chat.jsx:31 GET http://localhost:8080/ws/chat/285/4mxcvol4/jsonp?c=_jp.apvvzrr net::ERR_ABORTED 404 (Not Found) chat:1 Refused to execute script from ' http://localhost:8080/ws/chat/285/4mxcvol4/jsonp?c=_jp.apvvzrr ' because its MIME type ('') is not executable, and strict MIME type checking is enabled. 이렇게 계속해서 연결이 끊깁니다 어떻게 해야하나요?

  • rabbitmq
  • react
  • stomp
  • websocket
  • springboot
  • restapi
  • jwt
  • socketjs
유요한 댓글 1 좋아요 0 조회수 80

섹션3. 스프링부트와 API서버에서 부트 프로젝트 생성 및 확인 강의에 관한 겁니다.

미해결

코드로 배우는 React 19 with 스프링부트 API서버

해당 강의 1:51에서 갑자기 데이터베이스 익스플로러용 데이터그립 툴이 나오는데 이에 대한 설정은 어느 강의에서 확인할 수 있는 거죠? 느닷없이 나와서 혼동스럽기만 하네요. 섹션 1의 MariaDB와 부트 프로젝트생성에서도 하이디sql 툴 설정만 하셔서 데이터그립 툴은 어디에서 나온 건지 모르겠습니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
wjdwoals042 댓글 1 좋아요 1 조회수 148

moveToList 질문드려요

미해결

코드로 배우는 React 19 with 스프링부트 API서버

상품쪽 moveToList에서 page하고 size추가 안해도 useCustomMove 이쪽에 const page = getNum(queryParams.get('page'), 1) const size = getNum(queryParams.get('size'), 10) 이렇게 되어있어서 따로 moveToList에서 page하고 size를 안넣어도 잘 이동이 되던데 잘못된걸까요??

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
이주영 댓글 2 좋아요 0 조회수 77

수료증 문의

미해결

스프링부트 시큐리티 & JWT 강의

혹시, 강의 수강 완료 후 수료증 발급이 가능할까요?

  • spring
  • spring-security
  • jwt
CommitAndRun 댓글 2 좋아요 0 조회수 273

9분대에 질문이 있습니다 !

미해결

스프링부트 시큐리티 & JWT 강의

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 우선 강의 정말 유익하게 잘 보고 있습니다 감사합니다 ! 9분대에 질문이 있습니다. 어떻게 A의 개인 키로 잠겨 있는 것을 A의 공개 키로 오픈 할 수 있나요? -> 공개 키로 잠궈놨다면 해커가 열 수 있다고 생각 하는데, 개인키로 잠군 것을 B나 해커가 어떻게 공개 키로 열람할 수 있는 것인가요 ? A -> B 로 "A:C:1억을 송금했다" 라는 메시지를 A의 개인키로 보낼때 해커가 가로채서 A의 공개키를 사용해 데이터를 열어볼 수 있다고 하셨는데, 그럼 해커가 저 데이터를 다시 변경하여 B로 이상한 메시지를 보낼 수 있나요? 2-1. 보낼 수 있게 된다면 해커가 다시 A의 개인 키로 데이터를 보내나요? 2-2. 그렇게 된다면 B는 해커한테 탈취를 당했었는지 어떻게 식별 하나요? 해커가 다시 A의 개인 키를 사용할 수 있나요 ? 질문이 좀 많아서 죄송합니다 ㅎㅎ ..

  • spring
  • spring-security
  • jwt
이동준 댓글 1 좋아요 0 조회수 149

jwtUtil.js의 beforeRes에서 accessToken을 refresh 했을 경우

미해결

코드로 배우는 React 19 with 스프링부트 API서버

안녕하세요, 강의 잘 듣고 있습니다. jwtUtil.js 의 beforeRes 함수에서 아래 코드 관련 문의사항이 있습니다. // "ERROR_ACCESS_TOKEN" => JWTCheckFilter에서 어떠한 이유에서든 오류가 발생 시 if (data && data.error === 'ERROR_ACCESS_TOKEN') { const memberCookieValue = getCookie("member"); const result = await refreshJWT(memberCookieValue.accessToken, memberCookieValue.refreshToken); console.log("refreshJWT RESULT", result); memberCookieValue.accessToken = result.accessToken; memberCookieValue.refreshToken = result.refreshToken; setCookie("member", JSON.stringify(memberCookieValue), 1); // 원래의 호출 const originalRequest = res.config; originalRequest.headers.Authorization = `Bearer ${result.accessToken}`; return await axios(originalRequest); } 위 코드를 보면, accessToken (또는 refreshToken이 같이) 새로 발급된 후, setCookie 함수로 cookie에는 새롭게 갱신된 accessToken/refreshToken을 저장하고 있지만, redux store에는 갱신된 token 정보들을 업데이트 하지 않고 있는 것 같습니다. (loginSlice의 reducer를 호출하지 않고 있네요...) 혹시 redux store에도 새롭게 refresh된 token들을 저장하고 싶다면, 어느 부분에서 처리해야 할까요? 감사합니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
runner222 댓글 1 좋아요 0 조회수 111

npx create-react-app mall 에러가 납니다

해결됨

코드로 배우는 React 19 with 스프링부트 API서버

호환성 문제라고 본거같아서 이것저것 google에있는거 해보고 밀고 해보고 밀고 해봤는데도 안됩니다...

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
꾸아앙 댓글 3 좋아요 1 조회수 389

layout할때 css적용 같은건 그냥 다 따라 쳐야 하나요?

미해결

코드로 배우는 React 19 with 스프링부트 API서버

따로 코드가 있나요? 깃허브에 그 코드는 있는데 완성된 코드라 그런지 제가 보는 부분의 코드는 없는거 같아요(이 동영상 말고 다른 동영상에서) 동영상이라 코드가 안보이는 부분이 있어서 따라 칠수 없을때도 있는데 어떤식으로 해야 하나요?

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
김재원 댓글 1 좋아요 0 조회수 139

Client 파일은 어떤 IDE로 실행시키나요??

해결됨

Spring Boot를 활용하여 채팅 플랫폼 만들어보기

강사님 영상 오늘 하루종일 쭈욱 학습하였습니다. 저는 현재 Intelli J Ult 버전 사용중인데 7002 포트의 서버는 켰지만 3000의 포트 서버는 어떤 IDE로 구동해야 하나요??

  • mysql
  • spring-boot
  • jpa
  • jwt
  • websocket
service 댓글 2 좋아요 0 조회수 209

독립적인 Transactional을 둔 이유

해결됨

Spring Boot를 활용하여 채팅 플랫폼 만들어보기

음.. 코드를 보다가 강사님이 설명이 잘 이해가 가지않아서 질문 드립니다. saveChatMessage같은 경우 트랜잭션을 따로 빈으로 등록하여 saveChatMessage호출 시 독립된 트랜잭션을 호출해서 웹 소켓과 연관된 메시지 저장 작업만 독립적으로 관리하기 위함이라고 생각하면 될까요?? 보통 우리가 생각하는 웹소켓으로 메시징 작업을 하기 위해서는 실시간이기 때문에... 음 성능적인 부분과 데이터의 일관성을 유지하고 다른 트랜잭션 작업과 충돌을 방지하기 위해서 웹소켓사용시의 독립적인 트랜잭션을 사용한다라고 이해하면 될까요?? 그리고 또 한가지 현재 프로젝트에서는 MySQLConfig 클래스를 따로 정의해서 커스터마이징 하였는데, 만약 커스터마이징 하지 않고 웹소켓 기능을 사용하게 되었을 때에도 독립적인 트랜잭션 기능을 사용할 수 있나요??

  • mysql
  • spring-boot
  • jpa
  • jwt
  • websocket
service 댓글 2 좋아요 2 조회수 162

springdoc이 무슨 설정인가요??

해결됨

Spring Boot를 활용하여 채팅 플랫폼 만들어보기

springdoc이 무슨 설정인가요?? Swagger를 사용했을 때의 어떤 기본 설정같은건가요??

  • mysql
  • spring-boot
  • jpa
  • jwt
  • websocket
service 댓글 2 좋아요 1 조회수 141

typeorm ^10.0.2 버전 사용시 No metadata for "BoardRepository" was found. 오류 발생 해결방법.

미해결

따라하며 배우는 NestJS

@nestjs/typeorm: ^10.0.2 버전에서도 정상 동작합니다. 아래 코드 참고하셔서 수정해 보세요. boards.module.ts 파일에서 providers 부분 수정. ... @Module({ imports: [TypeOrmModule.forFeature([Board])], controllers: [BoardsController], providers: [BoardsService, BoardRepository], // BoardRepository 추가 }) export class BoardsModule {} board.repository.ts 파일에서 수정 import { Injectable } from '@nestjs/common'; import { DataSource, Repository } from 'typeorm'; import { Board } from './board.entity'; import { CreateBoardDto } from './dto/create-board.dto'; import { BoardStatus } from './board-status.enum'; @Injectable() // 변경 export class BoardRepository extends Repository<Board> { // constructor 추가 constructor(dataSource: DataSource) { super(Board, dataSource.createEntityManager()); } }

  • postgresql
  • jwt
  • nestjs
  • typeorm
jurjur 댓글 1 좋아요 3 조회수 287

섹션12:로그아웃 & 무한 루프 에러

미해결

코드로 배우는 React 19 with 스프링부트 API서버

안녕하세요. 덕분에 좋은 강의 잘 듣고 있습니다. 마지막 섹션 강의를 따라 진행하던 중, 로그아웃이 안되거나 무한 루프 오류가 나서 글을 남깁니다. 코드는 다 맞게 작성한 거 같은데, 어떤 부분을 확인해야 할 지 도움 부탁드립니다..!

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
인선 댓글 2 좋아요 0 조회수 148

useCallback 사용 이유를 잘 모르겠습니다...

미해결

코드로 배우는 React 19 with 스프링부트 API서버

안녕하세요 강의를 듣다 궁금한 점이 생겨서 질문 드립니다. 강의에서는 list페이지와 add페이지로 이동할때 useCallbak을 사용하여 이동하는데, const handleClickList = () => { navigate('list'); }; const handleClickAdd = () => { navigate('add'); }; 다음과 같이 useNavigate만 사용해도 라우터 이동은 똑같지 않나요??

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
헬랑 댓글 1 좋아요 0 조회수 165

프로젝트 이름이 중간에 바뀌어요

미해결

코드로 배우는 React 19 with 스프링부트 API서버

섹션 3의 REST 방식 컨트롤러 만들기(2)까지는 apiserver에서 작업중이었는데 REST컨트롤러 -수정/삭제, CORS 설정부터는 mallapi라고 프로젝트 이름이 바뀌어있고 그 뒤로도 mallapi에서 작업중인듯한데 제가 착각한건가요ㅠㅠ 뭐죠

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
이서연 댓글 4 좋아요 0 조회수 168

인기 태그

인프런 TOP Writers

주간 인기글