묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
스크롤링이 안됩니다 ㅠㅠ
안녕하세요! 양질의 강의 정말 감사합니다. 완강을 앞두고 빨리 실전반 강의를 듣고 싶은데 스크롤링이 안되어 진행이 안되고 있어요. 쇼핑 - 아이폰 13까진 검색 하는데 그 다음부턴 멈춰있습니다ㅠ 코드도 똑같이 작성했는데, 뭐가 문제인지 답변 주시면 감사하겠습니다 :))) from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 브라우저 생성 browser = webdriver.Chrome('C:/chromedriver.exe') # 웹사이트 열기 browser.get('https://www.naver.com') browser.implicitly_wait(10) # 로딩이 끝날 때까지 10초까지는 기다려라 # 쇼핑 메뉴 클릭 browser.find_element_by_css_selector('a.nav.shop').click() time.sleep(2) # 검색창 클릭 search = browser.find_element_by_css_selector('input.co_srh_input._input') search.click() # 검색어 입력 search.send_keys('아이폰 13') search.send_keys(Keys.ENTER) # 스크롤 전 높이 before_h = browser.execute_script("reuturn window.scrollY") # 무한 스크롤 while True: # 맨 아래로 스크롤을 내린다. browser.find_element_by_css_selector("body").send_keys(Keys.END) # 스크롤 사이 페이지 로딩시간 time.sleep(1) # 스크롤 후 높이 after_h = browser.execute_script("reuturn window.scrollY") if after_h == before_h: break before_h = after_h # 상품 정보 div items = browser.find_element_by_css_selector(".basicList_info_area__17Xyo") for item in items: name = item.find_element_by_css_selector(".basicList_title__3P9Q7").text price = item.find_element_by_css_selector(".price_num__2WUXn").text link = item.find_element_by_css_selector(".basicList_title__3P9Q7 > a").get_attribute('href') print(name, price, link)
-
해결됨스프링 핵심 원리 - 고급편
스프링 AOP에서 @Aspect 설정과 advisor 객체들의 관계가 궁금합니다.
스프링 AOP에서 @Aspect 설정과 advisor 객체들의 관계가 궁금합니다. 예를 들면 @Aspectpublic class AspectClass { @PointCut("...");private void pointCut1(){} @PointCut("...");private void pointCut2(){} @Before("pointCut1() && pointCut2()")public void doBefore(JoinPoint joinPoint){}@After("pointCut1()")public void doAfter1(JoinPoint joinPoint){}@After("pointCut1()")public void doAfter2(JoinPoint joinPoint){}} 이런 설정이 있다면 빈 후처리기 안에 있는 advisor 객체들은 총 3개가 되는 건가요? 1pointCut1() && pointCut2() 설정으로 생성된 포인트 컷 객체 1개 + doBefore() 설정으로 만들어진 advice 객체 1개= advisor 객체 1개 2pointCut1() 설정으로 만들어진 포인트 컷 객체 1개 + doAfter1() 설정으로 만들어진 advice 객체 1개 = advisor 객체 1개 3ponitCut1() 설정으로 만들어진 포인트 컷 객체 1개 + doAfter2() 설정으로 만들어진 advice 객체 1개 = advisor 객체 1개총 3 개이렇게 결국 advice 설정 함수만큼 advisor가 생성 되는 것인지 궁금합니다. <추가질문>@PointCut 설정으로 서브 포인트 컷 객체들이 만들어져서, 그것들이 조합되는 형식으로 스프링의 pointcut객체들이 만들어지나요? 위의 예로 치면 서브 포인트 컷 객체들이 2개(pointCut1(), pointCut2())이고, 서브 포인트 컷 객체들로 조합해서 만들어진 스프링 포인트 컷 객체가 2개(pointCut1() 서브 포인트 컷으로 만들어진 포인트 컷 객체, pointCut1() 서브 포인트 컷과 pointCut2() 서브 포인트 컷으로 만들어진 포인트 컷 객체)가 되는 것인가요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
로그가 안떠요
분명 똑같이 한 것 같은데 안뜨네요.. 뭐가 문제일까요? package com.parkjiae.val_logimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Logclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val test = "여기는 테스트 값입니다." Log.e("MainActivity",test) //오류 Log.w("MainActivity",test) //경고 Log.i("MainActivity",test) //정보 Log.d("MainActivity",test) //디버그 Log.v("MainActivity",test) //상세 }}
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링부트 질뭄
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]해당 강의는 스프링 부트 강의던데 커리큘럼이 있는 스프링 mvc나 다른 스프링 강의들은 테그를 보니 스프링만 써 있던데 부트는 이 강의에서만 쓰고 스프링으로 하나요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
안전(Safe), 멱등(Idempotent) 관련하여 질문드립니다.
안녕하세요. safe와 멱등 개념을 확실히 이해하고 싶어서 질문드립니다. ---------------------------------------------------- - safe : 리소스를 변경하지 않는, 즉 읽기전용 메서드(GET, HEAD)를 말한다. - 멱등 : 특정 메서드를 여러번 호출하여도 결과가 같다. ---------------------------------------------------- - GET, HEAD : Safe하면서, 멱등하다.- POST : 리소스의 위치를 지정하지 않았을 때 리소스를 생성하는 등 데이터를 변경하고 새로 생성된 결과를 보내줄 수 있으므로 safe하지도 않고, 멱등하지도 않다.- PUT : 리소스의 위치를 클라이언트가 알고 있고, 같은 리소스를 생성하거나 수정하므로 동일한 데이터로 요청하면 결과가 같다.그러므로 safe하지 않지만, 멱등하다.- DELETE : 클라이언트가 지정한 리소스를 삭제, 즉 수정이 일어나지만 삭제라는 동일한 결과를 제공하므로 safe하지 않지만, 멱등하다.혹시 잘 못 이해한 부분이 있으면 답변 부탁드립니다.감사합니다 :)
-
미해결스프링 핵심 원리 - 기본편
policies 사용처에 대한 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요, 영한님. 항상 질 좋은 강의 감사합니다 :) 즐겁게 수업 듣고 있습니다.수업중 놓친 게 있는 건지 ㅠㅠ 듣다가 의문점이 생겨 글을 남깁니다! ...static class DiscountService { // Key = 빈 이름, Value = 빈 객체 private final Map<String,DiscountPolicy> policyMap; // value값들만 존재? private final List<DiscountPolicy> policies;... 위 코드 DiscountService 에서 선언한 Map과 List 변수에 대한 질문입니다.Map에서 value값들만 모아 빼둔 것이 policies라고 이해했는데요, 이 value들을 따로 List타입으로 뽑아 모아둔 이유가 무엇인지 잘 모르겠습니다. 혹시 policyMap만 정의한 후 그 value값을 가져다 쓰면 안 되는 건가요?중간에 출력문을 제외하면 로직에선 policies를 사용하지 않는 듯한데, 따로 Map의 value만 모아서 list를 뽑아 저장한 이유가 무엇인지 궁급합니다!
-
미해결실전! 스프링 데이터 JPA
JPA Dirty Checking - open session in view
안녕하세요 JPA Dirty Checking 관련 질문 드립니다. 우선 환경은 Spring Boot 입니다. public void test() { OrderInfo orderInfo = new OrderInfo(); orderInfo.setStatus("test"); oRepo.save(orderInfo); OrderInfo findOrderInfo = oRepo.findById(orderInfo.getId()).get(); findOrderInfo.setStatus("zzzzzzz"); } 위와 같은 코드가 있다고 할 때 Open session In view 설정과 @Transactional 에 따라서 dirty checking 되는 로직에 대해서 질문드립니다. 1. Open Session in View : true @Transactional : 사용 안함 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) Hibernate: select orderinfo0_.id as id1_0_0_, orderinfo0_.status as status2_0_0_ from order_info orderinfo0_ where orderinfo0_.id=? 2. Open Session in View : false @Transactional : 사용 안함 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) 3. Open Session in View : true @Transactional : 사용 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) Hibernate: update order_info set status=? where id=? 4. Open Session in View : false @Transactional : 사용 Hibernate: call next value for hibernate_sequence Hibernate: insert into order_info (status, id) values (?, ?) Hibernate: update order_info set status=? where id=? 1 번의 경우 영속성 컨텍스트가 각각의 트랜잭션에서 끝나서 select 문이 나가는 것으로 보입니다. 2번의 경우 OSIV로 인해 영속성 컨텍스트가 끝까지 남아서 select문이 안나가는 것으로 보입니다. 3번의 경우도 OSIV와 Transaction으로 인해 영속성 컨텍스트안에 있는 객체를 가져오기에 select 문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다. 4번의 경우 트랜잭션 범위내에 있는 영속성 컨텍스트에서 찾아오기에 select문이 안나가는 것으로 보입니다. 그 후 dirty checking 으로 인해 update 문이 발생합니다. dirty checking 의 경우 영속성 컨텍스트가 관리하고 있는 엔티티에 대해서 스냅샷을 저장 후 변경이 되면 나가는 것으로 알고 있습니다. 그럼 이 때 2번의 경우 영속성 컨텍스트가 남아서 select문이 안나간다고 생각을 하는데 왜 dirty checking 이 안되는 이유가 있을까요??
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
gridview 사용할 때 사이 간격들을 조정하는 방법이 있을까요?
제가 만드는 도중 gridlayoutmanager를 이용해서 spancount를 2를 주고 만드니 아이템과 아이템 사이의 간격 조절이 안되어서 질문 드립니다. margin으로 조절이 잘 안되어 혹시 이런 경우 간격 조절하는 방법이 따로 있을까요? 감사합니다.
-
미해결[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드
2022년 출제기준 웹디자인 기능사 실기시험 공개문제 완성본 파일
선생님! 완성본 파일이 A1, B4, C2뿐인데 나머지는 어디서 확인할수있을까요???
-
미해결딥러닝 CNN 완벽 가이드 - TFKeras 버전
Tensorflow 2.x로 만든 모델의 중간 출력값들을 Numpy array로 변환하는 방법
안녕하세요! 공부를 하다가 중간에 궁금한 점이 생겨 질문드립니다! Tensorflow 2.x 버전으로 만든 모델을 학습(fit) 시킨 후에 중간 레이어들의 출력값들을 관찰하고 싶은데요! 그래서 tf.Tensor 에서 Numpy array 로 변환시켜서 보려고 했는데, 어려움이 생겨 질문드립니다. 우선 아래 코드를 보시면 하나는 그냥 tf.Constants 로 정의한 텐서이고 나머지 하나는 모델의 중간 레이어 출력값의 텐서입니다. 그런데 두 개 중 tf.Constants 로 정의한 텐서는 numpy() 메소드를 활용해서 넘파이 배열로 변환이 가능한데, 모델의 중간 출력값 텐서는 numpy() 메소드가 존재하지 않더라구요.. 그래서 두 개의 타입을 비교해보니 아래 처럼 서로 다른 클래스 이더라구요.. 아래 그림을 보시면 아시겠지만 tf.Constants로 정의한 텐서는 tensorflow.python.framework.ops.EagerTensor 라는 클래스인 반면, 모델 중간 레이어의 출력값 텐서 클래스는 tensorflow.python.framework.ops.Tensor 입니다. 구글링을 해보니 비슷한 문제를 겪은 질문들이 있었지만 명쾌한 해결책을 찾을 수는 없었습니다.. 혹시 tensorflow.python.framework.ops.Tensor 클래스를 갖는 텐서를 넘파이로 변환하는 방법을 아시는지 문의드립니다!
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
modles/product.js에서 대문자 잘못 입력했을 경우
price를 Price key로 프로젝트 생성된 상태에서 뒤늦게 오타 확인하고 바꿨으나 포스트맨이나 sqlite에서는 Price로 표시되어 데이터를 불러오지 못하고 있습니다. (Price는 잘 불러옴) 이런 경우 어떻게 해결해야 될까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
방문체크 하지 않아도 되나요?
부분집합을 하는 문제라고 판단하여, 부분집합구하기 문제처럼 ch(체크) 리스트 만들어서 풀었는데 답이 안나오네요.. 무엇이 문제일까요? 강의를 보니 체크 리스트 사용하지 않으셨던데... 사용해야하는 것 아닌가요? 추가적인 질문으로, 부분집합과 조합 방식의 차이가 무엇인지 아직까지 잘 이해가 되지 않는데.. 부분집합은 가지치기가 본인 포함 전부 다 되고, 조합은 가지치기가 본인을 제외한 하위 부분만 되는게 맞나요? 부분집합을 조합처럼 구할 수 있고, 조합을 부분집합처럼 구할 수 있나요? def DFS(L, time, sum): global res if time > m: return if L == n: if sum > res: res = sum else: for i in range(n): if visited[i] == 0: visited[i] = 1 DFS(i, time+graph[i][1], sum+graph[i][0]) visited[i] = 0 DFS(i, time, sum) if __name__ == '__main__': n, m = map(int, input().split()) graph = [] for _ in range(n): a, b = map(int, input().split()) graph.append([a, b]) visited = [0]*n res = 0 # 최대 점수 DFS(0, 0, 0) print(res)
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
Config 파라미터 설정 질문있습니다.
항상 좋은 강의 감사드립니다. 해당 강의에서 진행한 Config 파라미터 설정에 관해서 궁금한 점이 있어서 질문드립니다. Train_CFG Class 내의 hparams에 들어있는 'num_classes=20,moving_average_decay=0,mixed_precision=true' 해당 파라미터들을 hparams에 넣어주지 않고, 아래 예시와 같이 개별 파라미터로 설정한 뒤 params=dict에 넣어주고 override 시켜줘도 되는 것인가요?? ex. class TRAIN_CFG: num_classes = 20 moving_average_decay = 0 mixed_precision = true params = dict( num_classes=TRAIN_CFG.num_classes, moving_average_decay = TRAIN_CFG.moving_average_decay, mixed_precision=TRAIN_CFG.mixed_precision, ...) config.override(params, True) 만약 해당 방법도 가능하다면, hparams에 따로 개별 파라미터들을 넣어주어 Config를 설정해주는 이유가 무엇인지도 궁금합니다.
-
미해결Python 모듈을 활용한 공간 분석
visual studio code 에서도 실습이 가능한가요?
visual studio code 에서도 실습이 가능한가요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
강의 수강 질문
Google Dialogflow와 파이썬/장고를 활용하여, 카카오톡 챗봇 만들기 (초급편) (완료) ask company 에 들어가보니 챗봇 강의가 있어 수강을 하고 싶은데 구독을 못하게 되어 있어서요 혹시 해당 강의를 수강할 수 있는 방법이 있을까요?
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
프론트엔드의 로그인 페이지를 axios를 사용하여 구현한다면 응답 / 리다이렉션을 어떻게 처리해주는 것이 좋을까요?
이번 예제와 같이 로그인 페이지에서 HTML Form을 제출하도록 구현해보고 (잘 작동하였습니다), 앞의 예제와 같이 `axios.post`를 사용하여 POST 요청을 보내도록 구현도 해 보았는데, 후자의 경우 페이지가 리다이렉트 되지 않아서 원인을 알아보았습니다. (아래에 있습니다.) 혹시 현업에서는 이런 부분을 어떤 식으로 구현하나요? 구체적으로 1. 클라이언트에서 로그인 기능을 AJAX로도 구현하는지 궁금합니다. 2. 만일 AJAX로도 구현한다면 서버의 응답을 어떻게 처리하는지 궁금합니다. 서버의 응답 코드를 302로 하고 클라이언트의 axios에서는 302를 확인하려 했으나, 응답 코드 302가 확인이 안 되고, 리다이렉트된 주소의 응답이 결과값으로 반환됩니다. 그래서 응답에 문제가 없으면 `window.location`을 조정하여 브라우저를 리다이렉트하는 식으로 해결하였으나, 결과적으로 주소를 2번 요청하는 것도 조금 걸립니다. ===== 아래는 원인을 알아본 내용입니다. 타인에게 참고가 될까 싶어 첨부하였습니다. 서버에서 상태 코드가 302인 HTTP 응답을 보냈을 때, 클라이언트가 폼을 제출한 브라우저일 때는 브라우저가 응답을 받고 웹 페이지를 리다이렉션을 해주는 반면, 클라이언트가 Axios로부터 POST 요청을 보낸 경우였다면 리다이렉션 되는 것은 웹 페이지가 아닌 AJAX 요청입니다. 따라서 웹 페이지는 `/login`에 머물러 있고, AJAX 요청은 `/`로 리다이렉트되어서 응답 코드 200의 응답을 받고 이것이 `axios.post`의 결과로 반환됩니다. 참고한 자료: https://github.com/axios/axios/issues/396#issuecomment-395592900 (axios 문서 같은 곳에서는 관련 내용을 찾을 수 없어서 출처가 조금 빈약합니다. 혹시 틀린 내용이 있을 경우 지적해주시면 수정하겠습니다.)
-
미해결워드프레스 속성 마스터 클래스
UDraft Plus. 돈 안낸 버전으로 그냥 migration 진행하니까 critical error 뜨는데 정상인가요?
진행 명령 자체가 안 먹히는 건 아닌데, a 사이트의 자료들과 db를 udraft plus로 백업하여 다운받은 뒤 b 사이트에 설치된 워드프레스 플러그인으로 등록된 udraft plus에서 file upload 후 restore 하니까 작업 진행이 안되는 건 아니고 되긴 돼요. 근데 이후 critical error가 나오네요. 이렇게 되는 것이 정상인가요? 이걸 막으려면 70달러 주고 꼭 프리미엄 버전을 사야 되나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberRepository 에서 cannot find symbol 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요!! 동영상 강의 잘 보고 있습니다. 강의 내용 대로 따라서 하고 있는데 MemberRepository 를 작성하고 나면 cannot find symbol 오류가 발생합니다. 자동으로 import 되는게 강의와 다르게 import java.lang.reflect.Member; 로 되고 있습니다. 동영상 강의에는 import hello.hellospring.domain.Memeber; 되어 있는데 여기에서 오류가 발생하고 있습니다. 어느 부분이 잘못 됐을까요.. package hello.hellospring.repository;import java.lang.reflect.Member;import java.util.List;import java.util.Optional;public interface MemberRepository { Member save(Member member); Optional<Member> findById(Long id); Optional<Member> findByName(String name); List<Member> findAll();}
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
4장 hello world 출력 마지막 과정
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 마지막에 Run As 에서 Launch on Hardware할때 평균적으로 얼마나 소요되나요? 맛비님 영상속에는 바로 끝나는것 같은데 Run하는데 한번은 time out error 나고 한번은 17분 소요된 후 정상 실행되었는데 .. 이게 맞는건가요 ?? ( 노트북 성능에는 문제 없을거 같은데(i7) 툴 자체가 느린건지 궁금합니다.)
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
쿼리문 질문드립니다.
아래와 같은쿼리문이 있을 때 select User.id,User.nick , followes->follow. ~~ from users as User left join ( follow as followes->follow inner join users as followes on followes.id = followes->follow .followerid ) on User.id = followes->follow .followerid where User.id = 3 여기서 쿼리문 실행순서가 1. from 2. on 3. join 4.where 이순으로 알고있는데 여기서 from users as User 전체 User데이터 뽑고나서 어떤 순서로 실행이 되는지 궁금합니다. 제생각으로는 left join 이 실행이 되는데 그안 괄호먼저 실행이 되어서 follow as followes->follow inner join users as followes on followes.id = followes->follow .followerid follow 테이블과 users 테이블의 id가 같은것을 뽑아서 left join 주체가 되는 user 테이블의 id와 같은것을 찾고 그후에 where user.id = 3 이 실행될꺼같은데 저 중간에 있는 on이 join문끝에있는 on이 아니라 다른것인가요?? 궁금합니다.