묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결구성 관리 자동화 도구 - 앤서블(Ansible)
ssh 연결 설정과 관련하여 현업에서는 어떻게 하는지 궁금합니다.
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 하기]강의에서는 ansible을 처음 설치하고 테스트를 위해 ansible all -m ping -> yes 3번 입력 후 ansible all -m ping -k 는 정상적으로 수행이 되었는데요 저의 경우에는 ssh 설정이 막혀 있어 각 노드들의 sshd_config 파일에서 root 로그인을 허용해주었습니다.실습환경에서는 노드가 3개라서 하나하나 수정했지만, 현업에서는 노드들이 훨씬 많을텐데, ansible 도 사용하지 못하는 상황에서 이러한 번거로운 작업을 어떻게 하는지 궁금합니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
redis 를 compose 로 묶어준 이유가 궁금합니다.
강의 내용 중, redis 를 docker-compose 로 묶어 한번에 띄우도록 설정한 모습을 확인할 수 있었습니다. 이렇게 되면 서버 코드의 변경점이 생겨 수동 재배포를 진행하게 될 때, docker-compose 파일로 실행하게 될 것 같습니다. redis 도 일종의 db라고 생각이 되는데, 서버의 코드가 업데이트 되면 redis 를 다시 docker로 띄운다는 가정이 생기는 것 같은데, 맞는 접근법인지 궁금합니다.초기 ec2 설정 단계에서 단순히 redis 를 설치해서 사용하면 되지 않나 라고 생각이 됩니다. 만약 캐시 전략의 변경이나, 캐시 데이터의 정합성? 문제가 우려된다면 key를 모두 날려주는 cli 를 실행시키는 방법이 더 유욜할 것 같은데, 강의 편의와 docker-compose 의 유용성을 설명하기 위한 강의 챕터인가요?
-
해결됨비전공자도 이해할 수 있는 AWS 입문/실전
[실습] 7. Express 서버를 EC2에 배포하기 에서 node 설치 안됨
동영상처럼 인스턴스에 연결한 후 https://jscode.notion.site/7-Express-EC2-5f90f0ece37943f99dffbf29a21bdd93에 있는 1. Ubuntu 환경에서 Node.js 설치하는 법을 복사 붙여넣기 한 후 node -v 를 작성했는데 다음과 같이 나옵니다. 다른 분의 질문도 찾아서 보았는데 다른 분은 보안 규칙의 포트 번호를 잘 못 쓰신것 같은데 저는 강사님과 똑같이 되어 있었습니다. 어디가 잘못된 것일까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-E 강의 질문 드립니다.
안녕하세요, 선생님. 4-E(#14890 경사로) 문제의 경우, 해설 영상과 해설코드를 보면 별도의 비트마스킹 연산은 다루지 않는 것 같은데,비트마스킹 없이 풀어도 괜찮은 문제라고 이해해도 될까요? 감사합니다.
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
프론트코드 받을 수 있나요
정말 강의잘 듣고있습니다 다름이아니라 빠르게 서버만 진행하고싶은데 프론트 코드저장소가있으시다면 받을 수 있나요? 아니면은 스톰프를 테스트할 수 있는 팁이있나요?
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
server 쪽에서 should be a number of seconds or string representing a timespan 에러가 발생합니다
Window, node 22 버전 사용중입니다. 4-5 로그인 연동하기에서 회원가입까진 연동이 되는데 로그인 api 요청시 500에러가 발생합니다. [Nest] 22548 - 2025. 02. 15. 오후 10:00:50 ERROR [ExceptionsHandler] "expiresIn" should be a number of seconds or string representing a timespan Error: "expiresIn" should be a number of seconds or string representing a timespan at D:\project\community\server\node_modules\jsonwebtoken\sign.js:56:15 at Array.forEach (<anonymous>) at validate (D:\project\community\server\node_modules\jsonwebtoken\sign.js:47:6) at validateOptions (D:\project\community\server\node_modules\jsonwebtoken\sign.js:62:10) at module.exports [as sign] (D:\project\community\server\node_modules\jsonwebtoken\sign.js:171:5) at D:\project\community\server\node_modules\@nestjs\jwt\dist\jwt.service.js:56:17 [Nest] 22548 - 2025. 02. 15. 오후 10:00:50 LOG [HTTP] [POST] /auth/signin (500) (okhttp/4.12.0) //axios.ts import axios from "axios"; import {Platform} from "react-native"; const baseUrls = { ios: 'http://localhost:3030', android: 'http://10.0.2.2:3030' } const axiosInstance = axios.create({ baseURL: baseUrls[Platform.OS] ?? 'http://localhost:3030' }); export default axiosInstance //auth.ts import {getSecureStore} from "@/utils/secureStore"; import axios from "@/api/axios"; import {Profile} from "@/types"; interface RequestUser { email: string; password: string } async function postSignup(body: RequestUser): Promise<void> { const {data} = await axios.post('/auth/signup', body); return data; } async function postLogin(body: RequestUser): Promise<{ accessToken: string }> { const {data} = await axios.post('/auth/signin', body); return data; } //useAuth.ts function useLogin() { return useMutation({ mutationFn: postLogin, onSuccess: async ({accessToken}) => { setHeader('Authorization', accessToken) await saveSecureStore('accessToken', accessToken); queryClient.fetchQuery({queryKey: ['auth', 'getMe']}); router.replace('/') }, onError: () => { }, }) }postLogin 에서 엔드포인트만 /auth/signup로 바꾸면 회원가입은 정상적으로 요청이 됩니다.
-
해결됨Combine - iOS의 Reactive Programming(2025)
merge 오퍼레이터 질문
안녕하세요.stream은 시간이 지남에 따라 변하는 어떤 상태로 이해했는데요.publisher1과 publisher2에서의 stream을 각 stream1, stream2라고 했을때 시간이 지남에 따라 동시에 상태가 변하면 해당 상태는 merge 오퍼레이터에서 방출은 어떻게 처리하나요? [동시가 아닌 경우]-1-2-3---4--5--6---> 1-4-2-5-3-6 [동시인 경우]-1-2-3--4-5-6--> ?????
-
미해결대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
소켓 연결과 http
강의중에 "websocket을 연결할때 ip가 변경되는 정책으로인해 http로 구현했다"고 말씀하신부분에 질문이 있습니다. dns를 사용한다면 서버 ip 변경이 있어도 연결이 가능하지 않을까 생각하는데요. 그렇다면 ws을 유지하는게 더 좋았을거라고 생각하시나요? 아니면 dns의 적용의 지연시간이나 기타 다른 이유들로인해 여전히 http를 선택했을지 궁금합니다
-
해결됨Combine - iOS의 Reactive Programming(2025)
zip 오퍼레이터 설명하는 부분에서 강의가 짤렸습니다.
안녕하세요. zip 오퍼레이터 설명하는 부분에서 강의가 짤려 있습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 실행 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]영상보며 차근차근 따라하는데 스프링부트 프로젝트만들고 build.gradle 오픈하니 사진과 같이 에러가 뜹니다.질문전 다른 분들의 같은 문제를 보았는데 저는 제 어떤 부분이 문제인지 잘모르겠습니다ㅠ..환경변수하고 체크해봤는데 제 눈에는 문제를 잘모르겠어요.혹시나해서 오류 및 프로젝트 설정, 환경 변수등의 사진들을 올려봅니다. <오류> <Project Structure - Project>위 사진에서 처음에는 <No SDK>로 설정되어있어서 이것문제인가 싶어 open-jdk로 변경했지만 그대로더군요ㅠ <Project Structure - SDKs> <스프링부트 프로젝트 설정> <환경변수 설정> 이상입니다. 도움좀 주세요ㅠ 스프링 공부하고싶어여
-
미해결
백엔드 포트폴리오 관련해서 질문 있습니다.
백엔드 개발쪽으로 취업 희망하는데 기업에 포트폴링 ㅗ제출할 때, 한워드 파일로 제출해도 될까요? 보통 노션이나 다른 프로그램 사용해서 제출하나요?
-
미해결실전! Querydsl
Querydsl Fetchjoin 해서 이미 조회한 엔티티를 Spring Data JPA findBy 다시 하면 영속성 컨텍스트에서 가져오지 않고 쿼리가 실행되는 문제
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사님 안녕하세요.프로젝트를 진행하다가 Querydsl의 fetcjoin을 쓰고, 로직 처리를 위해 엔티티를 따로 조회하기 위해 다음과 같이 코드를 짰는데, 중간에 for 문으로 c.getUser()했을 떄는 fetcjoin이 제대로 되어서 쿼리가 발생하지 않고, userId가 1인 UserEntity가 잘 조회됩니다.그런데 이미 userId가 1인 user 엔티티가 조회 됐음에도 불구하고 맨 아래의 userId가 1인 User findBy를 사용하여 조회하면 select UserEntity where userId=1 인 한 번 더 쿼리가 발생합니다.원래 fetcjoin는 엔티티.get연관엔티티() 에서만 작동을 하는 걸까요?for 문 돌면서 id 체크하고 c.getUser()로 재사용하기에는 비효율적일 것 같은데 지금과 같은 상황에서는 어떤 식으로 쿼리가 한 번더 발생하지 않으면서 동일한 이미 fetcjoin으로 가져온 엔티티를 사용할 수 있는 좋은 방법이 있는지 궁금합니다.fetcjoin 한 getPopUpStoreComments querydsl 코드는 위와 같습니다. 감사합니다.
-
미해결
블랜더- 어플라이 후 미러 모디파이 적용하니 원하는 모양이 안나와요 ㅜ 도와주세요~
apply>all transform , scale(스케일 조정했어서)를 한 뒤 미러 모디파이를 적용하니 아래와 같은 모양이 되었어요어플라이 적용하지 않은 상태에서 바로 미러 적용하면 원했던 모양이 나옵니다강의 들으며 따라하고 있는데 강사분과 동일하게 진행하고있는데 다르게 나와서 막힌 상태입니다.혹시 아시는 분들 있으면 한번만 도와주세용어플라이 후 미러 적용한 모습어플라이 없이 바로 미러만 적용한 모습
-
해결됨MongoDB를 활용하여, 200억건 이상의 데이터 파이프라인 작성법
안녕하세요 혹시 강의하실때 진행하시는 몽고디비 버전은 몇인가요?
!
-
미해결
리액트 강의 추천 받습니다
백엔드 관련 공부하면서 취업 준비하다가 프론트도 준비해야할것 같아서리액트 관련강의를 들을려고 합니다. 기본적인 html, css ,javaScript 지식은 있지만 응용이 부족하여추가적으로 강의 나 공부를 해야하는 수준입니다. 이 상황에서 들을만한 리액트 로드맵이나 강의 추천해 주시면 감사드립니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
npx tailwindcss init 가 안되네요.
강의대로 npx tailwindcss init 을 하게되면 'tailwind'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. 라고 뜨네요. 어떻게 해결 방법이 없을까요?vscode 재시작해봐도 똑같네요.구글링 해보니, 환경변수에 nodejs 경로를 path에 추가하라고 하는데, 이미 추가되어있구요.아, node버전이 기존에 18버전이 설치되어 있어서 그건 새로 설치하지는 않았습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
동시성 테스트와 데이터 초기화
안녕하세요 선생님 배운 테스트 강의를 통해 사이드 프로젝트를 하며 성장 중입니다.동시성 테스트를 하던 중 문제가 발생 하였고 해결은 하였으나 다른 방법이 있는지 조언을 구하고자질문을 남기게 되었습니다. 먼저 엔티티에 대한 설명을 드리겠습니다.모임과 모임 참여 테이블이 1 : N모임 참여 회원 테이블이 N : 1 입니다.모임은 최대 인원인 capacity를 가지고 있습니다.여러 회원이 모임에 동시 참여 했을때 인원수를 제한 되는지 보기 위한 테스트 입니다.동시성 문제를 막기 위해 비관적락을 모임을 조회 할때 사용 하였습니다. DB는 MYSQL을 사용 하였습니다.트랜잭션의 격리 수준은 기본인 REPEATABLE READ 을 사용 하였습니다.테스트 트랜잭션에서 모임을 저장 하고 비동기 작업의 다른 스레드에서 모임 조회를 시도 할 경우테스트의 모임 저장은 커밋되지 않은 트랜잭션으로 조회가 불가능한 문제가 있었습니다.문제 해결 방안으로는테스트 트랜잭션 어노테이션 제거비동기 작업 스레드를 통한 트랜잭션 커밋으로 이후 트랜잭션이 모임을 조회 하는 방법테스트의 일관성을 위해 2번 방법을 선택 하였습니다.모임과 회원을 저장하는 부분을 비동기 작업 스레드를 통해 커밋 하고이후 스레드의 트랜잭션으로 조회 하여 데이터를 읽을수 있도록 하였습니다. 테스트는 정상적으로 통과 되었지만 문제가 발생 했습니다.스레드 작업의 트랜잭션 커밋으로 다른 테스트에 영향이 가는 문제 입니다. 원인은 테스트 트랜잭션이 전파 되지 않음에 따라 스레드 작업이 롤백 되지 않았습니다.@Test void not_executors_Tx() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("outer.isNewTransaction={}", outer.isNewTransaction()); log.info("내부 트랜잭션 시작"); TransactionStatus inner = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("inner.isNewTransaction={}", inner.isNewTransaction()); } 결과 : outer.isNewTransaction = true / inner.isNewTransaction = true @Test void executors_Tx() { //given log.info("외부 트랜 잭션 시작"); ExecutorService executorService = Executors.newFixedThreadPool(5); TransactionStatus outer = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("outer.isNewTransaction() = {}", outer.isNewTransaction()); log.info("내부 트랜 잭션 시작"); executorService.submit(() -> { TransactionStatus inner = txManager.getTransaction (new DefaultTransactionAttribute()); log.info("inner.isNewTransaction() = {}", inner.isNewTransaction()); }); executorService.shutdown(); } 결과 : outer.isNewTransaction = true / inner.isNewTransaction = false 커밋한 스레드의 결과로 인해 전체 테스트에 영향이 가게 되었습니다.밑의 페이징 정보 조회 테스트를 실행 하기 전에 모임 전체 조회를 해보니 테스터 라는스레드 작업에서 저장한 모임이 조회 되었습니다. 어떻게 하면 커밋된 데이터들이 다른 테스트에 영향을 주지 않을까?를 고민 하였고생각한 해결 방안은 @AfterEach를 사용 하자 였습니다.하지만 해결 되지 않았습니다. 다른 테스트 에선 여전히 커밋된 테스터 모임이 발견 되었습니다.이 부분은 왜 delete가 되지 않았는지 모르겠습니다.추측 하기로는 REPEATABLE READ 격리 수준에서 자신이 트랜잭션을 시작 하였을때 데이터만조회 하고 삭제 할수 있기 때문에 테스트 트랜잭션 에서는 스레드가 추가한데이터를 조회, 삭제가 불가능 해서 발생한 문제 이지 않을까 하는 추측 입니다. 그레서 모든 테스트에 @BeforeEach를 사용 하여 테스트 시작전에데이터를 모두 지우고 테스트 하니 통과 하였습니다. 선생님께 드리고 싶은 질문은 이렇게 해결 한것이 최선인지 궁금합니다.멀티 스레드는 테스트 할때 어떻게 동작 할지 모르기 때문에트랜잭션 어노테이션을 제거 하는 방법이 더 나을까요? @AfterEach void cleanUp() { userEventRepository.deleteAllInBatch(); bookmarkRepository.deleteAllInBatch(); eventRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); } @DisplayName("페이징 정보를 받아 모임을 조회 합니다.") @Test void getPagingEvents() { //given for (int i = 0; i < 10; i++) { Event event = createEvent("테스터" + i, "자전거 모임"); eventRepository.save(event); } Pageable pageable = PageRequest.of(1, 3); //when Slice<EventPreviewResponseDto> slice = eventService.getPagingEvents(pageable); //then assertThat(slice.getContent()) .extracting("author") .containsExactlyInAnyOrder("테스터3", "테스터4", "테스터5"); } @DisplayName("5명의 회원이 동시에 최대 인원이 3명인 모임에 참가 할때 3명만 참여 할 수 있다.") @Test void joinEventWhenParticipateAtTheSameTimeWithConcurrency() throws Exception { //given int taskCount = 5; ExecutorService executorService = Executors.newFixedThreadPool(5); CountDownLatch countDownLatch = new CountDownLatch(taskCount); Event findEvent = executorService.submit(() -> eventRepository.save(createEvent("테스터", "테스트 모임", 3))).get(); List<User> users = executorService.submit(() -> Stream .generate(() -> { User user = createUser("테스터", "testEmail"); userRepository.save(user); return user; }) .limit(taskCount) .toList()).get(); //when AtomicInteger exceptionCount = new AtomicInteger(0); for (User user : users) { executorService.submit(() -> { try { eventService.joinEvent(findEvent.getId(), user.getId()); eventRepository.flush(); // 엔티티 상태를 DB에 강제로 반영 } catch (BusinessException ex) { exceptionCount.incrementAndGet(); } finally { countDownLatch.countDown(); // 카운트다운 } }); } countDownLatch.await(); Long participateCount = executorService.submit( () -> userEventRepository.countParticipantByEventId(findEvent.getId())).get(); executorService.shutdown(); //then assertThat(participateCount).isEqualTo(3); assertThat(exceptionCount.get()).isEqualTo(2); }
-
해결됨[풀스택 완성] Supabase로 웹사이트 3개 클론하기 (Next.js 14)
searchMovies에서 hasNextPage가 필요한 이유
안녕하세요 로펀님. 강의 잘 듣고 있습니다. useInfiniteQuery에서 반환하는 hasNextPage를 이용해 fetchNextPage를 하는데 searchMovies에서 작성한 const hasNextPage = count > page * pageSize 는 사용하지 않는 것 같아서 질문 올립니다! {data?.pages ?.map((page) => page.data) ?.flat() ?.map((movie) => ( <MovieCard key={movie.id} movie={movie} />))}에서도 searchMovies 에서 반환하는 page, pageSize, hasNextPage를 제외하고 data만 쓰시길래 작성하신 이유가 궁금합니다. useInfiniteQuery에서 반환하는 hasNextPage와는 다른 건가요??
-
미해결해외 빅테크 코딩 인터뷰: LeetCode 포기자의 합격 공부법
이해하기 어려운 문제 시간 투자
어려운 알고리즘 문제의 경우 이해가 안되는 경우가 있는데요!이런 경우에 다시 2-3번으로 돌아가 내가 뭘 이해못했는지 고민하는 부분에서 시간투자를 어느정도 하셨나요~? 때로는 문제 난이도가 높아서 정말 잘 이해가 안될때도 있을 것 같은데, 이런 경우에 시간투자를 몇시간까지만 하고 그래도 이해가 안되면 강의에서 언급한 것 처럼 psudo code 자체 흐름을 외워버리고 넘어가셨을까요?
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
문제와 풀이2번 궁금증
영한님 안녕하세요. 문제와 풀이 2번을 풀고 고민하고 강의를 학습해도 약간의 의문점이 생겨서 질문드립니다. Thread t1 = new Thread(new MyTask(), "t1"); Thread t2 = new Thread(new MyTask(), "t2"); Thread t3 = new Thread(new MyTask(), "t3"); t1.start(); t2.start(); t3.start(); // 1초 t1.join(); t2.join(); t3.join(); // 대기현재 위와 같은 코드에서 main 쓰레드가 t1, t2, t3에게 작업을 시킵니다. 그리고 t1의 join을 만나니까 t1이 작업이 완전히 끝날때까지 대기상태에 빠집니다. 그리고 t1이 작업이 완료되면 t2.join()이 실행된다면 결과가 아래와 같이 나와야 하는데 왜 이렇게 안 되는지 의문입니다. ㅠㅠt1: 1t1: 2t1: 3t2: 1t2: 2t2: 3...