#변수

질문 2
해시태그 없이 키워드만 일치하는 질문은 개수에 포함되지 않아요.

14일 전 · aigoia 님의 답변 업데이트

코드를 쉽게 짜는법

기존회사에서 봐주는 사수 없이 거의 혼자 시스템을 맡아 하는중인데 코드리뷰없이 진행해서 제가 뭐가 잘못됐는지를 모르는상태로 경력을 쌓아 이직하는데 기능은 다 해내지만 코드를 어렵게 짠다는소리를 듣습니다 알기쉽게 짜는건 타고나야하는건가요? 여러방법이 있는건데 쉽게짜는법 정답이 있는건지 궁금합니다 기본적인 변수명, 함수명 알기쉽게 짜고 기능단위로 모듈화 이런건 아는데 생각의 차이인거같아 어렵네요

개발자

#코드작성

#이직

답변 1

댓글 2

조회 68

7달 전 · 김태욱 님의 질문

자바 메모리 누수 문제

프로젝트를 끝내고 aws 의 ec2 t2.micro 를 이용해서 배포를 했는데 메모리 누수가 심한 것 같습니다 docker 를 이용해서 배포해주고 있는데 heep space 에러가 메인 페이지 를 새로고침 몇번 하다보면 나더라구요 가상 메모리를 사용해서 메모리를 늘려주거나 코드에서 필요없는 변수를 지워주는 등 해봤는데 효과가 미미한것 같아요 본질 적인 문제는 어떤 시선으로 바라봐야 풀 수 있을까요?? 막막하네요 ㅜㅜㅜ

개발자

#java

답변 0

댓글 0

조회 30

7달 전 · 문종호 님의 새로운 답변

RAG 를 짜는 중에 도무지 어떤 부분이 문제인지 모르겠습니다.

# JSON 파일에서 FAQ 데이터를 로드하는 함수 def load_faq_data_from_json(file_path): with open(file_path, 'r', encoding='utf-8') as f: faq_data = json.load(f) return faq_data # FAQ 데이터 로드 json_file_path = '' faq_data = load_faq_data_from_json(json_file_path) # ChromaDB 클라이언트 및 Embedding 설정 chroma_client = chromadb.Client() # ChromaDB 클라이언트 생성 # 고유한 컬렉션 이름 생성 collection_name = "faq_data_" + datetime.datetime.now().strftime("%Y%m%d_%H%M%S") collection = chroma_client.create_collection(collection_name) # LangChain의 Text Splitter 설정 text_splitter = RecursiveCharacterTextSplitter( chunk_size=512, chunk_overlap=50 ) # OpenAI 임베딩 설정 openai_api_key = '' embedding_function = OpenAIEmbeddings( model="text-embedding-ada-002", openai_api_key=openai_api_key ) # 텍스트 스플리팅 및 임베딩 생성 함수 def split_and_embed_text(text): splitted_texts = text_splitter.split_text(text) print(f"Splitted texts: {splitted_texts}") try: # OpenAIEmbeddings는 embed_documents를 사용합니다. embeddings = embedding_function.embed_documents(splitted_texts) except Exception as e: print(f"임베딩 생성 중 오류 발생: {e}") return None # 임베딩이 제대로 생성되었는지 확인합니다. if embeddings is None or len(embeddings) == 0: print("임베딩 생성 실패") return None # 임베딩을 numpy 배열로 변환 embeddings = np.array(embeddings) print(f"Embeddings shape: {embeddings.shape}") # 임베딩 벡터의 차원을 확인하고 처리합니다. if embeddings.ndim == 1 and embeddings.shape[0] == 1536: # 임베딩이 1차원 배열이고 길이가 1536인 경우 final_embedding = embeddings elif embeddings.ndim == 2 and embeddings.shape[1] == 1536: # 임베딩이 2차원 배열이고 두 번째 차원이 1536인 경우 final_embedding = np.mean(embeddings, axis=0) else: print("임베딩 벡터의 차원이 예상과 다릅니다.") return None print(f"Final embedding shape: {final_embedding.shape}") return final_embedding # FAQ 데이터를 Vector DB에 저장 def store_faq_data_in_vector_db(faq_data, collection): for faq in faq_data: # 'question'과 'answer'가 있는지 확인하고, 'answer'가 None이 아닌지 확인 if 'question' not in faq or 'answer' not in faq or faq['answer'] is None: print(f"누락된 'question' 또는 'answer'로 인해 항목을 건너뜁니다: {faq}") continue # 다음 항목으로 넘어감 # 텍스트 스플리팅 및 임베딩 생성 question_embedding = split_and_embed_text(faq['question']) if question_embedding is None: print(f"Embedding generation failed for question: {faq['question']}") continue # 임베딩이 없으면 다음 질문으로 넘어감 print(f"Generated embedding for question '{faq['question']}': {question_embedding}") # 각 질문에 고유한 ID 생성 faq_id = str(uuid.uuid4()) # 메타데이터에서 None 값을 제거 metadata = {k: v for k, v in {"answer": faq['answer']}.items() if v is not None} # Vector DB에 저장 collection.add( documents=[faq['question']], metadatas=[metadata], ids=[faq_id], embeddings=[question_embedding] ) # 추가 후 임베딩 확인 (저장된 후 곧바로 확인) stored_results = collection.get(ids=[faq_id], include=["embeddings"]) if stored_results['embeddings'] is not None and len(stored_results['embeddings']) > 0: print(f"Embedding for question '{faq['question']}' successfully stored.") else: print(f"Failed to store embedding for question '{faq['question']}'") # FAQ 데이터를 JSON에서 로드하고 저장 store_faq_data_in_vector_db(faq_data, collection) 이렇게 데이터를 저장하고 # 환경 변수에서 API 키 로드 openai_api_key = os.getenv("OPENAI_API_KEY") if not openai_api_key: raise ValueError("OpenAI API 키가 설정되지 않았습니다. 환경 변수 OPENAI_API_KEY를 설정하세요.") # OpenAI 임베딩 설정 embedding_function = OpenAIEmbeddings( model="text-embedding-ada-002", openai_api_key=openai_api_key ) # LangChain의 Text Splitter 설정 (일관성 유지) text_splitter = RecursiveCharacterTextSplitter( chunk_size=512, chunk_overlap=50 ) # ChromaDB 클라이언트 및 컬렉션 설정 chroma_client = chromadb.Client() collection_name = "faq_data_collection" try: # 이미 존재하는 컬렉션인지 확인하고, 있으면 가져옴 collection = chroma_client.get_collection(name=collection_name) except chromadb.errors.CollectionNotFoundError: # 컬렉션이 존재하지 않을 경우에만 생성 collection = chroma_client.create_collection(name=collection_name) # Vector DB에서 유사 질문 검색 (ChromaDB) def find_similar_question_in_vector_db(new_question_embedding, collection, k=5): results = collection.query(query_embeddings=[new_question_embedding], n_results=k, include=['documents', 'metadatas', 'embeddings']) best_similarity = 0 best_question = None best_answer = None # 검색 결과에서 각 질문의 유사도와 답변을 처리합니다. if 'documents' in results and 'metadatas' in results: documents = results['documents'][0] metadatas = results['metadatas'][0] embeddings = results['embeddings'][0] for i in range(len(documents)): stored_embedding = embeddings[i] metadata = metadatas[i] if stored_embedding is not None: # 코사인 유사도를 통해 유사도를 계산합니다. similarity = cosine_similarity([new_question_embedding], [stored_embedding])[0][0] print(f"유사도: {similarity} for {documents[i]}") # 유사도가 가장 높은 결과를 선택하며, 임계값 이상일 경우에만 선택 if similarity > best_similarity and similarity >= SIMILARITY_THRESHOLD: best_similarity = similarity best_question = documents[i] if isinstance(metadata, list): metadata = metadata[0] best_answer = metadata.get('answer') if isinstance(metadata, dict) else None return best_question, best_answer # Fine-tuned GPT를 사용해 새로운 답변 생성 def gpt_generate_response_from_finetuned_gpt(question, style="의사 A 말투"): prompt = f"다음은 환자의 질문입니다: \"{question}\". 아래 말투를 사용하여 질문에 대해 성실하고 정확한 답변을 작성해주세요.\n\ 말투: {style}" response = client.chat.completions.create( model="", # Fine-tuned된 GPT 모델 ID messages=[ {"role": "system", "content": "You are a helpful medical assistant."}, {"role": "user", "content": prompt}, ], max_tokens=300, temperature=0.7, # 답변의 다양성을 조절합니다. ) return response.choices[0].message.content.strip() # 새로운 질문 처리 및 최종 응답 생성 def generate_final_response(new_question, collection): # 텍스트 스플리팅 및 임베딩 생성 splitted_texts = text_splitter.split_text(new_question) new_question_embedding = np.mean(embedding_function.embed_documents(splitted_texts), axis=0) # ChromaDB에서 유사 질문 검색 similar_question, answer = find_similar_question_in_vector_db(new_question_embedding, collection) if similar_question and answer: final_response = f"질문: {new_question}\n유사 질문: {similar_question}\n기본 답변: {answer}" else: generated_answer = gpt_generate_response_from_finetuned_gpt(new_question) final_response = f"질문: {new_question}\nGPT로 생성된 답변: {generated_answer}\n(이 답변은 벡터데이터에서 유사한 답변을 찾을 수 없어 GPT에 의해 생성되었습니다.)" return final_response # 사용자로부터 새로운 질문 입력 받기 new_question = input("새로운 질문을 입력하세요: ") # 최종 응답 생성 response = generate_final_response(new_question, collection) print(response) 로 데이터베이스에서 유사한 질문-답변 쌍을 끌어오려는데 정확히 같은 질문을 넣어도 (이러면 유사도가 1인데) 저장되어있는 답변이 끌어와지질 않네요...

