inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

JAVA에 ContentBean의 content_data가 int형이여도 되는이유가 뭔가요

미해결

윤재성의 만들면서 배우는 Spring MVC 5

안녕하세요. 현재 강의에서 XML, JAVA 모두 kr.co.softcampus.beans 패키지 안에 ContentBean.java 클래스에서 content_data변수를 String으로 사용하고 있습니다. 하지만, java프로젝트에서 String이 아니라 int로 설정하여도 작동되어서 문의드립니다. 왜 그런가요? XML의 경우는 안된다고 나옵니다.(당연히..)

  • MVC
  • java
  • spring
  • XML
it 댓글 1 좋아요 0 조회수 213

getter setter 인텔리제이에서 만드는 법

미해결

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

안녕하세요. getter setter를 만들려고 했는데 alt+Insert를 해도 generate에 test와 copyright만 뜨고 다른게 뜨지를 않습니다. 이럴땐 getter setter를 어떻게 만들어야 할까요 ㅠㅠ.. 구글링을 해봐도 모두 generate를 누르면 다 getter setter 탭이 뜨는데 인텔리제이 사용이 처음이라 어렵네요 ㅠㅠ..

  • gettersetter
  • java
  • MVC
  • spring
  • spring-boot
지향 댓글 2 좋아요 0 조회수 1871

메모리 데이터 조회 예제를 해보고 있는데 폼 데이터를 하나 더 추가하니 조회가 안됩니다.

미해결

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

