inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

강의를 보고 연관관계 매핑을 하는데 모르겠습니다...

미해결

실전! 스프링 부트와 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 양방향 매핑이 맞다면 하나의 옷은 여러개의 카테고리를 가질 수 있고 하나의 카테고리 또한 여러개의 옷을 가질 수 있는데 다대다관계가 아닌 이유도 궁금합니다. 마지막으로 어떻게 생각해야 연관관계 매핑에 있어서 잘 지을 수 있을까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
kongminoo 댓글 2 좋아요 0 조회수 189

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> 아무리 호출하고 수정해도 계속 오류가 납니다 이유 좀 알려주세요 ㅠ

  • react
  • node.js
  • seo
  • graphql
  • next.js
이 규성 댓글 3 좋아요 0 조회수 214

수업과는 조금 다른 실무 id취향 질문이 있습니다!

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

안녕하세요, 테이블 생성중에 id관련된 내용을 보다가 궁금한게 생겨 질문 남깁니다! 개발자에 따라서 유한한 bigint로 이루어진 고유 id를 극혐하고 이론상 거의 무한한 uuid를 사용해야한다 주장하시는 분들이 꽤나 많던데, 태현님께서는 어떻게 생각하시나요? 저는 개인적으로 실무에서도 uuid대신 bigint로 이루어진 id를 사용중에 있고, 유저에게 노출이 필요한 유저 고유번호만 내부에서 사용하는 id값 이외에 uuid칼럼을 따로 만들어서 관리하거든요 🤔 🤔 만약에 uuid를 사용한다면 조회의 성능이랑.. auto_increment를 사용할 수 없으니 매 번 insert문마다 서비스로직에서 uuid를 만들어서 넘겨야 하는것에 대해서도 그래야만 하는지 좀 의문이 있기도 하구요

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
김영욱 댓글 2 좋아요 1 조회수 192

TodoItem 컴포넌트에서 todos를 props로 받았는데 렌더링이 되지 않습니다.

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨 질문 하시기 전에 꼭 확인해주세요 - 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다) - 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다) - 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢) 질문 하실때 꼭 확인하세요 - 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X) - 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지) - 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우) - 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요 - 강의의 몇 분 몇 초 관련 질문인지 알려주세요! - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강의 4분정도에서 나오는 내용에 TodoItem컴포넌트에서 List로부터 todos를 받았는데 렌더링이 제대로 되지 않습니다. 오타도 확인해봤지만 모르겠습니다ㅠㅠ

  • javascript
  • react
  • node.js
박보경 댓글 2 좋아요 0 조회수 292

JPA, DB 연동 관련 오류 질문

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요 영한님 JPA 활용1 강의의 JPA와 DB 설정, 동작확인 파트를 실습하다가 오류가 생겨 질문남겨요 3시간 동안 검색해도 해결하지 못했어요.. MemberRepository 테스트 시 아래와 같은 오류가 발생해 해결하고자 합니다. 아마 application.yml 쪽 문제 같은데 강의와 똑같이 따라했는데도 불구하고 오류가 발생하네요.. H2는 확실히 켜고 테스트 시도했습니다. 아래는 강의를 보며 따라한 프로젝트입니다. https://drive.google.com/file/d/1BvWBkoHE0fjdIFABmGeiOMDLuG-pKdwP/view?usp=sharing

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
비랑 댓글 2 좋아요 0 조회수 169

Test 결과 화면이 다른 거 같은데 설정 문제일까요?

미해결

토비의 스프링 6 - 이해와 원리

토비님 강의 재밌게 보고 있습니다 그런데 강의 중에 토비님이 테스트를 실행하면 테스트 터미널 창에 > Task 이런 식으로 뭔가 많이 뜨던데 저는 문구가 따로 나오지 않네요 정상적인 결과일까요?

  • java
  • spring
jackt0506 댓글 2 좋아요 0 조회수 236

nextjs middleware에서 쿠키 업데이트에 관한 질문입니다.

미해결

Next + React Query로 SNS 서비스 만들기

안녕하세요 프로젝트 진행 중에 해결되지 않는 부분이 있어 질문 드립니다. 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; } ... }

  • react
  • next.js
  • react-query
  • next-auth
  • msw
박지수 Jisu Park 댓글 1 좋아요 0 조회수 294

gradlew 실행 시 다음과 같은 오류가 발생하는데 뭐가 문제일까요?

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

강의를 보면서 cmd 실행후 helloC:\Users\Desktop\Study\hello-spring\hello-spring> 에서 gradlew build를 실행하면 해당 에러가 계속 뜨네요 검색해봐도 안나오고 너무 답답합니다 ㅠ

  • java
  • spring
  • mvc
  • spring-boot
박인유 댓글 2 좋아요 0 조회수 378

private 접근 제어자

미해결

김영한의 실전 자바 - 기본편

