묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
nunjucks res.render('error'); 작동을 안합니다.
안녕하세요. 강사님.현재 learn-sequelize MySQL 부분을 실습하고 있습니다.그런데 실습 과정중 이름(UNIQUE INDEX ) 을 중복되게 생성하여 일부러 오류를 일으켰으나error.html 페이지가 호출 되지 않고있습니다.사용자 생성 router 부분은router.route('/').get(async (req, res, next) => {try {const users = await User.findAll();res.json(users);} catch(err) {console.error(err);next(err);}}).post(async (req, res, next) => {try {const user = await User.create({name : req.body.name,age : req.body.age,married : req.body.married});console.log(user);res.status(201).json(user); // status 201 작성됨(생성됨) 뜻} catch(err) {console.error(err);next(err); // <== next(err) 로 전달하나 error.html을 호출하지 못함}});입니다.app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; err.status = err?.status ?? 500; res.status(err.status); console.log('test'); //<== 로그는 찍힘 res.render('error');//error.html render안됨});res.render('error') 가 되지 않고 있습니다. 라우터 경로 테스트 결과app.use((req, res, next) => {const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);error.status = 404;next(error);});라우터 경로 오류시에는 정상적으로 호출하는 것으로 보아 문제는 없는 것 같은데 원인을 찾지 못하고 있습니다.잘 부탁드립니다.-- 에러 로그는 다음과 같습니다. ---- users 테이블에 중복된 이름을 입력 하였을 때 오류 내용으로 500 에러로 보아error.html 호출이 되어야 하지만 호출이 되지 않고 있습니다.Executing (default): INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);Errorat Query.run (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\dialects\mysql\query.js:52:25)at D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\sequelize.js:314:28at processTicksAndRejections (internal/process/task_queues.js:95:5)at async MySQLQueryInterface.insert (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\dialects\abstract\query-interface.js:308:21)at async User.save (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\model.js:2432:35)at async Function.create (D:\nodeExer\node_exer1\learn-sequelize\node_modules\sequelize\lib\model.js:1344:12)at async D:\nodeExer\node_exer1\learn-sequelize\routes\users.js:22:26 {name: 'SequelizeUniqueConstraintError',errors: [ValidationErrorItem {message: 'name_UNIQUE must be unique',type: 'unique violation',path: 'name_UNIQUE',value: 'aa',origin: 'DB',instance: [User],validatorKey: 'not_unique',validatorName: null,validatorArgs: []}],parent: Error: Duplicate entry 'aa' for key 'users.name_UNIQUE'at Packet.asError (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packets\packet.js:728:17)at Execute.execute (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\commands\command.js:29:26)at Connection.handlePacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:456:32)at PacketParser.onPacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:85:12)at PacketParser.executeStart (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packet_parser.js:75:16)at Socket.<anonymous> (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:92:25)at Socket.emit (events.js:400:28)at addChunk (internal/streams/readable.js:293:12)at readableAddChunk (internal/streams/readable.js:267:9)at Socket.Readable.push (internal/streams/readable.js:206:10) {code: 'ER_DUP_ENTRY',errno: 1062,sqlState: '23000',sqlMessage: "Duplicate entry 'aa' for key 'users.name_UNIQUE'",sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);',parameters: [ 'aa', '11', false, '2022-12-14 17:38:07' ]},original: Error: Duplicate entry 'aa' for key 'users.name_UNIQUE'at Packet.asError (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packets\packet.js:728:17)at Execute.execute (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\commands\command.js:29:26)at Connection.handlePacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:456:32)at PacketParser.onPacket (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:85:12)at PacketParser.executeStart (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\packet_parser.js:75:16)at Socket.<anonymous> (D:\nodeExer\node_exer1\learn-sequelize\node_modules\mysql2\lib\connection.js:92:25)at Socket.emit (events.js:400:28)at addChunk (internal/streams/readable.js:293:12)at readableAddChunk (internal/streams/readable.js:267:9)at Socket.Readable.push (internal/streams/readable.js:206:10) {code: 'ER_DUP_ENTRY',errno: 1062,sqlState: '23000',sqlMessage: "Duplicate entry 'aa' for key 'users.name_UNIQUE'",sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);',parameters: [ 'aa', '11', false, '2022-12-14 17:38:07' ]},fields: { name_UNIQUE: 'aa' },sql: 'INSERT INTO users (`id`,`name`,`age`,`married`,`created_at`) VALUES (DEFAULT,?,?,?,?);'}POST /users 500 52.768 ms - 785
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
cookie를 자동으로 업데이트 하는 방법이 있을까요?
https://kwonkyo.tistory.com/529해당 블로그의 방법처럼 joson 형식을 직접 코드에 작성하여 네이버 쇼핑 크롤링을 완성 하였습니다. 대신 이 방법대로 하면 매번 코드에 cookies,headers,params 를 작성해 줘야하는데요.headers와 params는 매번 똑같아도 괜찮지만 cookies는 매일 달라지는 것 같습니다?이 경우에는 cookies를 자동으로 업데이트 시켜줘야 할 것 같은데어떤 방법이 있을까요?구글링 하여 session 방법도 나름 시도해 보았지만 잘 해결되지 않아 질문 드립니다.아래는 코드 입니다.import requests from bs4 import BeautifulSoup import json page = 1 keyword = "과자" print(f"------------------{page}페이지--------------------") cookies = { 'NNB': 'WUXWWRMOOVZWG', 'nx_ssl': '2', 'NaverSuggestUse': 'use%26unuse', 'NFS': '2', '_ga': 'GA1.2.1826370085.1669177707', '_ga_8P4PY65YZ2': 'GS1.1.1670556699.3.1.1670556781.0.0.0', 'autocomplete': 'use', 'AD_SHP_BID': '14', 'ASID': '0e221f9100000185044256e400000053', 'SHP_BID': '4', 'demo': 'm-20', 'nid_inf': '856411158', 'NID_AUT': 'HZYH2iEU+pydap3C2ZeK6SYL11+ZQZzCIxAEVW3QF+iQi6lSXeyTWKIk5Q2u+b9S', 'NID_JKL': 'SVy2JH/PZVBFeP9cfyNUo3IgRz5c4Q/O3D1m7qX2s00=', 'page_uid': 'hHD3nsp0YihssMEgEXGssssssBd-506797', 'spage_uid': 'hHD3nsp0YihssMEgEXGssssssBd-506797', 'NID_SES': 'AAABnE+3Z8P/zCp3/+XE9IwB85rhcdGolR2WTfQ+4pgrPTDVp5OXKvHRGfHLRDEkgIPkWbhnTGodcztE7cv9hlVOxWbV/AzVGwmPzQZaD1fLKkFAp6C6687HIZnNTsT4eV03q6QZxMfBOw8XTTfsuYRwsYwbkJDEuKeXXmfFFdC2cy3sGgI6ZPG3ktjZIyg+rkfuxcf1ctpeNOHDdt8KmCKlPx5dstYGtlbWHjZo3A4nW6uaRMt+2C9GB/GLrR01RhYR/MO3V75Cs+QMLbaFjcH3rqDH3hW1Af72MHP7GhbefTHvhHrFUtKAgYUgL2GTT/1He52YtfMgiHlr9nkw9vOA+IxGJMTrzGfA2QhJ2ygbYbET/srzrBzN/wc1S9f/1l11d7SKh0V/wlAyputCtanuhm3zErFBEVVnVmnb4ZuMt0suYkOzi4npFMt9DDbZF0a94Jg/hCpqQpOJyZExpW27Lus6vVtTVMKtGhHKdIWIqQj/sazKIizGDZO/kCkB2B3UZ7Mifr8++HX/JRctca8Xhy2Raq4k4LeLgdfzBJUy8YPk', 'sus_val': 'bREWstOPzGuz2c6tT/IjoDSm', '_naver_usersession_': 'MBrk5lhOc1WegHzbQgb1fDhq', 'listOffset': '5', 'lastProductClick': '%EA%B8%B0%EB%8A%A5%EC%84%B1%20%EC%8B%A0%EB%B0%9C%20%EA%B9%94%EC%B0%BD%20%EC%95%84%EC%B9%98%20%EC%97%90%EC%96%B4%20%EC%BF%A0%EC%85%98%20%EC%9A%B4%EB%8F%99%ED%99%94%20%EC%9D%B8%EC%86%94%5E30260232791', 'ncpa': '6303604|lbmlel28|f29a4f23c2092dd24530afa9813bf4ed43f67312|s_18330e9a745fc|413a3e4b2505b6496c591b071aef2b79c21ebc52:3779889|lbmn6v3s|16785f2b11b65ae4a89a094ca2bc118dc954d556|s_16dc887ee7e95|02e93fa21fc6031ec88bcb6689e7cff18c15665b:5690384|lbmnnr4o|b4c6a1cf1d35097780f135a25c5799f57c65aede|s_19db0b627c733|01e7ef1e0ef2246ac863510bbb29e0a36a0033e3:165568|lbms7ec0|ead632e1b5f336c51e62da580208075272c11459|s_3422b8e1086835|47f818e032ceb6be564e3ff644b883ec359a265e:955149|lbnl92mg|b70c701a1fa1d38c1f581fcc23b30398d4adcc90|s_284221eac5eff|2f245a3ca6021c0dfb29a16bf7c07ec3c04396a7:225323|lbnmb480|2b37c0d8ddc982beacf11112bde0a117667fa270|s_5febb6e0220e1431|00c43677ce145a64eda592347157206e1dbd56d6:114|lbnr0s8w|54bc64a1453b4478949117b8889af402d3167367|s_1f0b6dd34481|165f45347c0201202f68fb81d77ad2bb5359ff6e:17703|lbns2kl4|26027c84c330407b41db82948a4fcaa33e7310d7|s_1f0b6dd345b2|2c70c3b6f7b0fcc2318cc94f852a990489505190:2680908|lbnsxh8o|462894807013beea343e192f633c808c7a42aabb|s_7d847d844c1e|a273843fa1cab15b4f2d4c666bc1fb930901383e:95694|lbntoqq0|d1c8fb101d9c85a5ff547a1b0785720da86641af|95694|477f8709aa2b405357c709a92412bb560da31300', } headers = { 'authority': 'msearch.shopping.naver.com', 'accept': 'application/json, text/plain, */*', 'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7', 'logic': 'PART', 'referer': f'https://msearch.shopping.naver.com/search/all?frm=NVSHPAG&origQuery=%ED%81%B0%EC%8B%A0%EB%B0%9C%EA%B9%94%EC%B0%BD&pagingIndex={page}&pagingSize=40&productSet=total&query=%ED%81%B0%EC%8B%A0%EB%B0%9C%EA%B9%94%EC%B0%BD&sort=rel&viewType=lst', 'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', } params = { 'query': f'{keyword}', 'sort': 'rel', 'pagingIndex': f'{page}', 'pagingSize': '40', 'viewType': 'lst', 'productSet': 'total', 'frm': 'NVSHPAG', 'origQuery': f'{keyword}', } response = requests.get('https://msearch.shopping.naver.com/api/search/all', params=params, cookies=cookies, headers=headers) itemlist = json.loads(response.text) cnt_1 = 1 print("=============광고 상품==============") try: for i in itemlist['searchAdResult']['products']: print(cnt_1) print(i["productTitle"]) print(i["mallProductId"]) cnt_1 +=1 except: print("============광고 상품 없음===================") cnt = 1 print("=============일반 상품==============") for i in itemlist['shoppingResult']['products']: print(cnt) print(i["productTitle"]) try: if i["mallProdMblUrl"][0] =="h": print(i["mallProdMblUrl"]) print(i["mallProductId"]) except: print(i["id"]) cnt +=1
-
미해결Slack 클론 코딩[실시간 채팅 with React]
front 폴더에서 yarn 설치 후 yarn dev 오류
맥북을 사용하기에 front 폴더에 yarn 설치 후, yarn dev를 하면 아래의 사진처럼 Type 'React.ReactNode' is not assignable to type {}. React.ReactNode오류가 뜹니다. setting 폴더에서 yarn 설치 후, yarn dev를 하면 정상적으로 작동합니다.(둘 다 똑같이 back 폴더에서 yarn run dev로 서버 가동은 해놓은 상태입니다)1번 에러2번 에러3번 에러총 이렇게 3개의 에러가 나오는 상황입니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
findbyid findall이두개만 return타입을 사용한 이유가 뭘까요
[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결처음 만난 리액트(React)
섹션3 JSX 코드 작성해보기
이곳에서 코드를 똑같이 따라했는데 아래와 같은 오류가 뜨네요 ㅜㅜ 에러가 왜 나는지 모르겠습니다.
-
미해결따라하며 배우는 HTML, CSS
go live 관련
강사님 하시는 거 보면 go live가 즉각적으로 반응되는데 그렇게하려면 어떻게 하는 건가요?
-
해결됨[코드캠프] 시작은 프리캠프
오류가 왜 난지 모르겠습니다 ㅠㅠ
싸이월드 4탄 강의에서 game.js 를 작성하는데 myword, lastword, firstword 등이 Unknown word 라고 뜨면서 오류가 발생하는것 같은데 왜그런건가요?? 저는 강의 그대로 코드를 짯는데 왜이런지 잘 모르겟씁니다 ㅠㅠ
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
hello world 강의도중 vi 실행시키니 이상한 창이 뜹니다!
늦은 시간 문의 드려죄송합니다! hello world 강의도중 vi 실행시키니 이상한 창이 뜹니다! 또한 ./build 를 실행시키니 오류가 뜹니다! ㅠㅠ-vi hello_world.v를 쳤을때-esc 키를 두번누르니 (정상적 화면 출력)-wq 치고 나와서 ./build 를 치니 command not found 라는 문구가 나옵니다command not found 가 왜뜨는걸까요? ㅠㅠ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
애플리케이션 구성관련하여 질문드립니다.
안녕하세요. 회사에서 사용하는 MSA가 무엇인지 궁금하여 알아보던 중 강의를 듣게 되었습니다..앞 강의에서 강사님이 로드밸런싱은 Eureka가, 라우팅은 API GATEWAY가 한다고 보면 된다.. 라고 봤던 것 같은데 이번 강의에서는 API Gteway에 "부하분산/서비스라우팅"이라고 적혀있습니다. 부하분산=로드밸런싱으로 알고 있는데.. 혹시 제가 잘 못 알고 있던 걸까요? 감사합니다.
-
미해결차량 번호판 인식 프로젝트와 TensorFlow로 배우는 딥러닝 영상인식 올인원
CRAFT 모델 train and validation data split 관련 오류
Custom Dataset을 만들어서 CRAFT 모델에 적용하려고 하는데 위와 같은 에러가 발생합니다. 에러를 해결할 방법에 대해 문의드립니다.Custom Dataset 수를 120장 정도로 했을때는 위 코드 부분에서 에러가 나지 않았는데 Image Augmentation 적용후 Custom Dataset 수를 220장 정도로 늘린 후에 CRAFT 모델에 적용하려고 하니 위와 같은 코드에러가 발생합니다. (120장 넣었을때는 Custom Dataset .zip파일 압출을 풀때 .png파일부터 압축 해제가 되었는데, 220장으로 늘린 후에는 .txt 파일부터 압축해제가 되는데요, 혹시 .png파일부터 압축해제가 안되어서 그런건 아닌지 생각도 해봤습니다)그리고 압축해제 후 코드창에 Dataset을 입력하면 []로 빈 파일로 나옵니다.
-
미해결시스템엔지니어가 알려주는 리눅스 실전편 Bash Shell Script
m1 지원
안녕하세요.얼마전 virtualBox Beta 이긴 하지만 드디어 m1을 지원하기 시작했는데요.혹시 여기에 맞춰져서 실습을 진행하는방법이 있을까요?
-
미해결반응형 웹사이트 포트폴리오(Architecture Agency)
섹션 상세 퍼블리싱 강의중에 프로토타입 제작
■섹션 상세 퍼블리싱 강의중에 탭 콘텐츠 프로토타입 제작 강의중 질문있는데요input[type=tab1]:checked ~ .tabs 여기 코드부분에margin-left: 0, margin-left: -100%, margin-left: -200%마진 레프트로 주셨는데 이 코드를 그냥 레프트로 left: 0, left: -100%, left: -200% 이렇게 주면 안되는이유가 궁금해요
-
미해결처음 만난 리액트(React)
에러가 나요ㅠㅠ
에러가 나서요ㅠ
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
71번 문제 전역 변수 질문 있습니다
안녕하세요! 강의 잘 보고 있습니다!강의를 듣다가 마지막 테스트 케이스에서 오류가나와서 찾아보니까int ch[10001], d[3] = {1, -1, 5};메인 안쪽에 지역 변수로 선언하고 돌리면 값 출력이 안되고 전역 변수로 선언하고 돌리면 출력이 되더라고요..멍청한 질문일 수도 있는데.. 제가 봤을 때는 상관이 없을거 같은데.. 왜 그러는지 알려주실 수 있으실까요??
-
해결됨[코드캠프] 강력한 CSS
학습자료가 어디있다는거죠..
학습 자료를 올려주신다는데 어디있다는건지요 ㅠ
-
해결됨[코드캠프] 강력한 CSS
노션 링크는 어떻게 해야 받을 수 있나요?
학습 자료를 받고 싶은데, 노션 링크는 어떻게 받을 수 있을까요?
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
확장선택자와 함께 가상클래스 checked 실전 퍼블리싱 06(탭 콘텐츠 - Slide)
이미지가 tab inner로 안들어가고 가로로만 배치가 되는데 무엇이 문제인지 모르겠습니다.. <!DOCTYPE html> <html lang="Ko"> <head> <meta charset="UTF-8"> <title>slider</title> <link rel="stylesheet" href="style_slide.css"> </head> <body> <div class="tab-inner"> <input type="radio" name="tabmenu" id="tab1" checked> <input type="radio" name="tabmenu" id="tab2"> <input type="radio" name="tabmenu" id="tab3"> </div> <div class="slide"> <div class="slide-inner"> <a href="#none1"><img src="images/slide-01.jpg"></a> <a href="#none2"><img src="images/slide-02.jpg"></a> <a href="#none3"><img src="images/slide-03.jpg"></a> </div> </div> <div class="btn"> <label for="tab1"></label> <label for="tab2"></label> <label for="tab3"></label> </div> </body> </html> css 입니다~ @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap'); body { font-family: 'Noto Sans KR', san-serif; line-height: 1.5em; font-weight: 300; color: #222; display: flex; justify-content: center; align-items: center; height: 100vh; } .tab-inner { border: 1px solid red; width: 300px; height: 350px; } input[name="tabmenu"] { /* display: none; */ } .slide { position: relative; width: 300px; height: 300px; } .slide-inner { width: 900px; font-size: 0; position: absolute; top: 0; left: 0; } .btn { text-align: center; margin-top: 10px; } .btn label { display: inline-block; width: 20px; height: 20px; border-radius: 50%; background-color: lightgray; cursor: pointer; }
-
미해결인터랙티브 개발 실무 끝장내기 [역량 강화편]
offsetTop, offsetHeight
안녕하세요 강사님.. 강사님 수업 열심히 듣고 있는데요~~ 질문이 있습니다!if(scroll > section[i].offsetTop - window.innerHeight/3 )Y축 스크롤값이 섹션 i번째의 세로 높이 - 윈도우 창의 높이/3 보다 크고,&&( scroll < section[i].offsetTop - window.innerHeight/3 + section[i].offsetHeight Y축 스크롤값이 섹션 i번째의 세로 높이 - 윈도우 창의 높이/3 + 섹션 i번째의 길이보다 작을 때 실행인데섹션 세로 높이랑 길이랑 어떻게 다른건지 잘 이해가 안됩니다...!이부분 참 어렵네용,,, 🧐
-
미해결프로그래머를 위한 강화학습(저자 직강)
DQN 알고리즘 실행 결과
말씀하신대로 코드를 수정하니 정상적으로 학습을 진행합니다.다만 학습 결과가 안 좋은데.... 강의에서 설명하신 것을 보면 하이퍼 파라메터에 민감하다고 하셨습니다.제 생각에는 하이퍼 파라메타 문제보다 타겟 신경망을 계속 업데이트하는 문제, 즉 부트스트랩의 문제점이라고 생각합니다. 유튜브나 다른 책에서 DQN 코드를 보면 별도의 타겟 신경망을 만들어서 따로 업데이트하고 있습니다.현재 코드는 부트스트랩 문제를 안고 있는데, 학습 결과가 좋지 않은 것에 대해 의견 부탁드립니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 단방향에 관해 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@OneToMany @JoinColumn(name = "TEAM_ID") private List<Member> members = new ArrayList<>();1:N 단방향에서 이렇게 작성한 경우 여기서 N이 Member 인지 어떻게 판단하는 건가요? 따로 지정하지 않아도 List에 들어가는 클래스로 판단할 수 있는건가요??