차근차근 순서대로 Django와 python으로 쇼핑몰을 만들어보자.
1. Django 가상환경설정
- 가상환경 virtualenv 설치하기 : pip3 install virtualenv
- 가상환경은 첫 사용시 한번만 설치하면 된다. 이미 설지채놓았다면 2번 가상환경 폴더만들기부터 진행하면된다.
- virtualenv는 일반적으로 글로벌 설치가 되어야하는 유일한 패키지이다. 나머지 패키지들은 가상 환경에 설치하기때문이다.
차근차근 순서대로 Django와 python으로 쇼핑몰을 만들어보자.
이름과 주민번호의 입력값이 DB데이터와 일치하면 회원탈퇴를 진행하는 코드를 만들어보자.
먼저 이름과 주민번호를 사용자로부터 입력받을 수 있는 deleteForm.jsp
파일을 만든다
1 | <fieldset> |
deletePro.jsp
에서 사용자데이터를 불러와서 DB데이터와 확인 후 탈퇴를 처리하는 코드를 작성하면 아래와 같다.
순서는 아래와 같다
1 | <%//1. 변수가져오기 |
이때 두가지 방법이 있다.
pstmt.executeUpdate();
는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.
사용자입력값이 DB데이터와 일치하면
실행완료(수정완료) : 1
출력정상적으로 탈퇴되었습니다
라는 문구 출력된다.사용자입력값이 DB데이터와 불일치하면
실행완료(수정실패) : 0
출력탈퇴실패
문구 출력된다.1 | <% |
pstmt.executeUpdate();
는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.
사용자입력값이 DB데이터와 일치하는지 select로 확인후 일치하면
사용자입력값이 DB데이터와 일치하는지 select로 확인후 불일치하면
DB에서 delete은 매우 신중한 작업이다.
따라서 정확한 데이터를 찾아 정확하게 처리해야하기때문에 전자보단 후자를 사용해야한다.
1 | <% //3. sql작성 & pstmt객체생성 |
어떤 건 import를 쓰고 어떤 건 import하지않고도 사용가능하다.
왜그럴까?
import가 필요없는 경우 : 기본적으로 사용 가능한 클래스인 경우이다.
import를 써야하는 경우 : 기본제공되는 클래스가 아닌 경우 클래스가 있는 패키지를 추가(import)해야함
form페이지를 만들어서 이름과 성별, 나이, 주민번호를 사용자로부터 받은 뒤 그 데이터들을 insertPro.jsp
파일에서 불어와서 MySQL DB에 넣어보는 코드이다.
아래 코드는 form페이지는 생략하고 insertPro.jsp
만 나타낸 코드이다.
총 3단계로 이루어진다.
1 | //import 아래 3가지 추가됨 |
MySQL가서 select * from 테이블명
명령어를 입력하면 row가 추가된 것을 확인할 수 있다.
위의 sql구문작성을 보면 변수, 작은따옴표, 큰따옴표혼재되어있어서 적기에 매우 불편하다
이를 해소하기위한 객체PreparedStatement를 이용하면된다.
기존 Statement보다 처리속도도 빠르고 보안도 좋은 PreparedStatement를 사용해야한다.
아래 두 코드를 비교해보자.
1 | <%@page import="java.sql.Statement"%> |
3단계 stmt 실행시 기능에 따라 쿼리구문을 두가지로 구분할수있다.
pstmt.executeUpdate() : insert, update, delete에 사용
pstmt.executeQuery() : select에 사용
1 | <%@page import="java.sql.PreparedStatement"%> |
클래스 Book은 책제목과, 저자, 가격을 출력해준다.
1 | public class Book { |
클래스 TestBook 이라는 새로운 클래스파일을 만들고 메인메서드를 실행해보자.
1 | public class TestBook { |
보이는 것처럼 생성자파라미터를 통해서 입력한 값들은 제대로 출력되지만 파라미터메서드를 통해서 입력한 값들은 null로 출력된다.
WHY?
메서드는 파라미터의 값을 받았는데 넣어줄 곳이 없기때문에!
그렇다면 메서드를 어떻게 바꾸면 될까?
멤버변수를 파라미터값을 대입할수있게 코드를 추가해주면된다
1 | void showInfo(String title, String author, int price ){ |
생성자에 파라미터를 받는 방법과 메서드에 파라미터를 받아서 하는 방법 중 어느것이 더 좋은 것일까?
1 | //1-1.생성자파라미터 생성 |
1 | //2-1.파라미터메서드 생성 |
둘 다 기능은 동일하지만 생성자파라미터를 쓰는 것이 더 좋다
WHY?
생성자의 기능과 메서드의 기능에 맞게 충실하게 하는 것이 좋기때문이다
생성자의 기능은 변수를 초기화하는 것이다.
메서드는 이름에서도 알수있듯이 showInfo()이다. 하지만 파라미터메서드를 생성하면 변수도 초기화하고 출력까지하는 두가지 짬뽕기능을 가지게 된다.
따라서 기능에 맞게 나눠서 코딩하는 것이 좋은 개발습관이다.
DAO : 주로 jsp model1에서 사용
DTO(Data Transfer Object) : 데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 작업을 처리하는 클래스이다.
멤버변수는 private을 설정하는 것이 데이터보안상 좋다.
하지만 private을 쓰게되면 다른 클래스에서 가져가 쓸 수가 없다.
이럴때 아래 두가지 메서드를 이용한다(개발자들의 약속이다).
이를 getter와 setter라고 부른다.
1 | //메인메서드안에서 get메서드쓰는 방법 |
Book 클래스파일은 아래와 같다.
제목과 저자 가격을 멤버변수로 가지고 있다.
1 | public class Book { |
매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.
실행하는 메인메서드파일은 아래와 같다.
1 | Book book1 = new Book("운동하는여자", "양민영", 25000); |
클라이언트쪽에서 저장되어 관리되는 정보.
ㅋ쿠기의 이름은 알파벳, 숫자조합으로 생성됨
브라우저가 종료되어도 상관없이 지정된 생존기간까지 사용가능.(클라이언트의 HDD하드디스크에 저장되기때문에 브라우저 종료되어도 계속 데이터를 유지할수있다.)
쿠키생성하면서 값을 입력하였다고 쿠키가 메모리 또는 하드디스크에 저장된 것이 아니다. 쿠키를 생성하였으면 생성한 쿠키를 꼭 클라이언트로 전송해줘야한다.
단점 : 클라이언트에서 관리되기 때문에 보안에 취약(하드디스크에 있는 쿠키파일 수정할수있기때문)
반대개념은 세션(Session) : 서버쪽에서 저장되어 관리되는 정보, 서버종료되면 사용불가
1 | <h1>쿠키테스트(서버 역할)</h1> |
1 | <h1>쿠키테스트(클라이언트 역할)</h1> |
1 | <% |
1 | <% |
쿠키를 확인하는 방법은
쿠키폼페이지 생성하기
1 | <h1>쿠키form</h1> |
쿠키프로페이지 생성하기
1 | <h1>쿠키pro</h1> |