Order by 정렬

Order by 정렬

order by를 입력하는 순서는 쿼리구문의 제일 마지막에 적어줘야한다.

  • 오름차순정렬 : asc = ascending order, default
  • 내림차순정렬(최신이 위쪽) : desc = descending order
Read More
테이블 전체목록조회, 테이블구조조회, WHERE(조건문)절
[패스트캠퍼스python] 세션session, 로그인화면만들기

[패스트캠퍼스python] 세션session, 로그인화면만들기

파이썬 인강 자기계발 챌린지 33회차 미션

1. 세션 Session

웹사이트 로그인 기능을 만들기위해 꼭 필요하면서도 중요한 개념인 세션에 대해 알아보자.

구조 설명
클라이언트 웹브라우저
쿠키 서버별 저장소
서버 서버
데이터베이스 클라이언트별 저장소
Read More

[ITWILL : JSP]영역객체 안에서 사용하는 속성(Attribute), 링크이동 방법별 전달가능한 영역(scope)

ITWILL학원 : 15강 JSP기초 BY 정규태강사

1. 영역객체 안에서 사용하는 속성(Attribute)

속성(Attribute)을 저장해서 사용.

사용형태 2가지

  • 해당영역객체.setAttribute("이름", 값)
  • 해당영역객체.getAttribute("이름")
1
2
3
4
5
6
7
//html페이지
<fieldset>
<form action="jsp페이지.jsp" method="get">
<label>아이디 : </label><input type="text" name="id">
<input type="submit" value="submit">
</form>
</fieldset>

페이지객체에서 setAttribute(“이름”, 값)를 통해 생성하고 getAttribute(“이름”)를 통해 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//jsp페이지
<h1>내장객체(pageContext, request, session, application)생성</h1>
<%
pageContext.setAttribute("p", "pageContext 값있음!");
request.setAttribute("req", "request 값있음!");
session.setAttribute("ses", "session 값있음!");
application.setAttribute("app", "application 값있음!");


<h1>내장객체 (pageContext, request, session, application)출력</h1>
pageContext 내장객체의 값 : <%=pageContext.getAttribute("p")%><br>
request 내장객체의 값 : <%=request.getAttribute("req")%><br>
session 내장객체의 값 : <%=session.getAttribute("ses")%><br>
application 내장객체의 값 : <%=application.getAttribute("app")%><br>
%>

2. 링크이동 방법별 전달가능한 영역(scope)

공통적으로 아래 4가지 방식들은 session,application, 파라미터를 저장/전달가능하다.

자바스크립트, JSP(sendRedirect), 액션태그 방식은 서로 같이 사용불가.

2-1. a태그로 이동시

사용가능한 영역은 4가지영역(pageContext,request,session,application) 중에 session, application영역의 값 공유가능하다.

1
<a href="scopeProPro.jsp"> scopeProPro.jsp로 페이지이동 ... </a>

만약 파라미터의 값도 저장하고 전달하고 싶다면 어떻게 하면될까?
표현식을 이용하면 된다.
파라미터까지 전달이 가능하다.

1
<a href="scopeProPro.jsp?id=<%=id%>"> scopeProPro.jsp 페이지로 이동 ... </a>

즉, a태그(링크) 이동시 session,application 영역의 값을 공유가능.
파라미터의 값도 저장/전달 가능하다(get 방식)
HTML이기에 파라미터를 가져갈때 표현식을 사용하면된다.

2-2. js에서 location.href사용하여 이동시

자바스크립트 이동시 session,application 영역의 값을 공유가능.
파라미터의 값도 저장/전달 가능하다(get 방식)
HTML이기에 파라미터를 가져갈때 표현식을 사용하면된다.

1
2
3
4
<script type="text/javascript">
alert("자바스크립트로 scopeProPro.jsp 페이지로 이동")
location.href="scopeProPro.jsp?id=<%=id%>&pw=1234";
</script>

2-3. 내장객체 response 이동시

session,application 영역의 값을 공유가능.
파라미터의 값도 저장/전달 가능하다(get 방식).
파라미터를 가져갈때 표현식이 아닌

1
2
3
4
5
6
7
<%
//response.sendRedirect("이동할 페이지 주소");
response.sendRedirect("scopeProPro.jsp");

