묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 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이 바닥을 향해 달려가는 버그가 발생해서 하루 종일 디버깅 해보고 오류를 수정하려고 했지만 결국 원인을 찾지 못하고, 처음 부터 다시 했더니 진짜 갑자기 됐습니다,, 근데 저는 아직도 그때 왜 버그가 났는지 이유를 모르겠습니다,, 그래서 제가 궁금한것은 게임을 만드시는 분들도 다들 이렇게 버그의 원인을 찾지 못하는 경우가 많나요? 저는 버그의 원인을 잘 찾지 못하는것 같은데,,, 다른 분들은 어떻게 하시나요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
throw er; // Unhandled 'error' event
안녕하세요 강의 너무 잘듣고있습니다 /login 으로 post 요청하여 계정을 검증하는 부분에서 throw er; // Unhandled 'error' event 이러한 오류가 나타나는데 port 문제라고 해서 port를 cmd로 죽이고 여러번 해봤지만 문제가 여전해서 질문 남깁니다. const express = require("express"); // express 모듈 가져오기 const app = express(); // 새로운 express 앱생성 const port = 5000; // 포트번호지정 const { User } = require("./models/User"); const bodyParser = require("body-parser"); const mongoose = require("mongoose"); const cookieParser = require("cookie-parser"); //application/x-www.form.urlencoded app.use(bodyParser.urlencoded({ extended: true })); // application/json app.use(bodyParser.json()); app.use(cookieParser()); const config = require("./config/key"); mongoose .connect(config.mongoURI) .then(() => { console.log("mongoDB connected!"); }) .catch((err) => { console.log(err); }); app.get("/", (req, res) => { res.send("Hello World! 노드 실행d"); }); app.post("/register", (req, res) => { // 회원가입 할때 필요한 정보들을 client에서 가져오면 // 그것들을 데이터 베이스에 넣어줌 const user = new User(req.body); user.save(function (err, userInfo) { if (err) return res.json({ success: false, err }); return res.status(200).json({ success: true, }); }); }); app.post("/login", (req, res) => { User.findOne({ email: req.body.email }, (err, user) => { if (err) { return res.json({ loginSuccess: false, message: err, }); } // 요청된 이메일을 데이터베이스에서 있는지 찾는다. if (!user) { return res.json({ loginSuccess: false, message: "이메일이 존재하지 않습니다.", }); } // 요청한 이메일이 존재한다면 비밀번호가 같은지 확인 user.comparePassword(req.body.password, (err, isMatch) => { if (err) { return res.json({ logginSuccess: false, message: err, }); } if (!isMatch) { return res.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다.", }); } }); // 비밀번호까지 맞는다면 token을 생성한다. user.generateToken((err, user) => { if (err) return res.status(400).send(err); // 저장은 어디에? 쿠기, 로컬스토리지 res .cookie("x_auth", user.token) .state(200) .json({ logginSuccess: true, userId: user._id }); }); }); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
쿠키와 캐시 질문
1. 쿠키와 캐시의 차이점이 궁금합니다!! 2. 웹브라우저에 캐시저장소 , 쿠키저장소 2개가 있는건가요??
-
미해결코딩으로 학습하는 GoF의 디자인 패턴
해당 코드가 C# 에선 접근 관련 컴파일 에러가 뜹니다.
안녕하세요 :) Java 보단 C# 이 편한 수강생입니다. C# 으로 강의 코드를 타이핑 하고 있는데요, 같은 코드인데 C# 에선 접근 제한 에러가 뜨더라구요! 그래서 instance 를 public/internal 로 바꿔야 했는데 C# 과 Java 의 차이에서 비롯된 것일까요? 어떤 차이에서 비롯된 것인지 궁금합니다!
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
useCallback과 state 업데이트
안녕하세요 제로초님 useCallback에 대한 질문이 있습니다 요렇게 코드를 넣고 좋아요/댓글 버튼을 여러번 누르니까 기능은 정상적으로 동작하는데 이렇게 로그가 false로만 뜨더라구요 useCallback과 관련된 부분인 것 같은데 원리가 무엇인가요?
-
미해결
Best Relocators In Dubai
Best moving company in Dubai Choosing the only moving company in Dubai is now easier than ever. When you move to Dubai, you may want the emirate to be the main mover of the emirate to help you. We have selected the only Dubai company to move goods for you. Are you looking for real reviews of national carriers? State mover and great race hence the simplest movers at cheap prices in Dubai. List of long-distance operators in Dubai supported by Consumer Reports. Complete a free moving quote for the best Movers Dubai, and estimate rates and discounted moving fees. Read what you need to know before following up on our daily tips, guides, and checklists.
-
미해결
Locking For Best Movers?
Best movers in Dubai cheapest and best moving and packing companies to date in addition to the pallet operators based in Dubai for moving homes everyone knows that moving business in Dubai is essential, the products in your home are very delicate, like glassware and electronic appliances, like refrigerators, microwaves, etc., so you cannot transport them yourself from Dubai. Want to need executives' help to transform your home. But now it is possible without meeting the best affordable movers and packers in Dubai. Visit Us: Movers and Packers
-
미해결
Are you worried for Removing?
Movers and Packers in Dubai We primarily focus on the value of our customers and offer a no-damage guarantee, only in the event of any minor damage to any of the property can we get a full replacement. Moving, loading and unloading will be done with the simplest procedure ever found. As one of the simplest packaging companies in Dubai, we guarantee the best quality of professional workmanship in reasonable quantities at short notice. The most complicated part of the transportation process is the packaging of different products. We must make sure that the products are not damaged during the transportation process. With us, you will have a direct honest experience in the moment of change and transition without worry. Visit Us: Movers and packers Dubai
-
미해결
Abuhakim
Abu Hakim is a Digital Marketing Expert at Allied Dubai Movers. Experienced in managing promotional campaigns, and crafting marketing strategies to generate niche relevant traffic for organizations through his blogs. Allied Dubai Movers offers full inclusive moving services, packing, removal, relocation, furniture movers, local movers, and self-storage services, including packaging and covering of your stuff and things for the journey. At Allied Dubai Movers, we own our own Trucks. We use bubble sheet cartons and other packing materials to prevent damage to your belongings during relocation. We take responsibility for any damage so care for them very seriously. Visit Us: Moving Company Dubai
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
텍스트RPG #3 31:48 질문
EnterBattle(playerInfo, &monsterInfo[index]); 부분에 monsterInfo[index]는 배열이기 때문에 &는 없더라도 포인터와 상호적으로 주고받을 수 있기 때문에 오류가 안나야 된다고 생각하는데, 왜 오류가 발생하는지 모르겠스빈다.