묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
/api/v2/members에 대해 질문이 있습니다.
안녕하세요? 강사님. 항상 강의 잘 듣고 있습니다. 다름이 아니라, 제가 private Long price를 임의로 추가를 해봤습니다. 제가 이해한 내요은 @RequestBody를 통해서 CreateMemberRequest 에 해당되는 name 과 price를 postman 에서 가져와서 request에 담아서 실행하는 것으로 이해를 했습니다. 근데 실행 결과 에러가 났습니다. 애초에 제가 이해한 것이 잘못된것인지 궁금해서 질문드립니다. 감사합니다. @PostMapping("/api/v2/members")public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){ Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id);}@Datastatic class CreateMemberRequest { private String name; private Long price;}
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
요청 순서 질문 있습니다.
안녕하세요! 궁금한점 있어 질문드립니다. https://github.com/ZeroCho/nodejs-book/blob/master/ch10/10.7/nodebird-api/routes/v2.js 이 코드에서, 요청이 들어오면 11번째 줄의 cors 관련 코드가 먼저 작동하나요? 아니면 25번째 줄의 apiLimmiter가 먼저 작동하나요?
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
const PostCard = ({ post }) => {
PostCard 컴포넌트에서 useSelector로 post값을 받아올 수도 있는데 props로 넘겨주신 이유가 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
5:23 질문입니다
private float _speed = 10.0f 에서 [SerializeField] 속성을 붙이면 public처럼 유니티에 표시된다고 하셨는데 처음부터 public으로 만드는 것과 private로 만든 후 SerializeField 속성을 붙이는것의 차이점이 있나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의자료 39페이지 오타(?) 제보드립니다.
안녕하세요 강사님, 간단한 오타 비스무리한게 있어서 제보드립니다. select m from member m where m.name = :name 위와 같은 JPQL을 아래처럼 바꿔야 할 것 같습니다! select m from Member m where m.name = :name
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
어렵네요 ㅎㅎ
6시간 만에 완성하긴 힘들듯 ㅜㅜ 반복해야되요
-
해결됨진짜 현업에서 쓰이는 직장인의 실무 엑셀 - 데이터 가공부터 분석까지
파워쿼리_"데이터 모델에 이 데이터 추가" 관련 문의드립니다.
안녕하세요. 좋은 수업에 감사드립니다. 파워쿼리로 데이터 취합 시, 원본을 "폴더에서"로 선택 후 - 데이터 변환 과정을 거쳐서 - 데이터 로드시킬 때, "데이터 모델에 이 데이터 추가"가 아예 활성화되어 있지 않아서... 체크를 하거나 체크를 풀 수 없습니다. (오피스 365 사용중입니다.) 1) 이렇게 비활성화 된 것이 정상적인지, 무언가 잘못되었는지 궁금합니다. 2) 데이터 로드를 시킨 후에는 --> 파워피벗을 사용하여 자료를 분석하려고 합니다. 그런데 "데이터 모델에 이 데이터 추가"을 체크해야 파워피벗 분석이 가능하다고 알고 있습니다. 제가 혹시 잘못 알고 있는 것은 아닌지, 맞게 알고 있는지 궁금합니다.
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
isin만 가능한지 궁금합니다.
선생님 plt.figure(figsize=(10,7)) sns.scatterplot(data=df_academy_selected[df_academy_selected["상권업종소분류명"]==["어린이집", "학원-입시"]] , x="경도", y="위도", hue="상권업종소분류명") 이렇게 코드를 쓰면 왜 오류가 나는 걸까요..? '=='과 같은 연산자에서는 값이 하나만 넣어야 되는 건가요? 리스트로 넣으면 안되나요..? 'isin() '을 사용해서 ()안에 리스트로 넣어주는 건 되는데.. 위에 코드처럼 쓸때에는 리스트를 쓰면 안되는 이유는 무엇인가요 ?
-
미해결유니티와 C#으로 배우는 카타나제로스타일 게임만들기 (기본편)
엣지콜라이더설치후 폴리싱 관련된 부분 질문드립니다.
계단부분을 처리하기 위해 엣지콜라이더를 설치 후 플레이어가 엣지콜라이더와 충돌시 중력값을 0으로 만들어 오르막길을 문제 없이 올라가게 하는 부분은 이해가 됐습니다만. 중력값이 0임에도 불구하고 정지상태에서 계속 아래로 캐릭터가 미끄러지듯 내려가는 부분을 확인할 수 있었습니다. 이런 2d 픽셀류 게임에서 일일이 박스콜라이더를 계단모양으로 일일이 배치하진 않을 것 같은데, 엇지 콜라이더 경사면에서 미끄러지지 않기 위해서 추가적으로 어떤 코드를 넣어야 할까요?
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
catplot 그릴때 x축 글씨 겹쳐보이지 않게..
선생님 catplot 으로 서브플롯 그릴때 sharex=False를 통해서 x축에 상권업종소분류명이 나오는데.. 글씨가 겹쳐보이면 그래프를 좀 넓게 그리는 방법은 어떻게 하나요? 간격조정 어떻게 하는지 궁금합니다.
-
미해결Python 엑셀 프로그래밍 - with xlsxwriter
저장이 특정 폴더가 아니라 여기만 존쟈하는 드라이브로 들어갑니다
엑셀을 저장하는데 제 컴퓨터가 아니라 특정 파일로 들어갑니다
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
로또 추출기에서 중복되는 수는 어떻게 해야해요?
마지막쯔음에 로또 추첨기 만들 수 있는데 중복을 어떻게 거르죠?
-
해결됨프론트엔드 개발자를 위한 웹팩
.txt 파일 자동생성 관련 질문이 있습니다.
main.js.LICENSE.txt 파일이 자동으로 생성이 됩니다. 라이센스 .txt 파일이 생성되지 않게 설정하는 방법도 있나요?
-
미해결애플 웹사이트 인터랙션 클론!
main.js 를 적용한 후에 show-scene-1에서 2로 넘아기질 않습니다..ㅠㅠ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="preconnect" href="https://fonts.gstatic.com"> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;900&display=swap" rel="stylesheet"> <link rel="stylesheet" href="default.css"> <link rel="stylesheet" href="01.css"> </head> <body> <div class="container"> <nav class="global-nav"> <div class="global-nav-links"> <a href="#" class="global-nav-item">Rooms</a> <a href="#" class="global-nav-item">Ideas</a> <a href="#" class="global-nav-item">Stores</a> <a href="#" class="global-nav-item">Contact</a> </div> </nav> <nav class="local-nav"> <div class="local-nav-links"> <a href="#" class="product-name">AirMug Pro</a> <a href="#" class="local-nav-item">개요</a> <a href="#" class="local-nav-item">제품사양</a> <a href="#" class="local-nav-item">구입하기</a> </div> </nav> <section class="scroll-section" id="scroll-section-0"> <h1>AirMug Pro</h1> <div class="sticky-elem main-message a"> <p>온전히 빠져들게 하는<br>최고급 세라믹</p> </div> <div class="sticky-elem main-message b"> <p>주변 맛을 느끼게 해주는<br>주변 맛 허용 모드</p> </div> <div class="sticky-elem main-message c"> <p>온종일 편안한<br>맞춤형 손잡이</p> </div> <div class="sticky-elem main-message d"> <p>새롭게 입가를<br>찾아온 매혹</p> </div> </section> <section class="scroll-section" id="scroll-section-1"> <p class="description"> <strong >보통 스크롤 영역</strong> Lorem ipsum dolor sit amet consectetur adipisicing elit. Blanditiis optio quasi maxime quam dolore sequi, beatae non qui dolorum magni aspernatur. Temporibus id debitis accusantium non porro. Veritatis, magnam saepe. Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nobis, debitis vero aliquam facilis soluta, facere, quis magnam ex deleniti dicta reprehenderit ad necessitatibus veritatis quas repellendus nemo tempore molestiae dignissimos. </p> </section> <section class="scroll-section" id="scroll-section-2"> <div class="sticky-elem main-message a"> <p> <small>편안한 촉감</small> 입과 하나되다 </p> </div> <div class="sticky-elem desc-message b"> <p> 편안한 목넘김을 완성하는 디테일한 여러 구성 요소들, 우리는 이를 하나하나 새롭게 살피고 재구성하는 과정을 거쳐 새로운 수준의 머그, AirMug Pro를 만들었습니다. 입에 뭔가 댔다는 감각은 어느새 사라지고 오롯이 당신과 음료만 남게 되죠. </p> <div class="pin"></div> </div> <div class="sticky-elem desc-message c"> <p> 디자인 앤 퀄리티 오브 스웨덴,<br>메이드 인 차이나 </p> <div class="pin"></div> </div> </section> <section class="scroll-section" id="scroll-section-3"> <p class="mid-message"> <strong>Retina 머그</strong><br> 아이디어를 광활하게 펼칠<br> 아름답고 부드러운 음료 공간. </p> <p class="canvas-caption"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Assumenda natus totam molestias sequi possimus ducimus nisi id. Odit, mollitia consequuntur voluptatum eius doloremque, aperiam, porro tenetur officiis ex illum nisi! Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolorum ducimus nemo harum iusto consequatur, ipsam necessitatibus nulla, tempora nobis, nam sunt nostrum accusantium atque. Itaque quas veniam eum molestiae nesciunt! </p> </section> <footer class="footer"> 2020, 최태호 </footer> </div> <script src="js/01.js"></script> </body> </html> (()=> { let yOffset = 0; //window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; //현재 스크롤 위치(yoffset)보다 이전에 위치한 스크롤 섹션들의 스크롤 높이값의 합 let currentScene = 0; //현재 활성된(눈앞에 보고 있는)씬(scroll-section) let enterNewScene = false; //새로운 씬이 시작된 순간 트루로 바뀔 예정 const sceneInfo = [ { //0 type: 'sticky', heightNum: 5, //브라우저 높이의 5배로 scrollHeight를 세팅(디바이스의 높이의 5배를 하기 위해 설정) scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-0"), messageA: document.querySelector('#scroll-section-0 .main-message.a'), messageB: document.querySelector('#scroll-section-0 .main-message.b'), messageC: document.querySelector('#scroll-section-0 .main-message.c'), messageD: document.querySelector('#scroll-section-0 .main-message.d'), }, values: { messageA_opacity_in: [0, 1, { start: 0.1, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.3, end: 0.4 }], messageC_opacity_in: [0, 1, { start: 0.5, end: 0.6 }], messageD_opacity_in: [0, 1, { start: 0.7, end: 0.8 }], messageA_translateY_in: [20, 0, { start: 0.1, end: 0.2 }], messageB_translateY_in: [20, 0, { start: 0.3, end: 0.4 }], messageC_translateY_in: [20, 0, { start: 0.5, end: 0.6 }], messageD_translateY_in: [20, 0, { start: 0.7, end: 0.8 }], messageA_opacity_out: [1, 0, { start: 0.25, end: 0.3 }], messageB_opacity_out: [1, 0, { start: 0.45, end: 0.5 }], messageC_opacity_out: [1, 0, { start: 0.65, end: 0.7 }], messageD_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], messageA_translateY_out: [0, -20, { start: 0.25, end: 0.3 }], messageB_translateY_out: [0, -20, { start: 0.45, end: 0.5 }], messageC_translateY_out: [0, -20, { start: 0.65, end: 0.7 }], messageD_translateY_out: [0, -20, { start: 0.85, end: 0.9 }] } }, { //1 type: 'normal', heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-1"), content: document.querySelector('#scroll-section-1 .description') } }, { //2 type: 'sticky', heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-2'), messageA: document.querySelector('#scroll-section-2 .a'), messageB: document.querySelector('#scroll-section-2 .b'), messageC: document.querySelector('#scroll-section-2 .c'), pinB: document.querySelector('#scroll-section-2 .b .pin'), pinC: document.querySelector('#scroll-section-2 .c .pin') }, values: { messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }], messageB_translateY_in: [30, 0, { start: 0.6, end: 0.65 }], messageC_translateY_in: [30, 0, { start: 0.87, end: 0.92 }], messageA_opacity_in: [0, 1, { start: 0.25, end: 0.3 }], messageB_opacity_in: [0, 1, { start: 0.6, end: 0.65 }], messageC_opacity_in: [0, 1, { start: 0.87, end: 0.92 }], messageA_translateY_out: [0, -20, { start: 0.4, end: 0.45 }], messageB_translateY_out: [0, -20, { start: 0.68, end: 0.73 }], messageC_translateY_out: [0, -20, { start: 0.95, end: 1 }], messageA_opacity_out: [1, 0, { start: 0.4, end: 0.45 }], messageB_opacity_out: [1, 0, { start: 0.68, end: 0.73 }], messageC_opacity_out: [1, 0, { start: 0.95, end: 1 }], pinB_scaleY: [0.5, 1, { start: 0.6, end: 0.65 }], pinC_scaleY: [0.5, 1, { start: 0.87, end: 0.92 }] } }, { //3 type: 'sticky', heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-3") } } ]; function setLayout() { // 각 스크롤 섹션의 높이 세팅 for (let i=0; i< sceneInfo.length; i++){ if (sceneInfo[i].type === "sticky") { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === "normal") { sceneInfo[i].scrollHeight = sceneInfo[i].objs.container.yOffsetHeight + window.innerHeight * 0.5; } sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`; } yOffset = window.pageYOffset; let totalScrollHeight = 0; for (let i = 0; i < sceneInfo.length; i++) { totalScrollHeight += sceneInfo[i].scrollHeight; if (totalScrollHeight >= yOffset) { currentScene = i; break; } } document.body.setAttribute('id', `show-scene-${currentScene}`); } function calcValues (values, currentYOffset) { let rv; // 현재 씬(스크롤섹션)에서 스크롤된 범위를 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / sceneInfo[currentScene].scrollHeight; if (values.length === 3) { // start ~ end 사이에 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if (currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd) { rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0]; } else if (currentYOffset < partScrollStart){ rv = values[0]; } else if (currentYOffset > partScrollEnd) { rv = values[1]; } } else { rv = scrollRatio * (values[1] - values[0]) + values[0]; } console.log(rv) return rv; } function playAnimation() { const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset- prevScrollHeight; const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; switch (currentScene) { case 0: if (scrollRatio <= 0.22) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objs.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break; case 1: // let messageA_opacity_in = calcValues(values.messageA_opacity, currentYOffset); // objs.messageA.style.opacity = messageA_opacity_in; break; case 2: // console.log("2 play"); if (scrollRatio <= 0.32) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.67) { // in objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.93) { // in objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break; case 3: // console.log("3 play"); break; } } function scrollLoop() { //전체 스크롤(타임라인 합)의 누적을 막기 위해 0으로 설정 enterNewScene = false; prevScrollHeight = 0; for(let i=0; i <currentScene; i++){ prevScrollHeight = prevScrollHeight + sceneInfo[i].scrollHeight; } if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight) { enterNewScene = true; currentScene++; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (yOffset < prevScrollHeight) { enterNewScene = true; if (currentScene === 0) return; //브라우저 바운스 효과로 인해 마이너스가 되는 것을 방지(모바일) currentScene--; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (enterNewScene) return; playAnimation(); } window.addEventListener("scroll", () =>{ yOffset= window.pageYOffset; scrollLoop(); }); window.addEventListener('load', setLayout); window.addEventListener('resize', setLayout); })();
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
경고 문구 질문드려요
안녕하세요 보스턴 주택가격 예측 실습을 하던 중에 자꾸만 경고문이 떠서 질문드렸습니다. 실습대로 LinearRegression, Ridge, Lasso의 RMSE 값 리스트와 평균 RMSE를 구했을 뿐인데 자꾸 저런 경고문이 뜨네요. 저게 뭘 의미하는 것인지, 그리고 어떻게하면 해결할 수 있을까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
model에서 Comment.Find를 할때 궁금한것이 있습니다.
Comment.find({'_id':comment._id}) .populate('writer') .exec((err,result)=>{ if(err) return res.json({seccess:false,err}) res.status(200).json({success:true,result}); }) 파라미터로 _id를 보냈는데, 이는 writer의 User에 대한 _id 인지 궁금합니다. Comment 모델 자체의 필드값은 _id를 받을수 있는게 없어 보여서, 저 뜻이 writer에 대한 _id 정보를 가져온다는 뜻으로 봐야할까요?
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
" n ", ' n ' 차이점이 뭔가요
큰 따음표와 작은 따음표 차이점이 뭔가요?
-
미해결따라하면서 배우는 고박사의 유니티 기초
설치에러
유니티 허브에서 유니티 설치하는데 용량 큰 외장하드로 경로를 설정했음에도 불구하고 계속용량이 부족하다고 하오네요... 이유가 무엇인지 알고 싶습니다...
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
useSelector로 가져온 state 값을 변경하고 싶습니다.
현재 이메일 중복 체크를 구현 하고 있습니다. const onChangeEmailInput = useCallback((evt) => { setEmailInput(evt.target.value); const regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/; if (!regExp.test(evt.target.value)) { setEmailVerify('이메일 형식에 맞게 입력을 해주세요.'); } else { dispatch({ type: CHECK_OVERLAP_EMAIL_REQUEST, data: evt.target.value, }); } }, [emailInput, emailVerify]); input이 변경될 때 이메일 정규식에 통과되면 중복된 이메일을 찾는 액션이 실행되고 router에서 router.get('/check_overlap_email', (req, res, next) => { try { const query = `SELECT email FROM TB_USER WHERE email = '${req.query.data}'`; connection.query(query, (err, result) => { if (err) throw err; if (result[0]) { res.status(200).send('exists'); } else { res.status(200).send('available'); } }); } catch (err) { console.error(err); next(err); } }); 이런식으로 값이 있으면 exists, 없으면 available로 값을 받습니다. 받은 값으로 useEffect(() => { console.log(checkOverLapEmailResult); if (checkOverLapEmailResult !== null) { if (checkOverLapEmailResult === 'exists') { setEmailVerify('이미 가입된 이메일입니다.'); } else { setEmailVerify(true); } } }, [checkOverLapEmailResult]); useEffect를 통해 체크를 해주는데 문제는 아래 flow일 때 문제가 됩니다. 1. 정규식 통과를 한 뒤 중복체크를 했는데 이메일이 없어서 available값을 받음. 2. 그 다음 이메일을 다 지워서 정규식을 통과하지 못해 '이메일 형식에 맞게 입력을 해주세요'가 출력. 3. 다시 정상적인 이메일을 입력후에 available값을 받음. 이 flow 대로 진행했을 때 checkOverLapEmailResult state가 available로 동일하여 useEffect에 들어오지 못하여 setEmailVerify(true); 코드가 실행이 되지 않아 emailVerify가 변경되지 않습니다. 그래서 정규식에 통과를 하지 못할 때 useSelector로 가져온 checkOverLapEmailResult state 값을 null로 초기화를하고 싶은데 어떤 방법이 효율적인지 궁금합니다. 제가 생각한거는 RESET_OVERLAP_EMAIL_STATE라는 액션을 하나 만들어서 정규식에 통과하지 못할 때 마다 호출하여 값을 초기화 하는 방법을 생각하고 있는데, 괜찮은지 궁금합니다.
-
미해결업무 자동화를 위한 파이썬 pyautogui, beautifulsoup 크롤링 기초
크롤링 할때 sh_blog_title 형식으로 안나오는데요! ㅠ
f12를 누르고 블로그 창을 봐도 'api_text_lines'으로 나오는데 아무리 찾아도 sh_blog_title 형식으로 안나오네요! ㅠ