안녕하세요. 회원 목록 Memory 에 저장하는거를 토대로 그냥 시간, 할 일 데이터를 받아와서 출력하는 예제를 해보고 있습니다. ( 수업 때 진행하셨던 부분을 토대로 한거라 구조는 같은데 Model에 date,work 가 저장되어 변수 하나 더 추가해서 해보는 중입니다. ) - 날짜, 할 일을 입력 받는 것까지 되는거는 확인 했습니다. - 1 을 보시면 아시다 싶이 id 값은 출력이 됩니다. 그런데 date 와 work 로 설정해놓은 데이터들이 출력이 안됩니다. 소스파일은 zip 파일로 묶어서 구글드라이브에 올려놨습니다. ( https://drive.google.com/file/d/1aTSxDKgxCr-do_l9oV0zNX3NTc7jDfRN/view?usp=sharing ) 한번 확인 가능하시면 어떤 부분을 놓치고 있는 것인지 조언 부탁드립니다.

  • spring
  • java
  • spring
  • java
  • spring-boot
  • MVC
준준 댓글 2 좋아요 0 조회수 329

select 에 option태그 관련

미해결

[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드

선생님! option태그에 value="" 이부분은 그냥 공백으로 비워놔도 상관없는지 궁금해요

  • HTML/CSS
  • jquery
  • 웹 디자인
psk1710 댓글 1 좋아요 1 조회수 239

이미지가 안보입니다...ㅠ(도움이 필요합니다!! 꼭 봐주세요!)

미해결

애플 웹사이트 인터랙션 클론!

안녕하세요 선생님 강의 잘 듣고 있습니다! 다름이 아니라 밑에 수강생분 처럼 저도 이미지가 안보이고 Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or OffscreenCanvas or SVGImageElement or VideoFrame)'. 이런 에러가 계속 뜨는데.. 어떻게 해야할지 모르겠습니다..ㅠㅠㅠ 분명 계속 이미지 경로도 확인하고 문제가 없는거같은데...대체 뭐가 문제인지 도움이 필요합니다..!! 너무 해결이 안되니까 꼭...해결하고싶습니다.. 잘되던 텍스트 애니메이션도 작동이 안됩니다. 보니까 playanimaion함수에서 sequence도 console.log에 찍으면 undefined로 찍히는데 도저히 뭐가 잘못 됐는지 모르겠습니다. 선생님이 주신 완성 코드를 대입해도 안뜨네요ㅠㅠㅠ (() => { let yOffset = 0; // window.pageYOffset대신 쓸 변수 let prevScrollHeight = 0; //현재 스크롤 위치(yOffset)보다 이전에 위치한 스크롤 섹션들의 높이값의 합 let currentScene = 0; //현재 활성화된(눈 앞에 보고있는) 씬(scroll-section) // sceneInfo는 애니메이션을 처리하는 정보를 담아놓는 변수 let enterNewScene = false;//새로운 scene이 시작되는 순간 true로 바뀜 const sceneInfo = [ { //0 type: 'sticky', heightNum:5,//브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, // 애니메이션을 조작할 오브젝트를 objs에 담음 objs:{ container: document.querySelector('#scroll-section-0'), messageA: document.querySelector('#scroll-section-0 .main-message.a'), messageB: document.querySelector('#scroll-section-0 .main-message.b'), messageC: document.querySelector('#scroll-section-0 .main-message.c'), messageD: document.querySelector('#scroll-section-0 .main-message.d'), canvas: document.querySelector('#video-canvas-0'), //context객체의 메서드인 getContext를 인자 2d를 넣어 호출해 그림을 그려주는 기초를 연다. context: document.querySelector('#video-canvas-0').getContext('2d'), //비디오 이미지를 배열에 넣을 예정이다. videoImages: [] }, //오브젝트를 어느시점에 보이고 안보이게 할지를 담을 곳 css제어 //시작값 :0 끝값 :1 values: { videoImageCount: 300, //스크롤에 따른 이미지 순서의 [초기값,최종값] messageA와 다르게 섹션의 부분에서 실행될 이미지가 아닌 한스크롤에서 쭉 이어지므로 start,end구간이 필요없다 imageSequence:[0 , 299], messageA_opacity_in: [0, 1, { start: 0.1, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.3, end: 0.4 }], //30%~ 40% messageC_opacity_in: [0, 1, { start: 0.5, end: 0.6 }], messageD_opacity_in: [0, 1, { start: 0.7, end: 0.8 }], // 글자를 20%에서 0으로 가는건데 %는 css에 나중에 작업할 예정 세번째 인수에는 타이밍이 들어간다(=어느 타이밍에 효과를 줄것인가) messageA_translateY_in: [20, 0, { start: 0.1, end: 0.2 }], messageB_translateY_in: [20, 0, { start: 0.3, end: 0.4 }], messageC_translateY_in: [20, 0, { start: 0.5, end: 0.6 }], messageD_translateY_in: [20, 0, { start: 0.7, end: 0.8 }], messageA_opacity_out: [1, 0, { start: 0.25, end: 0.3 }], messageB_opacity_out: [1, 0, { start: 0.45, end: 0.5 }], messageC_opacity_out: [1, 0, { start: 0.65, end: 0.7 }], messageD_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], messageA_translateY_out: [0, -20, { start: 0.25, end: 0.3 }], messageB_translateY_out: [0, -20, { start: 0.45, end: 0.5 }], messageC_translateY_out: [0, -20, { start: 0.65, end: 0.7 }], messageD_translateY_out: [0, -20, { start: 0.85, end: 0.9 }] // messageA_opacity:[200,900] } }, { //1 type: 'normal', //heightNum은 scrollHeight를 결정할 때 innerheight의 몇배로 할지 정해주는 수 였는데 normal은 원래 본인 default높이로 설정하므로 필요가 없다 // heightNum:5, scrollHeight: 0, objs:{ container: document.querySelector('#scroll-section-1') } }, { //2 type: 'sticky', heightNum:5, scrollHeight: 0, objs:{ container: document.querySelector('#scroll-section-2'), messageA: document.querySelector('#scroll-section-2 .a'), messageB: document.querySelector('#scroll-section-2 .b'), messageC: document.querySelector('#scroll-section-2 .c'), pinB: document.querySelector('#scroll-section-2 .b .pin'), pinC: document.querySelector('#scroll-section-2 .c .pin') }, values: { messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }], messageB_translateY_in: [30, 0, { start: 0.5, end: 0.55 }], messageC_translateY_in: [30, 0, { start: 0.72, end: 0.77 }], messageA_opacity_in: [0, 1, { start: 0.15, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.5, end: 0.55 }], messageC_opacity_in: [0, 1, { start: 0.72, end: 0.77 }], messageA_translateY_out: [0, -20, { start: 0.3, end: 0.35 }], messageB_translateY_out: [0, -20, { start: 0.58, end: 0.63 }], messageC_translateY_out: [0, -20, { start: 0.85, end: 0.9 }], messageA_opacity_out: [1, 0, { start: 0.3, end: 0.35 }], messageB_opacity_out: [1, 0, { start: 0.58, end: 0.63 }], messageC_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], pinB_scaleY: [0.5, 1, { start: 0.5, end: 0.55 }], pinC_scaleY: [0.5, 1, { start: 0.72, end: 0.77 }], pinB_opacity_in: [0, 1, { start: 0.5, end: 0.55 }], pinC_opacity_in: [0, 1, { start: 0.72, end: 0.77 }], pinB_opacity_out: [1, 0, { start: 0.58, end: 0.63 }], pinC_opacity_out: [1, 0, { start: 0.85, end: 0.9 }] } }, { //3 type: 'sticky', heightNum:5, scrollHeight: 0, objs:{ container: document.querySelector('#scroll-section-3') } } ]; function setCanvasImages() { let imgElem; for (let i = 0; i < sceneInfo[0].values.videoImageCount; i++){ //이미지 객체가 만들어짐 new Image(); 대신에 document.createElement('img')랑 같은말이다. imgElem = new Image(); imgElem.src = `./video/001/IMG_${6726 + i}.JPG`; sceneInfo[0].objs.videoImages.push(imgElem); } } setCanvasImages(); function setLayout() { //각 스크롤 섹션의 높이 세팅 for (let i = 0; i < sceneInfo.length; i++){ if (sceneInfo[i].type === 'sticky') { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === 'normal') { //container본연의 높이로 가져와서 그 크기만큼으로만 normal부분을 설정한다. sceneInfo[i].scrollHeight = sceneInfo[i].objs.container.offsetHeight; } sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`; } yOffset = window.pageYOffset; let totalScrollHeight = 0; for (let i = 0; i < sceneInfo.length; i++){ totalScrollHeight += sceneInfo[i].scrollHeight; if (totalScrollHeight >= yOffset) { currentScene = i; break; } } // 변수랑 문자열이 섞여있으면 ``을 써야한다. document.body.setAttribute('id', `show-scene-${currentScene}`); // console.log(sceneInfo); //초기화 할 때 실행되는 setLayout은 currentScene이 정해지지 않은 상태에서 currentScene을 구하는 것이고, // 스크롤 할 때마다 실행되는 scrollLoop는 현재 활성화된 currentScene 까지의 스크롤양(prevScrollHeight)을 기준으로 일정량의 스크롤이 지나갔을 때 currentScene을 +1 또는 -1 하는 것이랍니다. } function calcValues(values, currentYOffset) { //여기서 인자 currentYOffset은 현재 씬에서 얼마나 스크롤 됐는지 //현재 섹션에서 얼마나 스크롤 되었는지를 비율로 구한다 스클로의 비율을 0~1사이로 정한다. 비율을 구해서 그 값을 css값에 대입해준다. //yoffset변수는 전체 레이아웃에서 스크롤이 어디 위치해있는지 알려주는 변수이다. 현재 씬에서 스크롤이 얼마나됐는지는 알 수 없다. let rv; const scrollHeight = sceneInfo[currentScene].scrollHeight; //현재 씬(스크롤섹션)에서 스크롤된 범위를 비율로 구하기 ==>let scrollRation = 현재 씬에서 스크롤된 값 / 현재 씬 전체 const scrollRatio = currentYOffset / sceneInfo[currentScene].scrollHeight; if (values.length === 3) { // start~end사이에 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if (currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd) { rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0]; } else if (currentYOffset < partScrollStart) { //스크롤섹션에서 스크롤이 start에 도달하지 못했을 때 rv = values[0]; //opacity가 0이라는 뜻 } else if (currentYOffset > partScrollEnd) { //스크롤섹션에서 스크롤이 end를 완전히 벗어났을 때 rv = values[1]; //opacity가 1이라는 뜻 } else { rv = scrollRatio * (values[1] - values[0]) + values[0]; } // rv = parseInt(scrollRatio * (values[1] - values[0]) + values[0]); return rv; } } //애니메이션 함수 function playAnimation() { // 모든 섹션에 애니메이션을 주는 것은 비효율적이므로 switch문을 이용해서 현재 보고있는 섹션의 요소에만 애니메이션을 준다 const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset - prevScrollHeight; const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / sceneInfo[currentScene].scrollHeight; switch (currentScene) { case 0: let sequence = calcValues(values.imageSequence, currentYOffset); objs.context.drawImage(objs.videoImages[sequence], 0, 0); console.log(sequence); if (scrollRatio <= 0.22) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objs.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break; case 2: // console.log('2 play'); if (scrollRatio <= 0.25) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.57) { // in objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.83) { // in objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break; case 3: // console.log('3 play'); break; } } // keyframe이란: 애니메이션이 진행중에 변화가 있는 지점을 keyframe이라고 한다. function scrollLoop() { enterNewScene = false; prevScrollHeight = 0;//누적을 막기 위해서 // 현재 보고잇는 section이 몇번째 section인지 판별하려고함 for (let i = 0; i < currentScene; i++){ prevScrollHeight = prevScrollHeight + sceneInfo[i].scrollHeight; } // console.log(prevScrollHeight); if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight) { enterNewScene = true; currentScene++; document.body.setAttribute('id', `show-scene-${currentScene}`); // setLayout함수에서 이미 id값이 정해져있지만 스크롤에 변함에 따라 체크하는 방식으로 쓴다 } if (yOffset < prevScrollHeight) { if (currentScene === 0) return;//브라우저 바운스 효과로 인해 마이너스가 되는 것을 방지(모바일) enterNewScene = true; currentScene--; document.body.setAttribute('id', `show-scene-${currentScene}`); } // console.log(currentScene); // enterNewScene이 참이라는것은 씬이 바뀌는순간인 것이고 참일때 return, 즉 playAnimation함수를 한타임 실행하지 않는다는것으로 음수값이 무시되고 다시 playAnimation함수가 실행된다. if (enterNewScene) return; playAnimation(); } window.addEventListener('scroll', () => { yOffset = window.pageYOffset; scrollLoop(); }); window.addEventListener('load', setLayout); // window의 모든 문서(html, 이미지, 동영상..)가 완료되고 나서 // 레이아웃 잡는 setLayout함수를 실행한다 // window.addEventListener('DOMContentLoaded', setLayout); //반대로 window의 html구조들만 완료되면 반대로 이미지는 로드되지않아도 setlayout함수를 실행하는것 //인데 load보다는 빨리 setlayout을 실행한다. window.addEventListener('resize', setLayout); // 윈도우가 리사이즈 되었을 때 setLayout을 호출한다 })(); <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>AirMug Pro</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;900&display=swap" rel="stylesheet"> <link rel="stylesheet" href="css/default.css"> <link rel="stylesheet" href="css/main.css"> <script defer src="js/main.js"></script> </head> <body> <div class="container"> <nav class="global-nav"> <div class="global-nav-links"> <a href="#" class="global-nav-item">Rooms</a> <a href="#" class="global-nav-item">Ideas</a> <a href="#" class="global-nav-item">Stores</a> <a href="#" class="global-nav-item">Contact</a> </div> </nav> <nav class="local-nav"> <div class="local-nav-links"> <a href="#" class="product-name">AirMug Pro</a> <a href="#">개요</a> <a href="#">제품사양</a> <a href="#">구입하기</a> </div> </nav> <section class="scroll-section" id="scroll-section-0"> <h1>AirMug Pro</h1> <!-- p태그의 값들을 sticky, 즉 스티커처럼 고정해놓고 스트롤의 값에 따라 보여지도록 p태그를 감싸고 있는 div에 class를 준다. --> <div class="sticky-elem sticky-elem-canvas"> <canvas id ="video-canvas-0" width="1920px" height="1080px"></canvas> </div> <div class="sticky-elem main-message a"> <p>온전히 빠져들게 하는<br>최고급 세라믹</p></div> <div class="sticky-elem main-message b"> <p>주변 맛을 느끼게 해주는<br>주변 맛 허용 모드</p> </div> <div class="sticky-elem main-message c"> <p>온종일 편안한<br>맞춤형 손잡이</p> </div> <div class="sticky-elem main-message d"> <p>새롭게 입가를<br>찾아온 매혹</p> </div> </section> <section class="scroll-section" id="scroll-section-1"> <p class="description"> <strong>보통 스크롤 영역</strong> Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas minus praesentium incidunt tempora repellendus? Laudantium sed excepturi quo nemo quisquam totam, cumque nam sit incidunt, corrupti libero temporibus obcaecati enim facilis dolore itaque minima dolorem sequi explicabo. Modi alias in ullam labore, minima voluptates ipsa ex laborum deleniti tempora incidunt architecto iure aut, molestias ab! Fugiat aliquam veritatis ad voluptatibus, quaerat officia doloribus aliquid nulla repellat quidem rem magni perferendis labore similique reprehenderit aut. Cum quis omnis ex iusto natus iste nisi magnam, nesciunt fugit aspernatur ullam? Temporibus, dolores ipsa. Odit odio aliquam sunt error corporis ab facere, illum sequi! Explicabo nulla, ipsum necessitatibus laboriosam eligendi aspernatur quam nostrum. Debitis est ad, vel in corrupti voluptas laboriosam quo, reiciendis quos quas culpa, atque voluptate tempora tempore quam accusamus ipsa asperiores voluptatibus adipisci non vero aspernatur eum nesciunt quis. A cum, molestiae eaque repellat similique esse eligendi reprehenderit amet omnis minus quae voluptatum delectus dolores repudiandae? Distinctio aut aspernatur, iure nemo, eum soluta error necessitatibus minus voluptatum laborum rem dignissimos quae. Error ut recusandae ullam magnam quas molestiae repellat culpa. Ab nihil sint voluptatum in? Enim suscipit debitis earum culpa sint maxime hic, repudiandae nulla ad error voluptatem fugiat blanditiis odit! </p> </section> <section class="scroll-section" id="scroll-section-2"> <div class="sticky-elem main-message a"> <p> <small>편안한 촉감</small> 입과 하나 되다 </p> </div> <div class="sticky-elem desc-message b"> <p> 편안한 목넘김을 완성하는 디테일한 여러 구성 요소들, 우리는 이를 하나하나 새롭게 살피고 재구성하는 과정을 거쳐 새로운 수준의 머그, AirMug Pro를 만들었습니다. 입에 뭔가 댔다는 감각은 어느새 사라지고 오롯이 당신과 음료만 남게 되죠. </p> <div class="pin"></div> </div> <div class="sticky-elem desc-message c"> <p> 디자인 앤 퀄리티 오브 스웨덴,<br>메이드 인 차이나 </p> <div class="pin"></div> </div> </section> <section class="scroll-section" id="scroll-section-3"> <p class="mid-message"> <strong>Retina 머그</strong><br> 아이디어를 광활하게 펼칠<br> 아름답고 부드러운 음료 공간. </p> <p class="canvas-caption"> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eveniet at fuga quae perspiciatis veniam impedit et, ratione est optio porro. Incidunt aperiam nemo voluptas odit quisquam harum in mollitia. Incidunt minima iusto in corporis, dolores velit. Autem, sit dolorum inventore a rerum distinctio vero illo magni possimus temporibus dolores neque adipisci, repudiandae repellat. Ducimus accusamus similique quas earum laborum. Autem tempora repellendus asperiores illum ex! Velit ea corporis odit? Ea, incidunt delectus. Sapiente rerum neque error deleniti quis, et, quibusdam, est autem voluptate rem voluptas. Ratione soluta similique harum nihil vel. Quas inventore perferendis iusto explicabo animi eos ratione obcaecati. </p> </section> <footer class="footer"> 2020, 1분코딩 </footer> </div> </body> </html>

  • HTML/CSS
  • 웹 디자인
  • 인터랙티브-웹
  • svg
  • javascript
  • 클론코딩
jayoo8665 댓글 2 좋아요 0 조회수 864

MemberRepository 에서 cannot find symbol 오류

미해결

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

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요!! 동영상 강의 잘 보고 있습니다. 강의 내용 대로 따라서 하고 있는데 MemberRepository 를 작성하고 나면 cannot find symbol 오류가 발생합니다. 자동으로 import 되는게 강의와 다르게 import java.lang.reflect.Member; 로 되고 있습니다. 동영상 강의에는 import hello.hellospring.domain.Memeber; 되어 있는데 여기에서 오류가 발생하고 있습니다. 어느 부분이 잘못 됐을까요.. package hello.hellospring.repository ; import java.lang.reflect.Member ; import java.util.List ; import java.util.Optional ; public interface MemberRepository { Member save (Member member) ; Optional<Member> findById (Long id) ; Optional<Member> findByName (String name) ; List<Member> findAll () ; }

  • MemberRepository
  • member
  • java
  • MVC
  • spring
  • spring-boot
SSK 댓글 1 좋아요 0 조회수 1515

그림 불러오기

미해결

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

그랩마켓이라는 이미지 불러오기가 안되네요... 어떻게 해야될까요???

  • express
  • tensorflow
  • HTML/CSS
  • nodejs
  • javascript
  • 머신러닝 배워볼래요?
  • react-native
  • react
댓글 1 좋아요 0 조회수 244

csrf 토큰 과 jwt 토큰

미해결

스프링 시큐리티

제가 jwt를 사용하고 싶은데 그런 경우에는 jwt를 사용하면 csrf 기능을 사용하면 안되는 건가요?

  • Spring Security
  • java
  • spring-boot
seonjun Moon 댓글 1 좋아요 2 조회수 2447

Runwith, springboottest어노테이션이 없이 테스트 하면 어떻게 되나요?

미해결

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

이전에는 그 어노테이션 없이 test를 진행했던것같은데 이번에는 저 어노테이션이 추가가되어있네요 어떤 차이인거죠? runwith 어노테이션은 junit에 내장된 러너를 사용하는 대신 어노테이션에 정의된 러너 클래스(springrunner.class)를 사용한다는데.. junit에 내장된 러너랑 어노테이션에 정의된 러너클래스랑은 무슨차이인건가요?

  • JPA
  • 웹앱
  • spring
  • java
  • spring-boot
김민지 댓글 1 좋아요 1 조회수 1953

영속성 컨텍스트와 트랜잭션에 대한 질문입니다.

해결됨

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

안녕하세요 영한님. 늘 강의 잘 듣고 있습니다. 강의에서는 Controller단에서 찾아서 넘기면 JPA와 관계가 없는 애가 넘어온다고 하셔서 아래 코드로 테스트 해보았는데, 값이 변경되길래 조금 찾아보았고, 제가 이해한 것이 맞는건가 확인차 질문 올립니다. 1. Spring에서 Controller단의 경우 트랜잭션 범위 밖이기 때문에 읽기만 가능하며, 읽을때에도 영속성 컨텍스트에 등록은 된다. (기본적으로 open-in-view : true이기 때문에) 2. 하지만 말 그대로 "읽기"이기 때문에 persist / merge / flush 등을 호출시 에러를 터트려 트랜잭션 범위 밖에서는 값을 변경할 수 없다. 3. 그럼에도 아래의 코드로 item의 price와 name이 변경되는 것은 1번에 의해 item은 영속성 컨텍스트로 관리되고 있었기 때문이고 orderService의 order()가 종료될 때 플러시 발생 -> 더티체킹 동작시 DB에서 불러왔을때와 다르니 정상적으로 update 발생 4. 만약 application.yml에서 open-in-view : false로 변경 시 컨트롤러단에서 find 한 엔티티들은 영컨에 등록되지 않아 더티체킹도 안될 뿐더러 넘겨받은 member / item을 service단에서 그대로 사용하려 할 경우 에러 발생 (org.hibernate.LazyInitializationException: could not initialize proxy ) ``` @PostMapping ( "/order" ) public String order ( @RequestParam ( "memberId" ) Long memberId , @RequestParam ( "itemId" ) Long itemId , @RequestParam ( "count" ) int count) { // orderService.order(memberId, itemId, count); // 테스트 Member member = memberRepository .findOne(memberId) ; Item item = itemRepository .findOne(itemId) ; item.setPrice( 88888 ) ; // 더티체킹이 일어나는 시점은 트랜잭션 종료 지점이라 해당 지점에서는 변경이랑 관련이 없다 . // 그래서 트랜잭션이 있는 서비스 메소드 부분을 주석쳐버리면 변경은 일어나지 않는다 . // 얘네는 다 에러 // entityManager.flush(); // memberRepository.save(member); // itemRepository.save(item); orderService .order(member , item , count) ; return "redirect:/orders" ; } @Transactional public Long order (Member member , Item item , int count) { item.setName( " 변경된 책 이름 " ) ; // 배송정보 생성 Delivery delivery = new Delivery() ; delivery.setAddress(member.getAddress()) ; delivery.setStatus(DeliveryStatus. READY ) ; // 주문상품 생성 OrderItem orderItem = OrderItem. createOrderItem (item , item.getPrice() , count) ; // 주문 생성 Order order = Order. createOrder (member , delivery , orderItem) ; // 주문 저장 orderRepository .save(order) ; return order.getId() ; } ``` 으로 이해했는데 맞는지 모르겠습니다...

  • spring-boot
  • spring
  • java
  • 웹앱
  • JPA
kim.min.seok 댓글 1 좋아요 8 조회수 495

card영역이 footer 영역을 침범하여 문의드려요

미해결

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

강의 뒷부분에서 나온다고 댓글 확인했는데 아직 안나와서요.. height:100%는 어디다 적용되었는지 모르겠네요

  • HTML/CSS
  • nodejs
  • 머신러닝 배워볼래요?
  • tensorflow
  • javascript
  • react
  • express
  • react-native
기본땡땡이 댓글 2 좋아요 1 조회수 387

회원 관리 예제 - 웹 MVC 개발 / 회원 웹기능 - 조회를 듣고있는데

미해결

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

강사님 께서는 회원목록 버튼을 클릭하면 이러한 창이 뜨지만 제가 누를때는 이렇게 오류 창이 뜹니다 딱히 오류로 잡히는것도 없어서 단순히 제 코드 실수인가 싶어서 강의를 여러번 돌려가며 최대한 강사님의 코드를 그대로 타이핑 했는데도 오류가 계속 납니다. 다른분들 보니 H2관련해서 오류가 뜨는데 저는 아직 H2파트를 들어가기도 전이고 강사님도 아직 강의내에서 H2를 건드리지 않고 초기 제가 올렸던 사진 처럼 창이 떴는데 도대체 왜 오류가 나는지 궁금합니다 https://drive.google.com/file/d/187dnQjeFv08hwhpoNglqi6TrnZpRXZYI/view?usp=sharing

  • java
  • spring-boot
  • MVC
  • spring
댓글 1 좋아요 0 조회수 291

오늘부터 인터렉티브 공부 시작합니다

미해결

인터랙티브 웹 개발 제대로 시작하기

평소에도 인터랙티브 강의에 관심ㅇ 있었는데 마침 세일하길래 몽땅 사버렸습니다 오늘부터 천천히 공부를 시작해보겠습니다~~~

  • javascript
  • HTML/CSS
  • 인터랙티브-웹
댓글 1 좋아요 1 조회수 233

프록시 초기화 시 만들어지는 실제 엔티티

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

프록시 객체가 초기화 할 때 영속성 컨텍스트를 통해서 실제 엔티티를 생성하고 생성된 실제 엔티티를 프록시 객체의 target 변수에 참조해준다고 하셨는데 이 때 만들어진 실제 엔티티는 영속성 컨텍스트에 존재하고 있는 건가요? 그렇기 때문에 getReference() -> 초기화 -> find()의 과정을 했 을 때 find() 시점에 select 쿼리문이 안나오는 게 맞나요?

  • JPA
  • java
나 좀 도와줘요 댓글 1 좋아요 0 조회수 248

api 응답객체 네이밍 및 new에 대해

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

안녕하세요. 강의 너무 잘 보고 있습니다. 좋은 컨텐츠를 제공해주시는 인프런과 영한님, 서포터분들께 감사드립니다. api응답 객체 네이밍에 대해 질문이 있습니다. 등록,수정의 경우 응답객체 네이밍이 ~~Response 조회의 경우 MemberDTO 를 Result로 래핑해서 보내는데 DTO와 Response로 네이밍하는 기준이 있는지 궁금합니다. 또 하나는, 좀 엉뚱한 질문일 수도 있는데 응답시마다 new를 통해 응답객체를 생성하는데 대규모 시스템에 성능에 크게 문제가 없는지와 응답 객체를 싱글톤으로 만드는 패턴같은것도 있는지 궁금합니다. 감사합니다.

  • spring-boot
  • spring
  • java
  • JPA
cw k 댓글 1 좋아요 0 조회수 655

Connection is closed 에러발생(해결)

미해결

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

안녕하세요 강사님! 덕분에 수업 잘 듣고있습니다. 스프링 통합 테스트 강의에서, 테스트 코드의 join함수를 실행시켰더니 java.lang.IllegalStateException: java.sql.SQLException: Connection is closed 에러가 발생했습니다. 원인파악을 위해 join함수 처음부터 천천히 디버깅을 시도했는데, JdbcMemberRepository 클래스의 save함수에서 try 구문의 conn을 할당받는 첫번째 pstmt변수에서 IllegalStateException을 발생시켰습니다. 어떤 원인으로 에러가 발생했으며, 해결방법이 궁금합니다. 아래에 제가 작성한 오류와 연관된 코드들과 에러메시지 첨부합니다. *close함수에서 conn.close()를 close(conn)으로 수정했더니 해결됐습니다. [테스트코드] [JdbcMemberRepository 클래스] [MemberService 클래스] [에러메시지]

  • spring-boot
  • spring
  • MVC
  • java
한종승 댓글 4 좋아요 2 조회수 6699

Repository와 Service의 이해

미해결

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

안녕하세요! 강의를 다시 보다보니 제대로 이해한건지 확실히 하고 넘어가고 싶어서 글을 쓰게 되었습니다. Repository에서 interface로 선언한 것은 각 기능별로 저장할 때 어떤 타입? 으로 저장할지(list 등) 이며 이를 가지고 class에서 implements를 하여 실제 구현체를 만드는데 각 기능별로 저장한 값을 어떻게 반환할지 단순히 데이터의 저장을 위한 기능 Service에서는 앞서 Repository와 Domain에서 정한 것을 가지고 실제로 동작하는 기능(조건이 있다면 조건 로직, 검증을 해야한다면 검증 로직 포함)을 작성하는 것으로 이해했습니다. 실제 구현 할 때 Service 부분을이 아무래도 비즈니스 로직이다보니 해당 부분에서 오류가 발생한다면 전반적인 작동에도 문제가 생기겠죠?

  • spring-boot
  • spring
  • MVC
  • java
SeatSTAR 댓글 1 좋아요 1 조회수 860

8080포트 사용

미해결

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

.

  • mvc
  • java
  • spring-boot
  • spring
댓글 2 좋아요 0 조회수 397

SetterInjection 사용 지양에 대한 문의입니다.

미해결

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

안녕하세요 영한님. 강의 늘 잘 듣고 있습니다. 이번 강의를 듣던 중 Setter Injection 사용 지양에 대한 이유를 제가 제대로 이해하지 못해 질문 올립니다. Repository의 경우 런타임에 한 번 주입시켜놓으면 수정할 일이 없는데 굳이 그것을 Setter 메소드로 열어놓아 유지보수시 추적을 힘들게 할 필요 없다... 이런 느낌으로 이해했는데 맞는지 알고 싶습니다.

  • jpa
  • JPA
  • spring-boot
  • java
  • spring
  • 웹앱
kim.min.seok 댓글 1 좋아요 0 조회수 231

컨트롤러 단에서 프록시 객체 초기화

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

안녕하세요. 강의를 듣다 궁금하게 있어서 질문드립니다. 강의 중 for문을 돌려서 강제로 프록시를 초기화하는 부분이 있는데요. 제가 프록시 강의를 듣기로는 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때는 프록시를 초기화하면 문제가 발생하는 것으로 알고 있습니다. 그리고 트랜잭션이 걸려있는 서비스단에 트랜잭션이 끝나면 영속성 컨텍스트가 끝나는 것으로 알고 있는데요. 현재 코드는 서비스가 아닌 Repository에서 바로 값을 가져오고 있고 해당 클래스는 트랜잭션이 걸려있지 않기 때문에 아직 영속성 컨텍스트가 끝나지 않아 컨트롤러에서 프록시 초기화가 가능한 것인가요?

  • java
  • spring-boot
  • spring
  • JPA
노성규 댓글 1 좋아요 3 조회수 380

인기 태그

인프런 TOP Writers

주간 인기글