묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
선생님 질문입니다!
1:01의 그림을 보면서 질문드리고 있습니다!원래 CNN을 거치면 FC layer에 가기전에 여러개의 피처맵을 Flatten 해서 맞춰주는데 지금 그림에서 Conv Network를 통과한 feature 이미지는 하나만 있다고 표현되는데 왜 그런건가요? 제 생각대로라면 Flatten이 되기전에는 여러 피처맵이 있는걸로 알고 있습니다.그리고 이미 vggnet 을 통해서 나온 피처맵을 3*3 conv를 하는 이유를 모르겠습니다. conv를 적용하지 않고 그냥 1*1 conv를 하는 것이 나을거라 생각하는데 이해가 잘 되지 않습니다.
-
해결됨Three.js 3D 인터랙티브 바로 시작하기
이미지 클릭 시 페이지 이동
강의대로 const dataArr = [ { "image": "https://i.postimg.cc/ZqSD48GC/image.jpg", "link": "https://gokweol13.yikyung.repl.co", },코드를 사용하여 페이지에 삽입한 이미지를 클릭하면 새 창으로 페이지가 새로 만들어지는데, 혹시 한 웹사이트 내에서 페이지 간 이동 할 수 있도록 하려면 어떡해야하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ModelAttribute("item")
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요!pdf 5.검증 2에서@ModelAttribute("item") 에 item 이름을 넣어준 부분을 주의하자. 이것을 넣지 않으면ItemSaveForm 의 경우 규칙에 의해 itemSaveForm 이라는 이름으로 MVC Model에 담기게 된다. 이렇게 되면 뷰 템플릿에서 접근하는 th:object 이름도 함께 변경해주어야 한다. 라는 말을 이해했는데그럼 만약에 itemSaveForm이라는 이름을 사용하려면 @GetMapping("/add")의 attributename도 바꿔야하나요??만약에 안바꿔도 된다면 왜인거죠...?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
_app.tsx import 에러
안녕하세요 강사님, 강의 잘 듣고 있습니다.혹시 다음과 같은 에러가 발생하는데 뭘 잘못한지 모르겠어서 문의 남깁니다.아래 사진 파일들은 순서대로_app.tsx.eslintrc.js.eslintrc.jsonpackage.json입니다.감사합니다!
-
해결됨[백문이불여일타] 데이터 분석을 위한 중급 SQL
SUM(CASE ~) 단순화
꼭 각 월별로 쿼리를 짜야할까요?파이썬처럼 range 함수와 같이 순서대로 나열시키는 방법은 없을까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
이미지 불러오기 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]지금 현재 강의에서 file.dir에서 경로를 업로드하면 경로로 적어준 로컬에 생기면서 서버 메모리에 저장되는 걸로 알 고 있습니다.강의에서 Map으로 했던 것을 DB에 넣게 해서H2 데이터베이스에 이런식으로 들어가게 해서 서버를 껐다가 켜도 DB를 보고 잘 찾아와지는 것을 볼 수 있었습니다. 근데 로컬 경로에 있는 이미지를 지우면 이미지가 안보이더군요. 근데 프로젝트에서 적용하려고 하니 두 가지의 문제점이 있었습니다. file.dir을 똑같이 맞춰줘야하는 단점이 있어서활성화 프로퍼티에 경로를 쓰고 file.dir=${file-dir} 이런식으로 하려고 하니18:17:20.605 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@585fb60918:17:20.790 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failedjava.lang.IllegalStateException: Location 'file:./config/*/application-file-dir=c:/upload/file/.yaml' must end with '*/'at org.springframework.util.Assert.state(Assert.java:97)at org.springframework.boot.context.config.LocationResourceLoader.validatePattern(LocationResourceLoader.java:134)at org.springframework.boot.context.config.LocationResourceLoader.getResources(LocationResourceLoader.java:95)at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolvePattern(StandardConfigDataLocationResolver.java:312)at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:298)at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolve(StandardConfigDataLocationResolver.java:249)at org.springframework.boot.context.config.StandardConfigDataLocationResolver.resolveProfileSpecific(StandardConfigDataLocationResolver.java:148)at org.springframework.boot.context.config.ConfigDataLocationResolvers.lambda$resolve$2(ConfigDataLocationResolvers.java:120)at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:126)at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:119)at org.springframework.boot.context.config.ConfigDataLocationResolvers.resolve(ConfigDataLocationResolvers.java:107)at org.springframework.boot.context.config.ConfigDataImporter.resolve(ConfigDataImporter.java:106)at org.springframework.boot.context.config.ConfigDataImporter.resolve(ConfigDataImporter.java:98)at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:86)at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)at org.springframework.boot.context.config.ConfigDataEnvironment.processWithProfiles(ConfigDataEnvironment.java:311)at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:232)at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:343)at org.springframework.boot.SpringApplication.run(SpringApplication.java:301)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)at com.example.fileupload2.Fileupload2Application.main(Fileupload2Application.java:10)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)이런 오류가 발생했습니다.두 번째 문제는 로컬에 파일이 없으면 이미지를 보여줄 수 없는데 저는 이미지를 db직접 넣어서 사용하는 것과 로컬에 이미지를 넣는것이 아니라 강의에서 나온 사용자가 올린 파일명, 실제 서버에서 관리되는 파일명을 서버에 넣어준 것을 db에 경로만 넣어서 가져오길 원하는데 근데 로컬에서 가져오는 것은 성공했는데 서버에서 db를 통해 가져오는 방법을 모르겠습니다.ps) 설명을 들어보면 서버에 실제 서버에서 관리되는 파일명, 사용자가 올린 파일명 이렇게 넣어주는 거라고 이해했는데 로컬에 있는 경로로 이미지를 보여주고 업로드하면 이미지를 로컬에 넣어주니 이게 서버에 업로드하는 것이 맞나 헷갈리고 강의 코드에 db에 넣는거 추가만 했는데 강의방법이 경로를 db에 넣어서 사용하는게 아니라 이미지를 넣어준거 같아서 제가 알기론 db에 직접 넣지말고 경로로 가져와서 쓰는게 좋다는 걸로 알고 있거든요. 프로젝트로 협업할 때는 그냥 s3로 구현하는게 차라리 편하나요?
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
AttributeError: 'car' object has no attribute 'get_price'
# 가격정보(인상 전) print(car1.get_price()) print(car2.get_price()) 위와 같은 에러가 발생하는데, 어디서 에러가 발생하는건지 여쭤봅니다ㅜㅜ 에러 문구 : AttributeError: 'car' object has no attribute 'get_price'
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
print(car1._details.get('price')) 언더바 입력 시 에러 발생
강의에서는 아래 코드와 같이 _를 사용하셨는데, 저는 아래 첫 번째 이미지와 같은 에러가 발생하더라구요 (맥북 사용중)print(car1._details.get('price'))혹시나해서 _를 제거하고 아래와 같이 입력했더니 에러 없이 정상 결과값이 나왔는데 이유가 뭘까요?print(car1.details.get('price'))
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
L2 Access 로 나간다고 말씀하셨는데..
L2 Access 로 나가서 라우트를 탄다고 말씀하셨는데 장비 그림(NIC)을 보면 전에 OSI 레이어에서 L1 이였던 걸로 기억합니다. L1 에서 다른 호스트를 찾아서 나가는 도중에 다시 L2 를 타는 건가요? 이부분이 많이 헷갈리네요..
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
날짜 뒤에 요일 붙이기 질문
import os import datetime as dt from time import sleep import win32com.client as win32 def init_hwp(): hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.RegisterModule("FilePathCheckDLL","FilePathCheckerModule") return hwp hwp = init_hwp() #hwp.Open(r"D:\\SHW\\PROGRAM\\PYTHON\\hwp\\data\\실작업공정표.hwpx") hwp.Open(os.path.join(os.getcwd(), r"D:\\SHW\\PROGRAM\\PYTHON\\hwp\\data\\실작업공정표.hwpx")) def get_value(): hwp.InitScan(Range=0xff) # 추출범위를 "선택영역"으로 지정 text = hwp.GetText()[1] # 선택범위 문자열값 추출 hwp.ReleaseScan() # 검색종료 return text # 추출값 리턴 def get_weekday(text): week_list = ["월", "화", "수", "목", "금", "토", "일"] month, day = [int(i) for i in text.split(".")[:2]] week_num = dt.date(2022, month, day).weekday() week_day = week_list[week_num] return f"({week_day})" def insert_text(text): act = hwp.CreateAction("InsertText") pset = act.CreateSet() pset.SetItem("Text", text) act.Execute(pset) if __name__ == '__main__': hwp.FindCtrl() # 표 선택 hwp.Run("ShapeObjTableSelCell") # 첫 번째 셀로 진입(셀선택상태) while True: # 무한반복 text = get_value() # 셀의 텍스트 추출 if text.endswith("."): # 셀 안의 텍스트가 "."으로 끝나면(날짜셀을 구분하는 임의의 방법) weekday = get_weekday(text) # 요일 파악 hwp.Run("Cancel") # 셀선택 취소 hwp.Run("MoveLineEnd") # 문자열 끝으로 이동 insert_text(weekday) # 요일 삽입 hwp.Run("TableCellBlock") # 다시 셀선택 if not hwp.HAction.Run("TableRightCell"): # 우측으로 이동하다 break # 끝에 도달하면 while문 종료 아무리 해도 문서에서 변경이 안일어나는데 뭐가 문제인지 모르겠습니다.그리고 마지막 if 문에서if __name__ == '__main__':이게 무슨 의미인지 설명 부탁 드립니다.
-
미해결혼자 공부하는 머신러닝+딥러닝
합성곱 신경망 파트에 대해 질문이 있습니다.
안녕하세요 강사님. 먼저 늘 유익한 강의에 감사드립니다.다름이 아니라 합성곱에 대해 공부 중 두 가지 의문이 생겨 질문드립니다.1. 451p 신경망 생성을 그림으로 요약한 표 입니다.이미지가 필터를 거칠 때, 필터는 슬라이딩 하듯이 이미지 위를 이동하는 것으로 이해했습니다. 그런데, 몇 차례 이동을 거쳤을텐데 원본과 같은 크기의 이미지를 반환합니다. 반환된 이미지는 어떤 기준으로 계산되는건지 궁금합니다.2. 473p에서 두번째 문단에, '우리에게 필요한 것은 첫번째 conv2D의 출력입니다. model 객체 입력과 conv2D의 출력을 알 수 있다면 둘을 연결하여 새로운 모델을 얻을 수 있지 않을까요?' 부분의 맥락이 이해가 되질 않습니다. 여기서는 왜 새로운 모델을 만들려고 하는걸까요?
-
미해결그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
job-activeDeadlineSeconds 수행시에는 JOB 오브젝트 자체는 유지되는게 맞을까요?
job-activeDeadlineSeconds=> 해당 시간값 초과하면 30초 이후에 파드만 삭제되며, JOB 오브젝트는 삭제되지 않고 존재함ttlSecondsAfterFinished=> 해당 시간값 초과하면 바로 파드와 JOB 오브젝트 모두 삭제됨
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
javax 패키지 이름을 변경을 하라는 말이 무슨뜻인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 프로젝트에서 javax를 검색하니 javax.websocket 패키지 하나나오는데 이 이름을 변경하라는건가요? 이름변경이 안되는데
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
mongo설치 오류
안녕하세요 지금까지 열심히 듣고 있습니다. 다름이 아니라 몽고 db 설치에서 문제가 생겨 여쭈어 보려고 합니다. brew services start mongodb-community 실행시 아래와 같은 오류가 발생합니다. 해결방법이 있을까요??.... (맥북m1)
-
미해결실전! 스프링 데이터 JPA
엔티티에 setter 메소드를 구현하지 않았을 때, PK 값의 저장 과정에 대해 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 평소에 생각하지 못했던 부분인데, 강의를 들으면서 좀 궁금한 점이 생겨서 질문드립니다.. 만약 엔티티에 setter 메소드를 구현하지 않았다면,@GeneratedValue를 사용해서 데이터가 DB에 저장될 때 PK값이 생성되도록 했다면, 그 생성된 PK값이 영속성 컨텍스트에서 관리되는 엔티티 객체에 어떻게 저장되는 것인지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부호출 1 질문이 있습니다
고급편을 듣고 이 강의를 들었으면 알 수 있을 것 같은 내용이지만, 다른 분들을 위해 또 성격이 급해서 질문을 남깁니다. CallService의 프록시 객체는 CallService를 상속받은 자식 객체로 이해했는데요. 언뜻 생각하기로는 internal을 내부 호출을 하더라도 override된 internal이 호출되기 때문에 트랜잭션이 적용될 것 같다는 생각이 드는데, 간단하게라도 이렇게 동작하지 않는 이유를 알 수 있으면 좋겠습니다. 검색을 해보니 AOP가 런타임에 인터셉트 하는 방식으로 동작하기 때문에 그렇다고 하는데요. 그렇다면 왜 override 하는 방식으로 구현하지 않았는지도 궁금해집니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
ORDERS와 DELIVERY 관계에 대한 질의입니다.
안녕하세요. 강의 수강 도중 제가 이해를 잘하지 못하여 질문 남기게 되었습니다. 16:28~ 부분에서주문과 배송의 경우 일대일 단방향 관계라고 말씀하셨는데, 회원 엔티티 분석 이미지를 보았을 때Order 에서 delivery: Delivery,Delivery 에서 order: Order 이면단방향이 아니라 양방항 관계인 것 같은데 왜 단방향 관계인지 궁금합니다. ㅜ
-
미해결PHP 7+ 프로그래밍: 객체지향
http://localhost:8080/posts/1 접근시 배열 0값 표기 오류
Route::add('get','/posts/{id}', function($id){ echo ($id); var_dump(Adaptor::getAll('select * from posts where `id`= ?', [ $id ] )); });route.php public static function add($method, $path, $handler, $middlewares = []) { self::$contexts[] = new RequestContext($method, $path, $handler, $middlewares); } 위처럼 불러와도배열 표기가 아무것도 안나오는데 어떤부분을 확인해야 강의처럼 내용확인이 가능할까요?{id}array(0) { } 이렇게만 표기 됩니다.$id값을 못 읽는것 같은데 어떻게 해결해야 할지 모르겠네요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
게시글 좋아요 부분 강의에서 하트색이 바로 변하지 않습니다
에러는 없고 데이터에서도 like하고 unlike가 잘되는건 확인했는데 화면에서는 새로고침 해야지만 바뀌네요그리고 좋아요하고 다시 눌러서 취소 할려는데 취소가 안되고 계속 중복으로 좋아요가 됩니다 const express = require("express"); const { Post, Image, Comment, User } = require("../models"); const { isLoggedIn } = require("./middlewares"); const router = express.Router(); router.post("/", isLoggedIn, async (req, res, next) => { try { const post = await Post.create({ content: req.body.content, userId: req.user.id, }); const fullPost = await Post.findOne({ where: { id: post.id }, include: [ { model: Image, }, { model: Comment, include: [ { model: User, // 댓글 작성자 attributes: ["id", "nickname"], }, ], }, { model: User, // 게시글 작성자 attributes: ["id", "nickname"], }, { model: User, // 좋아요 누른 사람 as: "Likers", attributes: ["id"], }, ], }); res.status(201).json(fullPost); } catch (error) { console.error(error); next(error); } }); router.post("/:postId/comment", isLoggedIn, async (req, res, next) => { try { const post = await Post.findOne({ where: { id: req.params.postId }, }); if (!post) { return res.status(403).send("존재하지 않는 게시글입니다"); //return을 붙여줘야지 send하고 밑에 json이 동시에 실행안됨 } const comment = await Comment.create({ content: req.body.content, PostId: req.params.postId, userId: req.user.id, }); const fullComment = await Comment.findOne({ where: { id: comment.id }, include: [ { model: User, attributes: ["id", "nickname"], }, ], }); res.status(201).json(fullComment); } catch (error) { console.error(error); next(error); } }); router.patch("/:postId/like", isLoggedIn, async (req, res, next) => { try { const post = await Post.findOne({ where: { id: req.params.postId }, }); if (!post) { return res.status(403).send("게시글이 존제하지 않습니다"); } await post.addLikers(req.user.id); res.json({ PostId: post.id, userID: req.user.id }); } catch (error) { console.error(error); next(error); } }); router.delete("/:postId/like", isLoggedIn, async (req, res, next) => { try { const post = await Post.findOne({ where: { id: req.params.postId }, }); if (!post) { return res.status(403).send("게시글이 존제하지 않습니다"); } await post.removeLikers(req.user.id); res.json({ PostId: post.id, userID: req.user.id }); } catch (error) { console.error(error); next(error); } }); router.delete("/", (req, res) => { res.json({}); }); module.exports = router; const express = require("express"); const { Post, Image, User, Comment } = require("../models"); const router = express.Router(); router.get("/", async (req, res, next) => { try { const posts = await Post.findAll({ limit: 10, order: [ ["createdAt", "DESC"], [Comment, "createdAt", "DESC"], ], //옵션 = ASC: 오름차순 include: [ { model: User, attributes: ["id", "nickname"], //아이디 ,닉네임만 가져오기 }, { model: Image, }, { model: Comment, include: [ { model: User, attributes: ["id", "nickname"], }, ], }, { model: User, // 좋아요 누른 사람 as: "Likers", attributes: ["id"], }, ], }); res.status(200).json(posts); } catch (error) { console.error(error); next(error); } }); module.exports = router; import { Card, Button, Avatar, Popover, List, Comment } from "antd"; import { RetweetOutlined, HeartOutlined, MessageOutlined, HeartTwoTone, EllipsisOutlined, } from "@ant-design/icons"; import { useDispatch, useSelector } from "react-redux"; import PropTypes from "prop-types"; import PostImages from "./PostImages"; import { useCallback, useEffect, useState } from "react"; import CommentForm from "./CommentForm"; import PostCardContent from "./PostCardContent"; import FollowButton from "./FollowButton"; import { REMOVE_POST_REQUEST, LIKE_POST_REQUEST, UNLIKE_POST_REQUEST, } from "../reducers/post"; const PostCard = ({ post }) => { const dispatch = useDispatch(); const { removePostLoading } = useSelector((state) => state.post); const [commentFormOpened, setCommentFormOpened] = useState(false); const id = useSelector((state) => state.user.me?.id); const onLike = useCallback(() => { if (!id) { return alert("로그인이 필요합니다."); } dispatch({ type: LIKE_POST_REQUEST, data: post.id, }); }, [id]); const onUnLike = useCallback(() => { if (!id) { return alert("로그인이 필요합니다."); } dispatch({ type: UNLIKE_POST_REQUEST, data: post.id, }); }, [id]); const onToggleComment = useCallback(() => { setCommentFormOpened((prev) => !prev); }, []); const onRemovePost = useCallback(() => { dispatch({ type: REMOVE_POST_REQUEST, data: post.id, }); }, []); const liked = post.Likers.find((v) => v.id === id); console.log("@@@", liked); return ( <div style={{ marginBottom: 10 }}> <Card cover={post.Images[0] && <PostImages images={post.Images} />} actions={[ <RetweetOutlined key="retweet" />, liked ? ( <HeartTwoTone twoToneColor="#eb2f96" key="heart" onClick={onUnLike} /> ) : ( <HeartOutlined key="heart" onClick={onLike} /> ), <MessageOutlined key="message" onClick={onToggleComment} />, <Popover key="more" content={ <Button.Group> {id && post.user?.id === id ? ( <> <Button>수정</Button> <Button type="danger" onClick={onRemovePost} loading={removePostLoading} > 삭제 </Button> </> ) : ( <Button>신고</Button> )} </Button.Group> } > <EllipsisOutlined /> </Popover>, ]} extra={id && <FollowButton post={post} />} > <Card.Meta avatar={<Avatar>{post.user?.nickname[0]}</Avatar>} title={post.user?.nickname} description={<PostCardContent postData={post.content} />} /> </Card> {commentFormOpened && ( <div> <CommentForm post={post} /> <List header={`${post.Comments.length}개의 댓글`} itemLayout="horizontal" dataSource={post.Comments} renderItem={(item) => ( <li> <Comment author={item.user?.nickname} avatar={<Avatar>{item.user?.nickname[0]}</Avatar>} content={item.content} /> </li> )} /> </div> )} </div> ); }; PostCard.propTypes = { post: PropTypes.shape({ id: PropTypes.number, user: PropTypes.object, content: PropTypes.string, createdAt: PropTypes.string, Comment: PropTypes.arrayOf(PropTypes.object), Images: PropTypes.arrayOf(PropTypes.object), Likers: PropTypes.arrayOf(PropTypes.object), }).isRequired, }; export default PostCard;
-
미해결[NarP Series] MVC 프레임워크는 내 손에 [나프2탄]
강의자료
안녕하세요 !! 수업잘듣고있습니다.혹시 08_MVC05 Project(핵심정리) 수업때 강의용 파워포인트도 다운받을수 있는건가요 ? ㅎ