//파라메터 추가로 같이 공유하는 방법
response.sendRedirect("scopeProPro.jsp?id="+id+"&pw=1234");
%>

아이디가 한글일때는 왜 물음표가 나타날까요?
response.sendRedirect()전까지는 한글이 안깨지다가 response.sendRedirect()명령어부터 한글이 깨진다.
데이터를 인코딩해서 보내야한다. 인코딩에는 여러 방식이 있는데 response.sendRedirect()는 한글데이터를 처리하지못하는 인코딩방식이다.
response객체안에 전달되는 콘텐츠타입을 바꿔서 해야하는데 그걸 하려면 서블릿을 이용해야해서 서블릿배우면 알수있다.

2-4. 액션태그 forward 이동시(p222)

html태그이지만 jsp동작을 할수있게 만들어진 특수한 기능을 가지고 있다.
액션태그 : jsp페이지에서 자바, 스크립트코드없이 다른 페이지로 이동하는 기능이 있다.
서블릿, 객체(자바빈)에 접근할수있는 방법이 액션태그이다.
원래 페이지에 의해 생성된 request객체와 response객체가 그대로 넘어간다.

즉, session,application 그리고 request 영역 더불어 파라미터값까지 공유가능.

1
2
3
4
5
6
7
<jsp:forward page="scopeProPro.jsp" /> 

또는

<jsp:forward page="scopeProPro.jsp">
<jsp:param name="pw" value="<%=a %>" /> <!--표현식사용가능 -->
</jsp:forward>

액션태그는 포워딩이 일어난다.

  • forwarding (포워딩)이란
    • 이동하는 페이지의 주소는 변경 X, 페이지의 내용만 변경.
    • 중요 request객체와 response객체를 가지고 이동가능

따라서 액션태그는 이동하는 페이지의 주소는 변경되지않고 페이지의 내용만 변경되는 희안한 태그이면서 request객체와 response객체를 가지고 이동한다.

그런데 주소를 변경안하는 기능이 왜 필요할까?
MVC패턴개발방식에서 꼭 필요하다.
웹서핑중에 jsp파일명을 주소창에서 본 적이 있는가?
아마 없을 것이다. 보안을 위해서 .jsp파일을 절대 공개하지않는다.
따라서 가상주소를 사용해야하는데 그 가상주소를 사용할때 액션태그 forward가 필요하다

[패스트캠퍼스python] 회원가입페이지만들기2 비밀번호일치여부확인

[패스트캠퍼스python] 회원가입페이지만들기2 비밀번호일치여부확인

파이썬 인강 자기계발 챌린지 32회차 미션

1. 비밀번호와 비밀번호확인값 데이터베이스에 넣기

원래 프론트앤드에서 주로 담당하지만 백엔드로도 만들 수 있다.
기본 코드는 앱 하위 view.py파일에서 아래 코드를 작성한다.

  1. request를 가져오는 방식에느 get과 post가 있다.
  2. post일때 회원가입페이지이므로 register.html 파일에서 input태그마다 붙여준 name값을 키로 가지고와서 함수를 실행시킨다.
  3. fcuser에 입력값을 생성하기 위해서는 기존의 clas fcuser를 상단에 import해야한다 -> from .models import Fcuser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.shortcuts import render
from .models import Fcuser #새로운 import

def register(request):
if request.method == "GET":
return render(request, 'register.html') #연결하고싶은 파일의 경로
elif request.method == "POST":

#회원가입하는 코드작성 -> register.html파일에서 name값을 키로해서 함수진행
username = request.POST['username']
password = request.POST['password']
re_password = request.POST['re-password']

#fcuser생성 -> fcuser를 사용하기 위해서 기존의 clas fcuser를 import해야한다
fcuser = Fcuser( #객체를 생성해서 저장
username=username,
password=password
)

fcuser.save()

return render(request, 'register.html') #연결하고싶은 파일의 경로

회원가입페이지에서 값들을 입력하고 등록버튼을 누르면 빤짝하고 아래 이미지처럼 모든 값들이 리셋되어진다.

어떠한 변화가 생긴걸까?
위의 코드의 함수가 실행되었지만 입력값들이 post로 들어왔기때문에 elif문을 실행해주고 마지막에 render가 ‘register.html’를 호출했기때문에 페이지사의 변화는 없어보일뿐 데이터는 데이터베이스에 저장되어있다.




