묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결프로그래머를 위한 강화학습(저자 직강)
cartpole_DQN 에러
github에 있는 cartpole_DQN 코드를 그대로 사용하는데 위와 같이 에러가 뜹니다. 별도로 수정한 내용은 없고 우분투 20.04, 코랩에서 돌렸습니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
null? blank? 차이
- 여러분의 질문을 고대하고 있습니다. :-)- 질문 전에 검색을 먼저 해보세요. 사람 사는 게 다 비슷하다는 것을 알게 됩니다.- 예의는 거침없이 질문하기 위한 최고의 발명품입니다.- 100개의 설명이 스크린샷 한방 보다 못할 수 있습니다.- 코드를 첨부하면 전세계 누구나 이해할 수 있는 질문이 됩니다.- 하나의 질문에는 하나의 주제를 담아야 답변도 예리해집니다.- 시행착오를 알려주시면 곧 바로 원하는 문제에 집중할 수 있습니다.- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 선생님 혹시 model 생성시 null=True와 blank=True의 차이점은 뭔가요? 둘다 값을 부여하지않아도 된다라는 식으로 이해하고 있어서요
-
미해결태블로 지도 시각화, 기초부터 고급까지
헥스 타일맵 작성시 좌표생성
헥스 타일맵 작성시 좌표 생성은 어떤 식으로 해야 쉽게 할 수 있을까요? 시도와 시군구 경우, 좌표 템플렛을 제공해 주셔서 활용이 가능한데, 만약 미국을 주별로 좌표를 생성한다던가 아시아국가들을 좌표로 생성한다던가 하는 것으로 활용한다고 가정한다면 이럴 경우, 좌표 생성은 어떤 식으로 하면 될까요?
-
미해결
cartpole_DQN 에러
github에 업로드된 cartpole_DQN을 그대로 colab에서 사용중인데 다음과 같은 에러가 뜹니다.어떻게 해야 하나요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Button is not defined
프로필 탭 들어갈 시 Button is not defined 이라는 오류가 뜹니다 제 코드는 import React from "react"; import PropTypes from "prop-types"; import { List } from "antd"; import Item from "antd/lib/list/Item"; import { StopOutlined } from "@ant-design/icons"; import { isStyledComponent, keyframes } from "styled-components"; const FollowList = ({ header, data }) => { return ( <List style={{ marginBottom: 20 }} grid={{ gutter: 4, xs: 2, md: 3 }} size="small" header={<div>{header}</div>} loadMore={ <div style={{ textAlign: "center", margin: "10px 0" }}> <Button>더 보기</Button> </div> } bordered dataSource={data} renderItem={(Item) => ( <List.Item style={{ marginTop: 20 }}> <Card actions={[<StopOutlined key="stop" />]}> <Card.Meta description={Item.Nickname} /> </Card> </List.Item> )} /> ); }; FollowList.propTypes = { header: PropTypes.string.isRequired, data: PropTypes.array.isRequired, }; export default FollowList; 입니다 무엇이 문제 일까요?
-
해결됨
강사님 좋은 강의 감사드리며 궁금한 사항이 있어서 질문 드립니다.
스프링부트를 기동시키면 @Configuration 에 의해 존재하는 모듈들을 참고하여 환경을 자동 구성하는 것으로 알고 있습니다. 하지만 우리가 자체로 제작한 imports 파일에 jetty 와 tomcat , dispatcher 가 를 작성하여 이의 조건에 따라 이를 구성하였는데 이건 스프링 부트 자체에서 해주는 일들과 충돌이 발생하지 않는 건지요? 만약 발생하지 않는다면 그 이유는 사용자가 설정한 환경이 먼저 구성되고 스프링 부트는 @ConditionalOnMissingBean 을 사용하여 사용자가 생성한 빈을 따로 생성하지 않기 때문인지요 ? 제 생각이 틀렸으면 정확한 지적 부탁드립니다. 감사합니다.
-
미해결Vue.js + TypeScript 완벽 가이드
두번째 프로젝트 권한 요청 드려요~
닉네임: JAESEOK깃헙 아이디: sjs1@cudo.co.kr감사합니다~
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
HomeController 클래스 통해서 home.html 렌더링되는 과정이 이게 맞는 건지 궁금해요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. 애플리케이션이 실행될 때, @Controller annotation이 있는 HomeController class의 instance가 스프링 컨테이너에 bean으로서 등록2. 사용자가 localhost:8080 입력하면 tomcat 서버가 받고, 스프링 컨테이너에 @GetMapping("/")이 있는 bean 탐색3. HomeController class 내부에 있는 home()이 @GetMapping("/")이 있고, 문자열 "home"을 return하므로 templates 폴더에 있는 home.html 렌더링됨, 컨테이너에서 이미 대응되는 bean을 찾았으므로 static 폴더에 있는 index.html는 렌더링 X이 과정이 맞을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[3_Q맞왜틀] 어디서 틀렸는지 잘 모르겠어요
http://boj.kr/2c94d34c79944ea3a6c763ef440ac650 예제는 맞는 것 같은데 (visited배열 출력해서 확인함) 제출 하면 틀렸다고 나오네요.. 왜그런지 잘 모르겠어요 ㅜㅜ저는 다음과 같이 코드를 짰습니다.입력받고gohome 함수에서cnt가 k와 같으면 ret++하고 returnny와 nx정의해서 범위 벗어나는지 확인, 방문했는지 확인, 입력받은 배열 값이 T인지 확인, cnt==k인데도 도착지가 집이 아닌지 확인위 조건들을 통과하면 방문하고 재귀함수 호출 , 방문기록 삭제도움 많이 받고있습니다 선생님 감사합니다!
-
미해결실전! 스프링 데이터 JPA
long 반환타입
MemberJpaRepository의 count 함수에서 Long이 아닌 long 으로 반환타입을 작성 하는 이유가 뭔가요?Long으로 해도 상관 없는걸까요?
-
미해결
keycloak, oauth2을 이용한 spring boot 인증 처리
안녕하세요.프론트와 백엔드간에 인증처리 구성을 테스트 하던 중 궁금한게 있어 질문드립니다.프론트와 백엔드에 kecloak 적용 방법이 궁금합니다.현재 프론트, 백엔드 모두 spring boot를 사용했습니다.그 다음 spring-boot-starter-oauth2-resource-server, spring-boot-starter-oauth2-client를 적용하려고 하는데요.keycloak 로그인을 해서 인증 세션을 생성(프론트) : client 적용들어온 요청이 인증된 요청인지 확인(백엔드) : resource-server 적용이렇게 적용하면 되는걸까요? REST API 호출 시 인증 처리 방식이 궁금합니다.1) 같은 realms 안의 client들 끼리는 keycloak SSO 처리로 인증된다.?2) keycloak에서 토큰정보 조회 url을 호출해서 받은 access-token을 헤더에 넣어서 받는 쪽에서 token을 파싱해서 인증 체크를 한다.2번으로 한다고 하면 access-token을 얻어오는 방식이 url을 호출해서 받아오는 게 맞는 방법인지가 궁금합니다.프론트 접속 -> keycloak 로그인 페이지 호출 -> keycloak 로그인 -> 백엔드 호출 요청 -> keycloak에 access-token 요청 -> access-token을 헤더에 넣고 백엔드 호출-> 백엔드에서 헤더에 있는 access-token을 확인 -> keycloak에 token 검증 요청이 흐름대로 동작한다고 생각하면 될까요? 아니면 로그인 되어 있는 상태라면 access-token을 꺼낼 수 있는 방법이 있는걸까요?
-
미해결처음 만난 리액트(React)
npm start
npm start를 하면 여기서 멈추고 원하는 화면이 안나오는데 어떻게 해야하나요?
-
미해결홍정모의 따라하며 배우는 C언어
C언어로 메모장 프로젝트를 시작한다면,
지금 강의 커리큘럼을 완주했을때, 메모장 프로젝트가 가능할까요?제가 생각한 메모장 기능은파일 열기, 닫기,최대화 최소화, 크기변화 텍스트입력, 삭제. 복사,붙여넣기저장,수정-이렇게 일때, 해당 과정만으로 가능할까요?아니면 winAPI나 GUI에 대한 추가 학습이 필요할까요?순수C언어만으로 프로젝트가 가능한지, 다른 별도 학습이 필요한지 궁금합니다.
-
해결됨
이진탐색 코드 질문
n, m = map(int, input().split()) duck = list(map(int, input().split())) ducks = sorted(duck) def binary(array, target, start, end): global result while start <= end: sum = 0 mid = (start+end)//2 for i in duck: if i > mid: sum += i - mid if sum < m: end = mid - 1 else : result = mid start = mid+1 result = binary(ducks, m, 0, ducks[-1]) print(result)이 코드에 입력값 4 619 15 10 17대입하면 15가 나와야하는데 나오지 않습니다. 어디가 문제인걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceTest 똑같이 작성했는데 java: ';' expected 에러가 자꾸 떠요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. package hello.hellospring.service;import hello.hellospring.domain.Member;import hello.hellospring.repository.MemoryMemberRepository;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.AfterEach;import org.junit.jupiter.api.BeforeAll;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;import static org.assertj.core.api.Assertions.*;import static org.junit.jupiter.api.Assertions.assertThrows;public class MemberServiceTest {MemberService memberService; MemoryMemberRepository memberRepository; @BeforeEach public void beforeEach() {memberRepository = new MemoryMemberRepository(); memberService = new MemberService(memberRepository); }@AfterEach public void afterEach() {memberRepository.clearStore(); //코드가 끝날때마다 clear @Test void 회원가입() {// given Member member = new Member(); member.setName("hello"); // when long saveId = memberService.join(member); // then Member findMember = memberService.findOne(saveId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); }@Test public void 중복_회원_예외() {// given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); //then IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); }// //then// try{// memberService.join(member2);// fail();// }catch (IllegalStateException e){// // assertThat을 통해 두 객체가 같은지 확인한다.// Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.1232131");// } @Test void findMember() {}@Test void findOne() {}}
-
해결됨[Lv.1] iOS 17 앱 개발 기초 - SwiftUI로 시작하기
Frame에 대한 개념 질문
"뷰는 자신의 콘텐트와 자신이 속한 레이아웃에 따라 자동으로 크기가 조절됩니다. 하지만 frame 수정자를 사용하여 뷰의 크기나 영역을 조절 할 수 있습니다."프레임은 해당 글과 같은 역할을 한다고 볼 수 있을거 같은데 아래 실습을 통해 추가적으로 이해를 해보려고 하면 VStack(spacing: 20){ Text("Hello World!") .font(.title) .background(Color.red) .frame(height: 100, alignment: .top) // 100프레임에 대한 컨텐츠는 위에 붙게됨 .background(.orange) .frame(width: 200) .background(Color.purple) .frame(maxWidth: .infinity, alignment: .leading) .background(Color.pink) .frame(height: 400) .background(Color.green) .frame(maxHeight: .infinity, alignment: .top) .background(Color.yellow) } 실질적으로 뷰의 크기나 영역을 frame 함수를 통해 조각조각 붙여나가는 방식으로 구현한다.라고 정리될 거 같습니다. 제가 이해한 게 맞는지 궁금합니다. 이런 식으로 조각을 붙여가면서 구현을 하는 개념으로 이해해도 되는 건지...
-
미해결배달앱 클론코딩 [with React Native]
TypeError: Cannot read property 'status' of undefined
안녕하세요 제로초님!회원가입을 하려면, 계속 아래와 같은 에러가 터미널에 뜹니다.error: [TypeError: Cannot read property 'status' of undefined] ERROR undefined어디가 잘 못 된걸까요,,.env파일 확인 해서 제 IP주소 확인했습니다.signUp 부분을 확인해야하는건지,,import React, {useCallback, useRef, useState, useEffect} from 'react'; import { ActivityIndicator, Alert, Platform, Pressable, StyleSheet, Text, TextInput, View, } from 'react-native'; import {NativeStackScreenProps} from '@react-navigation/native-stack'; import DismissKeyboardView from '../components/DismissKeyboardView'; import axios, {AxiosError} from 'axios'; import Config from 'react-native-config'; // 혹시 이거 설정법 아시나요 import {RootStackParamList} from '../../AppInner'; type SignUpScreenProps = NativeStackScreenProps<RootStackParamList, 'SignUp'>; function SignUp({navigation}: SignUpScreenProps) { const [loading, setLoading] = useState(false); const [email, setEmail] = useState(''); const [name, setName] = useState(''); const [password, setPassword] = useState(''); const emailRef = useRef<TextInput | null>(null); const nameRef = useRef<TextInput | null>(null); const passwordRef = useRef<TextInput | null>(null); useEffect(() => { console.log('email: ', email); console.log('name: ', name); console.log('password: ', password); }, [email, name, password]); const onChangeEmail = useCallback((text: string) => { setEmail(text.trim()); }, []); const onChangeName = useCallback((text: string) => { setName(text.trim()); }, []); const onChangePassword = useCallback((text: string) => { setPassword(text.trim()); }, []); const onSubmit = useCallback(async () => { if (loading) { return; } if (!email || !email.trim()) { return Alert.alert('알림', '이메일을 입력해주세요.'); } if (!name || !name.trim()) { return Alert.alert('알림', '이름을 입력해주세요.'); } if (!password || !password.trim()) { return Alert.alert('알림', '비밀번호를 입력해주세요.'); } if ( !/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/.test( email, ) ) { return Alert.alert('알림', '올바른 이메일 주소가 아닙니다.'); } if (!/^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[$@^!%*#?&]).{8,50}$/.test(password)) { return Alert.alert( '알림', '비밀번호는 영문,숫자,특수문자($@^!%*#?&)를 모두 포함하여 8자 이상 입력해야합니다.', ); } console.log(email, name, password); try { //:TODO log 삭제 console.log('LOGIN REQUEST'); console.log(Config.API_URL); setLoading(true); console.log(email); console.log(name); console.log(password); const response = await axios.post(`${Config.API_URL}/user`, { email, name, password, }); console.log('response: ', response.data); Alert.alert('알림', '회원가입 되었습니다.'); navigation.navigate('SignIn'); } catch (error) { console.log('error: ', error); const errorResponse = (error as AxiosError).response; console.error(errorResponse); if (errorResponse) { Alert.alert('알림'); } } finally { setLoading(false); } }, [loading, navigation, email, name, password]); const canGoNext = email && name && password; return ( <DismissKeyboardView> <View style={styles.inputWrapper}> <Text style={styles.label}>이메일</Text> <TextInput style={styles.textInput} onChangeText={onChangeEmail} placeholder="이메일을 입력해주세요" placeholderTextColor="#666" textContentType="emailAddress" value={email} returnKeyType="next" clearButtonMode="while-editing" ref={emailRef} onSubmitEditing={() => nameRef.current?.focus()} blurOnSubmit={false} /> </View> <View style={styles.inputWrapper}> <Text style={styles.label}>이름</Text> <TextInput style={styles.textInput} placeholder="이름을 입력해주세요." placeholderTextColor="#666" onChangeText={onChangeName} value={name} textContentType="name" returnKeyType="next" clearButtonMode="while-editing" ref={nameRef} onSubmitEditing={() => passwordRef.current?.focus()} blurOnSubmit={false} /> </View> <View style={styles.inputWrapper}> <Text style={styles.label}>비밀번호</Text> <TextInput style={styles.textInput} placeholder="비밀번호를 입력해주세요(영문,숫자,특수문자)" placeholderTextColor="#666" onChangeText={onChangePassword} value={password} keyboardType={Platform.OS === 'android' ? 'default' : 'ascii-capable'} textContentType="password" secureTextEntry returnKeyType="send" clearButtonMode="while-editing" ref={passwordRef} onSubmitEditing={onSubmit} /> </View> <View style={styles.buttonZone}> <Pressable style={ canGoNext ? StyleSheet.compose(styles.loginButton, styles.loginButtonActive) : styles.loginButton } disabled={!canGoNext || loading} onPress={onSubmit}> {loading ? ( <ActivityIndicator color="white" /> ) : ( <Text style={styles.loginButtonText}>회원가입</Text> )} </Pressable> </View> </DismissKeyboardView> ); } const styles = StyleSheet.create({ textInput: { padding: 5, borderBottomWidth: StyleSheet.hairlineWidth, }, inputWrapper: { padding: 20, }, label: { fontWeight: 'bold', fontSize: 16, marginBottom: 20, }, buttonZone: { alignItems: 'center', }, loginButton: { backgroundColor: 'gray', paddingHorizontal: 20, paddingVertical: 10, borderRadius: 5, marginBottom: 10, }, loginButtonActive: { backgroundColor: 'blue', }, loginButtonText: { color: 'white', fontSize: 16, }, }); export default SignUp; 아니면 AppInner부분인건지 모르겟습니다.import SignIn from './src/pages/SignIn'; import SignUp from './src/pages/SignUp'; import Orders from './src/pages/Orders'; import Delivery from './src/pages/Delivery'; import Settings from './src/pages/Settings'; import * as React from 'react'; import {createBottomTabNavigator} from '@react-navigation/bottom-tabs'; import {createNativeStackNavigator} from '@react-navigation/native-stack'; import {useSelector} from 'react-redux'; import {RootState} from './src/store/reducer'; import useSocket from './src/hooks/useSocket'; import {useEffect} from 'react'; import EncryptedStorage from 'react-native-encrypted-storage'; import axios, {AxiosError} from 'axios'; import {Alert} from 'react-native'; import userSlice from './src/slices/user'; import {useAppDispatch} from './src/store'; import Config from 'react-native-config'; import orderSlice from './src/slices/order'; export type LoggedInParamList = { Orders: undefined; Settings: undefined; Delivery: undefined; Complete: {orderId: string}; }; export type RootStackParamList = { SignIn: undefined; SignUp: undefined; }; const Tab = createBottomTabNavigator(); const Stack = createNativeStackNavigator<RootStackParamList>(); function AppInner() { const dispatch = useAppDispatch(); const isLoggedIn = useSelector((state: RootState) => !!state.user.email); console.log('isLoggedIn', isLoggedIn); const [socket, disconnect] = useSocket(); // 앱 실행 시 토큰 있으면 로그인하는 코드 useEffect(() => { const getTokenAndRefresh = async () => { try { const token = await EncryptedStorage.getItem('refreshToken'); if (!token) { return; } const response = await axios.post( `${Config.API_URL}/refreshToken`, {}, { headers: { authorization: `Bearer ${token}`, }, }, ); dispatch( userSlice.actions.setUser({ name: response.data.data.name, email: response.data.data.email, accessToken: response.data.data.accessToken, }), ); } catch (error) { console.error(error); if ((error as AxiosError as any).response?.data.code === 'expired') { Alert.alert('알림', '다시 로그인 해주세요.'); } } }; getTokenAndRefresh(); }, [dispatch]); useEffect(() => { const callback = (data: any) => { console.log(data); dispatch(orderSlice.actions.addOrder(data)); }; if (socket && isLoggedIn) { socket.emit('acceptOrder', 'hello'); socket.on('order', callback); } return () => { if (socket) { socket.off('order', callback); } }; }, [dispatch, isLoggedIn, socket]); useEffect(() => { if (!isLoggedIn) { console.log('!isLoggedIn', !isLoggedIn); disconnect(); } }, [isLoggedIn, disconnect]); useEffect(() => { axios.interceptors.response.use( response => { return response; }, async error => { const { config, response: {status}, } = error; if (status === 419) { if (error.response.data.code === 'expired') { const originalRequest = config; const refreshToken = await EncryptedStorage.getItem('refreshToken'); // token refresh 요청 const {data} = await axios.post( `${Config.API_URL}/refreshToken`, // token refresh api {}, {headers: {authorization: `Bearer ${refreshToken}`}}, ); // 새로운 토큰 저장 dispatch(userSlice.actions.setAccessToken(data.data.accessToken)); originalRequest.headers.authorization = `Bearer ${data.data.accessToken}`; // 419로 요청 실패했던 요청 새로운 토큰으로 재요청 return axios(originalRequest); } } return Promise.reject(error); }, ); }, [dispatch]); return isLoggedIn ? ( <Tab.Navigator> <Tab.Screen name="Orders" component={Orders} options={{title: '오더 목록'}} /> <Tab.Screen name="Delivery" component={Delivery} options={{title: '내 오더'}} /> <Tab.Screen name="Settings" component={Settings} options={{title: '내 정보'}} /> </Tab.Navigator> ) : ( <Stack.Navigator> <Stack.Screen name="SignIn" component={SignIn} options={{title: '로그인'}} /> <Stack.Screen name="SignUp" component={SignUp} options={{title: '회원가입'}} /> </Stack.Navigator> ); } export default AppInner;
-
미해결[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
mysql 관련 docker-compose 빌드 시 에러
강의 하나 들을 때마다 에러가 너무 많이 떠서 진도가 안나가서 미칠 지경이네요 ㅠㅠdocker-compose.yaml 파일을 아래와 같이 설정하고 docker-compose build를 하니 services.mydb.environment.0 must be a string 라는 에러가 떠서 구글링을 하니 environment: - MYSQL_DATABASE: 'dockerProject' - MYSQL_ROOT_PASSWORD: 'root'여기서 띄어쓰기를 없애보라고 하길래 아래와 같이 띄어쓰기를 없앤채로 .yaml파일을 변경하였습니다. version: '3.7' services: mybackend: build: context: . dockerfile: Dockerfile volumes: - ./src:/myfolder/src ports: - 3000:3000 env_file: - ./.env.docker mydb: # platform: linux/86_64 image: mysql:8.0.34 environment: - MYSQL_DATABASE:'dockerProject' - MYSQL_ROOT_PASSWORD:'root' ports: - 3306:3306그리고는 docker-compose build 이후 up을 실행했으나 ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...에러가 계속 발생합니다.(docker 말고 내 로컬컴퓨터에서는 mysql 연결 잘 되었음) 다른 질문자 분들 내용을 참조하여 package.json 파일의 mysql2와 typeorm의 버전을 아래와 같이 바꾸었고, .yaml 파일에서도 mysql 버전을 latest에서 8.0.34로 지정해주었습니다. { "name": "graghql", "version": "0.0.1", "description": "", "author": "", "private": true, "license": "UNLICENSED", "scripts": { "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { "@apollo/server": "^4.9.0", "@nestjs/apollo": "^12.0.7", "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", "@nestjs/graphql": "^12.0.8", "@nestjs/platform-express": "^10.0.0", "@nestjs/typeorm": "^10.0.0", "graphql": "^16.7.1", "mysql2": "3.2.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "typeorm": "^0.3.12" }, "devDependencies": { "@nestjs/cli": "^10.0.0", "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^5.59.11", "@typescript-eslint/parser": "^5.59.11", "eslint": "^8.42.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "jest": "^29.5.0", "prettier": "^2.8.8", "source-map-support": "^0.5.21", "supertest": "^6.3.3", "ts-jest": "^29.1.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3" }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } }그런데도 똑같이 ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...에러가 발생하여 node_modules 파일 및 dist 파일을 삭제 후 다시 yarn install을 했는데,이제는 import도 되지 않습니다....에러 때문에 진도가 나가질 않아, 중간중간에 강의를 멈춰가며 강의와 똑같이 따라가고 있는데 왜 이런 에러가 계속 발생할까요 ㅠㅠ
-
미해결
맥 vscode 질문있습니다.
윈도우에서 vs code 코드 작성후 프로그램 종료후 다시 vscode 실행하면 이전 작업 그대로 화면에 나오는데맥에서는 코드 작성후 프로그램 종료후 다시 실행하면 이전 작업이 안나오고 이화면이 계속 나오는데 윈도우 처럼 할려면 어떻게 해야하나요? ㅠㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
별거 아니지만 항상 궁금했던거요
객체로 나타낼 떄 따옴표 쓰는 거 하고 쌍따옴표 쓰는 거 하고 뭔 차이인가요? 그리고 따옴표 쓰면 계속 따옴표 쓰고, 쌍따옴표 쓰면 계속 쌍따옴표로 써야하나요?