묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결단 2주간 키운 블로그로 월 80만원 용돈 벌기
세컨 계정
안녕하세요, 수익화 하고 싶은 아이템이 2가지에요. 하나는 영어교육관련 알바이고, 다른 건 직업 관련 컨텐츠인데요. 영어교육은 프로그램 모집이어서 광고성으로 계속 올릴텐데, 다른 직업관련 컨텐츠에 영향을 미칠 것 같아서요. 세컨 계정을 만들어서 각각 운영하는 게 좋을까요? 아니면 영어알바로 방문자수가 많아질테니 한 블로그로 같이 운영하는 게 좋을까요?! 답변부탁드려요.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2 DB <-> 웹
H2 데이터베이스에서 JdbcTemplate 쿼리문으로 데이터를 가지고 와 웹에 뿌려주고 싶으면 어떻게 해야 하나요 ?혼자 새로운 데이터를 만들고 웹에 뿌려주고 싶은데 (item-service 처럼) NULL POINT EXCEPTION이 나옵니다
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
http 헤더
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HTTP 헤더 분류를 RFC2616(과거)에서는 General, Request, Response, Entity헤더로 4개로 분류했다고 하셨습니다. 그런데 RFC7230~7235가 등장하면서 엔티티 대신 표현을 사용한다고 하셨는데 그러면 현재 Http를 분류할때는 General, Request, Response, Representation으로 분류한다고 알고 있으면 되는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 정의시 기본키(복합키) 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의 들은 내용을 기반으로 사이드 프로젝트 진행중인데 엔티티 정의 중에 문의사항이 있습니다. A라는 테이블이 있고, B는 A의 이력테이블입니다. A테이블의 기본키를 a_id라고 할 때, B테이블의 기본키는 (a_id+b_date) 이렇게 복합키로 하려고 하는데요. 1. 외래키가 기본키가 되는것인데 아래처럼 하면될까요? @Id@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "A_ID")private A aId;2. (외래키+추가필드)로 표현되는 기본키는 어떻게 표현해야할까요?인터넷을 찾아보고, 강의도 다시 리뷰해보았는데 확실한해답을 못찾겠네요. 도움부탁드립니다 ㅜㅠ.ㅜ
-
미해결문제로 배우는 C언어
일곱난쟁이. 1차배열 질문
1.접근을 왜 두개씩 하는지 모르겠어요 2. sum=0 일때 arr[i]=-1 이랑 arr[j]=-1 이걸 모르겠어요;;
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
상품수정시 수량에 너무 큰값을 넣으면 오류가나옵니다
99999정도의 수량은 정상작동하는데 너무큰값을넣으면 인식을 못하는 이유가 타입의 최대 저장용량을 넘어서인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
터미널에서 실행 시 빌드 오류
윈도우 환경이고 콘솔 > cmd 에서 gradlew까지 입력하고 엔터쳤을 땐 잘 돌아가는데 gradlew build 하면 다음과 같이 오류가 납니다. 자바 버전 문제인 것 같아서 아래와 같이 설정을 확인했는데 어디가 문제인지 발견하지 못해 질문 남깁니다. 아래 캡쳐는 관련있는지 모르겠지만 빨간 에러처럼 떠서 첨부합니다. 추가 질문으로, 메인에서 바로 런하면 오류가 나지 않는데 콘솔에서 빌드 시 오류가 나는 이유는 무엇인가요?
-
미해결Vue.js + TypeScript 완벽 가이드
Github 권한 요청 드립니다.
두번째 프로젝트 github 권한 요청 드립니다 계정: yongho.lee.biz@gmail.com 항상 좋은 강의 감사드립니다.
-
미해결홍정모의 따라하며 배우는 C언어
강의 18: 42
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { /* Array Versus Pointer */ const char* pt2 = "I am a String!."; const char* pt3 = "I am a String!."; const char* pt4 = "I am a String!!!!!!."; // <- different const char ar1[] = "I am a String!."; const char ar2[] = "I am a String!."; const char ar3[] = "I am a String!!."; // <- different /* Memory address check */ /* Local variables */ printf("Stack high \t%llu %llu %llu\n", (unsigned long long)&pt2, (unsigned long long)&pt3, (unsigned long long)&pt4); } 위코드를 실행하면 Stack high 1096839066952 1096839066984 1096839067016 이렇게 포인터변수의주소가 32씩 차이나는데 이유가뭔가요? x64에서 실행하면 포인터변수의크기가 8바이트 아닌가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
모델을 통해 데이터를 보내는 부분에서 궁금한 점이 있습니다.
@GetMapping("/add")public String addForm(Model model) {model.addAttribute("item", new Item());return "form/addForm";}@ModelAttribute("deliveryCodes")public List<DeliveryCode> deliveryCodes() {List<DeliveryCode> deliveryCodes = new ArrayList<>();deliveryCodes.add(new DeliveryCode("FAST", "빠른 배송"));deliveryCodes.add(new DeliveryCode("NORMAL", "일반 배송"));deliveryCodes.add(new DeliveryCode("SLOW", "느린 배송"));return deliveryCodes;}컨트롤러에서 @ModelAttribute 와 @GetMapping("/add") 를 통해 데이터를 넘겨주는데,@ModelAttribute 를 통해 넘어가는 데이터는 item 객체 내부의 deliveryCode 인가요?아니면, model.addAttribute("deliveryCodes", deliveryCode 리스트) 인가요?addForm.html 에서 <form action="item.html" th:action th:object="${item}" method="post">th:object 는 ${item} 으로, 모델로 넘어간 item 객체인데<select th:field="*{deliveryCode}" class="form-select">밑에서 선택 변수 식으로 deliveryCode 를 사용하고 있어서 헷갈립니다.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
회원가입에 인증 절차가 아이디, 비번 외 이메일 인증, 핸드폰 인증을 모두 해야되는 경우
회원가입 중에 아이디, 비번, 핸드폰 인증, 이메일 인증을 모두 완료한 유저만 회원가입 처리를 해주고싶은데 쿠키나 토큰은 회원가입, 토큰 검증, 토큰 재발급 외에는 써본 적이 없어서 여기에 쿠키를 써도 되는지 모르겠어서 질문을 남깁니다 이거 제 생각대로 쿠키를 이용해보면 핸드폰 인증 완료시 쿠키는 탈취 위험이 있기에 사용자 휴대폰 번호가 아닌 임의의 쿠키값을 넣는다handphone(복호화(handphonenodebird))= 이메일 인증도 마찬가지로 완료시 쿠키는 탈취 위험이 있기에 사용자 이메일 번호가 아닌 임의의 쿠키값을 넣는다 email(복호화(emailnodebird)) 이런 식으로 구현하고 회원가입 버튼을 누를 때 쿠키 검증을 하는 식으로 구현해도 괜찮을까요 다른 방법 있다면 솔루션 부탁드립니다
-
해결됨Slack 클론 코딩[실시간 채팅 with React]
채널 관련해서 2가지 에러가 발생했는데 원인을 못찾겠습니다..
1. 로그인을 성공하면, 회원에 대한 정보도 정상적으로 가져오고 화면은 정상적으로 나오지만,useSWR을 통해 체널 데이터를 못가져오는 것 같습니다. 2. 채널 만들기를 하면 500 에러가 발생합니다. query: SELECT DISTINCT `distinctAlias`.`Users_id` AS `ids_Users_id` FROM (SELECT `Users`.`id` AS `Users_id`, `Users`.`email` AS `Users_email`, `Users`.`nickname` AS `U sers_nickname`, `Users__Users_Workspaces`.`id` AS `Users__Users_Workspaces_id`, `Users__Users_Workspaces`.`name` AS `Users__Users_Workspaces_name`, `Users__Users_Works paces`.`url` AS `Users__Users_Workspaces_url`, `Users__Users_Workspaces`.`createdAt` AS `Users__Users_Workspaces_createdAt`, `Users__Users_Workspaces`.`updatedAt` AS ` Users__Users_Workspaces_updatedAt`, `Users__Users_Workspaces`.`deletedAt` AS `Users__Users_Workspaces_deletedAt`, `Users__Users_Workspaces`.`OwnerId` AS `Users__Users_ Workspaces_OwnerId` FROM `users` `Users` LEFT JOIN `workspacemembers` `Users_Users__Users_Workspaces` ON `Users_Users__Users_Workspaces`.`UserId`=`Users`.`id` LEFT JOI N `workspaces` `Users__Users_Workspaces` ON `Users__Users_Workspaces`.`id`=`Users_Users__Users_Workspaces`.`WorkspaceId` AND (`Users__Users_Workspaces`.`deletedAt` IS NULL) WHERE ( (`Users`.`id` = ?) ) AND ( `Users`.`deletedAt` IS NULL )) `distinctAlias` ORDER BY `Users_id` ASC LIMIT 1 -- PARAMETERS: [5] query: SELECT `Users`.`id` AS `Users_id`, `Users`.`email` AS `Users_email`, `Users`.`nickname` AS `Users_nickname`, `Users__Users_Workspaces`.`id` AS `Users__Users_Wor kspaces_id`, `Users__Users_Workspaces`.`name` AS `Users__Users_Workspaces_name`, `Users__Users_Workspaces`.`url` AS `Users__Users_Workspaces_url`, `Users__Users_Worksp aces`.`createdAt` AS `Users__Users_Workspaces_createdAt`, `Users__Users_Workspaces`.`updatedAt` AS `Users__Users_Workspaces_updatedAt`, `Users__Users_Workspaces`.`dele tedAt` AS `Users__Users_Workspaces_deletedAt`, `Users__Users_Workspaces`.`OwnerId` AS `Users__Users_Workspaces_OwnerId` FROM `users` `Users` LEFT JOIN `workspacemember s` `Users_Users__Users_Workspaces` ON `Users_Users__Users_Workspaces`.`UserId`=`Users`.`id` LEFT JOIN `workspaces` `Users__Users_Workspaces` ON `Users__Users_Workspace s`.`id`=`Users_Users__Users_Workspaces`.`WorkspaceId` AND (`Users__Users_Workspaces`.`deletedAt` IS NULL) WHERE ( (`Users`.`id` = ?) ) AND ( `Users`.`deletedAt` IS NUL L ) AND ( `Users`.`id` IN (5) ) -- PARAMETERS: [5] user Users { id: 5, email: 'qqq123@naver.com', nickname: 'Quit', Workspaces: [ Workspaces { id: 1, name: 'Sleact', url: 'select', createdAt: 2022-08-20T04:04:09.828Z, updatedAt: 2022-08-20T04:04:09.828Z, deletedAt: null, OwnerId: null } ] } query: SELECT `Workspaces`.`id` AS `Workspaces_id`, `Workspaces`.`name` AS `Workspaces_name`, `Workspaces`.`url` AS `Workspaces_url`, `Workspaces`.`createdAt` AS `Work spaces_createdAt`, `Workspaces`.`updatedAt` AS `Workspaces_updatedAt`, `Workspaces`.`deletedAt` AS `Workspaces_deletedAt`, `Workspaces`.`OwnerId` AS `Workspaces_OwnerI d` FROM `workspaces` `Workspaces` WHERE ( (`Workspaces`.`url` = ?) ) AND ( `Workspaces`.`deletedAt` IS NULL ) LIMIT 1 -- PARAMETERS: ["sleact"] [Nest] 19948 - 2022. 08. 20. 오후 1:33:12 ERROR [ExceptionsHandler] Cannot read properties of null (reading 'id') TypeError: Cannot read properties of null (reading 'id') at ChannelsService.createWorkspaceChannels (C:\Users\kwa13\IdeaProjects\sleact\back\dist\main.js:2034:41) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async C:\Users\kwa13\IdeaProjects\sleact\back\node_modules\@nestjs\core\router\router-execution-context.js:46:28 at async C:\Users\kwa13\IdeaProjects\sleact\back\node_modules\@nestjs\core\router\router-proxy.js:9:17 [Nest] 19948 - 2022. 08. 20. 오후 1:33:12 LOG [HTTP] POST /api/workspaces/sleact/channels 500 52 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (K HTML, like Gecko) Chrome/104.0.0.0 Safari/537.36 ::ffff:127.0.0.1 ------------------------------------------------------------------------------------------------------------------------ DB 관련 스크린샷 - 채널 - 워크스페이스 ------------------------------------------------------------------------------------------- 백엔드 관련 코드 - channels.controller.ts @Controller('api/workspaces/:url/channels') export class ChannelsController { constructor(private readonly channelsService: ChannelsService) {} @ApiOperation({ summary: '채널 생성하기' }) @Post() async createChannel( @Param('url') url: string, @Body() body: CreateChannelDto, @User() user: Users, ) { return this.channelsService.createWorkspaceChannels( url, body.name, user.id, ); } - channels.service.ts async getWorkspaceChannels(url: string, myId: number) { return this.channelsRepository .createQueryBuilder('channels') .innerJoinAndSelect( 'channels.ChannelMembers', 'channelMembers', 'channelMembers.userId = :myId', { myId }, ) .innerJoinAndSelect( 'channels.Workspace', 'workspace', 'workspace.url = :url', { url }, ) .getMany(); } ----------------------------------------------------------------------------------------------------------------------- 프론트엔드 관련 코드 - Workspace/index.tsx const Workspace = () => { const [showUserMenu, setShowUserMenu] = useState(false); const [showCreateWorkspaceModal, setShowCreateWorkspaceModal] = useState(false); const [showWorkspaceModal, setShowWorkspaceModal] = useState(false); const [showCreateChannelModal, setShowCreateChannelModal] = useState(false); const [newWorkspace, onChangeNewWorkspace, setNewWorkspace] = useInput(''); const [newUrl, onChangeNewUrl, setNewUrl] = useInput(''); const { workspace } = useParams(); const { data: userData, error, mutate } = useSWR<IUser | false>('/api/users', fetcher); const { data: channelData } = useSWR<IChannel[]>(userData ? `/api/workspaces/${workspace}/channels` : null, fetcher); const onLogout = useCallback(() => { axios .post('/api/users/logout', null, { withCredentials: true, }) .then(() => { mutate(); }); }, []); const onClickUserProfile = useCallback(() => { setShowUserMenu((prev) => !prev); }, []); const onCloseUserProfile = useCallback((e: any) => { e.stopPropagation(); setShowUserMenu(false); }, []); const onClickCreateWorkspace = useCallback(() => { setShowCreateWorkspaceModal(true); }, []); const onCloseModal = useCallback(() => { setShowCreateWorkspaceModal(false); setShowCreateChannelModal(false); }, []); const onCreateWorkspace = useCallback( (e: any) => { e.preventDefault(); if (!newWorkspace || !newWorkspace.trim()) return; if (!newUrl || !newUrl.trim()) return; axios .post( '/api/workspaces', { name: newWorkspace, url: newUrl, }, { withCredentials: true, }, ) .then(() => { mutate(); setShowCreateWorkspaceModal(false); setNewWorkspace(''); setNewUrl(''); }) .catch((error) => { console.dir(error); toast.error(error.response?.data, { position: 'bottom-center' }); }); }, [newWorkspace, newUrl], ); const toggleWorkspaceModal = useCallback(() => { setShowWorkspaceModal((prev) => !prev); }, []); const onClickAddChannel = useCallback(() => { setShowCreateChannelModal(true); }, []); if (!userData) { return <Navigate replace to="/login" />; } return ( <div> <Header> <RightMenu> <span onClick={onClickUserProfile}> <ProfileImg src={gravatar.url(userData.email, { s: '28px', d: 'retro' })} alt={userData.nickname} /> {showUserMenu && ( <Menu style={{ right: 0, top: 38 }} show={showUserMenu} onCloseModal={onCloseUserProfile}> <ProfileModal> <img src={gravatar.url(userData.email, { s: '36px', d: 'retro' })} alt={userData.nickname} /> <div> <span id="profile-name">{userData.nickname}</span> <span id="profile-active">Active</span> </div> </ProfileModal> <LogOutButton onClick={onLogout}>로그아웃</LogOutButton> </Menu> )} </span> </RightMenu> </Header> <WorkspaceWrapper> <Workspaces> {userData?.Workspaces.map((ws) => { return ( <Link key={ws.id} to={`/workspace/sleact/channel/일반`}> <WorkspaceButton>{ws.name.slice(0, 1).toUpperCase()}</WorkspaceButton> </Link> ); })} <AddButton onClick={onClickCreateWorkspace}>+</AddButton>; </Workspaces> <Channels> <WorkspaceName onClick={toggleWorkspaceModal}>WorkspaceName</WorkspaceName> <MenuScroll> <Menu show={showWorkspaceModal} onCloseModal={toggleWorkspaceModal} style={{ top: 95, left: 80 }}> <WorkspaceModal> <h2>Sleact</h2> <button onClick={onClickAddChannel}>채널 만들기</button> <button onClick={onLogout}>로그아웃</button> </WorkspaceModal> </Menu> {channelData?.map((v) => ( <div>{v.name}</div> ))} </MenuScroll> </Channels> <Chats> <Routes> <Route path="/channel/:channel" element={<Channel />} /> <Route path="/dm/:id" element={<DM />} /> </Routes> </Chats> </WorkspaceWrapper> <Modal show={showCreateWorkspaceModal} onCloseModal={onCloseModal}> <form onSubmit={onCreateWorkspace}> <Label id="workspace-label"> <span>워크스페이스 이름</span> <Input id="workspace" value={newWorkspace} onChange={onChangeNewWorkspace} /> </Label> <Label id="workspace-url-label"> <span>워크스페이스 url</span> <Input id="workspace" value={newUrl} onChange={onChangeNewUrl} /> </Label> <Button type="submit">생성하기</Button> </form> </Modal> <CreateChannelModal show={showCreateChannelModal} onCloseModal={onCloseModal} setShowCreateChannelModal={setShowCreateChannelModal} /> </div> ); }; export default Workspace; - CreateChannelModal/index.tsx interface Props { show: boolean; onCloseModal: () => void; setShowCreateChannelModal: (flag: boolean) => void; } const CreateChannelModal: VFC<Props> = ({ show, onCloseModal, setShowCreateChannelModal }) => { const [newChannel, onChangeNewChannel, setNewChannel] = useInput(''); const { workspace, channel } = useParams(); const onCreateChannel = useCallback( (e: any) => { e.preventDefault(); axios .post( `/api/workspaces/${workspace}/channels`, { name: newChannel, }, { withCredentials: true }, ) .then(() => { setShowCreateChannelModal(false); setNewChannel(''); }) .catch((error) => { console.dir(error); toast.error(error.response?.data, { position: 'bottom-center' }); }); }, [newChannel], ); return ( <Modal show={show} onCloseModal={onCloseModal}> <form onSubmit={onCreateChannel}> <Label id="channel-label"> <span>채널</span> <Input id="channel" value={newChannel} onChange={onChangeNewChannel} /> </Label> <Button type="submit">생성하기</Button> </form> </Modal> ); }; export default CreateChannelModal; 스스로 해결해보려고 많은 시간을 들여봤지만, 도저히 모르겠네요..
-
미해결스프링 배치
Flow 구성하는 방법
10:03에서 SimpleFlow 객체를 생성할 떄는 .end()를 사용하는데 13:54 실습부분에서는 SimpleFlow를 생성할때 builder.build() api를 사용합니다. 둘 중 어떤 것을 통해 SimpleFlow를 생성하는 것이 옳나요?
-
해결됨스스로 구축하는 AWS 클라우드 인프라 - 기본편
Target Groups에 private-ec2-c1은 Helth status가 "unhealthy"로 나오네요 ㅜ_ㅜ
여기저기 클릭해보면서 동강 다시보고 있는데 원인을 쉽게 찾는 방법 있을까요?
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
post 400 error
모든 기능은 잘 동작합니다. console로도 잘 찍히고 firebase에 register도 잘됩니다 하지만 chrome 콘솔창에 계속 이런 에러가 뜹니다. 무슨 문제인지 잘 모르겠습니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
예외전가
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); HttpServletResponse httpResponse = (HttpServletResponse) response; try { log.info("인증 체크 필터 시작 {}", requestURI); if (isLoginCheckPath(requestURI)) { log.info("인증 체크 로직 실행 {}", requestURI); HttpSession session = httpRequest.getSession(false); if (session == null ||session.getAttribute(SessionConst.LOGIN_MEMBER) == null) { log.info("미인증 사용자 요청 {}", requestURI); //로그인으로 redirect httpResponse.sendRedirect("/login?redirectURL=" +requestURI); return; //여기가 중요, 미인증 사용자는 다음으로 진행하지 않고 끝! } } chain.doFilter(request, response); } catch (Exception e) { throw e; //예외 로깅 가능 하지만, 톰캣까지 예외를 보내주어야 함 } finally { log.info("인증 체크 필터 종료 {}", requestURI); } 여기서 throw e해서 예외를 던지면 doFilter에서 LogFilter로 예외를 전가할텐데 LogFilter는 예외전가구문이 없는데 어떻게 was까지 예외를 전가할 수 있는 지 궁금합니다.
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
movie 모달 ui 생성하기 팝업 이미지 안나오
각 이미지를 클릭하면 팝업 이미지가 나오게 하는 부분인데 이미지가 엑박이 떠서 질문 드립니다. 어느부분을 수정하면 될까요 ?? row.js ------ import React, { useEffect, useState } from 'react' import axios from "../api/axios" import MovieModal from './MovieModal' import "./Row.css" const Row = ({ title, fetchURL, id, isLargeRow}) => { const [movies, setMovies] = useState([]) const [modalOpen, setModalOpen] = useState(false) const [movieSelected, setMovieSelected] = useState({}) useEffect(()=> { fetchMovieData() },[]) const fetchMovieData = async ()=> { const request = await axios.get(fetchURL) setMovies(request.data.results) } const handleClick = (movie) => { setModalOpen(true) setMovieSelected(movie) } return ( <section> <h2>{title}</h2> <div className="slider"> <div className="slider__arrow-left"> <span className="arrow" onClick={() => {document.getElementById(id).scrollLeft -= window.innerWidth - 80}}> {"<"} </span> </div> <div id={id} className="row__posters" > {movies.map((movie) =>( <img key={movie.id} className={`row__poster ${isLargeRow && "row__posterLarge"}`} src={`https://image.tmdb.org/t/p/original/${isLargeRow ? movie.poster_path : movie.backdrop_path}`} loading="lazy" alt={movie.name} onClick={()=> handleClick(movie)} /> ))} </div> <div className="slider__arrow-right"> <span className="arrow" onClick={() => {document.getElementById(id).scrollLeft += window.innerWidth - 80}}> {">"} </span> </div> </div> { modalOpen && (<MovieModal {...setMovieSelected} setModalOpen={setModalOpen} />) } </section> ) } export default Row moviemodal.js ------ import React from 'react' import "./MovieModal.css" const MovieModal = ({ backdrop_path, title, overview, name, release_date, first_air_date, vote_average, setModalOpen}) => { return ( <div className="presendation"> <div className="wrapper-modal"> <div className="modal"> <span className="modal-close" onClick={()=> setModalOpen(false)}>X</span> <img className='modal__poster-img' src={`https://image.tmdb.org/t/p/original/${backdrop_path}`} alt='moviemodal' /> <div className="modal__content"> <p className="modal__details"> <span className="modal__user_perc">100% for you</span> {release_date ? release_date : first_air_date} </p> <h2 className="modal__title">{title ? title : name}</h2> <p className="modal__overvie">평점: {vote_average}</p> <p className="modal__overview">{overview}</p> </div> </div> </div> </div> ) } export default MovieModal
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
안녕하세요 api 만드는거에 질문이 있습니다.
대댓글 기능도 추가하고 싶은데 만약 대댓글 orm이 Refcomment라고 하면 그러면 서버에서 강의에서 나온 post.get api에다가 Refcomment라고 적고 보내주면 되나요? { model: Refcomment, include: [{ model: User, attributes: ['id', 'nickname'], order: [['createdAt', 'DESC']], }], } 또 실무에서는 어떤 식으로 처리하는지도 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
준영속엔티티
ItemRepository의 updateItem메서드에서 Book book=new Book(); 을 해주었는데 왜 이떄 book 객체가 준영속엔티티라고 하시는지 이해가 안됩니다. BookForm 파라미터의 id값을 받아서 그런건가요? 그렇다면 BookForm 객체도 persist 되었어야하는데 그러지 않아서요.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
버그 발생시
안녕하세요! 항상 좋은 강의 잘 보고 있습니다!! 버그 수정에 대해 궁금한게 있습니다 게임을 만들던 도중에 unityChan이 바닥을 향해 달려가는 버그가 발생해서 하루 종일 디버깅 해보고 오류를 수정하려고 했지만 결국 원인을 찾지 못하고, 처음 부터 다시 했더니 진짜 갑자기 됐습니다,, 근데 저는 아직도 그때 왜 버그가 났는지 이유를 모르겠습니다,, 그래서 제가 궁금한것은 게임을 만드시는 분들도 다들 이렇게 버그의 원인을 찾지 못하는 경우가 많나요? 저는 버그의 원인을 잘 찾지 못하는것 같은데,,, 다른 분들은 어떻게 하시나요?