묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결애플 웹사이트 인터랙션 클론!
requestanimationframe 질문
안녕하세요 강사님 두가지 질문이 있는데요 첫번째로는 function loop{... requestanimationframe(loop) } 일때 loop이 계속 돌고있는데 이건 그러면 loop함수가 없어지지 않고 계속 생성되고 있는건가요?? 답변주시면 감사하겠습니다. 그리고 두번째로는 위의 addEventListener함수에서 rafId = requestAnimationFramp(loop) 을 쓰지 않고 그냥 loop을 쓰면 되지 않나요? rafId는 loop안에서만 사용되어도 상관없다고 생각이 돼서요. 답변주시면 감사하겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
class 안에서 자신을 재사용? 하는 경우
class TreeNode<T> { public T Data { get; set; } public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); } 이 부분에서 현재 정의하는 클래스 내부에 자신을 다시 사용하는 것이 왜 가능한 것인가요?(TreeNode 클래스의 정의 내부에 TreeNode가 사용되는 것) 이전부터 이렇게 사용하시길래 그냥 지나가려다가 궁금해서 질문드립니다.
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
StreamBuilder dispose 문의.
안녕하세요 강사님. search_page.dart(StatefulWidget) 파일내용중 문의 드립니다. StreamBuilder 에 대해서 dispose 할 필요는 없나요? 필요하다면 어떻게 처리하는지 문의 드립니다. 감사합니다.
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
StreamBuilder dispose 문의.
안녕하세요 강사님. root_page.dart(StatelessWidget) 파일내용중 문의 드립니다. StreamBuilder 에 대해서 dispose 할 필요는 없나요? 필요하다면 어떻게 처리하는지 문의 드립니다. 감사합니다
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
git 허가 부탁드립니다~
git 허가 부탁드립니다~!!
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
조합만들기처럼 res 리스트를 만들어서
안녕하세요 저는 sum을 인자로 두지않고, 조합만들기처럼 res 리스트를 만들어서 진행했습니다. import sys sys.stdin = open("input.txt", 'r') def dfs(L, s): global cnt if L==k and sum(res) % m ==0: cnt+=1 else: for i in range(s, n): res[L] = num[i] dfs(L+1, i+1) if __name__ == "__main__": n, k = map(int, input().split()) num = list(map(int, input().split())) m = int(input()) cnt = 0 res = [0]*(k) dfs(0,0) print(cnt) 10. 조합만들기에서 총합 개념만 조금 더해서 만든 코든데 계속 IndexError: list assignment index out of range가 납니다.. 왜 그런지 모르겠어요..
-
미해결플렉스(Flex) 반응형 웹사이트 포트폴리오(The World's Best Cities)
완성본을 보고 있습니다.
아직 1회차로 정주행 하고 있습니다. 완성본으로 모바일반응형으로 화면 전환하여 트리거를 클릭하여 .active를 넣어준 후 다시 클릭해 빼준 후, 다시 웹화면으로 돌아오면, .gnb와 .sns가 사라져 있습니다. 새로고침하면 다시나오는데, 일시적인게 아니고 계속그렇습니다. 제 생각에는 $('.trigger').click(function(){ $(this).toggleClass('active') $('.gnb, .sns').toggle() }) 여기에서 단순히 $('.gnb, .sns').toggle() 이렇게만 하면 .gnb와 .sns 라는 클래스가 아예 들어갔다 사라졌다를 하기 때문에, 웹화면에도 영향을 미치는 것으로 판단됩니다. 물론 이 파트를 플렉스 관련하여 배우는 거라 이 부분이 그렇게 중요하지 않고 넘길 수 있는 부분이지만, 조금 더 확실히 하고 싶었습니다. 다음 영상에서 이부분에 대해 언급을 해주셨으면 이 질문을 삭제하겠습니다. 괜한 또 오지랖인것 같아서. 그래서 선생님께서 그동안 가르쳐주신걸 기초로 했을 때, CSS 의 반응형 즉 미디어쿼리 파트에 .gnb.active, .sns.active { display: block; } 이 부분을 추가하고, 제이쿼리를 $('.trigger').click(function(){ $(this).toggleClass('active') $('.gnb, .sns').toggleClass('active') }) 이렇게 수정해 보니 잘 작동되었습니다. 이 방법도 괜찮은가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
DDL문 생성시 주석 관련 질문입니다.
엔티티 정보를 토대로 DDL문이 만들어 지는데 컬럼 주석은 만들어지지 않습니다. 컬럼주석 생성시 DB에 종속되지 않고 해주는 어노테이션이나 기능이 있나요?
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
low level code에 관해 질문드립니다.
안녕하세요. 선생님 현재 대학원 진학을 앞둔 학생입니다. 선생님 강의를 통해 다향한 Object detection에 내용을 배울 수 있어 감사드립니다. 다만, 저의 학습 목표가 기존 모델의 구조를 변형 혹은 추가를 하려고 하다 보니 제한점이 생겨 질문드립니다. 강의 실습에 API를 사용하셨는데 혹시 API가 아닌 low level의 code를 참고할 수 있는 site가 있을까요? API의 경우 기존 code에 접근하기가 오히려 어렵게 느껴져서요... 좋은 강의 정말 감사합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
7:37초에 findIndex 대신 find 써준 이유가
draft를 써서 굳이 불변성 유지를 신경써줄 필요가 없어졌기 때문에 Index를 찾을 필요없이 그냥 바로 find를써서 v.id === action.data.postId인 객체를 찾아준건가여??
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
13분 40초 부근에 long 타입의 변수는 id계열에 사용한다고 하셨는데
id계열이 무엇인지 알 수 있을까요?
-
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
해외 지수 크롤링건입니다
삭제된 글입니다
-
미해결실전 리액트 프로그래밍
성능 이슈 관련해서 문의드려요
강사님 안녕하세요. 강사님 강의가 좋아서 몇 번을 돌려보고 있는 지 모르겠습니다. 좀 더 실무에 활용할 수 있는 리액트 두번째 강의도 만들어 주시면 안될지요? ㅎㅎ 오늘은 강의에서 적용하셨던 Antd 의 다양한 요소를 함께 적용해 보고 있는데요.Antd 의 Form 에 다양한 요소들(Input, Select, Radio 등) 을 담아서 양식 등록하는 화면을 만들어 보고 있습니다. 만약 Form 안에 많은 항목들이 담긴 양식을 하나 개발한다고 가정해보겠습니다.양식의 모든 요소들은 Redux 를 사용하여, 강의님이 설명해주신 dispatch(SetValue(...)) 와 useSelector 를 사용하여 연동을 시키구요.. 이럴 경우, form 의 한 가지 요소만 값이 변경해도 양식 전체의 가상돔이 리렌더링이 발생할 듯 한데요..혹시 양식의 요소가 많아질 경우, 양식을 하나의 컴포넌트가 아닌 여러개의 컴포넌트로 분리시키는 것이 중요할 지 궁금합니다.(한번에 저장되는 양식이라 할지라도) 쪼갠 컴포넌트들이 재활용 가능성이 전혀 없는 Component 라 할지라도 성능을 고려하여 state 의 변화에 따른 렌더링의 범위를 줄이기 위해 하나의 양식 컴포넌트를 여러 개로 쪼개야만 하는 것인지.. 이런 부분들이 공부하면서 어려운 점이네요..조언을 부탁드리겠습니다.
-
미해결QGIS 기초와 Python의 만남
food_layer.invalid()를 사용했는데 왜 저런 빨간 글씨가 나올까요?
(사진)
-
미해결Vue.js - Django 연동 웹 프로그래밍 (실전편)
정적 이미지는 어떻게 넣을 수 있을까요?
안녕하세요. 강의를 듣고 실제로 Django와 Vue를 연동해서 홈페이지를 만들어보고 있는 완강생입니다. 사이트에 정적 이미지를 넣고 싶은데, 두 개를 연동한 경우에는 어떻게 해야 이미지를 올릴 수 있을까요?ㅠㅠ href로 해서 외부에서 가져오는건 속도가 너무 느립니다.
-
해결됨빠르게 git - 핵심만 골라 배우는 Git/Github
ls-al과 status 명령어 입력시 나타나는 것들에 대한 질문이 있습니다.
예전에 유튜브 영상을 보면서 git을 처음 설치하고 이것저것 따라해보다가 어려워서 중단했던 적이 있는데 이번에 이 강의를 들으면서 다시 해보려고 하니까 $ls -al 과 $git status 명령어를 쳤을 때 아래와 같은 것들이 나오는데 이미 git에 연결된채로 있었기 때문에 이런건가요? 혹시 없앨 수 있는 방법이 있나요?
-
미해결기본을 확실히!! HTML의 모든 것
혹시 쿼리 전송이라 뜨는건 오류인가요...???
혹시 쿼리 전송이라 뜨는건 오류인가요...???
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
프론트 ec2 빌드 시 JavaScript heap out of memory 오류가 납니다
배포하는데 세 가지 문제가 발생해 도움이 필요합니다ㅜㅠ 1. 우선 프론트 서버 문제입니다. ec2 프론트 서버에 빌드 시 힙메모리가 누수되고 있는 것 같은데 로컬에서 build 된 client chunk 용량이 1.72MB 정도 입니다.. 그런데 ec2 instance에 연결해 ubuntu에 npm run build를 하면 메모리 힙에서 문제가 생기는 것 같습니다. backend server는 pm2로 켜놓은 상태입니다. 어디서 메모리가 누수되고 있는지 확인할 수 있는지 추전해주실 만한 방법이 있을까요? 2. 백서버의 경우 탄력적 ip로 ip주소를 고정해놓고 도메인을 등록한 상태입나다. 이를 인스턴스 퍼블릭 IPv4로는 접근이 되는데 http://api.ymillonga.com로 접근하면 사이트에 연결이 안됩니다. hsts 해제도 확인했습니다. 제가 도메인을 산 곳에서 네임서버 수정한 후에 어느 정도 시간이 걸려서 생기는 문제인지 아니면 제가 놓치고 있는 부분이 있는지 조언 부탁드립니다! 로컬 빌드 시 프론트 용량 C:\Users\HOME\Documents\ymillonga\front>npm run build > front@1.0.0 build C:\Users\HOME\Documents\ymillonga\front > cross-env ANALYZE=true NODE_ENV=true next build warn - You are using a non-standard "NODE_ENV" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://err.sh/next.js/non-standard-node-env Warning: Built-in CSS support is being disabled due to custom CSS configuration being detected. See here for more info: https://err.sh/next.js/built-in-css-disabled info - Using external babel configuration from C:\Users\HOME\Documents\ymillonga\front\.babelrc Webpack Bundle Analyzer saved report to C:\Users\HOME\Documents\ymillonga\front\.next\analyze\server.html Webpack Bundle Analyzer saved report to C:\Users\HOME\Documents\ymillonga\front\.next\analyze\client.html info - Creating an optimized production build info - Compiled successfully info - Collecting page data info - Finalizing page optimization Page Size First Load JS ┌ λ / 1.43 kB 500 kB ├ /_app 0 B 105 kB ├ ○ /404 262 B 106 kB ├ λ /hashtag/[tag] 784 B 496 kB ├ λ /login 10.2 kB 485 kB ├ λ /post/[id] 687 B 496 kB ├ λ /posts/related 1.09 kB 499 kB ├ λ /profile 8.9 kB 484 kB ├ λ /signup 1.33 kB 476 kB └ λ /user/[id] 1.27 kB 496 kB + First Load JS shared by all 105 kB ├ chunks/033f869c0cc364627d93bd7d05534baade1e7634.cc8305.js 5.03 kB ├ chunks/6b7903cd2497917111f687055581f790035a2aa9.c4f564.js 15.6 kB ├ chunks/777c2cca.558465.js 77 B ├ chunks/b6451bfa71415e1eb6b699247070fee6c4d97f38.fee3f6.js 11.5 kB ├ chunks/commons.7aac71.js 8.79 kB ├ chunks/framework.9d2e16.js 42.1 kB ├ chunks/main.5b6e30.js 7.06 kB ├ chunks/pages/_app.c0b4a3.js 14.3 kB ├ chunks/styles.f4dce8.js 99 B ├ chunks/webpack.470e21.js 752 B └ css/777c2cca.81a3d2c1.chunk.css 65.7 kB λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps) ○ (Static) automatically rendered as static HTML (uses no initial props) ● (SSG) automatically generated as static HTML + JSON (uses getStaticProps) (ISR) incremental static regeneration (uses revalidate in getStaticProps) [== ] info - Generating static pages (0/1) 우분투 빌드시 오류코드 ubuntu@ip-172-31-45-132:~/ymillonga-sns/front$ npm run build > front@1.0.0 build /home/ubuntu/ymillonga-sns/front > cross-env ANALYZE=true NODE_ENV=true next build warn - You are using a non-standard "NODE_ENV" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://err.sh/next.js/non-standard-node-env Warning: Built-in CSS support is being disabled due to custom CSS configuration being detected. See here for more info: https://err.sh/next.js/built-in-css-disabled info - Using external babel configuration from /home/ubuntu/ymillonga-sns/front/.babelrc Webpack Bundle Analyzer saved report to /home/ubuntu/ymillonga-sns/front/.next/analyze/server.html info - Creating an optimized production build .. <--- Last few GCs ---> [17547:0x630efc0] 20581 ms: Scavenge 477.9 (490.8) -> 477.4 (490.8) MB, 16.3 / 0.0 ms (average mu = 0.604, current mu = 0.531) allocation failure [17547:0x630efc0] 20601 ms: Scavenge 478.8 (494.8) -> 478.3 (494.8) MB, 17.0 / 0.0 ms (average mu = 0.604, current mu = 0.531) allocation failure [17547:0x630efc0] 21501 ms: Mark-sweep 481.5 (494.8) -> 477.8 (497.3) MB, 866.5 / 0.0 ms (average mu = 0.393, current mu = 0.116) allocation failure scavenge might not succeed <--- JS stacktrace ---> FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory 1: 0xa04200 node::Abort() [node] 2: 0x94e4e9 node::FatalError(char const*, char const*) [node] 3: 0xb7860e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node] 4: 0xb78987 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node] 5: 0xd33215 [node] 6: 0xd63dae v8::internal::EvacuateNewSpaceVisitor::Visit(v8::internal::HeapObject, int) [node] 7: 0xd6fde6 v8::internal::FullEvacuator::RawEvacuatePage(v8::internal::MemoryChunk*, long*) [node] 8: 0xd5bfcf v8::internal::Evacuator::EvacuatePage(v8::internal::MemoryChunk*) [node] 9: 0xd5c248 v8::internal::PageEvacuationTask::RunInParallel(v8::internal::ItemParallelJob::Task::Runner) [node] 10: 0xd4eb29 v8::internal::ItemParallelJob::Run() [node] 11: 0xd71d40 void v8::internal::MarkCompactCollectorBase::CreateAndExecuteEvacuationTasks<v8::internal::FullEvacuator, v8::internal::MarkCompactCollector>(v8::internal::MarkCompactCollector*, v8::internal::ItemParallelJob*, v8::internal::MigrationObserver*, long) [node] 12: 0xd725dc v8::internal::MarkCompactCollector::EvacuatePagesInParallel() [node] 13: 0xd727a5 v8::internal::MarkCompactCollector::Evacuate() [node] 14: 0xd84791 v8::internal::MarkCompactCollector::CollectGarbage() [node] 15: 0xd40ab8 v8::internal::Heap::MarkCompact() [node] 16: 0xd425a8 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node] 17: 0xd459ec v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node] 18: 0xd0b2f2 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [node] 19: 0xd07542 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawArray(int, v8::internal::AllocationType) [node] 20: 0xd075f4 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithFiller(v8::internal::Handle<v8::internal::Map>, int, v8::internal::Handle<v8::internal::Oddball>, v8::internal::AllocationType) [node] 21: 0xf3d8ce v8::internal::Handle<v8::internal::NameDictionary> v8::internal::HashTable<v8::internal::NameDictionary, v8::internal::NameDictionaryShape>::New<v8::internal::Isolate>(v8::internal::Isolate*, int, v8::internal::AllocationType, v8::internal::MinimumCapacity) [node] 22: 0xf3db26 v8::internal::Handle<v8::internal::NameDictionary> v8::internal::HashTable<v8::internal::NameDictionary, v8::internal::NameDictionaryShape>::EnsureCapacity<v8::internal::Isolate>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::NameDictionary>, int, v8::internal::AllocationType) [node] 23: 0xf3e33a v8::internal::Handle<v8::internal::NameDictionary> v8::internal::Dictionary<v8::internal::NameDictionary, v8::internal::NameDictionaryShape>::Add<v8::internal::Isolate>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::NameDictionary>, v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyDetails, v8::internal::InternalIndex*) [node] 24: 0xf49dba v8::internal::BaseNameDictionary<v8::internal::NameDictionary, v8::internal::NameDictionaryShape>::Add(v8::internal::Isolate*, v8::internal::Handle<v8::internal::NameDictionary>, v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyDetails, v8::internal::InternalIndex*) [node] 25: 0x106f4ff v8::internal::Runtime_AddDictionaryProperty(int, unsigned long*, v8::internal::Isolate*) [node] 26: 0x1400039 [node] npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! front@1.0.0 build: `cross-env ANALYZE=true NODE_ENV=true next build` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the front@1.0.0 build script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /home/ubuntu/.npm/_logs/2020-12-17T07_21_00_369Z-debug.log 클라이언드 용량 front/config/config.js export const backUrl = process.env.NODE_ENV === 'production' ? "http://15.165.249.3" : "http://localhost:3051"; export const callbackUrl = process.env.NODE_ENV === 'production' ? "http://15.165.249.3/user/google/callback" : "http://localhost:3051/user/google/callback"; back/ app.js const express = require('express'); const dotenv = require('dotenv'); const passport = require('passport'); const db = require('./models'); const morgan = require('morgan'); const path = require('path'); const userRouter = require('./routes/user'); const postRouter = require('./routes/post'); const postsRouter = require('./routes/posts'); const hashtagRouter = require('./routes/hashtag'); const cookieParser = require('cookie-parser'); const session = require('express-session'); const passportConfig = require('./passport'); const cors = require('cors'); const hpp = require('hpp'); const helmet = require('helmet');//hpp, helmet:production모드일 때 보안에 필요한 필수 패키지들 const app = express(); dotenv.config(); passportConfig(); const prod = process.env.NODE_ENV === 'production'; const frontUrl = prod ? "http://ymillonga.com" : "http://localhost:3050"; db.sequelize.sync() .then(() => { console.log('db연결 성공'); }) .catch(console.error); app.use(morgan('dev')); if (prod) { app.use(morgan('combined')); app.use(hpp()); app.use(helmet({ contentSecurityPolicy: false })); app.use(cors({ origin: [frontUrl, 'http://3.36.18.214'], credentials: true, })) } else { app.use(morgan('dev')); app.use(cors({ origin: true, credentials: true, })); } app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use('/', express.static(path.join(__dirname, 'uploads'))); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use(session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, proxy: prod, cookie: { httpOnly: true, secure: false, //process.env.NODE_ENV === 'production',//https일 때 true domain: process.env.NODE_ENV === 'production' && '.ymillonga.com' }, })); app.use(passport.initialize()); app.use(passport.session()); app.use('/user', userRouter); app.use('/post', postRouter); app.use('/posts', postsRouter); app.use('/hashtag', hashtagRouter); app.get('/', (req, res) => { res.send('hello express'); }); app.use((req, res, next) => { const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`); error.status = 404; next(error); }); app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; res.status(err.status || 500); res.render('error'); }); app.listen(3051, () => { console.log(`3051에서 대기 중`); });
-
미해결자바스크립트 중고급: 엔진 핵심
앞에 분 내용 잘 읽었는데..
제가 앞에 분 내용을 다 읽었는데, 제가 이해한바가 맞는지 확인 부탁드립니다. 함수에서 스코프를 만드는 과정은 호출이 아닌 실행을 해서 처음 function이라는 키워드를 만났을 때 실행되며, 함수를 호출하면 그 때 실행컨텍스트가 만들어져 처음에 만들어진 스코프를 확인한다. 즉, 처음 실행과 호출과의 차이를 알아야한다. 위 내용이 맞나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님 질문있습니다!
[질문 1] Listener 강의 듣고 제가 이해한 것이 맞는지 확인 받고 싶습니다. ※ pending(지연) == false : I/O 처리 요청이 운영체제에 전달되자마자 바로 CPU가 처리함. ※ pendding(지연) == true ① I/O 처리 요청만 운영체제에게 전달(CPU는 다른 일을 하고 있음 → pending 상태)만 한 상태(즉, 접수만 상태) ② 이전에 수행하던 작업을 CPU가 완료되었을 때 운영체제는 Comleted 이벤트를 발생하고 ①에서 요청이 들어온 I/O처리를 한다. ③ 이때 OnAcceptCompleted에 있는 OnAcceptHandler를 통해 데이터를 보내고 받고 끊는 작업을 수행함. ④ RegisterAccept 호출을 통해 args를 초기화해준다. 이때 args의 역할은 운영체제와 응용 프로그램 사이에서 중개(데이터 전달, 이벤트 발생 등)해주는 역할을 한다. [질문 2] ⓐ _onAcceptHandler.Invoke(args.AcceptSocket); ⓑ _onAcceptHandler(args.AcceptSocket); ⓐ와 ⓑ를 실행하면 동일한 결과가 나오는데 강사님은 왜 Invoke를 붙이셨는지 궁금합니다.