Order by 정렬

Order by 정렬

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

  • 오름차순정렬 : asc = ascending order, default
  • 내림차순정렬(최신이 위쪽) : desc = descending order
Read More
[패스트캠퍼스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>

[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가 필요하다

[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 변수를 저장가능한 확장자파일.

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

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

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

[ITWILL : JAVA]배열과 함께쓰는 메서드

ITWILL학원 : 10강 JAVA BY 윤미영강사

1. for each문

향상된 for문인 for each문은 기존 for문과 비교해서 초기값과 증감식을 사용하지 않으며 배열이 가지고 있는 요소들을 특정 변수로 바로 할당해서 사용할 수 있게한다

1
2
3
for(데이터타입 변수명 : 반복할 배열명/컬렉션){
//반복할 문장
}

이 반복문은 내부적으로 배열의 인덱스 0번부터 배열의 길이만큼을 반복한다.

  • 장점 : 전체적으로 for문을 훨씬 간결히 작성할 수 있다.

  • 단점

    • 인덱스를 사용하지않고 사용불가능.
    • 반복 처리할 범위를 지정불가능.
  • 결론 : 따라서 인덱스를 써야하거나 특정범위를 반복해야하는 경우는 전통적인 for문을 쓰고 아닐 경우 for each를 쓰면 된다

아래 for문과 for each문의 예시를 보자.
랜덤한 짝수를 3개를 뽑은 뒤 그 합을 구해보자.

랜덤한 짝수 3개뽑기는 index를 사용해야하기때문에 for each를 쓸 수 없다.
뽑은 짝수합을 구하는 경우 index도 필요없고 특정범위반복도 필요없기때문에 for each를 쓰면 한결 간결해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[] evendatas = new int[3];

//랜덤한 짝수 3개 뽑기
for(int i=0;i<evendatas.length;i++){
evendatas[i] = rd.nextInt(8)+1;
if(evendatas[i]%2 !=0){
evendatas[i] = evendatas[i]+1;
}
System.out.print(evendatas[i]+"\t");
}

//뽑은 짝수합구하기
evenSum = 0;
for(int data : evendatas){
evenSum+=data;
}
System.out.print("랜덤한 짝수의 합 : "+evenSum);

2. 배열 데이터의 정렬

배열과 같은 자료구조에 대해서는 정렬에 대한 요구사항이 빈번하다.
정렬을 구현하기 위한 알고리즘은 버블 정렬, 선택 정렬, 삽입 정렬 등 여러가지 방식이 있다.

Arrays.sort() 오름차순정렬

Arrays클래스 API를 이용하기 위해 import java.util.Arrays;해줘야한다.
만약 문자열을 관리하는 배열이 파라미터로 들어온다면 대문자->소문자의 사전순으로 정렬한다.

1
2
3
4
5
6
7
8
9
10
int[] data = {5, 7, 2, 9, 1};
Arrays.sort(data);

//정렬 후 출력
for(int x : data){
System.out.print(x + "\t");
}

//출력값
1 2 5 7 9

3. 배열 데이터의 출력 : Arrays.toString(arr)

배열데이터를 출력하기 위해서 for문을 이용해도 되지만 Arrays클래스 API를 이용하여 출력할수있다.
Arrays.toString(arr)사용하기 위해서는 import를 먼저 해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String [] arr1 = {"JAVA", "is", "Not", "bad"};
Arrays.sort(arr1);

//배열출력1 : for each이용
for(String s :arr1){
System.out.print(s + "\t");
}
//배열출력2 : Arrays클래스 API이용
System.out.println(Arrays.toString(arr1));


// 출력값
JAVA Not bad is
[JAVA, Not, bad, is]

4. Arrays 로또 만들기

배열에 무작위 숫자로 구성된 로또를 만들고 정렬 후 출력하는 게임을 만들어보자.
로또는 1~45사이의 숫자로 구성되며 6개의 숫자를 랜덤으로 뽑느다.
그리고 모든 숫자의 중복 x.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[] selected = new int[6]; //로또를 저장할 배열
int[] fullBall = new int[45]; //모든 공의 정보를 가지고 있는 배열

int cnt= 0;
Random rd = new Random();
while(cnt < 6){ //총 6개의 공을 선택할 조건
int index = rd.nextInt(45); //0~44사이의 정수
int ball = fullBall[index];
if(ball ==0){ //중복체크
selected[cnt] = index +1;
fullBall[index] = -1;
cnt ++;
}
}
Arrays.sort(selected);
System.out.println(Arrays.toString(selected));
}
  1. random.nextInt(n)
    이는 0~(n-1)개의 정수를 랜덤하게 생성한다.
    그렇다면 여기선 random.nextInt(45)이므로 0~44사이의 랜덤한 정수를 생성하게된다.
    왜그럴까?
    selected된 공은 index에서 +1해주기때문이다
    if문을 보자.
    랜덤으로 index가 0이 걸리면 선택된 공은 1이되고
    랜덤으로 index가 44가 걸리면 선택된공은 45가된다.

  2. ball if문으로 중복체크
    ball = 0이 참이면 이 fullBall[index]가 한번도 뽑힌적이 없는 숫자라는 의미이다.
    그리고 선택되어지고 selected[cnt] = index +1을 준다.
    그리고 이미 뽑힌 수는 -1로 값을 준다.
    그렇게되면 다음번에 또 뽑혔을때 -1이기때문에 거짓이 되어 selected가 되지않는다.

1
2
3
예를 들어
fullBall[2]가 처음뽑혔으면 if문이 참이므로 selected[1]가 되고 로또숫자는 3이다.
그리고 난 뒤 fullBall[2] = -1로 바뀌어서 다음번에 뽑혀도 if문에서 거짓으로 팅겨나간다

5. System.arraycopy()

배열은 한 번 생성되면 메모리의 연속성때문에 그 크기를 변경할 수 없다.
하지먼 프로그래밍을 하다 보면 처음 예상했던 데이터의 개수보다 더 많은 데이터를 관리해야할 경우가 있다.
이를 예방하기위해 처음부터 배열의 크기를 크게 지정해버린다면 불필요한 메모리를 낭비하는 꼴이다.

필요에 따라 배열의 길이를 늘이기 위해서는 기존배열의 길이를 늘일수는 없고
배열의 길이 큰 새로운 배열은 만들고 기존 데이터를 복사해 넣은 다음 새로운 데이터를 추가해야한다.

첫번째 방법 : for문과 Arrays.toString()이용

1
2
3
4
5
6
7
8
9
int[] source = {1,2,3};
int[] newSource = new int[7]; //원하는 배열길이만큼의 숫자입력

for(int i=0; i<source.length; i++){
newSource[i] = source[i];
}System.out.println(Arrays.toString(newSource));

//출력값
[1, 2, 3, 0, 0]

두번째 방법 : System.arraycopy()와 Arrays.toString()이용

System.arraycopy(기존배열명, 카피할데이터인덱스, 새로운배열명, 데이터붙여넣을시작인덱스, source.length);

아래처럼 데이터붙여넣을시작인덱스에 2를 넣었기때문에 출력값은 인덱스2번부터 [0, 0, 1, 2, 3, 0, 0]부터 붙여넣기가 된다.
만약 0을 넣었다면 출력값은 인덱스0번부터 [1, 2, 3, 0, 0, 0, 0]이 된다.

1
2
3
4
5
6
7
int[] source = {1,2,3};
int[] newnewSource2 = new int[7] //원하는 배열길이만큼의 숫자입력
System.arraycopy(source, 0, newnewSource2, 2, source.length);
System.out.println(Arrays.toString(newnewSource2));

//출력값
[0, 0, 1, 2, 3, 0, 0]

5. Integer.parseInt(파라미터)

GUI환경에서 가장 잘 사용하는 메서드이다.
정수의 형태인 파라미터를 int로 변경해 리턴한다.
만약 파라미터가 정수형태가 아닐 경우 NumberFormatException 에러가 난다.