개발자

#llm#rag

답변 1

댓글 0

조회 102

8달 전 · 포크코딩 님의 새로운 답변

유니티 c# 클라이언트 프로젝트에서 환경변수 설정

일반적으로 어떻게 환경변수를 관리하나요? Api 도메인 명이나 클라이언트 api 키같은 부분들을 환경변수로 관리하고 싶은데 구글링을 해도 확실한 방법이 잘 나오지 않네요. 아시는 분 계신가요?

개발자

#unity

#c#

답변 1

댓글 0

조회 32

8달 전 · 익명 님의 질문

프론트 배포 netlify 환경변수

리액트에서 백엔드 서버주소를 관리할 때 .env 파일에 환경변수로 관리하고 있습니다. 그런데 netlify로 배포를 할 때, netlify.toml 파일을 작성해주는데, 이때 redirect에 백엔드 주소를 그대로 사용하면 깃허브에 toml파일이 노출되며 .env 파일로 관리해주는게 의미가 없어지는거 같은데 어떻게 해야되나요?

개발자

#netlify

#배포

답변 0

댓글 0

조회 35

8달 전 · 익명 님의 질문

시계열 데이터 분석 - 데이터가 부족할때 어떻게 해야하나요?

팀프로젝트 과목에서 시계열 데이터를 분석하게 되었습니다. 시계열 데이터에서 2년은 월의 마지막 일 '2004-03-01' 형식으로 독립변수가 주어져있고 마지막 1년은 일별로 y값이 주어져있는데 ARIMA 모델로 시계열 분석을 하려고 하니 데이터가 부족해서 ARIMA(0,0,0) 형태로 모델 적합을 하니 모델 정확성에 대한 의구심이 듭니다. 이런 경우에는 어떻게 하나요? 추가로 데이터 수집을 하기엔 어려운 상황인데 주제를 바꿔야할까요?

개발자

#데이터분석

#통계

답변 0

댓글 0

조회 39

10달 전 · 석정도 님의 질문

리액트 네이티브 릴리즈로 배포 시 build.gradle 설정대로 동작 안하는 이유가 뭔지 궁긍합니다.