2. 비밀번호와 비밀번호확인입력값이 일치하는 지 확인

일치여부는 if문으로 간단하게 나타낼수있다.
앱 하위의 views.py에서 아래 코드를 작성하면된다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.shortcuts import render
from .models import Fcuser
from django.http import HttpResponse #새로운 import

def register(request):
if request.method == "GET": #기존회원로그인
return render(request, 'register.html')
elif request.method == "POST": #회원가입
username = request.POST['username']
password = request.POST['password']
re_password = request.POST['re-password']

#비밀번호와 비밀번호확인일치여부
if password != re_password:
return HttpResponse('비밀번호가 다릅니다')
# HttpResponse를 사용하기위해 파일 상단에 import시켜준다

fcuser = Fcuser(
username=username,
password=password
)

fcuser.save()

return render(request, 'register.html')

기존이 회원가입페이지내용이 다 사라져버려서 유저입장에서 불편하다.
따라서 기존 코드에서 더 나아가보자.

기존 register()함수에서 res_data = {} 변수를 생성하여 불일치의 경우의 데이터를 변수에 담는다.
함수가 끝나가는 마지막라인에서 변수 res_data도 함께 return해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def register(request):
if request.method == "GET":
return render(request, 'register.html')
elif request.method == "POST":

#회원가입하는 코드작성 -> 앞에서 만든 네임값을 키로해서 진행
username = request.POST['username']
password = request.POST['password']
re_password = request.POST['re-password']

#비밀번호와 비밀번호확인일치여부
res_data = {} #불일치의 경우 데이터를 res_data라는 변수에 담는다.
if password != re_password:
res_data['error'] = '비밀번호가 다릅니다'


fcuser = Fcuser(
username=username,
password=password
)

fcuser.save()

return render(request, 'register.html', res_data)

위 코드이 변수res_data가 return할 값이 출력되어야하기때문에 register.html error가 출력된 수 있도록 코드를 추가해야한다.
에러코드가 나타나길 원하는 위치에 {{ error }}를 작성해주면 끝!

1
2
3
4
5
<div class="row">
<div class="col-12">
{{ error }}
</div>
</div>

