묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강사님처럼 테스트 각각이 나타나지않고 하나만 뜹니다.
강의 내용에서는 테스트 완료 후 첫번 째 사진처럼 각각의 함수명이 뜨는데 , 저는 3개의 테스트 완료 라고만 뜨고 하나씩은 안뜨는 이유를 잘 모르겠습니다! 옆쪽의 확장 화살표를 눌러봐도 밑의 3가지 테스트가 뜨지 않습니다.
-
미해결
졸업작품 project 질문[yolo,mysql]
안녕하세요 졸업작품으로 yolo 무인 계산 시스템을 만들고 있는 학생입니다 . yolo로 인식한 상품을 mysql 데이터 베이스와 연동해서 해당 상품을 모니터에 출력하는 방식으로 진행하고 싶은데 어떠한 방식으로 진행하면 좋을지 조언 부탁드립니다...
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
j포문 거꾸로 돌리는 이유
for j in range(pt,m+1)이 아니라 for j in range(m,pt-1,-1)로 작성해야하는 지 모르겠어서 여쭤봅니다.
-
해결됨따라하며 배우는 리액트, 파이어베이스 - 채팅 어플리케이션 만들기[2023.12 리뉴얼]
모듈 설치가 오류인지 잘 모르겠습니다
react-router-dom 모듈을 설치하는 과정에서 Switch문을 사용 할 수 없다는 내용의 오류가 생깁니다... https://github.com/tejava7177/React-ChattingProgram/blob/main/src/App.js 깃허브 주소입니다...감사합니다
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
함수 Hint에 대한 내용설명
강의 어디쯤에 함수 Hint에 대한 내용이 있나요? 예제파일에는 존재하는데, 강의내용을 못 찾아서 문의드립니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
에노테이션 만들기
Login에노테이션의 로직부분의 코드에 의문이 있습니다. 도데체 어떻게 저게 Login에노테이션의 로직부분이라는 것을 알 수 있어서 로그인 에노테이션이 실행될 때 저 로직이 실행이 되는 지 궁금합니다. parameter.hasParameterAnnotation(Login.class);<-- 이부분때문에 Login관련 에노테이션인건지잘 모르겠습니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
onetomany, manytoone관계 질문 있습니다
User와 Post는 User엔티티가 one에 해당하고 Post엔티티가 many에 해당되어 User.ts에서 OneToMany(()=>postMessage)...이런식으로 작성하고 Post.ts에도 ManyToOne(()=>User)...와 같이 작성하는 것을 확인했습니다. 그러면 User와 Sub도 onetomany관계인데 왜 Sub엔티티에서만 ManyToOne(()=>User)...로 작성하고 User에는 Sub에 대해서 OneToMany데코레이터를 사용하지 않는 것인지 질문드립니다.
-
미해결단 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를 생성하는 것이 옳나요?