묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의를 보고 연관관계 매핑을 하는데 모르겠습니다...
무신사와 비슷하게 만들고 있는데하나의 옷은 여러개의 카테고리를 가질 수 있잖아요Ex) [상품] 버버리코트 - [카테고리]상의, 코트, 겨울 등등..그런데 하나의 카테고리 또한 여러개의 상품에 등록되는 거 같아요Ex) [상품]아디다스 저지, 빨간색니트, 반팔티 - [카테고리]상의 이래서 N-M으로 연관관계 매핑이 되는 줄 알고 중간테이블로 둬서1:N , N:1로 만들었습니다.그런데 아이템을 넣고 확인해보니 중간테이블과 카테고리의 아이디가 동일하게 올라갈 수 밖에 없는 로직으로 구성되어 있습니다. 왜냐하면 옷 하나를 등록할 때 보통 많은 카테고리를 넣기 때문입니다.Item item = ItemRegisterDto.Request.toItemEntity(itemRegisterDto, findMember); itemRepository.save(item); Set<String> categoryNames = itemRegisterDto.getCategoryNames(); for (String categoryName : categoryNames) { Category category = ItemRegisterDto.Request.toCategoryEntity(categoryName); category.addItemCategories(item, category); categoryRepository.save(category); }public void addItemCategories(Item item, Category category) { this.itemCategories = new ArrayList<>(); this.itemCategories.add(ItemCategory.builder() .category(category) .item(item) .build()); }중간테이블과 카테고리의 아이디가 동일하게 올라가므로굳이 중간테이블을 쓰지 않고 옷과 카테고리를 1:N 양방향 매핑으로 연관관계를 만들면 될 거 같다고 생각했습니다.만약, 옷과 카테고리를 1:N 양방향 매핑이 맞다면 하나의 옷은 여러개의 카테고리를 가질 수 있고 하나의 카테고리 또한 여러개의 옷을 가질 수 있는데 다대다관계가 아닌 이유도 궁금합니다.마지막으로 어떻게 생각해야 연관관계 매핑에 있어서 잘 지을 수 있을까요?
-
미해결[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
실기 시험에서 sql라이브러리 사용
안녕하세요 선생님 질문이 있어서 글남겨요 혹시 실기 시험에서 1유형 풀이시 sql라이브러리를 사용해서 풀어도 되나요? 제가 sql이 매우 익숙한 사람이여서요
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
섹션 16, 17 docker-compose up -d 명령 실행 시 다운로드 속도 느려짐
섹션 16, 17에서 docker-compose up -d 명령 실행 시 다운로드 속도가 너무 느려집니다...이 전까지는 속도가 적당한 빠르기였는데, 지금은 속도가 너무 느려져서, 검색 후 ec2 서버 정지했다가 재부팅도 해 보고 했는데, 여전히 느립니다.해결 방법이 있을까요?저는 윈도우즈 11 사용중입니다.
-
미해결[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
기능별로 정리가 되지않아요
위가 강사님 화면이고 밑에가 제 화면인데 상단에 lib>src>app.dart뒤로기능별로 ui가 정리되지않고 initialLocation도 활성화되지않고 있어요 혹시 vscode에서 이상이 있는걸까요..?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
for in for of 강의에서 starter() 함수가 starter is not defined
const messageContainer = document.querySelector("#d-day-message"); const container = document.querySelector("#d-day-container"); container.style.display = 'none' messageContainer.innerHTML = "<h3>D-Day를 입력해 주세요</h3>"; const dateForMaker = function () { const inputYear = document.querySelector("#target-year-input").value; const inputMonth = document.querySelector("#target-month-input").value; const inputDate = document.querySelector("#target-date-input").value; //const dateFormat = inputYear + "-" + inputMonth + "-" + inputDate; const dateFormat = `${inputYear}-${inputMonth}-${inputDate}`; return dateFormat; // console.log(inputYear, inputDate, inputMonth); }; const counterMaker = function () { const targetDateInput = dateForMaker(); // console.log(targetDateInput); const nowDate = new Date(); const targetDate = new Date(targetDateInput).setHours(0, 0, 0, 0); const remaining = (targetDate - nowDate) / 1000; // 만약 remaining이 0이라면 , 타이머가 종료 되었습니다 출력 (수도코드) console.log(remaining); if (remaining === 0 || remaining < 0) { // console.log("타이머가 종료되었습니다"); messageContainer.innerHTML = "<h3>타이머가 종료되었습니다</h3>"; } else if (isNaN(remaining)) { // 만약 잘못된 날짜가 들어왔다면, 유효한 시간대가 아닙니다 출력 // console.log("유효한 시간대가 아닙니다"); messageContainer.innerHTML = "<h3>유효한 시간대가 아닙니다</h3>"; } // const remainingDate = Math.floor(remaining / 3600 / 24); //Math. floor 소숫점 제거 // const remaingHours = Math.floor(remaining / 3600) % 24; // const remaingMin = Math.floor(remaining / 60) % 60; // const remaingSec = Math.floor(remaining) % 60; const remaingObj = { remainingDate: Math.floor(remaining / 3600 / 24), remaingHours: Math.floor(remaining / 3600) % 24, remaingMin: Math.floor(remaining / 60) % 60, remaingSec: Math.floor(remaining) % 60, }; // const days = document.getElementById("days"); // const hours = document.getElementById("hours"); // const min = document.getElementById("min"); // const sec = document.getElementById("sec"); // const documentObj = { // days: document.getElementById("days"), // hours: document.getElementById("hours"), // min: document.getElementById("min"), // sec: document.getElementById("sec"), // }; const documentArr = ['days', 'hours', 'min' , 'sec'] // const docKeys = Object.keys(documentObj); const timeKeys = Object.keys(remaingObj); // Object.keys : 객체의 키를 가져와 배열로 반환f let i = 0; for (let tag of documentArr) { // 배열로 이용한다 document.getElementById(tag).textContent = remaingObj[timeKeys[i]] i++ } const starter = function () { container.style.display ='flex' messageContainer.style.display = 'none' counterMaker() } // for (let i = 0; i < timeKeys.length; i = i + 1) { for문 // documentObj[docKeys[i]].textContent = remaingObj[timeKeys[i]]; // // console.log(timeKeys); // // console.log(timeKeys[i]); // } // let i = 0; // for (let key in documentObj) { // 객체로 이용한다 for in // documentObj[key].textContent = remaingObj[timeKeys [i]] // i++; // } // documentObj['days'].textContent = remaingObj["remainingDate"]; // documentObj['hours'].textContent = remaingObj["remaingHours"]; // documentObj['min'].textContent = remaingObj["remaingMin"]; // documentObj['sec'].textContent = remaingObj["remaingSec"]; // console.log("클릭"); // console.log(remainingDate, remaingHours, remaingMin, remaingSec); };<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="./main.css" /> <!-- <script src="./script.js" defer></script> --> <title>Document</title> </head> <body> <h1>D-Day</h1> <div id="d-day-container"> <div class="d-day-child-container"> <span id="days">0</span> <span>일</span> </div> <div class="d-day-child-container"> <span id="hours">0</span> <span>시간</span> </div> <div class="d-day-child-container"> <span id="min">0</span> <span>분</span> </div> <div class="d-day-child-container"> <span id="sec">0</span> <span>초</span> </div> </div> <div id="d-day-message"></div> <div id="target-selector"> <input type="text" id="target-year-input" class="target-input" / size="5"> <input type="text" id="target-month-input" class="target-input" / size="5"> <input type="text" id="target-date-input" class="target-input" / size="5"> </div> <button onclick="starter()" id="start-btn">카운트 다운 시작</button> <script src="./script.js"></script> </body> </html>아무리 호출하고 수정해도 계속 오류가 납니다 이유 좀 알려주세요 ㅠ
-
미해결실습으로 손에 잡히는 SQLD의 정석(2과목)
p.105 95번 문제 질문
답이 2번인 것은 이해가 되는데 3, 4번 문항에서 질문이 있습니다.배우기로는 GROUPING SETS를 GROUP BY와 UNION ALL로 바꿀 때 SELECT 컬럼명 중 GROUP BY 를 하지 않는 값을 NULL로 써서 했는데 이것을 MAX(Y.col1), MAX(X.keyb) 로 해도 되는건가요?
-
미해결실습으로 손에 잡히는 SQLD의 정석(2과목)
p.90 78번 문제 질문
78번 문제 질문드립니다.2번 문항의 SELECT 구문에서CASE GROUPING(B.지역ID)~ 로 되어있는데 B.지역명이여야 맞는거 아닌가요? ㅠㅠ그리고 ELSE 뒤에 MIN(지역명)도 가능한건지 이해가 잘 안됩니다.지역명은 서울, 경기 이런 내용인데 MIN 으로 출력이 되는게 의아합니다..
-
해결됨[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
크롤링시 한글 부분이 이상한 문자로 나옵니다.
r
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
수업과는 조금 다른 실무 id취향 질문이 있습니다!
안녕하세요, 테이블 생성중에 id관련된 내용을 보다가 궁금한게 생겨 질문 남깁니다! 개발자에 따라서 유한한 bigint로 이루어진 고유 id를 극혐하고 이론상 거의 무한한 uuid를 사용해야한다 주장하시는 분들이 꽤나 많던데, 태현님께서는 어떻게 생각하시나요? 저는 개인적으로 실무에서도 uuid대신 bigint로 이루어진 id를 사용중에 있고, 유저에게 노출이 필요한 유저 고유번호만 내부에서 사용하는 id값 이외에 uuid칼럼을 따로 만들어서 관리하거든요 🤔🤔만약에 uuid를 사용한다면 조회의 성능이랑.. auto_increment를 사용할 수 없으니 매 번 insert문마다 서비스로직에서 uuid를 만들어서 넘겨야 하는것에 대해서도 그래야만 하는지 좀 의문이 있기도 하구요
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
TodoItem 컴포넌트에서 todos를 props로 받았는데 렌더링이 되지 않습니다.
🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨질문 하시기 전에 꼭 확인해주세요- 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다)- 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다)- 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢)질문 하실때 꼭 확인하세요- 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X)- 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지)- 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우)- 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요- 강의의 몇 분 몇 초 관련 질문인지 알려주세요!- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강의 4분정도에서 나오는 내용에 TodoItem컴포넌트에서 List로부터 todos를 받았는데 렌더링이 제대로 되지 않습니다. 오타도 확인해봤지만 모르겠습니다ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA, DB 연동 관련 오류 질문
안녕하세요 영한님 JPA 활용1 강의의 JPA와 DB 설정, 동작확인 파트를 실습하다가 오류가 생겨 질문남겨요3시간 동안 검색해도 해결하지 못했어요.. MemberRepository 테스트 시 아래와 같은 오류가 발생해 해결하고자 합니다. 아마 application.yml 쪽 문제 같은데 강의와 똑같이 따라했는데도 불구하고 오류가 발생하네요..H2는 확실히 켜고 테스트 시도했습니다. 아래는 강의를 보며 따라한 프로젝트입니다.https://drive.google.com/file/d/1BvWBkoHE0fjdIFABmGeiOMDLuG-pKdwP/view?usp=sharing
-
해결됨[임베디드 입문용] 임베디드 개발은 실제로 이렇게 해요.
[5강 Hello Gpio] 환경구축의 의미
안녕하세요, 강의를 듣는중 의문점이 생겨서 글 남깁니다. 제가 궁금한점은우선 보드에 ST link 장비를 연결하는 이유가 뭔지가 궁금합니다.이 장비가 있어야 디버깅이 가능한건가요??ST link의 전체적인 역할이 궁금합니다.
-
미해결토비의 스프링 6 - 이해와 원리
Test 결과 화면이 다른 거 같은데 설정 문제일까요?
토비님 강의 재밌게 보고 있습니다 그런데 강의 중에 토비님이 테스트를 실행하면 테스트 터미널 창에 > Task 이런 식으로 뭔가 많이 뜨던데저는 문구가 따로 나오지 않네요 정상적인 결과일까요?
-
미해결Next + React Query로 SNS 서비스 만들기
nextjs middleware에서 쿠키 업데이트에 관한 질문입니다.
안녕하세요 프로젝트 진행 중에 해결되지 않는 부분이 있어 질문 드립니다.middleware에서 쿠키의 값을 업데이트 하려고 하는데 업데이트 되지 않는 현상이 발생하고 있습니다.아래의 코드와 같이 NextResponse.next() 실행 후에 response에 쿠키를 업데이트를 하려 하는데 반영이 되지 않습니다. request에서 세팅해도 마찬가지입니다. 쿠키 세팅이 되지 않는 원인에 대해 알고 계신가요?? export default async function middleware(request: NextAuthRequest) { if (request.nextUrl.pathname.startsWith("/gateway")) { const token = await getToken({ req: request, secret: process.env.AUTH_SECRET as string, secureCookie: process.env.NODE_ENV === "production", }); const accessToken = token?.accessToken; const { device } = userAgent(request); request.headers.set("Accept", "*/*"); request.headers.set("Authorization", `Bearer ${accessToken}`); request.headers.set("Access-Control-Allow-Origin", "*"); request.headers.set("deviceType", "1"); request.headers.set("User-Agent", device.model ?? ""); request.headers.set("locale", localeFromCookie); request.headers.set("language", defaultLocale); const response = NextResponse.next({ request: request.headers }); response.cookies.set("test", "test"); return response; } ... }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew 실행 시 다음과 같은 오류가 발생하는데 뭐가 문제일까요?
강의를 보면서 cmd 실행후 helloC:\Users\Desktop\Study\hello-spring\hello-spring> 에서 gradlew build를 실행하면 해당 에러가 계속 뜨네요 검색해봐도 안나오고 너무 답답합니다 ㅠ
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
object 컬럼명 선택
그냥 object라고 쓸 때가 있고 ""붙이는 경우도 있는데, 이 차이가 궁금합니다
-
미해결Spring Boot JWT Tutorial
Spring boot 3.x버전에서 data.sql 오류 발생할 경우
data.sql -> import.sql로 이름 변경user 테이블 명을 users나 다른 테이블 명으로 수정해야 하며 sql 쿼리문에서의 ""는 삭제해야 합니다. package com.sixplace.user; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.*; import java.util.Set; @Entity @Table(name = "users") @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor public class User { @JsonIgnore @Id @Column(name = "user_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long userId; @Column(name = "username", length = 50, unique = true) private String username; @JsonIgnore @Column(name = "password", length = 100) private String password; @Column(name = "nickname", length = 50) private String nickname; @JsonIgnore @Column(name = "activated") private boolean activated; @ManyToMany @JoinTable( name = "user_authority", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "authority_name")}) private Set<Authority> authorities; } insert into users (username, password, nickname, activated) values ('admin', '$2a$08$lDnHPz7eUkSi6ao14Twuau08mzhWrL4kyZGGU5xfiGALO/Vxd5DOi', 'admin', 1); insert into users (username, password, nickname, activated) values ('user', '$2a$08$UkVvwpULis18S19S5pZFn.YHPZt3oaqHZnDwqbCW9pft6uFtkXKDC', 'user', 1); insert into authority (authority_name) values ('ROLE_USER'); insert into authority (authority_name) values ('ROLE_ADMIN'); insert into user_authority (user_id, authority_name) values (1, 'ROLE_USER'); insert into user_authority (user_id, authority_name) values (1, 'ROLE_ADMIN'); insert into user_authority (user_id, authority_name) values (2, 'ROLE_USER');
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
코랩 문서팝업 지우는 방법
안녕하세요.강의와 교재로 학습중입니다.코랩 환경에서 자꾸 문서 팝업이 떠서 불편하여 구글링을 해보았는데도 잘 안나와서혹시 방법을 아실까 하여 질문드립니다.사진과 같이 ( 를 칠때 이와 관련된 안내문서 창이 나타나는데, 이걸 안나타나게 하는 방법이 있을까요? 답변에 미리 감사드립니다.
-
미해결김영한의 실전 자바 - 기본편
private 접근 제어자
[질문 내용]Speaker 클래스에서 int volume를 private로 지정하였을 때 volume 필드는 외부에서 접근을 못하고 Speaker 내부에서만 접근을 할 수 있다 설명했습니다. 그렇다면, 예를 들어 volume 멤버 변수를 Speaker 클래스 내부에서 10을 대입한다고 했을 때 volume = 10; 라고 초기화를 하려고 하면 volume 변수가 존재하지 않는 오류가 발생합니다. 분명히 Speaker 내부 에서 선언된 volume 필드를 쓰려고 하는데 왜 자기 자신의 클래스에서 생성된 변수를 사용하지 못하는 거죠?
-
미해결OpenStack을 활용한 클라우드 환경 구축하기
오픈스택 인스턴스 로그인 불가 합니다. (6강 15분 41초)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. root kisec123 해도 자꾸 이럽니다. 더 이상 진행 자체가 안되고 있습니다.