inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

응시권 신청

미해결

비개발자도 쉽게 시작하는 코딩 입문 강의: PCCE 합격을 위한 파이썬 기초 & 알고리즘

응시권 신청했는데 언제올까요? 시험이 다음날이라 기출 문제를 보고 싶은데 권한이 없어서 못보고 있습니다. 메일은 구글 연동 메일로 가입 진행하였습니다. (kyoungbinseo@gmail.com)

  • python
  • 코딩-테스트
janus014 댓글 1 좋아요 0 조회수 59

[해결]그랩님 답변 주세요.

해결됨

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

102강 강의를 듣고 있는데요, react-native-reanimated-carousel 설치 위해 노션에 링크대로 npm install react-native-reanimated-carousel@3.3.0 명령어로 설치하고 그 이후 expo install --npm react-native-reanimated react-native-gesture-handler 를 입력하여 터미널에서 설치 완료 하였습니다 질문 1. 이후 babel.config.js 파일 에 가서 plugins: ["react-native-reanimated/plugin"], 추가 해야 하는데 문제 는 babel.config.js 파일 이 존재하지 않아 어디에 플러그인 작성해야 하는지 모르겠습니다 첨부 사진 package.json에 디펜던시를 보면 아래와 같아요 "react": "19.1.0", "react-native": "0.81.5", "react-native-reanimated-carousel": "^3.3.0", "react-native-reanimated": "~4.1.1", "react-native-gesture-handler": "~2.28.0" 질문 2. Babel 설정 위해 Cache 초기화 하는 부분도 위에 질문1이 순서대로 정상적으로 진행이 되지 않아 스킵 했는데 babel.config.js에 플러그인 문구부터 저장한 뒤 바벨 설정 캐시 초기화 하는 것이 옳지요? 질문 3 102강 시작부터 ~ 18분 56초 까지 타이핑 한 grab-market-mobile의 App.js 소스 내용 아래와 같은데 이것을 실행 하면 사진과 같이 안드로이드 스튜디오(runtime not ready) 에서 에러 발생 아래 App.js 는 강의 전체 완성본 소스 가 아니라 에러가 난 시점까지의 소스 입니다 질문4 ->여기서 Carousel 부분 살펴보면 아래 App.js 소스 에서 아래와 같이 작성하는 것 맞나요 ? 만약 아래 작성 소스 가 다르면 어떻게 작성 해야하는지 댓글에 소스 적어주세요 < Carousel data = {banners} width = {Dimensions.get( " window ") .width } height = {200} autoPlay = {true} renderItem = {(obj) =>{ return( < TouchableOpacity > < Image source = {{uri :obj.item.imageUrl }} /> </ TouchableOpacity > ) }} /> import { StatusBar } from "expo-status-bar"; import React from "react"; import { StyleSheet, Text, View, Image, ScrollView, Dimensions, TouchableOpacity } from "react-native"; import BasketballImage from "./assets/products/basketball1.jpeg"; import Avatar from "./assets/icons/avatar.png"; import {API_URL} from "./config/constants"; import axios from "axios"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import "dayjs/locale/ko"; import Carousel from "react-native-reanimated-carousel"; dayjs.extend(relativeTime); dayjs.locale("ko"); export default function App() { const [products, setProducts] = React.useState([]); const [banners, setBanners] = React.useState([]); React.useEffect(()=>{ axios.get(`${API_URL}/products`).then((result)=>{ setProducts(result.data.products); }).catch((error)=>{ console.error(error); }) axios.get(`${API_URL}/banners`).then((result)=>{ setBanners(result.data.banners); }).catch((error)=>{ console.error(error); }) },[]) return ( <View style={styles.container}> <ScrollView> <Carousel data={banners} width={Dimensions.get("window").width} height={200} autoPlay={true} renderItem={(obj)=>{ return( <TouchableOpacity> <Image source={{uri : obj.item.imageUrl}} /> </TouchableOpacity> ) }} /> <Text style={styles.headline}>판매되는 상품들</Text> <View style={styles.productList}> { products.map((product, index)=>{ return (<View style={styles.productCard} key={product.id}> {product.soldout === 1 && <View style={styles.productBlur}/>} <View> <Image style={styles.ProductImage} source={{uri: `${API_URL}/${product.imageUrl}`,}} resizeMode={"contain"} /> </View> <View style={styles.productContents}> <Text style={styles.productName}>{product.name}</Text> <Text style={styles.productPrice}>{product.price}원</Text> <View style={styles.productFooter}> <View style={styles.productSeller}> <Image style={styles.productAvatar} source={Avatar} /> <Text style={styles.productSellerName} >{product.seller}</Text> </View> <Text style={styles.productDate}>{dayjs(product.createdAt).fromNow()}</Text> </View> </View> </View>); }) } </View> </ScrollView> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', paddingTop: 32, }, productCard: { width: 320, borderColor: 'rgb(230,230,230)', borderWidth:1, borderRadius: 16, backgroundColor: "white", marginBottom: 8, }, ProductImage :{ width: '100%', height: 210 }, productContents : { padding: 8 }, productSeller : { flexDirection: 'row', alignItems: 'center' }, productAvatar: { width:24, height:24, }, productFooter: { flexDirection: 'row', justifyContent:'space-between', alignItems: 'center', marginTop: 12, }, productName : { fontSize: 16 }, productPrice: { fontSize: 18, fontWeight: '600', marginTop: 8 }, productSellerName: { fontSize: 16, }, productDate: { fontSize: 16, }, productList: { alignItems:"center", }, headline : { fontSize: 24, fontWeight: "800", marginBottom:24 }, productBlur : { position: 'absolute', top: 0, bottom: 0, right: 0, left: 0, backgroundColor: "#ffffffaa", zIndex: 999, }, }); 에러 해결 차근차근 알려주셨으면 좋겠습니다 --------------------------------------------------------------------------------------------- 질문 5 babel.config.js 없기에 프로젝트 루트에 파일 을 직접 생성 하고 module.exports = { presets: ['babel-preset-expo'], plugins: ['react-native-reanimated/plugin'], }; 위 소스입력 후 저장 완료 후 캐시 초기화 를 위해 expo start -c 까지 차례대로 수행 후 ngrok과 모바일/서버로 연동 후 결과 가 위 버전 에러와 다르게 새로운 에러가 발생 했습니다 어떻게 해결 하죠? 질문6 아래 게시글 답변대로 질문 2까지 수행 하니 아래와 같은 에러가 발생 질문7 아래게시글 답변에 질문 3 및 3-1은 하라는대로 실행해보면 에러가 발생할까 실행을 안했는데 3개를 입력해 줘도 괜찮은건가요 ? 명령어 1: npm uninstall react-native-reanimated-carousel react-native-reanimated 명령어 2: npm install react-native-reanimated-carousel@3.3.0 react-native-reanimated@^2.0.0 명령어 3: expo install react-native-gesture-handler 질문8 잘 되던 안드로이드 스튜디오가 로딩을 왜 못할까요?

  • HTML/CSS
  • javascript
  • react
  • node.js
  • react-native
  • 머신러닝
  • express
  • tensorflow
isbcom1004 댓글 2 좋아요 0 조회수 220

비동기 전송을 위한 Thread 관리 에서 Executor 설명 오류

해결됨

멀티 모듈 아키텍처로 구현하는 은행 서버 핵심 기능 [ Kotlin & Spring ]

안녕하세요! 유익한 강의 감사합니다. Executor 설명 중 한 가지를 정정드리고 싶습니다. 강의에서 설명해주신 내용은 maxPoolSize까지 바로 스레드가 생성되는 것으로 이해될 수 있는데, 실제 동작은 먼저 corePoolSize만큼 스레드를 생성하고, 그 이후 요청은 큐에 쌓이며, 큐가 가득 찼을 때 maxPoolSize까지 확장되는 구조입니다. 물론 강의 흐름상 의도적으로 설명을 단순화하신 것일 수도 있습니다만, 혼동될 수 있는 부분이라 참고용으로 댓글 남깁니다!

  • java
  • spring
  • kotlin
  • mysql
  • spring-boot
chess.min 댓글 2 좋아요 0 조회수 78

숏츠 제목 글씨가 겹쳐요

해결됨

원클릭으로 AI가 생성해주는 Youtube 쇼츠 만들기 자동화(with n8n)

여러번 시도했는데 똑같이 나와요. 이럴 땐 어떻게 해야 되나요

  • python
  • youtube-api
  • n8n
  • ai-활용-(ax)
sws6054 댓글 1 좋아요 0 조회수 63

포트폴리오 웹사이트에대해 질문드립니다.

해결됨

포트폴리오 어나더레벨 | 합격하는 이력서 작성법

큰돌님 안녕하세요. 알고리즘강의부터 유튜브까지 잘 시청하고있습니다. 프론트엔드를 목표로 준비를 하고있는데 대부분 포트폴리오 페이지를 하나씩 구축을 하고 이력서와 같이 첨부하더라구요.. 과거에 리액트 + GSAP로 인터렉션 위주로 만들어놓은게 있지만 손볼것도 많고 요즘은 NextJS가 추세라하여 새로 만들어야할것같은데 이부분이 프론트 지원시 거이 필수적인지 궁금합니다.

  • HTML/CSS
  • javascript
  • python
  • java
  • 포트폴리오
AMSTD - 댓글 2 좋아요 0 조회수 135

질문이 이있어요

미해결

썸머의 챌린지 온보딩 for 지식공유자

질문이 있어요 !

  • python
  • 국비지원-부트캠프
썸머 댓글 1 좋아요 0 조회수 43

합격했어요

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

강의를 다 듣지 않으면 수강평을 못남길까요? 2유형이 과적합이였는지 예상외로 점수가 꽤 깎였지만 도움많이받고 합격했어요~

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
key.nam 댓글 2 좋아요 0 조회수 87

결제정보

해결됨

빠르게 시작하는 Gemini API With Python

처음 듣는 경우라 이어 문의 드립니다. 결제정보를 하지 않으면 진행하는데 문제 있는지 궁금합니다.

  • python
  • gemini
  • 인공지능(ai)
  • ai-활용-(ax)
olivetree 댓글 1 좋아요 0 조회수 72

강의자료 문의

해결됨

빠르게 시작하는 Gemini API With Python

안녕하세요? 강의자료를 아래 한글로 받을 수 있나요? 불필요한 툴 없이 강의 내용을 정리했으면 합니다 답변 부탁드려요.

  • python
  • gemini
  • 인공지능(ai)
  • ai-활용-(ax)
olivetree 댓글 1 좋아요 1 조회수 82

AI 영상 생성 파트 입니다

해결됨

원클릭으로 AI가 생성해주는 Youtube 쇼츠 만들기 자동화(with n8n)

video가 생성되면 제자리를 찾아가야 되는데 자꾸 다른자리에서 생성됩니다.

  • python
  • youtube-api
  • n8n
  • ai-활용-(ax)
fayest 댓글 1 좋아요 0 조회수 66

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

이번 강의에서 영한님이 기본적으로 트랜잭션을 시작할 때 커넥션을 가져온다고 말씀해 주셨습니다. 주문 api 관련 내용에서는 바로 리포지토리를 참조하여 @Transactional 없이 사용했는데요 그럼 이런 경우는 커넥션을 어느 타이밍에 가져오나요?

  • java
  • spring
  • spring-boot
  • jpa
조태준 댓글 2 좋아요 0 조회수 134

사용자(User)의 정의에 대한 답변. & 토이 프로젝트 기획에 유용한 툴 질문

해결됨

[매일 완독 챌린지] 저자와 함께하는 <FastAPI로 기획에서 출시까지>

안녕하세요 :) 좋은 강의와 책 잘 보며 열심히 따라가고 있습니다! 이번 강의 중 언급하셨던 사용자에 대한 저만의 정의를 생각해봤습니다. 시스템, 서비스 혹은 제품을 이용하게 될 주체이자, 프로젝트 진행 시 직/간접적인 경험 등을 우선적으로 고려할 대상. 라고 생각합니다. 추가 질문으로 기획 시에 발생하는 아이디어나 문서 정리, 다이어그램 등 ERD, User flow 차트처럼 (1) 기록으로 남겨야 하는 것들은 어떤 게 있으며 , (2) 어느 툴을 사용하는 게 유용할까요? 손으로 쓰는 것이 편해서 종이에 펜으로 그리면서 설계한 적이 많았습니다. 그 뒤에 Figma나 스프레드 시트로 표현했구요. 하지만, 추후 프로젝트 README.md 에 넣을 것도 고려하면 설계 혹은 기획부터 차근차근 리소스를 쌓아가는 게 어떤 가 싶어서 여쭙습니다! 무언갈 그려야 한다면 Figma를 사용하긴 하지만, 파워포인트 수준으로 밖에 활용하지 못하고 있는 것 같습니다. 전반적인 실험이나 개발 기록은 Notion(GitHub과 별개)을 활용하는 편 입니다. JIRA를 협업 및 이슈 추적에 Confluence는 Docs 관리로 써보고는 싶었지만, 현업에서 배우는 게 아닌 개인이나 4-5인 팀에서 제대로 활용하기가 어렵더군요.. (1) 설계 시 기록으로 남겨야 하는 것들은 어떤 게 있을까요? (2) 어느 툴을 사용하는 게 유용할까요? 감사합니다.

  • python
  • aws
  • tdd
  • FastAPI
  • 북-챌린지
Zip-sa 댓글 1 좋아요 2 조회수 98

디졸브 강의 관련 문의

해결됨

QGIS 파이썬 자동화 (벡터편) Ver.2

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1.테이블에 속성에 EMD_NM 값들이 깨짐 현상이 납니다. (예:������7��) 2.디졸브 후 산출물이 아프리카 사하라 사막쪽에 생성됩니다. 이후 구멍삭제도 마찬가지입니다. 좌표계를 건드리거나 수정한적은 없습니다. 현재 3.34 버전 사용중입니다.

  • python
  • qgis
  • GIS
권오규 댓글 2 좋아요 0 조회수 121

Future4-이유 질문

미해결

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. Future를 거치는 SumTaskMainV2에서 future2.get()이 future1.get() 실행 후 task1의 call() 완료를 기다리지 않고 바로 실행되는 것을 콘솔 로그로 확인 가능했는데요. 그렇다면 Future를 거치지 않고 결과를 반환한다 가정할 때, task2가 task1 완료를 기다린 후 수행된다고 나와있는데, "Future는 한 스레드 작업의 future1.get() 실행 후, 다른 스레드의 작업 future2.get()은 future1의 call() 완료까지 기다리지 않는 기능이 있다" 이렇게 이해해도 될까요?

  • java
  • 객체지향
  • 동시성
  • multithread
  • thread
sjahn 댓글 1 좋아요 0 조회수 88

변수 or 함수명

미해결

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

안녕하세요. 강의를 보다보니 변수명은 파스칼케이스 사용하고, 함수는 카멜케이스 사용하시던데 혹시 특별한 이유가 있나요? 제가 면접관이면 무조건 물어볼 것 같아서요.

  • python
  • 코딩-테스트
긍지에찬인간 댓글 1 좋아요 0 조회수 91

성능 개선에 대한 부분을 작성할 때 궁금한 점이 있습니다.

미해결

포트폴리오 어나더레벨 | 합격하는 이력서 작성법

안녕하세요 큰돌님! 항상 유튜브 잘 보고 있습니다. 저는 백엔드 개발자로 취업을 준비하고 있고, 현재 이력서와 포트폴리오를 만들기 위해 강의도 듣고 제 경험을 정리하고 있습니다. 본 강의와 큰돌님의 유튜브에서 항상 성능 개선을 수치적으로 표현 하라고 말씀하시는 것을 많이 들었습니다. 여기서 성능 개선에 있어서 제가 프로젝트를 할 때, 제 지식의 부족함으로 인해 성능이 안좋았던걸 개선한거에 대해서는 어떻게 적으면 좋을지 궁금합니다. 실제로, 웹에서 SSH 접속을 위한 프로젝트를 하면서 초기 SSH 접속을 할 때, sleep(500), 쉘에서 실행할 명령어를 송수신 하는 while문에서 sleep(10)을 설정 했었습니다. Java의 InputStream으로 입력값을 받도록 하였는데 개발 당시에는 안정적인 송수신을 위해서 sleep을 추가했는데, 리팩토링을 하는 과정에서 InputStream이 Blocking I/O의 특성으로 인해 불필요하다는 것을 알게 되었습니다. 이런 부분도 성능 개선 작업으로 적어도 되는지 궁금하고, 특히 면접에서 제 부족함?을 직접적으로 표현하지 않고 어떻게 말해야할지도 궁금합니다. 질문이 최대한 간략하게 적으려고 하다보니 두서없네요 ㅠㅠ. 감사합니다!

  • HTML/CSS
  • javascript
  • python
  • java
  • 포트폴리오
akdlzhf2008 댓글 1 좋아요 0 조회수 121

병렬 중첩

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

형 병렬 중첩 시키는 예제 코드있잖아. Worker Step Multithreading Implementation @Bean public Step managerStep(Step workerStep) { return new StepBuilder("managerStep", jobRepository) .partitioner("workerStep", dailyTimeRangePartitioner) .step(workerStep) .taskExecutor(partitionTaskExecutor()) .gridSize(4) .build(); } @Bean public Step workerStep(SynchronizedItemReader<TestLog> redisLogReader, ItemProcessor<TestLog, TestLog> logProcessor, MongoItemWriter<TestLog> mongoLogWriter) { return new StepBuilder("workerStep", jobRepository) .<TestLog, TestLog>chunk(500, transactionManager) .reader(redisLogReader) .processor(logProcessor) .writer(mongoLogWriter) .taskExecutor(workerTaskExecutor()) .build(); } @Bean @StepScope public SynchronizedItemReader<TestLog> redisLogReader(@Value("#{stepExecutionContext['startDateTime']}") LocalDateTime startDateTime) { log.info("{} read {}", Thread.currentThread().getName(), startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH"))); RedisItemReader<String, TestLog> itemReader = new RedisItemReaderBuilder<String, TestLog>() .redisTemplate(redisTemplate()) .scanOptions(ScanOptions.scanOptions() .match("logs:" + startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH")) + ":*") .count(10000) .build()) .build(); return new SynchronizedItemReader<>(itemReader); } @Bean public TaskExecutor workerTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(5); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(10); executor.setThreadNamePrefix("Worker-Thread-"); executor.setAllowCoreThreadTimeOut(true); executor.setKeepAliveSeconds(30); return executor; } 이렇게 했는데 2025-12-17T13:34:07.885+09:00 ERROR 1568 --- [ main] o.s.batch.core.step.AbstractStep : Encountered an error executing step workerStep in job testLogJob java.lang.NullPointerException: Cannot invoke "org.springframework.data.redis.core.Cursor.hasNext()" because "this.cursor" is null at org.springframework.batch.item.redis.RedisItemReader.read(RedisItemReader.java:62) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4] 이런 오류가 나. 그리고 ItemReader쪽에 log.info("{} read {}", Thread.currentThread().getName(), startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH"))); 로그를 찍었는데 Worker-Thread-5 read 2025121712 Worker-Thread-1 read 2025121706 Worker-Thread-2 read 2025121700 Worker-Thread-3 read 2025121718 이런식으로 찍히고 있어. 하나의 파티션을 여러 스레드가 읽어야 하는데 workerTaskExecutor가 서로 다른 파티션을 읽고 있어. 내가 뭐 놓친게 있는걸까?

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
ABBCD 댓글 3 좋아요 1 조회수 135

article_like_count api test

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

동시성 이슈가 안터질 수도 있나요?

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
댓글 2 좋아요 0 조회수 103

SIGHUP 에러

미해결

한 번에 끝내는 AI 에이전트 개발 올인원 (w. LangGraph, Google ADK, CrewAI)

안녕하세요 섹션 4 수업 듣고 있는데 uv run ~ 명령어로 실행하면 아래와 같은 에러가 뜹니다. 해결 방법 알 수 있을까요?ㅠㅠ (agent-a-to-z) PS C:\Project\3_FUND_MANAGER_AGENT> uv run .\ main.py Traceback (most recent call last): File "C:\Project\3_FUND_MANAGER_AGENT\ main.py ", line 2, in <module> from crewai.flow.flow import Flow, listen, start, router, or_ File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\__init__.py", line 6, in <module> from crewai.agent.core import Agent File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agent\__init__.py", line 1, in <module> from crewai.agent.core import Agent File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agent\ core.py ", line 36, in <module> from crewai.agents.crew_agent_executor import CrewAgentExecutor File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agents\crew_agent_ executor.py ", line 15, in <module> from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agents\agent_builder\base_agent_executor_ mixin.py ", line 6, in <module> from crewai.events .event_listener import event_listener File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\event_ listener.py ", line 10, in <module> from crewai.events .listeners.tracing.trace_listener import TraceCollectionListener File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\listeners\tracing\trace_ listener.py ", line 74, in <module> from crewai.events .types.system_events import SignalEvent, on_signal File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\types\system_ events.py ", line 17, in <module> class SignalType(IntEnum): ...<6 lines>... SIGCONT = signal.SIGCONT File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\types\system_ events.py ", line 22, in SignalType SIGHUP = signal.SIGHUP ^^^^^^^^^^^^^ AttributeError: module 'signal' has no attribute 'SIGHUP'

  • python
찰식빵 댓글 1 좋아요 0 조회수 97

수업을 잘 듣고 있습니다.

미해결

토비의 스프링 6 - 이해와 원리

혹시 지금 강의하시는 내용 중애 notion의 내용을 받아 볼 수는 없을까 해서요.

  • java
  • spring
임정훈 댓글 2 좋아요 0 조회수 129

인기 태그

인프런 TOP Writers

주간 인기글