안녕하세요. 현재 리액트 네이티브로 프로젝트를 진행하고 있습니다. 막바지 단계에 거의 도달해서 이제 배포 준비를 하려고 하는데요, 마지막으로 테스트를 하기 위해 stagingRelease 로 apk 를 만들어서 테스트를 하려고 하니, .env.staging 을 읽지를 못하고 있네요. 이상한건 stagingDebug 로 할 때에는 이런 문제가 없었습니다. 지금 환경변수는 루트 디렉토리에 env 폴더가 있고, 해당 폴더 내에는 3개의 환경변수 파일이 존재합니다. .env.development .env.staging .env.production 이렇게 3개 입니다. project.ext.envConfigFiles = [ productiondebug: "env/.env.production", productionrelease: "env/.env.production", developmentrelease: "env/.env.development", developmentdebug: "env/.env.development", stagingrelease: "env/.env.staging", stagingdebug: "env/.env.staging" ] 위의 코드는 제가 설정한 환경변수 매핑하는 부분입니다. 실제로 stagingrelease 로 빌드 시에 flavor 값이 stagingrelease 로 뜨는 걸 확인했습니다. node_modules 에서 react-native-config 폴더를 찾아서 dotenv.gradle 에서 찍으니까 확인이 가능하더라고요. 제가 궁금한 점은 왜 루트에서 .env 파일만을 읽어서 BuildConfig.java 에서 사용하려고 하는걸까요? .env.staging 을 참조하지 않는 이유가 궁금합니다. 아래는 dotenv.gradle 파일입니다. import java.util.regex.Matcher import java.util.regex.Pattern def getCurrentFlavor() { Gradle gradle = getGradle() def pattern = Pattern.compile("(?:.*:)*[a-z]+([A-Z][A-Za-z0-9]+)") def flavor = "" gradle.getStartParameter().getTaskNames().any { name -> Matcher matcher = pattern.matcher(name) if (matcher.find()) { flavor = matcher.group(1).toLowerCase() return true } } println "Current flavor: $flavor" return flavor } def loadDotEnv(flavor = getCurrentFlavor()) { def envFile = project.hasProperty("defaultEnvFile") ? project.defaultEnvFile : ".env" if (System.env['ENVFILE']) { envFile = System.env['ENVFILE'] } else if (System.getProperty('ENVFILE')) { envFile = System.getProperty('ENVFILE') } else if (project.hasProperty("envConfigFiles")) { project.ext.envConfigFiles.any { pair -> if (flavor.startsWith(pair.key.toLowerCase())) { envFile = pair.value return true } } } println "Reading env from: $envFile" def env = [:] File f = new File("$project.rootDir/../$envFile"); if (!f.exists()) { f = new File("$envFile"); } if (f.exists()) { println "Found env file: $f" f.eachLine { line -> def matcher = (line =~ /^\s*(?:export\s+|)([\w\d\.\-_]+)\s*=\s*['"]?(.*?)?['"]?\s*$/) if (matcher.getCount() == 1 && matcher[0].size() == 3) { env.put(matcher[0][1], matcher[0][2].replace('"', '\\"')) // 각 환경 변수 키-값 쌍 출력 println "Loaded env variable: ${matcher[0][1]} = ${matcher[0][2]}" } } } else { println("**************************") println("*** Missing .env file ****") println("**************************") } project.ext.set("env", env) } loadDotEnv() android { defaultConfig { project.env.each { k, v -> def escaped = v.replaceAll("%","\\\\u0025") buildConfigField "String", k, "\"$v\"" resValue "string", k, "\"$escaped\"" println "Set buildConfigField and resValue: $k = $v" } } } 안드로이드 스튜디오 터미널에서 ./gradlew assembleStagingRelease 명령어를 치게 될 경우, Current flavor: stagingrelease Reading env from: .env.staging ************************** *** Missing .env file **** ************************** 이런 로그가 뜨고 있습니다.

개발자

#react-native

#react-native-config

#다중환경변수

#release

답변 0

댓글 0

조회 67

10달 전 · 성지수 님의 새로운 답변

환경변수 주입 및 빌드(모노레포)

모노레포 프로젝트 환경 및 요구사항 - 프로젝트는 front(React), back(Node), common 패키지로 구성되어 있으며, 모노레포로 되어있음 - Dockerfile 스크립트에서는 build → run 순서로 실행되도록 구현되어 있음 - 서버 배포 시에는 하나의 포트만 사용해야 하므로 back(Node)에서 front의 정적 파일(index.html)을 실행해야 함 - Docker 빌드 시, front(webpack 빌드)와 back 둘 다 build 스크립트를 실행하고, 이미지 실행 시에는 back만 run 스크립트를 실행하여 back에서 front의 정적 파일을 실행해야 함 - 환경변수는 이미지 실행 시 docker-compose.yml의 env_file 속성을 사용해 외부에서 주입해야 함(환경변수가 바뀌는 상황이 있다면 .env 파일을 수정한 후 다시 빌드해야 합니다.) 예외 상황 Docker 빌드할 때 .env 파일을 포함하지 않고 run 스크립트를 실행(이미지 실행) 시 주입하는데, front 패키지에는 run 스크립트가 존재하지 않습니다. (back에서 front의 정적 파일을 실행) 즉, 환경변수가 주입되지 않고 있음 해결 방법 첫번째는 back에서 front의 dist 파일 호출 시 환경변수 객체를 만들어 value 값을 key 값으로 치환해서 함께 넘기고, index.html의 head에서 window 객체를 활용해 값을 받는 방법 하지만 이 방법은 개발자 도구에서 환경변수 값이 노출되고, window 객체를 활용하기 때문에 새로운 브라우저를 생성할 때마다 사이드 이펙트가 발생할 수 있음 두번째는 모노레포 root 패키지에서 prerun 스크립트로 front의 build 스크립트를 실행하는 방법 스크립트 -> "prerun": "lerna run build --parallel --scope @projectname/front --stream", 이 방법은 빌드를 두 번 실행하므로 자원을 많이 소모하지만, 예외 상황이 없는 것으로 보임 질문 받은 내용 Q. 환경변수를 바꾸는 상황이 존재할까요? A. 회사의 인프라 환경에 따라 다르지만, 포트나 IP가 변경될 수 있는 상황이 있음 예를 들어, 외부 서버에 요청을 보낼 경우 그 서버의 정보가 바뀌면 설정을 변경해야 하며, 다른 서버에 요청할 때 인증 정보를 입력해야 하는데, 토큰이나 사용자 패스워드 값이 변경될 경우에도 수정이 필요함 고민되는 부분 다른 해결 방법이나 비슷한 상황이 있다면 함께 논의하고 싶습니다. ㅎㅎ *프로젝트 구조 root ├── packages │ ├── back │ │ ├── package.json │ │ ├── index.ts │ │ ├── .babelrc │ │ └── ... │ ├── common │ ├── front │ │ ├── public │ │ │ └── index.html │ │ ├── package.json │ │ ├── src │ │ │ └── index.js │ │ ├── src │ │ ├── webpack.config.js │ │ └── ... ├── package.json ├── lerna.json ├── docker-compose.yml ├── Dockerfile * 프로젝트의 중요 정보는 제외했습니다.

개발자

#환경변수주입

#모노레포

#빌드

#node.js

#react

답변 1

댓글 0

조회 105

10달 전 · 김준석 님의 새로운 댓글

Next.js 코드 가독성..

안녕하세요 프론트앤드 1년차에 다가가고 있는 신입 개발자입니다. 현재 Next14를 사용하고 있으며 코드의 가독성, 효율성을 많이 고려하면서 코드를 짜려고하는데 너무 고민이 되네요 저보다 앞서서 달려가고 있는 개발자 선배님의 생각을 듣고싶습니다 ㅠㅠ... 2가지가 궁금합니다. 먼저 첫번째 이미지처럼 Version에 관련된 파일을 저렇게 분리했을 때 저는 Version의 최상위 Layout.tsx에서 모든 것을 선언하기가.. 너무 오히려 가독성이 안좋다고 생각을 하고 있습니다 즉, 변수나 함수를 모두 최상위 Layout.tsx에서 선언 및 정의를 해두고 props로 내려주는게 이상하다고 생각을 합니다. 변수, 함수, useEffect 모두 직접 해당 변수나 함수를 컨트롤하는 부분에서 선언 및 가공을 하는게 맞다고 생각을 합니다. 최상위 Layout.tsx가 너무 무거우면 오히려 나는 VersionDataTable에 관련된 변수나 함수만 보려고 하였으나 최상위 Layout.tsx를 보고 아 이게 VersionDataTable에 필요하구나 뭐가 필요없구나, useEffect의 의존성 배열까지 고려하는것이 불필요하다고 생각을 하고 있습니다.. 근데 같이 프론트 앤드 개발하시는 분께서는 '단기적으로 절대 코드가 변하지 않는다고 생각하면 그 말씀이 맞는데 그건 아니잖아요? 우리는 계속 유지보수를 할거고 그러면 결과적으로 A에서만 사용하던 변수나 함수들을 A,B,C에서 같이 사용할 수 있게 변경하게 되면 그때 변경하면 유지보수 측면에서 너무 안좋습니다. 최상위에 모두 선언이나 정의를 해두고 props로 내려주는게 맞다 이런 형식으로 코드를 작성하면 몇개월 뒤에 코드를 수정할 때 A가서 수정했다가 C가서 수정했다가 D가서 수정하실 거에요? 바로 알아보실 수 있겠어요?' 라고 말씀을 하시더라구요.. 물론 몇개월 뒤에 코드를 보거나 하면 제가 작성한 코드인데도 저는 헷갈리는 경우가 많습니다. 그러나 최상위에 모두 선언 및 정의해둬도 마찬가지 아닌가..? 유지보수 측면에서 뭐가 안좋은거지..? 라고 생각되게 됩니다.. 선배님의 말씀을 따라가고는 싶은데 이해가 안돼서요 제가 아직 기본기가 많이 부족한 상황이라 이 상황에서 말씀드리면 이론부터 말하며 설득시키기가 부족하다고 생각하기 때문에 말씀드리면 오히려 '저는 이렇게 생각해요 틀렸는데요?' 라고 말하는 것 같아 말다툼이 될 것 같습니다. 2. 밑 사진을 보면 modalTemplate라는 폴더, ConfirmTemplate이라는 폴더가 존재하는데요 이것에 대해서 저는 사용하는 용도에 따라서 Create면 Create Create와 Update를 동시에 할 수 있는거면 BundleCreateAndUpdate 이런 형식으로 각각의 파일을 생성을 하고 문법상 공유되는 부분은 중복이 되어서 실제로 보여주는 부분을 영역으로 나눠서 BasicOptions, SelectList, VersionDetail, VersionOptions로 나누고 각각의 파일에서 사용하는 부분만 불러와서 쓰는 형식으로 코드를 작성했습니다. 그러나 이렇게 용도에 따라 구분하지 않고 최상위 Layout.tsx파일 하나만 만들고 ModalType이라는 props를 받아서 ModalType이 create, update, create&update, delete ... 등 JSX에서 삼항 연산자를 써서 처리를 할수도 있습니다. 저는 ModalType으로 처음에 구분하다보니 나는 'create' 속성일 때 어떤 형식으로 되는지 코드로 보고싶은데.. 그러면 너무 뜯어서 봐야하더라구요 그래서 용도에 맞게 파일을 만들고 거기서 form을 불러오기만해서 중복 코드를 줄이는 방식을 택했습니다.. (더 나은 코드라고 생각했습니다.) 그랬지만 선배님께서 'ModalType으로 나누는게 더 좋아요 저렇게 지으면 가독성이 너무 떨어지고 파일의 이름이 너무 길어지잖아요 이상하지 않나요?' 라고 말씀을 하시더라구요... 물론 가독성은 사람마다 다른거 알고있습니다. 그러나 ModalType으로 나누기 시작하면 한도 끝도없이 나누고 ModalType이 delete일 때만 사용하는 함수, create일 때만 사용하는 함수 등 필요없는 함수도 너무 많아져서 용도에 맞게 파일을 구분하고 거기서 중복 코드만 최대한 줄이자! 라고 생각하여 코드를 작성했는데 이 내용도 말씀드려 봤지만 '가독성' 이라는 이유 하나만으로 너무 안좋다고 합니다.. 진짜 안좋은건가요..? Next 도 그렇고 프론트 앤드 너무 어렵습니다..

개발자

#react

#next.js

#front-end

#code-review

답변 2

댓글 2

추천해요 1

조회 683

10달 전 · 익명 님의 질문 업데이트

프론트엔드 - Docker-Compose 문제

docker-compose를 세팅 중 빌드 오류가 있어 질문 드립니다. 문제의 원인이 prod 환경의 compose.yml라고 예상되어지는데 dev 환경의 compose에서는 env 파일을 정상 인식하지만 prod 환경의 compose에서는 env 파일을 인식하지 못하는 문제인데요. docker-compose 명령어를 실행할 때, .env 파일이 있는 경로에서 실행을 하고있고 docker-compose.prod.yml과 .env 파일에 정의된 변수 이름도 오탈자는 없습니다. 어떻게 해야 docker build시, prod에서는 args를 사용할 때 production.env(= multiple .env)파일을 인식하게 할 수 있을까요? 혹시 제가 놓치고 있는 부분이 있을까요? 추가로, 관련된 코드와 설정은 Stack Overflow에 업로드를 해뒀는데요, 답변 주시면 정말 감사하겠습니다! https://stackoverflow.com/questions/78857841/docker-compose-not-recognizing-environment-variables-in-next-js-application-pro

개발자

#docker

#docker-compose

#도커

#에러

#프론트엔드

답변 1

댓글 0

조회 71

일 년 전 · 장성호 님의 새로운 댓글

비트연산관련 질문입니다.

우연히 비트관련해서 끄적이다 발견했습니다. 먼저 0x8000을 2바이트 short(golang에서는 int16)형 변수에 16진수 0x8000(앞에 형변환 넣었습니다.)을 할당 하면 제가 원한 결과인 -32768가 아닌 컴파일러에서는 양수로 인식이 되고 런타임(디버깅 모드, 브레이크 포인트잡고)에선 원하는 결과인 -32768이 반환되는데요 혹시 어떤 이유에서 컴파일러는 오류라 판단하는 건가요? 2의 보수에 의해 이런 결과가 나오는 건가요?

개발자

#질문

#비트연산

답변 1

댓글 2

보충이 필요해요 2

조회 88

일 년 전 · 유길종 님의 새로운 답변

리액트에서는 호이스팅이 다른이유?

순수 자바스크립트에서는 함수선언문으로 만든 경우에만 호이스팅단계에서 선언과 초기화가 코드 실행 전에 이뤄져서, 선언부보다 윗라인의 코드에서 사용할 수 있다고 배웠습니다. 그런데 첨부한 이미지처럼, 리액트에서는 함수형 컴포넌트를 화살표함수로 만들고, const를 사용해서 변수를 선언해도 선언부보다 윗라인의 코드에서 사용이나 참조가 가능한 이유가 뭔가요?? 구글에서 글을 여러개 찾았는데 이야기 하는게 다 달라서 너무 햇갈리고 궁금합니다.

개발자

#react

답변 1

댓글 0

조회 143

일 년 전 · 이호영 님의 질문

Firebase sdk에 관한 질문입니다.

Firebase db로 2개의 프로덕트가 있는데 하나는 클라이언트에서 하나는 서버단에서 사용하려고 Initialize() 를 사용하려하는데 2가지의 이슈가 있었는데 getAuth()에 app이라는 변수명에 config를 정의 해두고 getauth(app)까지는 무제없었는데auth의메서드를 사용하려하니 이미 duplicate 블라블라..에러가 뜨더라구요. Firebase 공식문서 확인을 하면서 작성하긴했는데 이제 3일차 되는데 너무어려워서 질문남겨봅니다..

개발자

#firebase

#next.js

답변 0

댓글 0

조회 27

일 년 전 · 이양일 님의 답변 업데이트

Spring Unit test @Value

프로젝트 중 외부에 노출되면 안되는 값이 있어 환경변수로 설정한 후 @Value 어노테이션을 사용해서 값을 사용했습니다. 테스트 코드를 작성하며 통합테스트를 진행하기엔 자원소모가 크다 생각하여 유닛테스트로 테스트 코드를 작성했습니다. 그런데 유닛테스트에서는 @Value에 의존성주입이 안되서 해결방법을 찾고있습니다. 제가 찾아본 해결 방법으로는 1. @SpringBootTest 사용 2. Reflection 사용 3. 생성자를 통한 주입 이렇게 3가지 방법이 있는데 2,3번 모두 테스트코드 내에서 직접 값을 입력해줘야해서 환경변수로 값을 보호하는 이점이 사라진다고 생각이 들었습니다. 이런 상황에선 어떻게 하는게 좋을까요? 환경변수가 들어가는 값을 테스트 할때 유닛테스트를 사용하는 접근방식부터 잘못된걸까요..? 현업에선 이런 민감한 정보를 어떻게 처리하는지 궁금합니다!

개발자

#spring

답변 1

댓글 1

보충이 필요해요 1

조회 1,481

일 년 전 · devwoo 님의 새로운 답변

react-native-config, Cannot locate tasks that match 'app:installDevlop' as task ~

react-native-config 를 활용해서 환경변수를 만들어서 api key를 숨길려고 했는데요, 제목같이 에러가 발생하더라구요. 근데 다 찾아봤는데 저렇게 계속떠가지고 방법이 있을까요? (※ project.ext.envConfigFiles = [ developdebug: ".env.development", productdebug: ".env.production" ] 위 코드처럼 developdebug 이렇게 자세히 써야한다고 하는데 썼는데도 안되더라구요;; )

개발자

#react-native

#react-native-cli

#react-native-config

답변 1

댓글 0

조회 27

일 년 전 · 문종호 님의 새로운 댓글

typescript api fetch 시 interface로 타입을 지정해줘야 할까요?

안녕하세요. 프론트엔드 개발을 하고 있는 사람입니다! 아직 잘 몰라서 여쭤보고 싶습니다. typescript로 react query를 이용하여 api fetch를 진행하고 있는데요. data를 받을 때 unknown이라고 나와서 타입 지정이 필요하다는 것을 느꼈습니다. 현재는 Dot Notation : data.변수 -> Bracket Notation data['변수'] 형식으로 변경을 했는데 오류가 사라져서 사용하고 있는데, 장기적으로 봤을 때 interface로 api 에 있는 키 영역을 모두 타입 지정해줘야 할까요? 경력자분들의 고견을 부탁드립니다(_ _)

개발자

#react

#react-query

#fetch

#typescript

답변 1

댓글 2

조회 82

일 년 전 · 유길종 님의 새로운 답변

타입스크립트를 쓰면 구문 해석 시간이 감소하나요?

타입스크립트가 자바스크립트 변수의 타입을 지정해주는 기능이 포함되어 있는 것으로 알고 있습니다. 그럼 코드 구문 해석 시에 타입추론 과정을 생략하게 되니까 안 쓰는 것보다 구문 해석 시간이 줄어드나요?

개발자

#javascript

#타입스크립트

답변 2

댓글 2

조회 74

일 년 전 · 익명 님의 새로운 댓글

변수와 state에 대해 질문있습니다.

자바스크립트와 리액트를 현재 공부하고 있는 중인데 변수인 let, const에 대한 부분과 리액트에서 useState에 대한 부분의 설명을 듣고 문법적인 부분은 이해는 했는 상황인데 제가 직접 혼자 코드를 작성을 해보려고 하니 변수와 useState를 어떨때 작성을 하면 되는지 감이 잘 오지 않더라구요. 그래서 혼자 코드를 작성을 할 때 이럴때 변수 또는 useState를 작성하면 되겠구나하고 정말 쉽게 이해할 수 있는 방법이 있을까요? 있다면 쉽게 설명해주시면 너무 감사드리겠습니다.

개발자

#프론트엔드

#변수

#state

#초보자

답변 2

댓글 2

조회 49

일 년 전 · olcloolzj 님의 새로운 댓글

타입스크립트에서 타입 표기는 모두 다 해야하나요?

자바스크립트만 이용해 프로젝트를 하다가 타입스크립트를 사용하면 오류 메시지도 자세히 볼 수 있고, 나중에 규모가 커졌을 때 더 좋다고 들었습니다. 그래서 타입스크립트에 대해 공부하게 되었고 타입 명시를 하는것도 이해했습니다. 그런데 모든 변수나 함수와 같은 자료에 타입을 명시할 필요가 없다고 들었는데, 그렇다면 어디에 타입을 명시해야하는지 기준을 잘 모르겠습니다,, 다른 분들이 타입스크립트로 프로젝트한 깃 레포를 살펴봐도 잘 모르겠더라구요,, 혹시 타입스크립트를 사용하는 분들은 모든 곳에 타입 명시를 하시나요? 만약 모든 곳에 타입 명시를 하지 않는다면, 타입스크립트에서 타입 명시하는 기준이 무엇인지 궁금합니다,,!! 🤔

개발자

#타입스크립트

#자바스크립트

답변 1

댓글 3

조회 60

일 년 전 · 짹 님의 새로운 답변

콜백함수부분에 대해 질문있습니다.

안녕하세요 현재 자바스크립트를 공부하고 있는 초보자입니다. 현재 위치를 보여주는 코드를 작성하면서 궁금한 점이 생겼습니다. const askForLocation = function () { navigator.geolocation.getCurrentPosition((position) => { console.log(position); }); }; askForLocation(); 이러한 코드가 있는데 제가 알기론 ()=>{} 콜백함수에 매개변수로 position이 있고 제일 마지막에 askForLocation() 함수 호출하는게 있는데 이 함수 호출부분에서 인자로 아무것도 전달되는것이 없어서 console.log(position)를 했을 때 undefined가 나올 것을 예상했는데 geolocation의 객체정보가 콘솔창에 나오더라구요. 그래서 매개변수로 전달 될 만한것이 없는데 어떻게 콘솔창에 객체정보가 나오는지 궁금합니다. 초보자 입장에서 정말 쉽게 설명해주시면 너무 감사드리겠습니다.

개발자

#함수

#콜백함수

#프론트엔드

#자바스크립트

답변 1

댓글 0

보충이 필요해요 1

조회 46

일 년 전 · olcloolzj 님의 새로운 댓글

Next.js 클라이언트 컴포넌트에서 api 요청 시 보안 문제?

Next.js에서 클라이언트 컴포넌트에 사용하는 환경 변수에 NEXT_PUBLIC을 붙여줘야하는 것으로 압니다. 제가 프로젝트에서 api 키를 포함해 클라이언트 컴포넌트에서 fetch 요청을 보내야하는 상황이라(리액트 쿼리 사용 중), 해당 api키에 위와 같은 변수를 붙여주었습니다. 그런데 해당 방법이 안전한걸까요? 전에 chatGPT에서는 NEXT_PUBLIC을 붙이는 환경 변수에는 api 키와 같은 보안에 중요한 변수는 넣지 않는게 좋다고 하더라고요.... 이 말이 사실인건가요? 그렇다면 그 이유가 궁금합니다.. + Next.js에서 리액트 쿼리를 사용하고 있는데 리액트 쿼리를 사용하는 곳은 클라이언트 컴포넌트여야 정상적으로 작동하더라고요.. 만약 api 키가 포함된 요청을 클라이언트 컴포넌트에서 사용하는 것이 보안에 좋지 않다면, 어떤 방법을 써서 api 요청을 보내야할까요? Next.js의 api 라우트를 만들어 요청하는게 맞는건가요? 개발에 대해 잘 몰라 질문이 깔끔하지 않습니다만.. 혹시 아는 분 계시면 도와주세요 😭❕

개발자

#next.js

#서버-컴포넌트

#클라이언트-컴포넌트

#api요청

답변 2

댓글 5

추천해요 1

조회 208

일 년 전 · 용용 님의 답변 업데이트

직장상사가 너무 코드를 못짜는거 같아요.

1년도 안된 신입 개발자입니다. 제 직속 상사가 너무 코드를 못짜서 고민이 많습니다. 함수를 재사용할 수 있는데 그것을 재사용할 생각을 안하고, 똑같은 함수를 복사해서 여러 페이지 파일에서 사용을 합니다. 그래서 그 함수에 문제가 있으면 그 함수를 사용한 여러 페이지를 찾아서 코드를 수정합니다. 이런 일이 무수히 많이 일어나자 너무 스트레스가 많습니다. 또 간단하게 생각할 수 있는 로직을 변수도 여러개 만들어서 코드를 더 복잡하게 만듭니다. 이런 개발자들이 실제로도 많나요...?

개발자

#개발자

답변 2

댓글 0

조회 234

일 년 전 · 백승훈 님의 답변 업데이트

백엔드에서 데이터가공도 하나요?

저는 주니어개발자입니다 제 방식은 백엔드는 로직처리나 쿼리결과를 프론트로 보내고 프론트에서 데이터를 화면에 보이기쉽게 가공해서 보이는방식으로 하는데 지금다니는회사 프로젝트에서 이중중첩반복문을 사용해서 json형태로 만들고 화면에선 그대로 보여주는 방식을 하라고합니다 이중중첩반복문 자체도 좋지않을뿐더러 데이터가공을 백엔드에서 할때 데이터가많으면 서버부하가 나지않나요? 그리고 프론트에서 객체리스트로 2차원배열형태를 사용하는걸 보통 개발자들은 좋아하지않나요? 특히 그래프나 통계를 낼때 데이터들을 분류해서 꺼내는작업을하다보면 객체리스트형태로 할수밖에없던데 이렇게하지말고 데이터를 동적(데이터값이 바뀌어도 수정할필요없이)이 아닌 정해진 변수로 값을 꺼내도록 하라는데 이게맞나요..?

개발자

#백엔드개발

답변 1

댓글 0

조회 195

일 년 전 · 방재호 님의 답변 업데이트

[Js] 함수 매개변수 전달에 대하여...

안녕하세요! 이제 막 1년 좀 넘은 주니어 개발자 입니다. 공부 중에 한 가지 궁금한 점이 생겨서 선생님들께 여쭤보려합니다. js 함수를 작성하는 중에 매개변수로 event를 전달하려 했더니 event에 취소선이 생성됩니다... 예시) - html - <div class='.card'> ... <button id="deleteCard" onclick="deleteCard(event)">삭제</button> </div> - js - function deleteCard(event){ let card = $(event.target).closest('.card').remove(); }; 위와 같이 작성했는데 함수 실행은 되긴 하는데 매개변수 event에 취소선이 생기니 잘못된 것 같아서 여쭤봅니다... 취소선이 생기는 이유와 문제가 된다면 어떤 점에서 문제가 생기는지 개선점은 뭐가 있는지 궁금해서 문의 남깁니다.

개발자

#javascript

#매개변수

답변 1

댓글 0

조회 81

일 년 전 · 김하림 님의 답변 업데이트

JS는 {변수}로 사용하면 객체가 나오나요?

React를 급하게 독학하고 있는데 JS 문법에서 막혀서 여쭤봅니다. 강의들 찾아보면 {}를 사용해서 변수처럼 쓸 수 있는데 (ex. <div>{contents}</div>) 이걸 JS 표현식이라고 해서 JS 문법이라고 들었습니다. 일반적으로 객체를 변수에 할당시키면 리터럴이 아니라 주소가 담기잖아요. 왜 a를 찍는데 객체 리터럴이 보이고, {a}를 하면 객체 value로 객체가 들어가는 것처럼 표현되나요? 이 개념 찾아보고 싶은데, 뭐라고 검색해야 되는지 막막합니다... -------------------------------- let a = {a:"asfd", b:"erw"}; let b = "ast"; console.log(a); // 출력1: { a: 'asfd', b: 'erw' } console.log(b); // 출력2: ast console.log({a}); // 출력3: { a: { a: 'asfd', b: 'erw' } } console.log({b}); // 출력4: { b: 'ast' } 위 코드는 myCompiler에서 실행해봤습니다. https://www.mycompiler.io/ko/new/nodejs

개발자

#react

#js

답변 1

댓글 0

추천해요 2

조회 1,935

일 년 전 · 안희수 님의 새로운 답변

자바스크립트 및 프로그래밍 입문 강의 추천

안녕하세요. 친구가 프로그래밍을 입문하고 싶어하여 질문을 할 때 마다 답변을 주고있지만 서로아는 지식의 차이가 있기에 어디서부터 설명해야 할지 어려움이 있습니다. (D를 설명하다 기본으로 생각하던 C를 몰라 설명하다보니 B, A 까지 설명하게 되어 작은 부분 설명한번에 30분씩 소요 되는 중 입니다.) 기본적인 프로그래밍 단어(변수,함수,자료형) 등을 알려주는 강의가 있다면 추천받을 수 있을까 하여 질문드립니다. 읽어주셔서 감사합니다.

개발자

#프로그래밍-공부

#기초

답변 1

댓글 0

조회 55

일 년 전 · Ed 님의 새로운 답변

사용자 등급에 따라 다른 화면을 보여주고 싶어요.

Next.js 14버전을 사용하고 있습니다. 홈페이지에 접속했을 때, 사용자의 로그인 상태 여부에 따라 각기 다른 컴포넌트를 보여주고 싶습니다. const Main = () => { const isLogin = useRecoilValue(loginStatus); const user = useRecoilValue(userAtom); return ( <> <AuthWrapper> {isLogin && user ? <Login/> : <Logout />} </AuthWrapper> </> ) }; export default Main; isLogin과 user는 로그인 여부와 회원 정보에 대한 전역 변수입니다. isLogin의 default값은 false이고, user의 경우 isLogin이 true일 때만 존재합니다. (로그인 상태일 때 해당 유저 정보를 api로 호출) 그리고 <AuthWrapper>를 통해 해당 전역 변수들을 업데이트 해줍니다. 제가 원하는 건 최초 페이지 접속 시에 AuthWrapper를 통해 state값을 초기화해주고, 이에 알맞게 컴포넌트가 렌더링 되는 것입니다. 하지만 isLogin의 default값이 false이기에 로그인 상태일 경우, 순간적으로 Logout컴포넌트가 출력되었다가 AuthWrapper에서 검증 후 state값이 변경되면 Login컴포넌트가 출력됩니다. 이 순간적인 깜빡임을 없애고 바로 동작할 수 있게 하는 방법이 있을까요? +) 추가로.. 서버 사이드에서 처리하기에는 AuthWrapper 내부에서 storage값을 사용하거나 useEffect등을 사용하기에 불가능했습니다.

