묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Null오류
NullReferenceException: Object reference not set to an instance of an object UiManager.Start () (at 유아이메니저의 바인드 부분은 잘 실행이 되는데 get함수를 들어가자마자 오류가 납니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
jsp 프로젝트 진행중에 save.jsp로 넘어갈시 계속해서 500에러가 뜹니다...
jsp 프로젝트 진행중에 /new-form-jsp에서 save.jsp로 넘어가려고 할 때 계속해서 에러가 떠서 질문드립니다. new-form.jsp입니다. <%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body><form action="/jsp/members/save.jsp" method="post"> username: <input type="text" name="username" /> age: <input type="text" name="age" /> <button type="submit">전송</button></form></body></html> save.jsp의 소스코드입니다. <%@ page import="hello.servlet.domain.member.MemberRepository" %><%@ page import="hello.servlet.domain.member.Member" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><% // request, response 사용 가능 MemberRepository memberRepository = MemberRepository.getInstance(); System.out.println("MemberSaveServlet.service"); String username = request.getParameter("username"); int age = Integer.parseInt(request.getParameter("age")); Member member = new Member(username, age); memberRepository.save(member);%><html><head> <title>Title</title></head><body>성공<ul> <li>id=<%=member.getId()%></li> <li>username=<%=member.getUsername()%></li> <li>age=<%=member.getAge()%></li></ul><a href="/index.html">메인</a></body></html> build.gradle입니다. plugins { id 'org.springframework.boot' version '2.6.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'war'}group = 'hello'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'// providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' //JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl' //JSP 추가 끝}tasks.named('test') { useJUnitPlatform()}
-
해결됨언리얼엔진 블루프린트 스파르타 클래스
Lerp를 이용한 문 만들기
Lerp를 이용한 문 만들기 강의는 Lerp랑 관련이 없는거 같은데요?
-
미해결침투테스트 전문가 - 시스템 편 (모의해킹, 모의침투)
두화면 보이게 어떻게하나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.vmware에서 두개 화면 debian과 kali.. 동시에 보이던데.. 어떻게 해서 보였나요??
-
미해결테스트주도개발(TDD)로 만드는 NodeJS API 서버
테스트 코드 실행이 안됩니다.
아래와 같은 메시지가 나오고 mocha 가 실행이 안됩니다. ㅠㅠ 환경은 window 입니다.
-
해결됨프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2
질문있습니다~
로컬에 있는 이미지를 이용할때보다 서버에서 url 주소로 전달 받아 이용하는 경우가 더 많은데, 그럴때도 webp로 변환할 수 있는 방법이 있을까요? 아니면 다른 최적화 방법이 있나요?
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
darknet vs ultralytics
이전 시간에는 다크넷으로 YOLO를 사용했고, 이번에는 ultralytics로 YOLO를 사용하는데요. 다크넷과 Ultralytics라는 게 한 회사라고 보면 되나요? 다크넷 YOLO라 하면 그 회사에서 구현한 YOLO 패키지라고 보면 될까요? 혹은 프레임워크 정도로 생각하면 될까요? 추가로 다크넷은 OpenCV로 YOLO를 사용하고, Ultralytics는 파이토치로 YOLO를 사용하는 차이가 있는 것인지요? 이후 강의에서 설명하실 수도 있는데, 강의를 듣고 있는 지금 개념을 잡고 이후 강의를 들어야 할 것 같아 질문드립니다. ^^
-
미해결최반장의 엑셀 피벗테이블 마스터 클래스
피벗차트 보고서 단추 생성
피벗 차트를 생성했는데 기본적으로 보고서 필터 단추가 나타나지 않습니다. 차트에서 보고서 필터 단추를 생성하려면 어떻게 해야하나요 ?
-
미해결Vue.js 시작하기 - Age of Vue.js
Windows 에서 Code 메뉴 찾을 수 없어요
어디서 설정하는지 알려주세요.
-
해결됨그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
NetworkPolicy ipBlock에 대한 질문 입니다.
현재 제 환경에서 실습을 위해 접속하는 net의 ip주소는 172.16.132.37 입니다. egress설정을 통해 172.16.0.0/17대역 쪽으로만 나가도록 허용했는데 방화벽의 아웃바운드와 같은 개념이라면 net에서 트래픽이 나가는 것 자체가 안되거나 ping 통신의 경우 트래픽을 주고 받기 때문에172.16.103.147이 net에서 보낸 트래픽을 받는 건 가능하더라도 net으로 다시 트래픽을 보내는건 불가능 하다고 생각합니다. net(172.16.132.37)이 172.16.103.147 주소를 가진 pod와 어떻게 ping통신이 가능한지 궁금합니다!
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
크롤링되다가 멈춥니다.
이전 글에서 수강생 분이 작성한 바와 같이 terminal 자체가 멈춥니다. 아래는 코드 캡쳐본 입니다. Print(url)만 하면 2번째 사진과 같이 뜨는데, for 문 부터 실행을 시키면 terminal에 깜빡임이나 오류 메세지 없이 그냥 멈춰버립니다.
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
QuestTargetMarker 스크립트 오류
private Dictionary<Quest, Task> targetTasksByQuest = new Dictionary<Quest, Task>(); private void OnDestroy() { QuestSystem.Instance.onQuestRegistered -= TryAddTargetQuest; foreach ((Quest quest, Task task) in targetTasksByQuest) { quest.onNewTaskGroup -= UpdateTargetTask; quest.onCompleted -= RemoveTargetQuest; task.onStateChanged -= UpdateRunningTargetTaskCount; } } 에러내용 1. CS1061 - 'KeyValuePair<Quest, Task>'에는 'Deconstruct'에 대한 정의가 포함되어 있지않고, 'KeyValuePair<Quest, Task>' 형식의 첫 번째 인수를 허용하는 엑세스 가능한 확장 메서드 'Deconstruct'이(가) 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요. 2. CS8129 - 2 out 매개 변수 및 void 반환 형식을 사용하는 'keyValuePair<Quest, Task>' 형식에 대한 적절한 분해 인스턴스 또는 확장 메서드를 찾을 수 없습니다. 1. foreach문에서 빨간색으로 표시한 부분이 에러가 계속 나고 있습니다. 올려주신 수업자료를 복붙해도 4번 강의를 계속 돌려보며 고쳐도 고쳐지지가 않네요... 2. 혹시 수업 자료 풀버전은 따로 올린곳이 있을까요? 현재 챕터마다 수업자료가 흩어져있거나 누락된게 있어서 보기가 어렵네요..
-
미해결<1만 시간의 법칙> 웹 페이지 제작하기
.title_img img css 작성 문의 드립니다.
.title_img img{ width:100%; height:auto; } 이렇게 height:auto 를 주셨는데 height값은 어떻게 설정 되는건가요? width는 부모 요소의 100% 라 564px 인걸로 알고 있습니다 ㅠㅠ
-
미해결Slack 클론 코딩[실시간 채팅 with React]
Workspace: FC = ({children}) 이 안됩니다.
이런식으로 에러가 나는데 어떻게 해결하면 좋을까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
include 질문이요
const fullUserWithoutPassword = await User.findOne({ where: { id: user.id }, attributes: { // attribute: ['id','nickname','email'] => id,nickname,email만 쓰겠다. exclude: ["password"], }, include: [ { model: Post, attributes: ["id"], }, { model: User, as: "Followings", attributes: ["id"], }, { model: User, as: "Followers", attributes: ["id"], }, ], }); include의 모델 User는 아래와 같이 user와user의 관계에 의해 mysql에 테이블 follow가 만들어 지는데요. db.User.belongsToMany(db.User, { through: "Follow", as: "Followers", foreignKey: "FollowingId", }); db.User.belongsToMany(db.User, { through: "Follow", as: "Followings", foreignKey: "FollowerId", }); 이때 { model: User, as: "Followings", attributes: ["id"], }, { model: User, as: "Followers", attributes: ["id"], }, 1번째 include 모델 User는 테이블follow의 FollowerId 값으로 해당 user를 찾고 2번째는 FollowingId로 user를 찾아서 객체로 반환 해 주는 건가요? 이쪽부분이 잘 이해가 안되네요..
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
lt, rt의 자료형 Node 질문 드립니다.
강의 듣고 이해가 가지 않는 부분이 있어 질문 드립니다! Node 클래스의 lt와 rt 변수의 자료형이 Node라고 코드를 구현하셨는데 이 부분이 잘 이해가 가지 않습니다. 클래스 내부의 변수의 자료형이 본인 클래스일 수 있는 건가요? 자료형이 참조형인 경우 가능한건가요?? 구글 검색을 통해 찾아보려고 했는데 원하는 답을 찾기 어려워서 질문 남깁니다! 감사합니다~
-
해결됨남박사의 파이썬으로 실전 웹사이트 만들기
(회원가입 비밀번호 일치하지 않음 및 flask_wtf.csrf 오류) 보안강화 - 로그인 정보 암호화 하고 CSRF Protect 구현하기 강의중 오류..
남박사님 안녕하세요 이번 보안강화 - 로그인정보 암호화 강좌 진행중에.. 오류를 해결하지 못해서 질문 드립니다. 우선 내용은 이렇습니다. 1. werkzeug.security 설정진행중 패스워드 보안작업중에 "pass": hash_password(pass1) 로 변경후에 회원가입을 하면 비밀번호가 일치하지 않습니다라고 계속 나오더라구요.. 몽고db에서 내용지워도 마찬가지 입니다. 그전에는 정상적으로 로그인이 되었습니다. 2. flask_wtf.csrf import CSRFProtect 를 적용하는데 pip install flask-wtf를 설치해도 오류가 나오더라구요.. 문제 사진 1번 2번 3번 4번 5번 코드 - board.py- from main import * from flask import Blueprint bluerprint = Blueprint("member", __name__, url_prefix="/member") # @csrf.exempt @bluerprint.route("/join", methods=["GET", "POST"]) def member_join(): if request.method == "POST": name = request.form.get("name", type=str) email = request.form.get("email", type=str) pass1 = request.form.get("pass", type=str) pass2 = request.form.get("pass2", type=str) if name == "" or email == "" or pass1 == "" or pass2 == "": flash("입력되지 않은 값이 있습니다.") return render_template("join.html", title="회원가입") if pass1 != pass2: flash("비밀번호가 일치하지 않습니다.") return render_template("join.html", title="회원가입") members = mongo.db.members cnt = members.count_documents({"email": email}) if cnt > 0: flash("중복된 이메일 주소입니다.") return render_template("join.html", title="회원가입") current_utc_time = round(datetime.utcnow().timestamp() * 1000) post = { "name": name, "email": email, "pass": hash_password(pass1), "joindate": current_utc_time, "logintime": "", "logincount": 0, } members.insert_one(post) return redirect(url_for("member.member_login")) else: return render_template("join.html", title="회원가입") @bluerprint.route("/login", methods=["GET", "POST"]) def member_login(): if request.method == "POST": email = request.form.get("email") password = request.form.get("pass") next_url = request.form.get("next_url") members = mongo.db.members data = members.find_one({"email": email}) if data is None: flash("회원 정보가 없습니다.") return redirect(url_for("member.member_login")) else: if check_password(data.get("pass"), password): session["email"] = email session["name"] = data.get("name") session["id"] = str(data.get("_id")) session.permanent = True if next_url is not None: return redirect(next_url) else: return redirect(url_for("board.lists")) else: flash("비밀번호가 일치하지 않습니다.") return redirect(url_for("member.member_login")) return "" else: next_url = request.args.get("next_url", type=str) if next_url is not None: return render_template("login.html", next_url=next_url, title="회원로그인") else: return render_template("login.html", title="회원로그인") @bluerprint.route("/logout") def member_logout(): try: del session["name"] del session["id"] del session["email"] except: pass return redirect(url_for('member.member_login')) ---------------------------------------------------------------------------------------------------- - common.py - from functools import wraps from main import session, redirect, request, url_for, ALLOWED_EXTENSIONS from string import digits, ascii_uppercase, ascii_lowercase import random import re import os from werkzeug.security import generate_password_hash, check_password_hash def hash_password(password): return generate_password_hash(password) def check_password(hashed_password, user_password): return check_password_hash(hashed_password, user_password) def check_filename(filname): reg = re.compile("[^A-Za-z0-9_.가-힝-]") for s in os.path.sep, os.path.altsep: if s: filname = filname.replace(s, ' ') filname = str(reg.sub('', '_'.join(filname.split()))).strip("._") return filname def allowed_file(filename): return "." in filename and filename.rsplit(".", 1)[1] in ALLOWED_EXTENSIONS def rand_generator(length=8): char = ascii_lowercase + ascii_uppercase + digits return "".join(random.sample(char, length)) def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if session.get("id") is None or session.get("id") == "": return redirect(url_for("member.member_login", next_url=request.url)) return f(*args, **kwargs) return decorated_function ---------------------------------------------------------------------------------------------------- - __init__.py - from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo from bson.objectid import ObjectId from datetime import datetime, timedelta from flask import abort from flask import redirect from flask import url_for from flask import flash from flask import session # from flask_wtf.csrf import CSRFProtect import math import time import os app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" app.config["SECRET_KEY"] = "abcd" app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=30) mongo = PyMongo(app) BOARD_IMAGE_PATH = "C:\\python\\images" BOARD_ATTACH_FILE_PATH = "C:\\python\\uploads" ALLOWED_EXTENSIONS =set(["txt", "pdf", "png", "jpg", "jpeg", "gif"]) app.config["BOARD_IMAGE_PATH"] = BOARD_IMAGE_PATH app.config["BOARD_ATTACH_FILE_PATH"] = BOARD_ATTACH_FILE_PATH app.config["MAX-CONTENT_LENGTH"] = 15 * 1024 * 1024 if not os.path.exists(app.config["BOARD_IMAGE_PATH"]): os.mkdir(app.config["BOARD_IMAGE_PATH"]) if not os.path.exists(app.config["BOARD_ATTACH_FILE_PATH"]): os.mkdir(app.config["BOARD_ATTACH_FILE_PATH"]) from .common import login_required, allowed_file, rand_generator, check_filename, hash_password, check_password from .filter import format_datetime from . import board from . import member app.register_blueprint(board.bluerprint) app.register_blueprint(member.bluerprint) ---------------------------------------------------------------------------------------------------- -member.py- from main import * from flask import Blueprint bluerprint = Blueprint("member", __name__, url_prefix="/member") # @csrf.exempt @bluerprint.route("/join", methods=["GET", "POST"]) def member_join(): if request.method == "POST": name = request.form.get("name", type=str) email = request.form.get("email", type=str) pass1 = request.form.get("pass", type=str) pass2 = request.form.get("pass2", type=str) if name == "" or email == "" or pass1 == "" or pass2 == "": flash("입력되지 않은 값이 있습니다.") return render_template("join.html", title="회원가입") if pass1 != pass2: flash("비밀번호가 일치하지 않습니다.") return render_template("join.html", title="회원가입") members = mongo.db.members cnt = members.count_documents({"email": email}) if cnt > 0: flash("중복된 이메일 주소입니다.") return render_template("join.html", title="회원가입") current_utc_time = round(datetime.utcnow().timestamp() * 1000) post = { "name": name, "email": email, "pass": hash_password(pass1), "joindate": current_utc_time, "logintime": "", "logincount": 0, } members.insert_one(post) return redirect(url_for("member.member_login")) else: return render_template("join.html", title="회원가입") @bluerprint.route("/login", methods=["GET", "POST"]) def member_login(): if request.method == "POST": email = request.form.get("email") password = request.form.get("pass") next_url = request.form.get("next_url") members = mongo.db.members data = members.find_one({"email": email}) if data is None: flash("회원 정보가 없습니다.") return redirect(url_for("member.member_login")) else: if check_password(data.get("pass"), password): session["email"] = email session["name"] = data.get("name") session["id"] = str(data.get("_id")) session.permanent = True if next_url is not None: return redirect(next_url) else: return redirect(url_for("board.lists")) else: flash("비밀번호가 일치하지 않습니다.") return redirect(url_for("member.member_login")) return "" else: next_url = request.args.get("next_url", type=str) if next_url is not None: return render_template("login.html", next_url=next_url, title="회원로그인") else: return render_template("login.html", title="회원로그인") @bluerprint.route("/logout") def member_logout(): try: del session["name"] del session["id"] del session["email"] except: pass return redirect(url_for('member.member_login')) ---------------------------------------------------------------------------------------------------- - write.html - {% extends "main.html" %} {% block contents %} <script> $(document).ready(function() { $("#summernote").summernote({ height: 300, minHeight: null, maxHeight: null, lang: "ko-KR", popover: { image:[], link:[], air:[] }, callbacks: { onImageUpload: function(image) { for(var i = 0; i < image.length; i++) { uploadImage(image[i]); } } } }); }); function uploadImage(image) { var data = new FormData(); data.append("image", image); var csrf_token = "{{csrf_token()}}"; $.ajaxSetup({ beforeSend: function(x, s) { if(!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(s.type)) { x.setRequestHeader("X-CSRFToken", csrf_token) } } }); $.ajax({ url: "{{url_for('board.upload_image')}}", cache: false, contentType: false, processData: false, data: data, type:"post", success: function(url) { var image = $("<img>").attr("src",url).css('max-width', "900px"); $("#summernote").summernote("insertNode",image[0]); }, error: function(data) { console.log(data); alert(data); } }); } </script> <script> function checkForm() { if ($.trim($("#title").val()) == "") { alert("제목을 입력하세요"); $("#title").focus(); return false; } if ($.trim($("#summernote").val()) == "") { alert("내용을 입력하세요"); $("#summernote").focus(); return false; } } </script> <div style="padding: 50px 50px 50px 50px;"> <form name="form" method="post" action="{{url_for('board.board_write')}}" onsubmit="return checkForm()"enctype="multipart/form-data"> <input type="hidden" name="csrf_token" value="{{csrf_token()}}"> <div class="form-group"> <label for="name">작성자</label> <input class="form-control" id="name" type="text" name="name" value="{{session['name']}}" readonly> </div> <div class="form-group"> <label for="title">제목</label> <input class="form-control" type="text" name="title" id="title" placeholder="제목을 입력하세요"/> </div> <div class="form-group"> <label for="contents">내용</label> <textarea rows="8" class="form-control" name="contents" id="summernote" placeholder="내용을 입력하세요"></textarea> </div> <div class="custom-file"> <input class="custom-file-input" id="customFile" type="file" name="attachfile"> <label class="custom-file-label" for="customFile">파일선택</label> </div> <div class="text-center"><input class="btn btn-primary" type="submit" value="작성하기"></div> </form> </div> {% endblock %} ---------------------------------------------------------------------------------------------------- - edit.html - {% extends "main.html" %} {% block contents %} <script> $(document).ready(function() { $("#summernote").summernote({ height: 300, minHeight: null, maxHeight: null, lang: "ko-KR", popover: { image:[], link:[], air:[] }, callbacks: { onImageUpload: function(image) { for(var i = 0; i < image.length; i++) { uploadImage(image[i]); } } } }); }); function uploadImage(image) { var data = new FormData(); data.append("image", image); var csrf_token = "{{csrf_token()}}"; $.ajaxSetup({ beforeSend: function(x, s) { if(!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(s.type)) { x.setRequestHeader("X-CSRFToken", csrf_token) } } }); $.ajax({ url: "{{url_for('board.upload_image')}}", cache: false, contentType: false, processData: false, data: data, type:"post", success: function(url) { var image = $("<img>").attr("src",url).css('max-width', "900px"); $("#summernote").summernote("insertNode",image[0]); }, error: function(data) { console.log(data); alert(data); } }); } </script> <div style="padding: 50px 50px 50px 50px;"> <form name="form" method="post" action="{{url_for('board.board_edit', idx=data._id)}}" enctype="multipart/form-data"> <input type="hidden" name="csrf_token" value="{{csrf_token()}}"> <div class="form-group"> <label for="name">작성자</label> <input class="form-control" type="text" name="name" value="{{session['name']}}" readonly /> </div> <div class="form-group"> <label for="title">제목</label> <input class="form-control" type="text" name="title" value={{data.title}}> </div> {% if data.attachfile %} <div class="form-check text-right"> <input type="checkbox" class="form-check-input" id="deleteoldfile" name="deleteoldfile"> <label class="form-check-label" for="deleteoldfile">첨부파일 삭제 ({{data.attachfile}})</label> </div> {% endif %} <div class="form-group"> <label for="contents">내용</label> <textarea rows="8" class="form-control" name="contents" id="summernote">{{data.contents}}</textarea> </div> <div class="custom-file"> <input class="custom-file-input" id="customFile" type="file" name="attachfile"> <label class="custom-file-label" for="customFile">파일선택</label> </div> <div class="text-center"><input class="btn btn-primary" type="submit" value="수정하기"/></div> </form> </div> {% endblock %} ---------------------------------------------------------------------------------------------------- - join.html - {% extends "main.html" %} {% block contents %} <script> function checkForm() { if ($.trim($("#name").val()) == "") { alert("이름을 입력하세요"); $("#name").focus(); return false; } if ($.trim($("#email").val()) == "") { alert("이메일을 입력하세요"); $("#email").focus(); return false; } if (!validateEmail($.trim($("#email").val()))) { alert("이메일 유효성이 올바르지 않습니다."); $("#email").focus(); return false; } if ($.trim($("#pass1").val()) == "") { alert("비밀번호를 입력하세요"); $("#pass1").focus(); return false; } if ($.trim($("#pass2").val()) == "") { alert("비밀번호를 입력하세요"); $("#pass2").focus(); return false; } if($.trim($("#pass1").val()) != $.trim($("#pass2").val())) { alert("비밀번호가 일치하지 않습니다."); $("#pass2").select().focus(); return false; } } </script> <div style="padding: 50px 50px 50px 50px;"> <form name="form" action="{{url_for('member.member_join')}}" method="POST" onsubmit="return checkForm()"> <input type="hidden" name="csrf_token" value="{{csrf_token()}}"> <div class="form-group"> <label for="name">이름</label> <input class="form-control" type="text" name="name" id="name"> </div> <div class="form-group"> <label for="name">이메일</label> <input class="form-control" type="text" name="email" id="email"> </div> <div class="form-group"> <label for="name">비밀번호</label> <input class="form-control" type="password" name="pass1" id="pass1"> </div> <div class="form-group"> <label for="name">비밀번호 확인</label> <input class="form-control" type="password" name="pass2" id="pass2"> </div> <div class="text-center"><input class="btn btn-primary" type="submit" value="가입하기" /></div> </form> </div> {% endblock %} ---------------------------------------------------------------------------------------------------- - login.html - {% extends "main.html" %} {% block contents %} <script> function checkForm() { if ($.trim($("#email").val()) == "") { alert("이메일을 입력하세요"); $("#email").focus(); return false; } if (!validateEmail($.trim($("#email").val()))) { alert("이메일 유효성이 올바르지 않습니다."); $("#email").focus(); return false; } if ($.trim($("#pass").val()) == "") { alert("비밀번호를 입력하세요"); $("#pass").focus(); return false; } return true; } </script> <div style="padding: 50px 50px 50px 50px;"> <form name="form" action="{{url_for('member.member_login')}}" method="POST" onsubmit="return checkForm()"> <input type="hidden" name="csrf_token" value="{{csrf_token()}}"> {% if next_url %} <input type="hidden" name="next_url" value="{{next_url}}" /> {% endif %} <div class="form-group"> <label for="email">이메일</label> <input class="form-control" type="text" name="email" id="email"> </div> <div class="form-group"> <label for="pass">비밀번호</label> <input class="form-control" type="password" name="pass" id="pass"> </div> <div class="text-center"><input type="submit" class="btn btn-primary" value="로그인"></div> </form> </div> {% endblock %} ---------------------------------------------------------------------------------------------------- - view.html - {% extends "main.html" %} {% block contents %} <div style="padding: 50px 50px 50px 50px;"> <table class="table table-bordered"> <tbody> <tr> <td colspan="2">{{result.title}}</td> </tr> <tr> <td>{{result.name}}</td> <td class="text-right">{{result.pubdate|formatdatetime}}</td> </tr> {% if result.attachfile %} <tr> <td>첨부파일</td> <td><a href="{{url_for('board.board_files', filename=result.attachfile)}}">{{result.attachfile}}</a></td> </tr> {% endif %} <tr> <td colspan="2"><div style="min-height: 200px;"></div>{% autoescape false %}{{result.contents}}{% endautoescape %}</td> </tr> </tbody> </table> <a class="btn btn-primary" href="{{url_for('board.lists', page=page, search=search, keyword=keyword)}}">리스트</a> {% if session["id"] == result.writer_id %} <a class="btn btn-danger float-right ml-2" href="{{url_for('board.board_delete', idx=result.id)}}">글삭제</a> <a class="btn btn-warning float-right" href="{{url_for('board.board_edit', idx=result.id)}}">글수정</a> {% endif %} </div> {% endblock %} ----------------------------------------------------------------------------------------------------
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원 중복처리 질문입니다.
@PostMapping("/new") public String join (@Valid MemberDTO form, BindingResult result) { if (result.hasErrors()) { return "Oops.."; } Address address = new Address(form.getCity(), form.getStreet(), form.getZipCode()); Member member = new Member(); member.setName(form.getName()); member.setAddress(address); try { memberService.join(member); } catch (IllegalStateException e) { return "회원 중복"; } return "Success"; } 회원중복 처리에 대해선 얘기가 없으셔서 혼자 생각해봐서 구현해봤는데요 실무에서도 보통 저렇게 컨트롤러에서 예외를 잡나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버
어나니머스 타입
// LINQ 버전 레벨 2배 { var players = from p in _players where p.ClassType == ClassType.Knight && p.Level >= 50 orderby p.Level select new { Hp = p.Hp, Level = p.Level * 2 }; Console.WriteLine(); foreach (Player p in players) // 구문오류 { Console.WriteLine($"직업 : {p.classType}, 레벨 : {p.Level}, Hp : {p.Hp}, 공격력 : {p.Attack}"); } } 14:40 쯤에 select에서 new를 이용하여 레벨을 2배인 상태로 추출이 가능하다고 해서 직접 확인해보려 하니까 잘 안되네요 ㅠㅠ foreach문에서 구문오류를 확인해보니 'anonymous type: int Hp, int Level형식을 Player형식으로 변환할 수 없다'고 뜨네요. Player형을 쓰면 안된다는 것 같은데. 그러면 어떤 자료형을 써야하는지 감이 안잡힙니다.. Q1) foreach문의 코드를 어떻게 고쳐야 anonymous type을 출력할 수 있을까요? 레벨이 2배로 된 것을 눈으로 확인하고 싶습니다!
-
미해결UX/UI 시작하기 : Adobe XD 입문(Inflearn Original)
강의 내용도 너무 좋은데 혹시 연습할 만한 예제들을 올려주실 수 있을까요?
강의를 보고 따라하고 있습니다 그런데 몇가지 예제는 그냥 눈으로 볼 수 밖에 없는 몇가지가 있더라고요~ 강의 내용이 너무 좋기는 한데 예제파일도 혹시 올려주시면 감사할 것 같습니다