묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결이미지 관리 풀스택(feat. Node.js, React, MongoDB, AWS)
Promise.all에 대한 질문
선생님 안녕하세요.이번 강의에서 사용된 Promise.all이 뭔지 몰라서찾아보니 async-await를 사용하면 비동기 동작의 상태가 완료될 때까지 기다린 후 다음 코드를 순차적으로 읽어나가다보니 이렇게 기다리는 시간을 개선하기 위해 Promise들을 병렬로 처리해 주는 것으로 확인됩니다.근데 이번 강의에서 Promise.all을 빼고 이미지를 업로드해보면 아래의 사진처럼 네트워크의 preview에서 아무 값도 담기지 않게 됩니다.Promise.all이 처리속도를 개선해 주기 위한 기능이라면 Promise.all을 사용하지 않아도 우선 값은 담겨야 하는게 아닐까 하는 생각이 드는데 왜 값이 담기지 않게 되는지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
th:text에 의해 대체되는 부분 관련 질문
items.html의 일부 코드입니다. <td><a th:text="${item.id}">회원id</a></td> <td><a th:text="${item.itemName}">상품명</a></td> <td th:text="${item.price}">10000</td> <td th:text="${item.quantity}">10</td>선생님께서는 th:text에 의해 대체될 부분에 '회원id', '상품명', '10000', '10'을 작성하셨습니다.사실 저는 어차피 대체될 부분이니까 비워둬야 겠다고 생각을 했었는데, (th:text에 대체되더라도) 무엇이 들어가는지를 작성해두는 것이 좋은가요?그렇다면 혹시 서버에서 렌더링되지 않고 브라우저로 바로 봤을 때 무엇이 들어가는지 알기 위함인 것인가요?서버를 거치지 않고 브라우저로 바로 봤을 때의 상황까지 고려해주는 것이 좋은가요??
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
스택과 큐의 필요성
스택은 FIFO 큐는 LIFO 구조인데 이 두개를 합친게 덱같네요. 이렇게되면 스택과 큐의 자료구조의 필요성이 잘 느껴지지 않습니다. 덱이 성능이 나쁘게 아니고 연결리스트 덕분에 삽입 제거가 O(1)의 성능이 나오는데 이렇게되면 굳이 스택과 큐를 써야하나싶은데 스택, 큐, 덱이 성능상의 차이점이 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
타임리프에서 URL 표현하는 법
items.html의 일부 코드입니다. <link th:href="@{/css/bootstrap.min.css}"> <button th:onclick="|location.href='@{/basic/items/add}'|"></button>MVC2 강의의 타임리프 편을 듣고 왔는데요,쿼리 파라미터, 경로변수 없는 단순한 URL(ex. @{/hello} -> /hello)인 경우, @{} 없이 그냥 문자열로 다루면 안 되는 것인가요?타임리프에서 th:href로 경로를 작성할 때는 단순 경로일지라도 @{}로 경로를 작성하는 것이 원칙인가요?
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
챕터2) identity 관련 질문입니다.
선생님 안녕하세요. 강의 잘 듣고 있습니다. 아톰이 서비스가 종료된 것 같아서, 강의를 들을 때는 vscode에 코딩을 따라하면서 수업 듣고 있는데요. 강의를 듣지 않고 복습을 해봐야 될 것 같아서 주피터노트북에 복습을 하던 중에 이상한 점을 발견했습니다. 챕터2-2 수강도중 ID 확인 부분에서 vscode에서는 동일 값에 대한 id가 True로 표현되는데, 주피터노트북에서는 이상하게 False로 표현이 돼서요... 혹시 제 코드가 잘 못 된걸까요, 아니면 주피터노트북의 문제인걸까요...? 자꾸 시덥잖은 걸로 질문드려서 죄송합니다ㅜㅜㅜㅠㅠㅠ
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
SMTPServerDisconnected at /accounts/signup/
선생님회원가입 환영 이메일 보내기 마지막 쯔음 파트에 관하여 질문 드리고자 합니다.우선 세팅을 마치고터미널로 시도할때는 메세지 1이 뜨면서메일이 전송된 것을 확인했습니다. 이후로 터미널에서 시도했던 것을 accounts/models.py등으로 이전하고 시도하고나니 에러가 발생했는데요.이게 에러 메세지 이구요.에러메세지에 표시된 구간을 따라가보았는데# views.py from django.conf import settings # from ..askcompany.settings import common from django.contrib.auth.models import AbstractUser from django.core.mail import send_mail from django.db import models from django.template.loader import render_to_string # Create your models here. class User(AbstractUser): website_url = models.URLField(blank = True) bio = models.TextField(blank = True) def send_welcome_email(self): subject = render_to_string('accounts/welcome_email_subject.txt', { 'user': self }) content = render_to_string('accounts/welcome_email_content.txt',{ 'user': self }) # 여기서 settings는 django.conf라는 곳에서 임포트 해오는 것이고 # 기초 settings.py의 이름이 변하더라도 거기서 가져오는 것 같다. # 문제 생길 시, 추측이 아닐 수 있으니 settings를 common으로 변경해주자. sender_email = settings.WELCOME_EMAIL_SENDER # 여기서 self.email의 의미는 User마다 email로 가입이 될텐데, 그 주소가 수신주소가 되는것이다. send_mail(subject, content, sender_email, [self.email], fail_silently=False) # save할때마다 호출 -> which mean is User가 생성될때마다 # 이런식의 로직 구현이 가능하다. def save(self, *args, **kwargs): is_created = (self.pk == None) super().save(*args, **kwargs) if is_created: pass이렇게 있구요. 여기서 에러를 만드는 것으로 의심되는 요소는 sender_email이였습니다. 그도 그럴것이 common.py에는 WELCOME_EMAIL_SENDER를 정의해주었지만 그것이 from django.conf import settings의 것을 오버라이딩 하는 것에 대해서는 확신이 들지 않아서요.# common.py WELCOME_EMAIL_SENDER = 'daniell8282@naver.com'이렇게 설정해 주었구요.echo $SENDGRID_API_KEY도 딱히 {키값}으로 노출되는게 아니라 키값으로 잘 확인 됩니다.무엇이 문제여서 이게 에러가 계속 나는 걸까요? 추가사항으로는저와 동일한 문제로 8시간동안 풀려고 시도했던 분이 계셨더라구요.그분하고 저와 같은케이스 같은데요.저두 맥이고 zsh를 쓰고 있습니다.혹시몰라서 bash로 전환해서 export로 키값 재설정해주고echo로 확인해주고 회원가입해보니깐회원가입이 되긴 하는데메일이 발송이 안되구요zsh한정이긴 하지만 키값을 처음에 export로 잡아주고 echo로 확인할때는 {}이렇게 딕셔너리로 감싸지는 것 없이 키값이 노출이 되는데, SMTP error? 이거 발생후에 echo로 확인해보면 {}이렇게 딕셔너리 처리 됩니다; 이건 왜그런걸까요?
-
해결됨[코드캠프] 강력한 CSS
가상요소 선택자 after 기본 dislplay 값
강의 중에선 after의 display 기본 값이 block이기 때문에명시할 필요는 없지만 flex-direction 처럼 명시해주는 것이 좋다고 말씀해주셨습니다.근데, 개발자도구를 통해서 기본값을 확인해보니 display를 명시해주지 않으면 inline으로 지정되어 있는데 최근에 바뀐걸까요?
-
미해결지금 당장 NodeJS 백엔드 개발 [사주 만세력]
Error response from daemon: Ports are not available
PS B:\SSYW\saju-backend-nodejs-master> docker-compose up -d[+] Running 12/12[+] Running 1/2 - Network saju-backend-nodejs-master_default Created 9.3s - Container saju_nodejs_mysql Starting 42.3sError response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3309 -> 0.0.0.0:0: listen tcp 0.0.0.0:3309: bind: An attempt was made to access a socket in a way forbidden by its access permissions.PS B:\SSYW\saju-backend-nodejs-master> 죄송한데요. 포트를 사용할 수가 없습니다. 해결 방법좀 가르쳐 주세요. ~~
-
해결됨[코드캠프] 훈훈한 Javascript
window객체 대신 document객체를 사용해도 되나요?
섹션 6. 키보드 event 체크에서 질문이 있습니다.DOM은 브라우저가 HTML 문서를 파싱하는 과정에서 생겨나는 객체라고 배웠고,window는 가장 높은 최상위 공간에 존재하고 있는 전역객체라고 배웠습니다.그런데, event속성을 사용할 때, 꼭 굳이 window를 사용해야 하는지 여쭤봅니다.어떻게보면 event속성도 크게보면 HTML 문서 내 한 요소이자 영역인 것 같아서요. 혹시 window 객체에서 사용가능한 속성과 document 객체에서 사용가능한 속성이따로 분리되어 각자 사용하기로 약속한게 있는건가요? 이점이 궁금합니다.감사합니다.
-
미해결스프링 배치
Fetch와 Cursor의 순서?
[DB - Cursor & Paging 이해] 강의에서 보여주신 장표를 보면 cursot가 먼저 움직이고 fetch를 통해 application으로 매핑된 데이터(객체)를 넘겨주는 것처럼 표현되어있는데요.fetch size에 의해서 DB --> 메모리로 데이터가 적재된 후, 그 결과집합을 순차적으로 cursor를 통해 접근하는걸로 알고있습니다.즉, fetch size는 DB에서 메모리로 데이터를 적재할 크기이고 그 데이터 셋을 처음부터 cursor를 통해 접근하는게 맞지않나 싶어서 질문드립니다. 제가 반대로 알고 있을 수 있지만...
-
미해결최신 딥러닝 기술 Vision Transformer 개념부터 Pytorch 구현까지
'어텐션 기법 - 키, 쿼리, 밸류는 무엇인가?' 강의에서 (QK^T)
안녕하세요!'어텐션 기법 - 키, 쿼리, 밸류는 무엇인가?' 강의에서 (QK^T)쿼리와 키 transpose한 것이 어떻게 쿼리와 키의 유사도를 나타내는지 잘 이해가 가지 않습니다.
-
해결됨처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part3]
10_ADVANCE_EXAMPLE-에서 MNIST 함수 작성할 때 index_error가 나타납니다 ㅠㅠ
항상 강의들으면서, 따라치면서, 여러번 반복해서 익히려고 하고 있습니다. 지금까지 별 문제 없이 쏙쏙 이해가 잘 가서, 지금까지 질문을 드리지 않았는데요.. 함수를 작성하는 부분에서 자꾸 인덱스 에러가 나타나서, 제가 어느 부분을 잘못 쓴 건지 모르겠습니다. 선생님께서 작성하신 코드를 그대로 복사해서 넣었는데도 index error가 호출되어서 왜 그런지 모르겠습니다...
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
강의 내용 포스팅
안녕하세요 자료구조 및 알고리즘 강의 잘 듣고 있습니다.다름이 아니라 제가 개인 블로그에 상업적인 목적 없이공부한 흔적을 남길려는 용도로 해당 강의 내용을 정리하려고 하는데혹시 강의 중간 중간에 나오는 그림이 필요할 경우 출처를 남긴 후사용해도 가능한지 여쭤보고 싶습니다.
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
length 오류
콘솔 결과와 error가 같이 출력됩니다!
-
해결됨풀스택 리액트 라이브코딩 - 간단한 쇼핑몰 만들기
body : ReadableStream 관련 문의드립니다.
안녕하세요. 2강 진행 중 상품목록 조회시 msw Response 결과에 대한 body 값이 ReadableStream 으로 넘어옵니다.이 경우 body 의 data를 확인할 방법이 있을까요?답변 부탁드립니다.감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-R 1068 질문 드립니다.(링크 수정하여 다시 올립니다)
선생님 죄송합니다. 링크 수정하여 다시 질문 드립니다.저는 Input 값을 받을 때, 부모 자식에 대한 꼬리표를 같이 매겨서 부모 = 1 / 자식 = 2 / 루트 = -1 이런 식으로 풀었는데요. 75 % 쯤에서 Fail이 뜨네요 ㅠㅠ어떤 문제가 있는 걸까요? 코드는 아래 링크에 있습니다http://boj.kr/457d11f9ac914b61b98f62c5f2a89554감사합니다
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@ModelAttribute Item item에 관한 질문(추가 수정)
앞선 질문내용이 잘못된것이 있어서 수정합니다.[질문 내용]@ModelAttribute는 지정된 객체를 생성하여, 요청 파라미터의 값을 해당 객체의 프로퍼티를 보고 입력해준다고 알고 있습니다.그리고 자동으로model.addAttribute("item", item);을 실행해 줄텐데 이때 모델에 담기는 item은기존에 업데이트하려는 item객체가 아니라 @ModelAttribute로 인해 새로 생성된 item을 넣어주게 되는 것 아닙니까?해당 모델을 return "/basic/item";으로 넘겨주게 되면 새로 생성된 item은 updateParam이기 때문에 id값이 없어서 예외가 발생하는 문제가 있습니다.따라서 redirect를 이용하여return "redirect:/basic/items/{itemId}"로 재요청을 하게되면 기존 model이 초기화 되고, itemId로 리포지토리에 있는 item을 찾고 해당 아이템을 model에 추가 하여"/basic/item" Html From으로 경로 이름을 반환하는 것으로 이해하면 될까요? (추가)리턴을 pathName으로 바로 해주어도item.id에 값이 제대로 들어가는 것으로 확인되는데Model에 담기는것은 updateParam 으로 id값이 없는 것으로 알고 있습니다. 어떻게 잘 작동하는지 궁금합니다.!
-
미해결[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드
.sub-menu를 ABC형의 위치에 놓고 CSS를 작성했습니다.
잘 실행되는데요.이렇게 작성해도 될까요?<!DOCTYPE html><html lang="ko"><head> <meta charset="UTF-8"> <title>최종본 - D3</title> <link rel="stylesheet" href="css/style.css"></head><body> <div class="container"> <div class="main-content"> <div class="left"> <header> <div class="header-logo"> <a href="#none"><img src="images/header-logo.png" alt="header logo"></a> </div> <div class="navi"> <!-- Navigation --> <ul class="menu"> <li> <a href="#none">MENU-1</a> <div class="sub-menu"> <a href="#none">SUBMENU-1-1</a> <a href="#none">SUBMENU-1-2</a> <a href="#none">SUBMENU-1-3</a> <a href="#none">SUBMENU-1-4</a> </div> </li> <li> <a href="#none">MENU-2</a> <div class="sub-menu"> <a href="#none">SUBMENU-2-1</a> <a href="#none">SUBMENU-2-2</a> <a href="#none">SUBMENU-2-3</a> <a href="#none">SUBMENU-2-4</a> </div> </li> <li> <a href="#none">MENU-3</a> <div class="sub-menu"> <a href="#none">SUBMENU-3-1</a> <a href="#none">SUBMENU-3-2</a> <a href="#none">SUBMENU-3-3</a> <a href="#none">SUBMENU-3-4</a> </div> </li> <li> <a href="#none">MENU-4</a> <div class="sub-menu"> <a href="#none">SUBMENU-4-1</a> <a href="#none">SUBMENU-4-2</a> <a href="#none">SUBMENU-4-3</a> <a href="#none">SUBMENU-4-4</a> </div> </li> <div class="sub-back"></div> </ul> <!-- Navigation --> </div> <div class="spot-menu"> <a href="#none">로그인</a> <a href="#none">회원가입</a> </div> </header> </div> <div class="right"> <div class="slide"> <div class="slide-image"> <div class="slide-image-inner"> <a href="#none1"><img src="images/slide-d-01.jpg" alt="slide1"></a> <a href="#none2"><img src="images/slide-d-02.jpg" alt="slide2"></a> <a href="#none3"><img src="images/slide-d-03.jpg" alt="slide3"></a> </div> </div> <div class="slide-banner"> <a href="#none"><img src="images/banner-01.png" alt="banner1"></a> <a href="#none"><img src="images/banner-02.png" alt="banner2"></a> <a href="#none"><img src="images/banner-03.png" alt="banner3"></a> </div> </div> <div class="items"> <div class="shortcut"> <img src="images/shortcut-01.png" alt="shortcut thumnail"> <div class="shortcut-content"> <h3>얼리버드 선착순 할인 이벤트, 신규강의 최대 30% 할인</h3> <p> 12월은 사랑의 달~ 한일외국어학원이 여러분께 사랑을 뿌려요~ 12월 개강반을 12월 06일까지 접수하는 분들께는 15%~ 20% 의 얼리버드 할인을 제공합니다. 더불어 소중한 리뷰를 꼼꼼히 남겨주시는 분들을 뽑아 더 큰 적립금을 추가지급해 드릴 예정이오니 리뷰도 놓치지 마시고 작성해주세요~^^<br> <b>기간: 2022년 12월 18일~ 12월 25일</b> </p> </div> <a href="#none"><img src="images/shortcut-02.png" alt="shortcut icon"></a> </div> <div class="news-gallery"> <div class="tab-inner"> <div class="btn"> <a class="active" href="#none">공지사항</a> <a href="#none">갤러리</a> </div> <div class="tabs"> <div class="tab1"> <a class="open-modal" href="#none">스트리밍 서버 이전 작업으로 2시간 서비스 중지<b>2022.12.20</b></a> <a href="#none">얼리버드 선착순 할인 이벤트 최대 50% 할인 <b>2022.10.13</b></a> <a href="#none">내 집 마련의 꿈을 꿈이 아닌 현실로 만드는 진짜 방법 <b>2022.11.31</b></a> <a href="#none">외국인과 영어로 네이티브처럼 대화하는 노하우! <b>2022.08.09</b></a> <a href="#none">월 500만원 매출을 내는 블로그 운영하는 노하우 <b>2022.07.07</b></a> </div> <div class="tab2"> <a href="#none"> <img src="images/gallery-01.png" alt="gallery1"> <span>Gallery title Text</span> </a> <a href="#none"> <img src="images/gallery-02.png" alt="gallery2"> <span>Gallery title Text</span> </a> <a href="#none"> <img src="images/gallery-03.png" alt="gallery3"> <span>Gallery title Text</span> </a> <a href="#none"> <img src="images/gallery-04.png" alt="gallery4"> <span>Gallery title Text</span> </a> <a href="#none"> <img src="images/gallery-05.png" alt="gallery5"> <span>Gallery title Text</span> </a> <a href="#none"> <img src="images/gallery-06.png" alt="gallery6"> <span>Gallery title Text</span> </a> <a href="#none"> <img src="images/gallery-07.png" alt="gallery7"> <span>Gallery title Text</span> </a> </div> </div> </div> </div> </div> </div> </div> <footer> <div class="footer-logo"> <a href="#none"><img src="images/footer-logo.png" alt="footer logo"></a> </div> <div class="footer-content"> <div class="footer-link"> <a href="#none">기업소개</a> <a href="#none">제휴 및 입점 문의</a> <a href="#none">이용약관</a> <a href="#none">개인정보처리방침</a> <a href="#none">이메일무단수집거부</a> <a href="#none">사이트맵</a> <a href="#none">인재채용</a> </div> <div class="copyright"> 상호 : (주)코딩웍스 | 대표자 : 홍길동 | 개인정보관리책임자 : 성춘향 부장 사업장주소 : 경기도 남양주시 별내동 1234 코딩웍스 빌딩 6층 (주)코딩웍스 </div> </div> </footer> </div> <!-- Modal --> <div class="modal"> <div class="modal-content"> <h2>스트리밍 서버 이전으로 서비스 장애</h2> <p> 스트리밍 서버 이전 작업으로 2시간 서비스 중지됩니다. 주요 작업 내용은 아래와 같습니다. <ol> <li>서버 이전에 따른 DNS 이전으로 기존 호스팅 서비스 대체</li> <li>문자셋을 utf-8로 변경 후 모바일 등에 대처하기 위해 미리 조치</li> <li>스트리밍 서버 CDN과 연동 후 멀티미디어 이러닝 서비스가 제공</li> </ol> 위 내용을 보시면 제법 큰 작업이었음을 알 수 있습니다. 특히 문자셋의 변경에 따라 기존의 DB, data, 웹사이트 솔루션 등의 커스트마이징 등에 상당한 어려움이 있었고, 이에 따른 일부 접속 오류가 있을 수 있었음에 양해를 구합니다. 특히 인터넷익스플로러 11로 접속하셨을 경우 일부 문제은행 목차가 출력되지 않았을 수도 있습니다.<br><br> 서버 이전 작업으로 고객님들께 불편을 드려서 대단히 죄송합니다. 정상 운영되도록 최선을 다하겠습니다. 감사합니다. </p> <a class="close-modal" href="#none">닫기</a> </div> </div> <!-- Modal --> <script src="script/jquery-1.12.4.js"></script> <script src="script/custom.js"></script> </body></html>@charset "utf-8";body { margin: 0; background-color: #fff; color: #333;}a { text-decoration: none; color: inherit;}/* Entire Layout */.container {}.main-content { display: flex;}.main-content > div {}.left { width: 200px;}.right { flex: 1;}/* Header */header {}header > div {}.header-logo { height: 100px; padding-top: 10px; box-sizing: border-box;}.navi { height: 150px;}/* Navigation */.menu{ width: 90%; margin: 0 auto; margin-top: 10px; padding: 0; position: relative; } .menu li{ text-align: center; box-sizing: border-box; position: relative; } .menu li> a{ display: block; border: 1px solid black; padding: 5px; transition: 0.5s; } .menu li:hover > a{ background-color: rgba(0, 0, 0, 0.5); color: #fff; } .sub-menu{ width: 1000px; height: 35px; position: absolute; top:0; left: 100%; display: none; z-index: 100; } .sub-menu a{ float: left; width: 150px; color: #fff; padding: 5px; transition: 0.5s; } .sub-menu a:hover{ background-color: #000; color: #fff; } .sub-back{ width: calc(100vw - 190px); height: 135px; background-color: rgba(0, 0, 0, 0.5); position: absolute; left: 100%; top: 0; z-index: 90 ; display: none; }/* spot-menu */.spot-menu { text-align: center;}.spot-menu a:after { content: '|'; margin-left: 5px;}.spot-menu a:last-child:after { display: none;}.spot-menu a:hover { text-decoration: underline;} /* Slide */.slide { height: 400px; position: relative;}.slide > div {}.slide-image { height: 400px;}.slide-image-inner { height: inherit;}.slide-image-inner a { /* 실제로 움직이는 요소 */ position: absolute; top: 0; left: 0; animation: slide 10s linear infinite; visibility: hidden; height: inherit; width: 100%;}.slide-image-inner a:nth-child(1) { animation-delay: 0s;}.slide-image-inner a:nth-child(2) { animation-delay: 3.5s;}.slide-image-inner a:nth-child(3) { animation-delay: 7s;}.slide-image-inner a img { width: inherit; height: inherit; object-fit: cover;}@keyframes slide { 0% { opacity: 0; } 5% { visibility: visible; /* 0% 구간에 visibility: hidden 상태를 보이는 상태로 전환 */ opacity: 1; } 35% { opacity: 1; } 40% { visibility: hidden; /* 보이는 구간이 끝났으니까 투명도 0과 함께 실제로도 보이지 않는 상태로 전환 */ opacity: 0; } 100% { opacity: 0; }}.slide-banner { position: absolute; top: 0; right: 0;}.slide-banner img { width: 150px; display: block;}/* Shortcut */.shortcut { height: 200px; display: flex; align-items: center; margin: 0 15px; gap: 25px; }/* News & Gallery */.items {}.items > div {}/* News & Gallery */.news-gallery { /* border: 1px solid green; */ height: 250px;}.tab-inner { width: 95%; margin: auto; margin-top: 25px;}.btn {}.btn a { border: 1px solid #000; display: inline-block; width: 100px; text-align: center; padding: 5px; border-radius: 5px 5px 0 0; margin-right: -6px; border-bottom: none; margin-bottom: -1px; background-color: #ddd;}.btn a.active { background-color: #fff;}.tabs {}.tab1 { border: 1px solid #000; padding: 0 15px;}.tab1 a { display: block; padding: 5px; border-bottom: 1px dashed #bbb;}.tab1 a:last-child { border-bottom: none;}.tab1 a b { float: right; font-weight: normal;}.tab2 { display: none; border: 1px solid #000; height: 170px; text-align: center; padding-top: 20px; box-sizing: border-box;}/* ▼ D유형과 E유형 공개도면에 따라 약간의 수정 */.tab2 a { display: inline-block; text-align: center; margin: 0 15px;}.tab2 a img { height: 120px; border-radius: 5px;}.tab2 a span { display: block;}/* Footer */footer { display: flex;}footer > div { height: 120px;}.footer-logo { width: 200px; padding-top: 20px; box-sizing: border-box; /* display: flex; align-items: center; */}.footer-content { flex: 1;}.footer-content div { height: 60px; box-sizing: border-box; /* display: flex; align-items: center; */}.footer-link { padding-top: 30px;}.copyright { padding-top: 10px;}.footer-link a { color: royalblue;}.footer-link a:after { content: '|'; color: #ccc; margin: 0 5px;}.footer-link a:last-child:after { display: none;}.footer-link a:hover { text-decoration: underline;}/* Modal */.modal { background-color: rgba(0, 0, 0, 0.19); position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 100; display: none;}.modal-content { width: 450px; background-color: #fff; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); padding: 20px; border-radius: 10px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.13);}.close-modal { float: right; border: 1px solid #000; padding: 5px 10px;}/* 이건 하면 좋고 안해도 괜찮습니다. */.modal-content h2 { text-align: center; background-color: yellowgreen; color: #fff; padding: 7px;}.modal-content ol { padding-left: 18px; font-size: 14px; font-weight: 500;}/* Navigation */// $('.menu li').mouseenter(function(){// $('.sub-menu, .sub-back').stop().slideDown()// })// $('.menu').mouseleave(function(){// $('.sub-menu, .sub-back').stop().slideUp()// })$('.menu li').mouseenter(function(){ $('.sub-menu, .sub-back').stop().fadeIn()})$('.menu').mouseleave(function(){ $('.sub-menu, .sub-back').stop().fadeOut()})/* Tab Menu */$('.btn a:first-child').click(function () { $('.tab1').show() $('.tab2').hide() $(this).addClass('active') $(this).siblings().removeClass('active')})$('.btn a:last-child').click(function () { $('.tab2').show() $('.tab1').hide() $(this).addClass('active') $(this).siblings().removeClass('active')})/* Modal */$('.open-modal').click(function(){ $('.modal').fadeIn()})$('.close-modal').click(function(){ $('.modal').fadeOut()})
-
미해결실무에서 바로 쓰는 영어 이메일
강의자료 요청
안녕하세요, 유익한 강의 감사합니다.아래 메일로 강의 자료 전달 부탁드립니다.감사합니다 :)
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
spring-mybatis 이미지 업로드 관련 NullPointerException 에러
안녕하세요!수업 듣다가 Mybatis로 이미지 업로드 해보려는데, 실패해서요 조언 좀 듣고 싶습니다.아래 코드에서 fileData.setFilePath가 Null 값으로 나오는데 왜그런걸까요 ? ㅠㅠjava.lang.NullPointerException: nullcom.restapi.bin.service.FileUploadDownloadService.uploadImageToFileSystem(FileUploadDownloadService.java:29) ~[main/:na]@Data public class FileData { private Long id; private String name; private String fileType; private String filePath; public FileData(Long id, String name, String fileType, String filePath) { this.id = id; this.name = name; this.fileType = fileType; this.filePath = filePath; } }@Service @Slf4j public class FileUploadDownloadService { @Autowired private FileDataMapper mapper; private static FileData fileData; private final String FOLDER_PATH = "/Users/david/Downloads/image/"; public String uploadImageToFileSystem(MultipartFile file) throws IOException { String filePath = FOLDER_PATH + file.getOriginalFilename(); log.info("file Path={}", filePath); fileData.setFilePath(filePath); fileData.setName(file.getOriginalFilename()); fileData.setFileType(file.getContentType()); log.info("fileData={}", fileData); mapper.insert(fileData); log.info("fileData={}/{}/{}", fileData.getFileType(), fileData.getName(), fileData.getFilePath()); file.transferTo(new File(filePath)); return null; } public byte[] downloadImageFromFileSystem(String fileName) throws IOException { Optional<FileData> dbImageData = mapper.findByFile(fileName); //이미지가 저장된 파일을 가져옴 > 바이트배열로 변환 > 서비스에서 다시 반환하여 얻음 String filePath = dbImageData.get().getFilePath(); byte[] images = Files.readAllBytes(new File(filePath).toPath()); return images; } }