개발자

#next.js

#react

답변 4

댓글 0

조회 106

일 년 전 · 안희수 님의 답변 업데이트

JWT 토큰 중 accessToken은 어디에 보관하는 것이 좋을까요?

안녕하세요 jwt 토큰 보관에 대해 질문 있습니다. 원래는 accessToken은 로컬스토리지에, refreshToken은 httponly cookie로 보관하려 했습니다. 하지만 accessToken을 로컬스토리지로 보관하면 XSS 공격에 취약하다라는 단점 때문에 로컬 변수를 사용하라는 글도 종종 보이더라구요. 어떤 방식을 사용하는게 좋은 방법일까요? 퍼널 형식의 웹페이지며, 이메일 인증을 통해 토큰을 발급합니다. acceToken의 만료 시간은 30분정도로 생각중입니다.

개발자

#react

#jwt토큰

#accesstoken

#cookie

#localstorage

답변 1

댓글 0

추천해요 1

조회 335

일 년 전 · 박정환 님의 새로운 답변

백엔드 개발자로써 많은 사람들의 조언이 필요해요..

안녕하세요. 26살 백엔드 개발자를 희망하고자 하는 신입입니다. 저는 비전공자에 취득한 자격증이 아직 없습니다. 국비지원으로 학원 수강 후 DBA로 2년6개월간 업무를 했고, 백엔드 개발자로 성장하고 싶다는 생각이들어 퇴사를 하고 다시 국비지원으로 학원수강 후 지금 현재 백엔드개발자로 취직한 상태입니다. (취직한지 한달됐습니다.) 여기서 제가 고민인 부분은 첫번째로, 연봉입니다. 연봉이 300이 되지 않습니다. 현재 시장 평균 연봉보다 적다고 생각합니다. 저는 이전 회사생활을 통해 전연봉이 중요하다고 느꼈고, 첫단추를 잘꿰고 싶은 마음이 있는 것 같습니다. 이 고민에 대한 것은 현재 회사에 선임님이 정말 잘해주셨고, 개발자로써 지식, 마인드가 좋았습니다. 또한 백엔드, 디자인, 기획 파트로 명확하게 나뉜 부분이 체계적이라고 느꼈습니다. 때문에 배울게 있다고 생각되어 연봉보다 배움을 택하려고 했습니다. 하지만 변수가 생기면서 두번째 고민이 생기게 됐습니다. 저를 케어하는 포지션으로 있어주시던 앞서 언급한 선임님이 퇴사를 하게 되었습니다. 그로인해 책임선임 직급으로 이전에 같이 업무했던 분이 프리랜서로 오셨습니다. 회사 모든 사람들이 그 분을 서포트 해주기 시작했고 저를 더 뒤로하게 된 상황이 되었죠 선임님이 안계신 뒤로 아무도 저에게 업무 지정을 해주지 않았습니다. 선임님 계실 땐 정말 쉬운 업무. 하루이틀만에 끝나는 업무 한번해봤습니다. (그 작업으로 기술적으로는 아니지만 배포하는 과정이나 업무흐름은 조금이나마 알 수 있어서 좋았습니다.) 파트장님께 저의 상황을 알려도 이전 회사에서 했던 업무인 데이터 추출건만 잠깐 줄뿐이었습니다. 데이터 추출보다 개발을 위해 공부하고 왔는데 또 데이터추출만 하는 셈이었죠 신입입장에서 혼자 업무를 가져가고 혼자 공부하는 것도 한계가 있다고 생각합니다. 그것도 한달간 말이죠 남이 짠 소스분석은 집에서도 충분히 할 수 있으니까요 현재 무슨업무가 들어오고 있는지를 알아죠... 또한 제가 가져갈 수 있는 업무를 그 안에서 찾는건 쉽지않았습니다. 때문에 첫번째 고민인 배울점이 정말 있는게 맞을까 하는 고민부터 다시 시작됐습니다. 결론은 현저히 낮은 연봉에 배울점이 있다고 생각했던 상황에 변수가 생기며 계속 이 회사에 다니는게 맞을지 고민이 됩니다. 지금 제가 섣불리 업무를 하고 싶은 욕심이 많은건지 잘못생각하고 있는건지 충분히 할 수 있는 고민을 하고 있는건지 모르겠어요 긴글 읽어주셔서 감사합니다. 많은 분들의 조언이 필요합니다 진심어린 조언 부탁드립니다...

개발자

#이직고민

#신입

#연봉

#조언

답변 1

댓글 0

조회 275

일 년 전 · 김예지 님의 새로운 답변

인텔리제이 스프링부트 env

인텔리제이에서 스프링부트 프로젝트를 개발중인데요 환경변수 설정에서 사용하다가 VScode 에서는 env파일을 만들어 사용하는 것을 보고 여기에서도 파일을 만들어 사용하려고 하는데 appconfig 에 @PostConstruct가 어플리케이션 컨텍스트가 로드된 후에나 실행 된다고 오류가 자꾸 나서요... 혹시 파일로 따로 설정하는게 어렵운건가요? 설정하는 방법이 있을까요?

개발자

#spring-boot

#env

답변 1

댓글 0

조회 243