[질문 내용] Speaker 클래스에서 int volume를 private로 지정하였을 때 volume 필드는 외부에서 접근을 못하고 Speaker 내부에서만 접근을 할 수 있다 설명했습니다. 그렇다면, 예를 들어 volume 멤버 변수를 Speaker 클래스 내부에서 10을 대입한다고 했을 때 volume = 10; 라고 초기화를 하려고 하면 volume 변수가 존재하지 않는 오류가 발생합니다. 분명히 Speaker 내부 에서 선언된 volume 필드를 쓰려고 하는데 왜 자기 자신의 클래스에서 생성된 변수를 사용하지 못하는 거죠?

  • java
  • 객체지향
댓글 1 좋아요 -1 조회수 141

섹션8. ▶ openWeatherMap API 부분 질문있습니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

const weatherSearch = function (position) { fetch( `https://api.openweathermap.org/data/2.5/weather?lat=${position.latitude}&lon=${position.longitude}&exclude={part}&appid=b53e0e301571ed81576201a2a4fee23b` ); }; const accessToGeo = function (position) { const positionObj = { latitude: position.coords.latitude, longitude: position.coords.longitude, }; weatherSearch(positionObj); console.log(position.latitude); }; const askForLocation = function () { navigator.geolocation.getCurrentPosition(accessToGeo, (err) => { console.log(err); }); }; askForLocation(); 위 코드 13번째 줄에서 console.log(position.latitude);를 하면 저는 undefined가 출력되고, console.log(position.coords.latitude);를 해야 위도 값이 나오는데... 강사님께서는 console.log(position.latitude); 라고 코드를 작성하셨는데, 위도 값이 잘 나오더라고요.. 이게 왜 그런지 별건 아니지만 궁금해서 질문남깁니다!

  • react
  • node.js
  • seo
  • graphql
  • next.js
jihun6548 댓글 1 좋아요 0 조회수 139

각 섹션의 강의 목표을 알고 싶습니다.

해결됨

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)

안녕하세요 강사님, 강사님 강의는 다른 강사님들 강의와는 다르게 먼저 한번 전체적으로 다뤄주고나서 나중에 세세히 강의해주시는것 같습니다. 지금 장고핵심기능 리뷰를 보고 있는데, 각 섹션마다 수강생들이 어떤 부분을 염두하고 보면 좋은지를 알려주시면, 혹은 어떤 목적으로 섹션을 나눴는지를 알려주시면 제가 강의를 이해하고 앞으로 강의를 듣는데 좀더 이해가 잘 될거같습니다. 감사합니다.

  • react
  • python
  • django
  • web-api
  • htmx
sunnnwo 댓글 2 좋아요 0 조회수 230

소스코드가 없습니다 도와주세요

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

제가 뭘 틀렸는지 잘 모르겠습니다.. src 파일에 들어가면 선생님 강의에선 소스코드들이 주루룩 뜨는데, 전 안 뜨고 'Main' 하나밖에 없습니다. 애초에 java-start 파일 하나만 있고 java-start 압축파일은 안 보입니다. 왜 이러는걸까요??? ㅠㅠㅠㅠㅠㅠ 소스코드들이 왜 없는건지 모르겠습니다

  • java
  • 객체지향
오리너구리푸딩 댓글 2 좋아요 0 조회수 333

Api 관련질문

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

@GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name){ Hello hello = new Hello(); hello.setName(name); return hello; } static class Hello{ private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } } 위처럼 APi사용하려는데 이렇게 한국어로 입력 시 문자가 깨지는 현상이 발생합니다 설정은 다음과 같습니다

  • java
  • spring
  • mvc
  • spring-boot
DG Y 댓글 1 좋아요 0 조회수 85

다운로드 소스코드가 계속 안됩니다 ㅠㅠ 도와주세요..

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

[질문 내용] 그냥 나오는대로 다 예 예 누르고 맞게 한 것 같은데 계속 다른 위치에 저장하라고 뜹니다 선생님 ㅠㅠ 프로젝트를 몇 번이나 삭제하고 다시 깔고 실행했는데도 다운로드 소스코드가 실행이 안됩니다 파일 다운로드 위치도 계속 바꿔봤는데 똑같이 뜹니다 이유가 뭘까요? ㅠㅠㅠ...

  • java
  • InteliJ
댓글 1 좋아요 0 조회수 388

<img /> 요소 대신 <Image /> 컴포넌트를 사용해야 하는 이유 (성능 최적화)

미해결

Next.js 시작하기

섹션 11의 이미지 성능 최적화 강의에서 Next.js의 이미지 성능 최적화에 대해 설명하실 때의 강의 코드가 <Image /> 컴포넌트가 아닌 <img /> 요소인데도 이미지 성능 최적화가 잘 되는 것을 보았습니다. 그럼 굳이 <img /> 요소 대신 <Imgae /> 컴포넌트를 사용해야 하는 이유가 있나요?

  • javascript
  • react
  • next.js
  • imgae컴포넌트
  • 성능최적화
  • lazyloading
  • 지연로딩