[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수

[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수

  1. 클래스 class : 실생활에서 도면에 해당하는 것, 객체를 만드는 원판
  2. 객체 object=instance : 도면을 이용해서 찍어내는 제품, 원판을 통해 만들어진 객체
  3. 인스턴스화 : 클래스 - 인스턴스화(=객체화=객체생성=메모리에 객체가 생성됨)-> 객체
Read More

[ITWILL : JSP]JSP 디렉티브(directive) 중 include VS 액션태그 include, jspf확장자 파일

ITWILL학원 : 15강 JSP기초 BY 정규태강사

1. include의 두 종류

  • @include : 골뱅이방식
    골뱅이방식은 jsp 지시어이고 jsp문법이다.
    공통으로 사용되는 변수를 파일에 지정해서 추가한다.
    해당 페이지가 컴파일되기전에(소스코드파일.java가 클래스파일로.class 변화하는 과정) 소스코드를 include한 후 컴파일한다.
    컴파일을 한번한다.

  • jsp:include page=”” : 액션태그방식
    액션태그방식은 html문법이다.
    공통으로 사용되는 메뉴들을(주로 페이지) 특정 공간에 추가한다.
    해당 페이지가 java파일(서블릿)으로 컴파일 된 후에 include한다.
    컴파일을 두번하게된다.

1
2
3
4
5
 <%@ include ~ %>
<!-- JSP 지시어 : 공통으로 사용되는 변수를 파일에 지정해서 추가 -->

<jsp:include page=""> ~
<!-- 액션태그 : 공통으로 사용되는 메뉴들을(페이지) 특정 공간에 추가 -->

예시
아래 테이블에서 첫 행에 top.jsp라는 파일을 추가하고싶을때 jsp액션태그를 사용하는 방법이다.

1
2
3
4
5
6
7
8
9
 <table border=1 width="600" height="600">
<tr>
<td colspan="2" height="100">
<jsp:include page="top.jsp">
<jsp:param value="Your name" name="name"/>
</jsp:include>
</td>
</tr>
</table>

2. @include 와 jsp:include page=”” 차이점

둘 다 목적은 include(추가)하는 거지만 include되는 시점이 다르다.
골뱅이방식은 jsp파일에 include한 뒤 java가 되고 class파일이 된다.
액션태그방식은 jsp가 java파일이 되고 거기에 include를 하고 class파일이 된다.

3. jspf확장자 파일

jspf( Jsp Servlet Page Framegment ) : JSP 변수를 저장가능한 확장자파일.

[패스트캠퍼스python] 부트스트랩을 이용한 회원가입페이지만들기, csrf token

[패스트캠퍼스python] 부트스트랩을 이용한 회원가입페이지만들기, csrf token

파이썬 인강 자기계발 챌린지 31회차 미션
부트스트랩을 이용해 회원가입페이지를 만들어보자

1. 부트스트랩 설정

앱 아래에 만들어놓은 templates폴더안에 register.html 파일을 생성한다.
그 뒤 부트스트랩 홈페이지로 이동한다.

  1. head태그안에 부트스트랩 CSS를 복붙한다.
  2. head태그안에 부트스트랩 JS를 복붙한다.
  3. head태그안에 아래 기본 meta코드를 복붙한다.
1
2
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

또는

  1. 위의 3단계를 생략하고 부트스트랩 Starter template를 복붙해도 된다!




2. Bootstrap’s form styles 적용하기.

부트스트랩 컴포넌즈 폼에서 form태그를 복붙해온뒤 센터정렬이라든지 커스터마이징을 할수있다.
부트스트랩의 기본 폼스타일은 아래 이미지와 같다.
딱 심플 그자체!

기본 폼 스타일에서 커스터마이징을 해보자.
input태그를 추가하여 비밀번호 확인을 만들 수 있다.
input태그를 추가한 후 python manage.py runserver명령어를 입력한 뒤 주소창에 register/를 추가입력해주면 커스터마이징한 웹페이지가 나타난다.




3. html페이지를 view에 연결하기

부트스트랩으로 만든 html페이지를 view에 연결을 해줘야한다.
앱 아래의 views.py파일에서 아래 코드를 입력한다.

view는 항상 request라는 매개변수를 받기때문에 입력을 해주어야한다.

1
2
3
4
from django.shortcuts import render

def register(request):
return render(request, 'register.html') #따옴표안에 연결하고싶은 파일의 경로입력




4. url설정

  1. 앱 하위에 urls.py파일을 생성한 뒤 아래 코드를 입력해준다
    register는 3번에서 만든 views안의 register함수를 연결해준 것이다.
1
2
3
4
5
6
7
from django.urls import path
from . import views

urlpatterns = [
path('register/', views.register),
#register는 views안의 register함수에 연결하겠다는 의미
]
  1. 프로젝트폴더의 동일한 이름으로 자동생성된 파일 하위의 urls.py를 클릭한다.
    urls.py에서 path('앱명/', include('앱명.urls')) 한줄을 추가한다.
    추가한 뒤 전체코드는 아래와 같다.
1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('앱명/', include('앱명.urls'))
]
  1. python3 manage.py runserver 실행.
    잘 연결되었는지 확인을 위해 python3 manage.py runserver를 실행한다.




5. csrf_token

장고를 이용하면 꼭 넣어야하는 코드이고 항상 form태그 안에 위치해야한다.
form의 겨우 데이터를 서버에 전달하는 역할을 하는데 우리 사이트에서 우리 서버로 데이터를 전송하는 것은 문제될것이 없으나 피싱범죄를 목적으로 자신의 웹사이트에서 전송을 하는 경우가 있다.
이를 방지하기 위해, 즉 크로스도메인을 막기위해 암호화된 키를 숨겨놓는다.

참고링크 : CORS 크로스 도메인 이슈와 해결방법

이 코드를 {% csrf_token %}입력을 해놓으면 장고가 알아서 암호화된 키를 생성하고 키검증까지 자동으로 해준다.

1
2
3
<form method="POST" action=".">
{% csrf_token %}
</form>

여기서 action값을 생략하거나 점(.)을 입력하면 현재페이지 action이 진행된다.
실제 사용예시는 아래와 같다. form태그 밑에 위치하면 된다!