묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결React Native with Expo: 제로초에게 제대로 배우기
사진 촬영 후 갤러리 저장 시 권한 문제
안녕하세요, 제로초님! 강의 잘 듣고 있습니다.다름이 아니라 ImagePicker로 카메라 사진 촬영 후 MediaLibrary를 사용해서 갤러리에 저장할 때, 다음과 같은 에러가 발생합니다.확인해보니 AUDIO 권한이 선언되지 않았다고 하는데, 아래와 같이 app.json의 plugin에 권한을 추가해도 동일한 에러가 발생합니다.{ "expo": { // ... "plugins": [ // ... [ "expo-media-library", { "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.", "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos.", "isAccessMediaLocationEnabled": true, "granularPermissions": ["audio", "photo"] } ] ], // ... } }제로초님이 올려주신 코드를 그대로 복사 & 붙여넣기 해봐도 같은 문제가 발생하는데, 혹시 제가 놓친 부분이 있을까요...? 강의에서 다룬 부분의 코드와 package.json 첨부하겠습니다.import { FontAwesome, Ionicons } from '@expo/vector-icons'; import * as ImagePicker from 'expo-image-picker'; import * as Location from 'expo-location'; import * as MediaLibrary from 'expo-media-library'; import { useRouter } from 'expo-router'; import React, { useState } from 'react'; import { Alert, FlatList, Image, Linking, Pressable, StyleSheet, Text, TextInput, TouchableOpacity, View, } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; // ... export default function Modal() { // ... const canAddThread = (threads.at(-1)?.text.trim().length ?? 0) > 0 || (threads.at(-1)?.imageUris.length ?? 0) > 0; const canPost = threads.every( thread => thread.text.trim().length > 0 || thread.imageUris.length > 0, ); const removeThread = (id: string) => { setThreads(prevThreads => prevThreads.filter(thread => thread.id !== id), ); }; const pickImage = async (id: string) => { let { status } = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (status !== 'granted') { Alert.alert( 'Permission not granted', 'Please grant camera roll permission to use this feature', [ { text: 'Open settings', onPress: () => { Linking.openSettings(); }, }, { text: 'Cancel', }, ], ); return; } let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ['images', 'livePhotos', 'videos'], allowsMultipleSelection: true, selectionLimit: 5, }); console.log('image result:', result); if (result.canceled) return; setThreads(prevThreads => prevThreads.map(thread => thread.id === id ? { ...thread, imageUris: thread.imageUris.concat( result.assets?.map(asset => asset.uri) ?? [], ), } : thread, ), ); }; const takePhoto = async (id: string) => { let { status } = await ImagePicker.requestCameraPermissionsAsync(); if (status !== 'granted') { Alert.alert( 'Permission not granted', 'Please grant camera permission to use this feature', [ { text: 'Open settings', onPress: () => { Linking.openSettings(); }, }, { text: 'Cancel', }, ], ); return; } let result = await ImagePicker.launchCameraAsync({ mediaTypes: ['images', 'livePhotos', 'videos'], allowsMultipleSelection: true, selectionLimit: 5, }); console.log('camera result:', result); // MediaLibrary 권한 요청 및 사진 저장 status = (await MediaLibrary.requestPermissionsAsync()).status; if (status === 'granted' && result.assets?.[0].uri) { await MediaLibrary.saveToLibraryAsync(result.assets[0].uri); } if (result.canceled) return; setThreads(prevThreads => prevThreads.map(thread => thread.id === id ? { ...thread, imageUris: thread.imageUris.concat( result.assets?.map(asset => asset.uri) ?? [], ), } : thread, ), ); }; const removeImageFromThread = (id: string, uriToRemove: string) => { setThreads(prevThreads => prevThreads.map(thread => thread.id === id ? { ...thread, imageUris: thread.imageUris.filter( uri => uri !== uriToRemove, ), } : thread, ), ); }; // ... }{ "name": "expo-threads-clone", "main": "expo-router/entry", "version": "1.0.0", "scripts": { "start": "expo start", "reset-project": "node ./scripts/reset-project.js", "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", "lint": "expo lint" }, "dependencies": { "@expo/vector-icons": "^15.0.2", "@react-navigation/bottom-tabs": "^7.4.0", "@react-navigation/elements": "^2.6.3", "@react-navigation/native": "^7.1.8", "expo": "~54.0.12", "expo-blur": "~15.0.7", "expo-constants": "~18.0.9", "expo-dev-client": "~6.0.13", "expo-font": "~14.0.8", "expo-haptics": "~15.0.7", "expo-image": "~3.0.8", "expo-image-picker": "~17.0.8", "expo-linking": "~8.0.8", "expo-location": "~19.0.7", "expo-media-library": "~18.2.0", "expo-router": "~6.0.10", "expo-splash-screen": "~31.0.10", "expo-status-bar": "~3.0.8", "expo-symbols": "~1.0.7", "expo-system-ui": "~6.0.7", "expo-web-browser": "~15.0.8", "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.4", "react-native-gesture-handler": "~2.28.0", "react-native-reanimated": "~4.1.1", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", "react-native-web": "~0.21.0", "react-native-worklets": "0.5.1" }, "devDependencies": { "@types/react": "~19.1.0", "typescript": "~5.9.2", "eslint": "^9.25.0", "eslint-config-expo": "~10.0.0" }, "private": true }
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
실전 2편에서는 어떤 것들을 준비 중인지 궁금합니다
안녕하세요 강사님 강의 너무 잘 듣고 있습니다! 아직 많은 DB설계를 해보진 않아서 알려주시는 개념들이 차곡차곡 잘 정립되는 것 같아 도움이 많이 되고 있습니다.실제 조금 더 복잡한 프로젝트들에서의 DB 설계, 성능이나 쿼리들도 궁금한데 혹시 앞으로 이에 관한 내용들도 강의하실 예정에 있으신지 궁금합니다. 또 실전 2편이 기다려지는데 어떤 것들을 준비 중에 있는지 궁금합니다!
-
미해결김영한의 실전 데이터베이스 - 기본편
이해하기 쉬운 SQL 코드 작성 배울 수 있는 자료 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]> ALL()이나 > ANY() 대신 MAX, MIN 집계 함수를 사용하는 방식이 더 이해가 잘 된다고 말씀해주셨는데요, 저도 그게 직관적으로 느껴졌습니다. 😊혹시 이런 best practice를 배울 수 있는 자료가 있을까요?
-
해결됨개발자를 위한 쉬운 도커
컨테이너를 활용한 개발환경 통일에 관하여
인텔리제이 Ultimate 라이센스가 있어서, 프론트엔드 작업(React)과 백엔드 작업(Spring)모두 인텔리제이에서 작업하는데요. 노드 버전을 이것저것 설치하면서 들었던 생각이 '개발환경도 컨테이너로 띄워서 하면 안되나?' 였습니다. 이 섹션을 통해 그 갈증을 해소한 것 같아요.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
도메인의 응집도와 모델 복잡도간 밸런스 고민
강의 너무 재미있게 듣고 있습니다.도메인이라는 개념에 대해서 고민하다가 궁금한 사항이 생겨서 질문드립니다. "도메인 모델이 비즈니스 규칙을 모두 내포하면 응집도는 높아지지만, 복잡도도 함께 커집니다. 이때 어디까지를 도메인 모델에 포함시키는 게 적절할까요?"
-
미해결JPA (ORM) 개발자를 위한 고성능 SQL (High-Performance SQL)
mysql에서 text vs json
어떤 상황에서 text를 쓰고 어떤 상황에서 json을 쓰는게 좋을까요? 현재는 json을 이용해서 쿼리를 사용할 사용성이 없지만 저장, 조회에 큰 비용이 발생하지 않는다면 추후를 위해서 json 타입으로 선언하는게 좋을까요?
-
미해결비전공자도 이해할 수 있는 Docker 입문/실전
도커는 백엔드말고 어디에 쓰이는 곳이 있나요?
도커를 배우다보니 다양한 곳에 어떻게 활용이 가능한지 궁금합니다!
-
미해결김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
PK 타입에 관한 문의
강의를 너무 잘 듣고 있습니다.PK 타입과 관련되어 문득 궁금한 점이 생겨 문의 드립니다.혹시 대규모 시스템에서 UUID를 PK를 사용할때 실무에서 고민하셨던 팁이 있으신지 궁금합니다.보안성이나 마이그레이션 가능성이 있는 테이블들에 부분적으로 UUID를 적용해 보았으나, 대규모 환경에서는 어떤 설계 팁이 있을지 궁금하네요.감사합니다^^ * 이건 질문은 아니나 사소한 오타 제보입니다.수업 자료중 1-A. 윈도우 - MySQL 설치 안내 파일의4P 맨 아래'mysql-installer-community-8.0.x.dmg`로 되어 있습니다. 참고하시면 좋을 것 같습니다.
-
해결됨Git & GitHub, 원리부터 차근차근 - 근본깃 [완성편]
브랜치 병합 전략에 대한 지식공유자님의 생각이 궁금합니다.
안녕하세요, 강의 잘 듣고 있습니다.Git을 정리하는 데 큰 도움을 받고 있습니다.다름이 아니라 GitHub에서 브랜치를 메인 브랜치로 병합할 때 사용하는 전략에 대해 궁금합니다. 기본 병합(merge), 스쿼시 & 머지(squash & merge), 리베이스 & 머지(rebase & merge) 방식이 있는데, 어떤 방식을 선호하시는지 여쭤보고 싶습니다.개인적으로는 로컬에서 작업할 때는 리베이스 & 머지를 선호합니다. 히스토리를 깔끔하게 유지할 수 있기 때문입니다. 반면에 메인 계열 브랜치(dev, prod 등)로 병합할 때는 기본 병합을 사용해야 기능 추가 히스토리를 명확히 추적할 수 있다고 생각합니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
Application Service와 Domain Service를 명확하게 이해한 건지 궁금합니다.
Application Service에서는 흐름을 관리하고 (예를 들면 DB에서 데이터를 가져오는 등) Domain Service는 복잡한 비즈니스 로직을 처리하는 역할로 이해를 했는데 이해한 것이 맞을까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
빈약한 도메인 모델을 보완하기
안녕하세요. 빈약한 도메인 모델에 관하여 질문이 있습니다.현재 개인적으로 진행하는 프로젝트에서 데이터 홀더 역할정도만 하는 빈약한 도메인 모델이 있습니다.repository에는 테이블의 상태 컬럼을 업데이트하는 메소드가 존재하는데 이를 도메인 모델 내부에 메소드를 만들어 업데이트하고 repository의 save를 통해 엔티티의 상태를 update하는 것이 강의에서 의도한 내용으로 이해했는데 맞을까요?추가로 이런 경우(비즈니스 로직이 복잡하지 않은)에 꼭 도메인 모델이 없어도 될지 궁금합니다.
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
22강에서 구조체와 포인터로 설명해주셨는데 패딩의 경우는 어떻게 되나요?
StatInfo 라는 구조체를 활용해서 포인터 연산을 설명해주셨는데, 만약 구조체 생성부분에서 바이트 패딩을 주는 경우엔 포인터 연산 처리가 어떻게 되는지 궁금합니다.
-
해결됨김영한의 실전 데이터베이스 - 설계 1편, 현대적 데이터 모델링 완전 정복
장기간 진행된 프로젝트, 지금이라도 용어사전 작성이 필요할까요?
안녕하세요 영한강사님!강의를 듣다가 문득 궁금한 점이 있어 질문을 남기게 되었습니다~ 다름이 아니라, 강의 중에서 '용어사전'에 대해 중요성을 강조하셨는데, 현재 제가 실무에서 맡고 있는 프로젝트가 있습니다! 근데 이 프로젝트가 이미 3-4년 전부터 계속 고도화 및 디벨롭하며 진행 되고 있는 프로젝트입니다..ㅎㅎ 이런 상황에서 해당 프로젝트에 대해서 지금이라도 용어사전을 만드는게 좋을까요..? 실무를 하다보니 '용어사전'에 대해 아주 깊게 중요하다는 것을 깨닫게 되었는데, 막상 이제와서 만들려고 하니 막막하고 뭐부터 어떻게 작성해야할지 감이 안잡히네요 😅앞으로 새롭게 시작하는 프로젝트가 있다면 무조건 '용어사전'을 만들고 시작할텐데, 이미 진행중인 프로젝트에 대해서는 어떻게 해야할지, 만드는게 좋을지 아니면 그냥 지금처럼 없이 계속 진행할지 고민이 듭니다..! 조언해주시면 감사드리겠습니다..!
-
미해결RAG를 활용한 LLM Application 개발 (feat. LangChain)
성능 측정 방식
강의를 듣다보면 임베딩 및 프롬프트의 성능에 대해서 "어떤것이 좋다" 라고 말씀십니다. 혹시 그런 성능들은 직접 모두 수행해봐야 하는건가요? 아니면 어떤 상황에서는 어떤것의 성능이 더 좋다라는 데이터가 존재할까요?
-
미해결PCB HW설계 실무 : STM32를 활용한 Mixed-signal 보드 설계 프로젝트
현재 stm32 Mixed-signal 보드 설계 수강중인데요??
이번강의는 끝나고. stm32에 대한 펌웨어에 관한 강의 듣고 싶은데...어느것을 들어야 하나요?현재 강의 6개 뿐인데.. stm32펌웨어강의는 없는것 같아서..혹시 stm32펌웨어 대한 추천해주실 강의는 없으신지요??
-
해결됨오브젝트 - 기초편
6-1. 변경과 설계 마지막 추상화 관련 질문 입니다.
안녕하세요.이번에 설계의 관점에서의 배움을 위해 강의를 듣고 있습니다.실 생활(영화) 의 예시로 알려주셔서 이해하고, 생각해보는데 도움이 되고 있습니다. 6-1 강의 마지막에 추상화를 변경이 일어날 것을 미리 추측하여 만들지 말고 간단하게 하는 것이 좀더 나은것 같다고 이야기 해주셨는데요.이부분에 대해서 현 영화의 예시로 본다면, 할인 정책이 만약 정액재 (금액 할인) 정책만 존재한다면정책 인터페이스를 만들 필요 없이 금액 정책 클래스만 만들어 활용하는게 더 좋다는 의미로 이해했습니다. 이렇게 말씀해주신 이유를 생각해보았는데, 추상화를 활용해 message 만 일치한다면 다양한 방식의 정책을 동적으로 활용할 수 있다는 장점이 있습니다. 다만 코드의 동작 분석에 있어 실제 runtime 단계에서 어떤 구현체가 사용되는지 확인 해야 하는 어려움이 있기 때문에 위와 같이 말씀 에 동의할 수 있는거 같습니다. 만약, 변경이 일어날 것을 추측이 아닌 실제로 일어나게 된다면 최소 몇개의 변경이 있어야 ( Ex ) 정책이 3개 ) 추상화를 하는게 좋다는 강사님만의 기준이 있을까요??
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
chain.doFilter()
JwtAuthFilter에서 토큰이 없을 때 예외를 던지지 않고 그냥 chain.doFilter()를 호출하는 이유는?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
락 오래 점유 시 장애 발생 가능성 질문
9:55 쯤에락을 오래 점유하면 발생하는 문제는 치명적이고 다양하다.리소스 고갈 등으로 인해 장애가 발생할 수 있는 것이다.지식공유자님께서는 오래 점유하는 상황에서 겪으셨던 문제가 있었나요?좋아요라는 게, 네트워크 문제가 아닌 이상 빠르게 끝날 처리인데, 혹시 좋아요 말고도 (다른) 쓰기 상태에서 락을 오래 점유하고 있을 때 어떤 문제를 겪으셨는지, 어떻게 해결하셨는지 러프하게라도 말씀해 주시면 감사드리겠습니다!! 감이 잘 안 와서 궁금해서 질문드립니다.
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Deprecated 관련 사항들
보통 실무에서는 deprecated된 사용할때 발견하면 그때 그때 찾아보나요? 아니면 항상 up-to-date하는 공부방법이 따로 있나요?
-
해결됨깃허브 데스크탑으로 프로젝트 관리하기
비공개 보안
민감한 정보를 포함하는 비공개(Private) GitHub 저장소의 보안을 강화하기 위해 조치가 있을까요