play _Er 댓글 2 좋아요 0 조회수 277

Edit page onUpdate 질문

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

onUpadate를 주석처리하면 home으로 잘 돌아오는데, onUpadate를 실행하면 위 사진 같은 상태가 됩니다. 매번 오탈자로 질문드려서 죄송하지만 코드를 계속 살펴보고 다시 작성해봐도 같아서 질문드립니다... import Header from "../components/Header"; import Button from "../components/Button"; import Editor from "../components/Editor"; import { useParams, useNavigate } from "react-router-dom"; import { useContext } from "react"; import { DiaryDispatchContext } from "../App"; import useDiary from "../hooks/useDiary"; const Edit = () => { const params = useParams(); const nav = useNavigate(); const { onDelete, onUpdate } = useContext(DiaryDispatchContext); const curDiaryItem = useDiary(params.id); const onClickDelete = () => { if (window.confirm("일기를 정말 삭제할까요? 다시 복구되지 않아요!")) { //일기 삭제 로직 //console.log(params.id); onDelete(params.id); nav("/", { replace: true }); } }; const onSubmit = (input) => { if (window.confirm("일기를 정말 수정할까요?")) { onUpdate( params.id, input.createdDate.getTime(), input.emotionId, input.content ); } nav("/", { replace: true }); }; return ( <div> <Header title={"일기 수정하기"} leftChild={<Button onClick={() => nav(-1)} text={"< 뒤로 가기"} />} rightChild={ <Button onClick={onClickDelete} text={"삭제하기"} type={"NEGATIVE"} /> } /> <Editor initData={curDiaryItem} onSubmit={onSubmit} /> </div> ); }; export default Edit;

  • javascript
  • react
  • node.js
ju004100 댓글 2 좋아요 0 조회수 142

기본 생성자 사용자 정의 시 null

미해결

김영한의 실전 자바 - 기본편

[질문 내용] 문제 풀이 과정에서 Book 클래스에 기본 생성자를 사용자가 직접 정의해서 만들었는데, 김영한 강사님께서 값을 비워두면 안 된다고 한 말씀이 의아해서 질문 드립니다. 교육 차원으로 문제에서 null값이 아닌 빈 값으로 보여주게 하기 위해서 this("", "", 0);으로 표시한 것인지, 아니면 실무에서도 기본 생성자를 개발자가 정의할 때에도 꼭 값을 비워두면 안 된다는 것인지 궁금합니다.

  • java
  • 객체지향
soojinkimss 댓글 1 좋아요 0 조회수 147

this 이해가 잘 안돼요..

미해결

김영한의 실전 자바 - 기본편

[질문 내용] 김영한 강사님께서는 this가 예를 들어 nameField에서 먼저 지역변수(매개변수(에서 같은 이름이 있는지 찾고 없으면 멤버 변수에서 찾는다고 애기해주셨고 자바가 자동으로 this를 해준다고도 설명해주셨는데, 자바 입문편에서 배웠을 때 자신의 클래스에 변수를 타입지정하여 선언하면 하위 메소드나 앞으로도 타입 없이 변수명만으로 생존가능한 것으로 알고있습니다. 물론 매개변수의 이름과 멤버변수 이름이 동일하면 왜 this를 써야하는지는 알겠으나, 매개변수명과 멤버변수명이 다르다면 자바가 this를 자동으로 설정하는 설명 전에 일단 멤버변수와 매개변수가 구분을 지을 수 있으니 굳이 this를 설명할 이유가 있나 싶습니다. 애초에 멤버변수를 선언을 했으니 멤버변수를 자유롭게 사용할 수 있는데 거기에 this가 없어도 된다는 내용이 아이러니 하다고 생각이 드네요. 좀 디테일하게 알려주실 수 있을까요?

  • java
  • 객체지향
soojinkimss 댓글 1 좋아요 0 조회수 224

scondTask관련 질문있습니다!

해결됨

실리콘밸리 엔지니어와 함께하는 Gradle

안녕하세요 강사님 task firstTask { println "Hello World" doFirst(){ println "First action!!" } doLast(){ println "Last action!!" } } task secondTask { doFirst(){ println "First action in secondTask" } doLast(){ println "Last action in secondTask" } } 위와 같이 task를 작성하였습니다! secondTask를 작성할 때는 Hello World를 지운 상태로 실행을 했는데도 gradle sT를 이용해서 sT를 실행하는 터미널 명령어를 사용했습니다! > Configure project : Hello World 가 터미널에 출력되는 이유를 알 수 있을까요??

  • java
  • scala
  • gradle
  • scala-3
  • compiler
hong090992 댓글 2 좋아요 0 조회수 191

인기 태그

인프런 TOP Writers

주간 인기글