반응형
SMALL

아이디 중복검사 기능 구현

ajax 통신을 통해 DB에 Id가 중복되는지 확인해서 id중복검사 기능을 구현해보겠다.

[ 만들 기능 ]
1. 빈값 체크
2. 유효성 검사(5~20자 특수문자 -와_만 허용)
3. id 중복체크

1. jsp에서 ajax 통신을 이용해서 호출 URL로 Data 보냄
2. Controller에서 호출 URL을 받아 Action과 연결함.
3. Action에서 getParameter로 가져온 userId값을 Service로 보내줌.
4. Service에서 id값을 받아 커넥션 풀에서 DB 연결하고, 회원정보 찾아봄.
5. DAO 안에서 service에게 전달받은 id를 SQL에 맞게 검색 후 결과값 리턴해서 Service에게 줌. (+커넥션 끊음)
6. 다시 Service에서 DB 명령 완료하고 결과 리턴해줌.(중복이면 0, 안중복이면 1)
7. Action에서 Service에게 받은 결과값을 getWriter().write로 응답하는 스트림에 결과값 던져줌.
8. 다시 ajax 성공 결과값인 success로 와서 응답받은 result값에 따라 메시지 출력해줌.


1. joinUs.jsp - id를 입력하는 input 확인

<form name="joinform" action="./memberJoinAction.me" method="post">
   <!-- container -->
    <div id="container" role="main">
        <div id="content">
            <!-- tg-text=title -->
            <h2 class="blind">네이버 회원가입</h2>
            <div class="join_content">
                <!-- 아이디, 비밀번호 입력 -->
                <div class="row_group">
                    <div class="join_row">
                        <h3 class="join_title"><label for="id">아이디</label></h3>
                        <span class="ps_box int_id">
                        	<!-- ID 입력 및 포커스아웃되면 중복검사 -->
                            <input type="text" id="id" name="MEMBER_ID" class="int" title="ID" maxlength="20">
                            <span class="step_url">@naver.com</span></span>
                        <span class="error_next_box" id="idMsg" style="display:none" aria-live="assertive"></span>
                    </div>

2. joinUs.jsp - 하단 script에서 IdCheck 함수 시행

▼ id 체크하는 jsp 파일 script 전체

더보기
//필요한 플래그들을 세운다.
var idFlag = false;

...

//id = 'id' 인 input에 플래그가 있다. checkId 함수를 시행한다.
$("#id").blur(function() {
    idFlag = false;
    checkId("first");
});

//========= id 체크 함수 시행 ===============
function checkId(event) {
    if (idFlag) 
        return true;
    
    var id = $("#id").val();
    var oMsg = $("#idMsg");
    var oInput = $("#id");
	
  	//============ [id 필수입력] ============
    if (id == "") {
        showErrorMsg(oMsg, "필수 정보입니다."); //에러메시지 출력
        setFocusToInputObject(oInput); //전송 플래그 조절
        return false;
    }
	
  //============ [id 유효성검사] ============
    var isID = /^[a-z0-9][a-z0-9_\-]{4,19}$/;
    if (!isID.test(id)) {
        showErrorMsg(oMsg, "5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능합니다."); //에러메시지 출력
        setFocusToInputObject(oInput); //전송 플래그 조절
        return false;
    }

  //============ [id 중복체크] ============
    // 추가) ajax 통신으로 DB 데이터 조회해서 중복확인하기!!!(post 방식) 
    idFlag = false; //검사 flag
    let userId = $('input[name=MEMBER_ID]').val(); // input_id에 입력되는 값
    console.log("입력한 id값 : " + userId);
	
  	//id 중복체크를 위해 input에 입력한 id값을 가져와서 ajax data로 반드시 보내줘야한다.
    $.ajax({
        url: "IdCheckService/idcheckAjax",
        type: "post",
        data: {
            userId: userId 
        },
        dataType: 'json',
        success: function (result) {
            //Action에서 받은 result값 : 1이면 사용가능, 0이면 중복됨
            if (result == 0) { //돌려받은 결과가 중복이 존재한다는 0이면

                showErrorMsg(oMsg, "이미 사용중이거나 탈퇴한 아이디입니다."); //에러메시지 출력
                setFocusToInputObject(oInput); //전송 플래그 조절

            } else { //돌려받은 결과가 중복이 없다는 false이면

                if (event == "first") { //그리고 #id라면
                    showSuccessMsg(oMsg, "멋진 아이디네요!"); //에러메시지 출력
                } else {
                    hideMsg(oMsg); //메시지 숨김
                }
                idFlag = true; //id 플래그 1로 변경. 더이상 id alert 발생 x
            }
        },
        error: function () {
            alert("서버요청실패");
        }
    })
    return true;
} //function checkId(event) { 끝

1) id 필수입력

  	//============ [id 필수입력] ============
    if (id == "") {
        showErrorMsg(oMsg, "필수 정보입니다."); //에러메시지 출력
        setFocusToInputObject(oInput); //전송 플래그 조절
        return false;
    }

2) id 유효성 검사 - 정규식 활용

  //============ [id 유효성검사] ============
    var isID = /^[a-z0-9][a-z0-9_\-]{4,19}$/;
    if (!isID.test(id)) {
        showErrorMsg(oMsg, "5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능합니다."); //에러메시지 출력
        setFocusToInputObject(oInput); //전송 플래그 조절
        return false;
    }

3) id 중복체크 - ajax 통신을 통해 결과값 받음.

  //============ [id 중복체크] ============
      // 추가) ajax 통신으로 DB 데이터 조회해서 중복확인하기!!!(post 방식) 
    idFlag = false; //검사 flag
    let userId = $('input[name=MEMBER_ID]').val(); // input_id에 입력되는 값
    console.log("입력한 id값 : " + userId);
	
  	//id 중복체크를 위해 input에 입력한 id값을 가져와서 ajax data로 반드시 보내줘야한다.
    $.ajax({
        url: "IdCheckService/idcheckAjax",
        type: "post",
        data: {
            userId: userId 
        },
        dataType: 'json',
        success: function (result) {
            //Action에서 받은 result값 : 1이면 사용가능, 0이면 중복됨
            if (result == 0) { //돌려받은 결과가 중복이 존재한다는 0이면

                showErrorMsg(oMsg, "이미 사용중이거나 탈퇴한 아이디입니다."); //에러메시지 출력
                setFocusToInputObject(oInput); //전송 플래그 조절

            } else { //돌려받은 결과가 중복이 없다는 false이면

                if (event == "first") { //그리고 #id라면
                    showSuccessMsg(oMsg, "멋진 아이디네요!"); //에러메시지 출력
                } else {
                    hideMsg(oMsg); //메시지 숨김
                }
                idFlag = true; //id 플래그 1로 변경. 더이상 id alert 발생 x
            }
        },
        error: function () {
            alert("서버요청실패");
        }
    })
    return true;

3.  MemberDAO.java - SQL 조회 중복여부 확인

...

	public static MemberDAO instance;
	Connection con;
	// jsp와 오라클 연결 유지.
	PreparedStatement pstmt;
	// 쿼리문 전달.
	ResultSet rs;
	// 쿼리문 결과 저장 객체.
	DataSource ds;
	// 어떤 DB에 연결할 지.
    
...
    
    //=========================== id 중복확인하는 SQL로직 ===============================
	public int checkId(String id) {  // 유저가 입력한 값을 매개변수로 한다
		/*
		회원가입 JSP에서 받아온 ID값과 기존 테이블의 ID값이 일치하는지 여부를
		확인하기 위해 Select명령어를 사용해 DAO를 만들었습니다. 
		Select값이 없는 경우 0을 출력하고,
		Select값이 있는 경우 1을 출력하도록 설정했습니다.*/
		String sql = "select * from memberinfo where MEM_ID=?"; // 입력값이 테이블에 있는지 확인
		
		int idCheck = 0;
	    try {
	    	pstmt = con.prepareStatement(sql); // pstmt에 위의 query 저장 후 DB에 연결 준비
	    	pstmt.setString(1, id); //첫번째 ?에 id 변수 셋팅
			System.out.println("DAO 내부) DB에 검색하는 id값(input에 쓴 값) : "+ id);
			
			rs = pstmt.executeQuery(); // query 실행 후 그 결과값을 rs에 저장
					
			
			if(rs.next() || id.equals("")) {
				idCheck = 0;  // 이미 존재하는 경우, 생성 불가능
				System.out.println("DAO 내부) id 중복됨");
			} else {
				idCheck = 1;  // 존재하지 않는 경우, 생성 가능
				System.out.println("DAO 내부) id 안중복");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(rs);
			close(pstmt);//마지막으로 연결 다 끊어주자. conn은 위에서 다 함.
		}

		return idCheck;
	}

4. MemberJoinService.java - DB와 jsp를 연결

	//=================== 추가) id 중복체크 하는 service ==============================
	public int checkIdService(String id) {
		MemberDAO memberDAO = MemberDAO.getInstance();
		// 객체에 저장된 고객 정보를 DB로 전달하는 클래스.
		// DAO : Data Access Object
		Connection con = getConnection();
		// DB와 jsp간의 연결을 해주는 것을 담당함.
		memberDAO.setConnection(con);
		
		int chkId = memberDAO.checkId(id);  //checkId는 MemberDAO에서 받아온다.
		//1이면 사용가능, 0이면 중복됨
		// DB추가 쿼리를 메소드로 구현.
		System.out.println("Service 내부) chkId : "+chkId);
		
		
		//============ "commit"이 꼭꼭 필요하다. ============
		if (chkId == 0 || chkId == 1) { 
			commit(con); //DB 명령 완료 확인
			System.out.println("Service 내부) DB commit");
		} else {
			rollback(con);
			//만약 제대로 동작하지 않았다면
			//쿼리문에 대해서 취소(rollback)
		}

		//============ 없었더니 안중복되었다고만 리턴됨..그냥 닫기만 한거임. ============
		
		
		close(con);
		System.out.println("Service 내부) DB close");
		//연결되지 않았으면 연결 해제(DB와 Connection의 연결 해제)

		return chkId;
	}

5. MemberIdCheckAction.java - ajax로 받은 값 service에 넘겨주고 조회한 뒤 결과값 전송받음

/* 인터페이스를 함께 추가했다. 로그인 처리를 위한 클래스이다.*/
public class MemberIdCheckAction implements Action { // Action을 implements 해줌

	@Override
	public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		MemberJoinService memberJoinService = new MemberJoinService();
		//=========================== id중복 처리 ================================

		String userId = req.getParameter("userId"); //ajax로 전달한 data 값 userId
		//1이면 사용가능, 0이면 중복됨
		System.out.println("Action 내부) 입력한 id : "+userId);
		PrintWriter out = resp.getWriter();			
		int idChk = memberJoinService.checkIdService(userId); 
		//DB 조회해서 중복체크 결과값 전송받음(checkId). 1이면 사용가능, 0이면 중복됨				
		
		// 성공여부 확인 : 개발자용(서버콘솔)
		if (idChk == 0) { //id 중복
			System.out.println("Action 내부) 이미 존재하는 아이디입니다.");
		} else if (idChk == 1) {
			System.out.println("Action 내부) 사용 가능한 아이디입니다.");
		}
				
		out.write(idChk + ""); // --> ajax 결과값인 result가 됨
				// --> String으로 값을 내보낼 수 있도록 + "" 를 해준다
				//ajax의 result값 : 1이면 사용가능, 0이면 중복됨
		
		return null;
		//ActionForward를 null로 리턴하면 이미 response에 응답을 끝냈다는 의미가 된다. 다른 어떤 페이지로도 이동하지 않는다.	
	}
}

6. 컨트롤러에서 ajax URL에 해당하는 Action페이지 연결

//-------------------- id중복검사하는 membercheckAction 페이지 생성 ---------------------------				
else if (command.equals("/member/IdCheckService/idcheckAjax")) {
    action = new MemberIdCheckAction();
    try {
        forward = action.execute(req, resp); //받은 action을 뜯어서 SQL로 보내준다.
        System.out.printf( "MemberFrontController : idCheck - SQL DB로 보내는 로직 실행 \n",req, resp))

    }
    catch (Exception e) {
        e.printStackTrace();
        System.out.println( "MemberFrontController : idCheck - SQL DB로 보내는 로직 실패(위에 에러)"))
    }
}

7. result 값을 리턴받은 ajax에서 success에 설정한 메시지(oMsg)를 띄운다.

결과물

틀릴 시 댓글 부탁드립니다.

 

jQuery 를 이용하여 id, class, name 의 input value 값 가져오기

jQuery 를 이용하여 id, class, name 의 input value 값 가져오기 1) id 값 기준으로 가져 오기 var valueById = $('#inputId').val(); # 은 아이디를 의미 2) class 값 기준으로 가져 오기 var valueByClass = $('.inputClass').val();

heannim-world.tistory.com

 

 

HttpServletRequest 과 HttpServletResponse 메소드 정리

HttpServletRequest 과 HttpServletResponse 메소드 정리 HttpServletRequest 를 간단하게 req라고 해봅시다. req를 사용하면, 값을 받아올 수가 있는데, 회원정보를 보냈다면 req 객체 안에 모든 데이터들이 들어가

heannim-world.tistory.com

 

 

protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { 뜯어보기

컨트롤러에서 요청/응답 처리하는 법 protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { 하나하나 뜯어보자면, protected : java 접근자, 같은 폴더(패키지)및 그 클

heannim-world.tistory.com

▼ 진행중인 gitHub 링크를 남깁니다.

 

GitHub - k-haein/BlogPrj: 회원가입/로그인/게시글 등록 등의 블로그를 처음부터 만듭니다.

회원가입/로그인/게시글 등록 등의 블로그를 처음부터 만듭니다. Contribute to k-haein/BlogPrj development by creating an account on GitHub.

github.com

 

반응형
LIST
반응형
SMALL

1. 오라클 워크시트에 테이블과 시퀀스 생성하기

create table board(
no number CONSTRAINT board_no_pk primary key,
pwd varchar2(10),
writer varchar2(34),
subject varchar2(100),
content varchar2(400),
regdate date default sysdate
);

create sequence board_seq
increment by 1
start with 1;

저장하고 실행.

 

2. 리눅스 터미널에서 jupyter-notebook 실행

(아나콘다가 깔려있어야 한다.)

base에서 실행한다.

3. workspace 역할을 할 디렉토리 만들자.

new > folder > 파이썬 파일 하나 만들기

그리웠다 주피터..... 필기 자유로운게 너무 좋다ㅠ

 

4. 오라클 연동 후 필수 라이브러리 설치
!pip install cx_Oracle 설치하기

!pip install cx_Oracle

다운로드 되거나,  이미 설치되어 있으면 이미 했다고 뜸

 

 

5. 오라클 연결

#오라클 수입
import cx_Oracle as ora

현재 주피터와 오라클 데이터베이스를 연결하는 클래스이다.

앞으로 계속 껐다가 킬껀데, 그때마다 다시 켜주는 장치다. 

#오라클 connection 연결
conn = ora.connect('kosmorpa/test00@192.168.0.122:1522/orcl')
print(conn.version)

나는 버전이 11.2.0.1.0이다. 저번 포스팅에서 깔았던 그 오라클 버전.

print(conn)

잘 연결되었다.

이러면 윈도우에서 오라클 DB가 있어도 리눅스에서 작업할 수 있어서 훨씬 편하다.

 

6. 커서 변환하기

conn.cursor : 연결된 데이터 베이스에 sql 문장을 실행하고 데이터를 가져오는 역할

#커서 변환하기
cursor = conn.cursor()
print(cursor)

 

▼ connection 클래스와 cursor 클래스

더보기

[ Connection클래스 ]

연결된 데이터베이스를 동작시키는 역할을 한다.

>Connection.cursor()

Cursor객체를 생성한다.

 

>Connection.commit()

현재 트랜잭션의 변경내역을 DB에 반영(commit)한다.

이 메서드를 명시적으로 호출하지 않으면 작업한 내용이 DB에 반영되지 않으므로, 다른 연결(Connection)에 그 내용이 나타나지 않는다.

 

>Connection.rollback()

가장 최근의 commit()이후 지금까지 작업한 내용에 대해서 DB에 반영하지 않고, 트랜잭션 이전 상태로 되돌린다.

 

>Connection.close()

DB연결을 종료한다.

자동으로 commit()메서드를 호출하는것이 아니기에, close()메서드를 호출하기 이전에 commit()/rollback()중 하나를 명시적으로 호출해야 한다.

 

>Connection.isolation_level

트랜잭션의 격리수준(isolation level)을 확인/설정한다.

입력가능한 값은 None, DEFERRED, IMMEDIATE, EXCLUSIVE이다.

 

>Connection.execute(sql[, parameters])

>Connection.executemany(sql[, parameters])

>Connection.executescript(sql_script)

임시 Cursor객체를 생성하여 해당 execute계열메서드를 수행한다

(Cursor클래스의 해당 메서드와 동일하므로 Cursor클래스에서 설명하겠다.)

 

>Connection.create_aggregate(name, num_params, aggregate_class)

사용자정의 집계(aggregate)함수를 생성한다.

 

>Connection.create_collation(name, callable)

문자열 정렬시 SQL구문에서 사용될 이름(name)과 정렬 함수를 지정한다.

정렬함수는 인자로 문자열 2개를 받으며, 첫 문자열이 두번째 문자열보다 순서가 낮은경우 -1, 같은경우 0, 높은경우 1을 반환해야 한다.

 

>Connection.iterdump()

연결된 DB의 내용을 SQL질의 형태로 출력할수 있는 이터레이터를 반환

 

 

[ Cursor클래스 ]

실질적으로 데이터베이스에 SQL문장을 수행하고, 조회된 결과를 가지고 오는 역할을 한다.

>Cursor.execute(sql[, parameters])

SQL문장을 실행한다. 실행할 문장은 인자를 가질수 있다.

 

>Cursor.executemany(sql, seq_of_parameters)

동일한 SQL문장을 파라미터만 변경하며 수행한다.

파라미터 변경은 파라미터 시퀸스, 이터레이터를 이용할수 있다.

 

>Curosr.executescript(sql_script)

세미콜론으로 구분된 연속된 SQL문장을 수행한다.

 

>Cursor.fetchone()

조회된 결과(Record Set)로부터 데이터 1개를 반환한다. 더 이상 데이터가 없는 경우 None을 반환한다.

 

>Cursor.fetchmany([size=cursor.arraysize])

조회된 결과로부터 입력받은 size만큼의 데이터를 리스트 형태로 반환한다.

데이터가 없는 경우 빈 리스트를 반환한다.

 

>Cursor.fetchall()

조회된 결과 모두를 리스트형태로 반환한다.

데이터가 없는 경우, 빈리스트를 반환한다.

 

출처 : m.blog.naver.com/dudwo567890/130165627205

 

연결은 끝났고 다양하게 오라클과 연동해보자.


[연동 방식]

  1. DB 접속이 성공하면, Connection 객체로부터 cursor() 메서드를 호출하여 Cursor 객체를 가져온다. DB 커서는 Fetch 동작을 관리하는데 사용되는데, 만약 DB 자체가 커서를 지원하지 않으면, Python DB API에서 이 커서 동작을 Emulation 하게 된다.
  2. Cursor 객체의 execute() 메서드를 사용하여 SQL 문장을 DB 서버에 보낸다.
  3. SQL 쿼리의 경우 Cursor 객체의 fetchall(), fetchone(), fetchmany() 등의 메서드를 사용하여 데이타를 서버로부터 가져온 후, Fetch 된 데이타를 사용한다.
  4. 삽입, 갱신, 삭제 등의 DML(Data Manipulation Language) 문장을 실행하는 경우, INSERT/UPDATE/DELETE 후 Connection 객체의 commit() 메서드를 사용하여 데이타를 확정 갱신한다.
  5. Connection 객체의 close() 메서드를 사용하여 DB 연결을 닫는다.

▼한국인을 위한 요약

더보기

방법을 간단히 요약하자면,

 

1) 오라클 connection 연결

2) connection이 cursor 객체 가져옴(연결도구)

3) cursor 객체의 fetch메서드를 이용해서 데이터를 서버로부터 가져온다.

4) cursor 객체의  execute() 메서드를 사용해서 파이썬에 입력한 SQL 문장을 오라클 DB 서버로 보낸다.

5) 주고받는 것이 완료되면 connection 객체의 commit() 메서드를 사용해서 데이터를 확정한다.

6) connection.close()를 해서 오라클과 연결을 끊는다.

 

즉, 정리하자면

오라클 수입 : import cx_Oracle as ora
오라클 Connection 연결 : conn = ora.connect('kosmorpa/test00@192.168.0.122:1522/orcl')
Cursor 불러오기 :  cursor = conn.cursor()
a) SQL 입력문장 -> 오라클 DB : cursor.execute( 전송할 sql 문장 )
b) 오라클 DB 데이터 -> 파이썬 : cursor.fetch*****()
Cursor 닫기 : cursor.close()
오라클 DB 저장 : conn.commit()
오라클 연결 끊기 : conn.close()

이걸 이용해서 파이참(PyCharm)에서 DB를 원래 했던 sqlite가 아닌 윈도우에 설치 되어있는 오라클과 연동해서 해보도록 하자.



 

 

1. 입력처리

 

1) 디장고에서 폼으로 작성할 것

#디장고에서 폼으로 작성할 것
writev = input('작성자 : ')
pwdv = input('비밀번호 : ')
subjectv = input('제목 : ')
contentv= input('내용 : ')

2) 입력해주고 insert 하는 sql문을 실행해준다.

#SQL문 작성
sql_insert ='insert into board values(board_seq.nextVal,:pwd,:write,:subject,:content,sysdate)'
sql_insert
#입력값을 쿼리에 바인딩한 후 전송
cursor.execute(sql_insert,pwd=pwdv,write=writev,subject=subjectv,content=contentv)
#커서 닫고 commit 해준다.
cursor.close()
conn.commit()

전부 dd로 입력 후 저장

3) 오라클에 데이터가 잘 들어간 것을 볼 수 있다.

4) 오라클과 연결을 종료할 때. 하지만 지금은 닫지 않는다.

#오라클과 연결 종료
conn.close()

 

 

2. 출력

1) 변수 지정

sql_select = 'select no,writer,subject,regdate from board order by 1 desc'
cursor.execute(sql_select)

Cursor 객체의 execute() 메서드를 사용하여 SQL 문장을 DB 서버에 전송

 

2) 데이터를 서버로부터 가져온다.

print(cursor.fetchall())

 

3) 출력 완료 후 닫는다.

cursor.close()
conn.close()

 

3. 상세보기 구현

 

번호를 입력받아서 사용자의 정보를 모두 출력해보자.
fetchone() 사용해서 적용하기

#findone() : mybastis select_one()
nov = input("상세보기 값 : ")
sql_no = "select no,writer,subject,content,\
to_char(regdate,'yyyy-mm-dd') regdate from board where no=:no"
cursor = conn.cursor()
print(cursor)
cursor.execute(sql_no,no=nov)
print(cursor.fetchone())

 

4. 최근 글 5개만 출력하기(select)

#함수로 정의
def connections():
    try:
        conn= ora.connect('kosmorpa/test00@192.168.0.122:1522/orcl')
        cursor = conn.cursor()
    except Exception as e:
        msg="예외발생"
        print(msg)
    return conn
#최근 글 5개만 출력 fetchmany
def myFetchmany():
    conn  = connections()
    cursor = conn.cursor()
    sql_select = 'select * from board order by 1 desc'
    cursor.execute(sql_select)
    numRows = 5
    res = cursor.fetchmany(numRows = numRows)
    print('fetchmany {}'.format(numRows))
    cursor.close()
    conn.close()
    return res
print(myFetchmany())

 

cf ) 서브쿼리를 이용해서 동일한 결과를 가져올 수 있다.(rowNum)

# 서브쿼리 사용해서 최근 5개만 추출해보기(위에 fetchmany와 동일하다.)
def examSelect():
    conn  = connections()
    sql_select = "select no,writer,content,regdate from\
    (select rownum,no,writer,content,regdate from\
    (select * from board order by 1 desc) where rownum <=5)"
    cursor = conn.cursor()
    cursor.execute(sql_select)
    rs = cursor.fetchall()
    return rs
selectList = examSelect()
selectList

 

 

5. 삭제

#삭제 - insert, delete ,update
def boardDel(num):
    conn  = connections()
    cursor = conn.cursor()
    sql_delete = 'delete from board where no = :no'
    try:
        cursor.execute(sql_delete, no=num)
        conn.commit()
    except Exeption as e:
        print(e)
    finally:
        conn.close()

num = input('삭제번호 :')
boardDel(num)
examSelect()

10번이 사라졌다.

 

 

 


1. 카페에서 파일 다운로드(리눅스에서 다운받기)

 

2. 파이참에서 web1 이라는 앱 만들기

python manage.py startapp web1

3. templates>web1 > 파일 폴더 만들기

 

4. 다운받은 파일 홈 디렉토리로 옮겨버리고 압축을 풀자

mv base.html ~
mv static.zip ~
cd ~
unzip static.zip

압축도 풀어줌

5. 홈에 푼 파일들을 다시 우리 프로젝트 환경에 templates에 옮겨줘야한다.

mv base.html PycharmProjects/myapps/web1/templates/web1/

static 안에는 assets라는 폴더가 들어있다. 다시 web1에 리소스 파일을 넣을 static에 넣어준 후 옮겨준다.

mv assets/ PycharmProjects/myapps/web1/templates/web1/static/

 

 

6. urls에 홈 경로, views에 렌더링 입력, config/setting 에 web1 등록, config/urls에 등록.

참 쉽죠?

아직 DB를 안 건드렸으니까 admin과 마이그레이션은 안한다.

 

실행해보면,

python manage.py runserver

따란!

static에 모든 css와 js가 다 있어서 편했다.

 

7. sql에 member_table 테이블 생성하기

create table member_table(
num number constraint member_table_num_pk primary key,
id varchar2(15) constraint member_table_id_nn not null,
pwd varchar2(15) constraint member_table_pwd_nn not null,
name varchar2(34),
tel varchar2(54),
emain varchar2(54),
addr varchar2(100),
npoint number(5),
rdate date,
constraint member_table_id_uq unique(id));

create sequence member_table_seq
increment by 1
start with 1;

 

8. 이제 회원가입 페이지를 만들거다.

base.html의 내용을 복사해서 tripmember.html 만들기

content 부분 변경하기 -> 회원가입 폼으로 변경할 것.

카페에 올라온 거 붙여넣고

				<!-- Banner -->
				<section id="banner">
					<div class="content">
						<!---- content 시작! -->
						<form method="post" action="tripinsert">
							{% csrf_token %}
							<div class="row gtr-uniform">
								<!-- 카페 코드 추가(회원가입창 만들기) -->
								<div class="col-6 col-12-xsmall">
									<input type="text" name="id" id="id" value="" placeholder="ID" />
								</div>
								<div class="col-6 col-12-xsmall">
									<input type="password" name="pwd" id="pwd" value="" placeholder="비밀번호" />
								</div>
								<div class="col-6 col-12-xsmall">
									<input type="password" name="chkpwd" id="chkpwd" value="" placeholder="비밀번호 확인" />
								</div>
								<div class="col-6 col-12-xsmall">
									<input type="text" name="name" id="name" value="" placeholder="이름" />
								</div>
								<div class="col-6 col-12-xsmall">
									<input type="tel" name="tel" id="tel" value="" placeholder="전화번호" />
								</div>
								<div class="col-6 col-12-xsmall">
									<input type="email" name="email" id="email" value="" placeholder="Email" />
								</div>
								<div class="col-6 col-12-xsmall">
									<input type="text" name="addr" id="addr" value="" placeholder="주소" />
								</div>
								<!-- Break -->
								​
								<div class="col-12">
									<ul class="actions">
										<li><input type="submit" value="가입하기" class="primary" /></li>
										<li><input type="reset" value="취소하기" /></li>
									</ul>
								</div>
								<!--  회원가입창 끝 -->
							</div>
						</form>
						<!-- content 끝! -->
					</div>
					<span class="image object">
						<img src="{{baseUrl}}/assets/img/main.jpg" alt="" />
					</span>
				</section>
				<!-- Banner 섹션 끝-->
                <!-- Section 지움-->

urls.py에 추가하기

views 추가

 

섹션부분 전부 지우기(깔끔하게)

 

 

9. models 가자.

오라클로 연결하면 자동으로 마이그레이션이 생기지 않는다. 따라서 아까 주피터에서 했던 것 처럼 데이터를 불러오자.

 

여기는 base가 아니라 myapp이기 때문에 cx_Oracle를 다시 받아줘야한다. 잠시 서버 멈추고 다운 받고 해보자

pip install cx_Oracle

 

 

10. 아까 주피터에서 했던 것처럼 가져오자.

모델에 작성하기

예외있으면 예외발생 메시지 나오게 하자.

from django.db import models
import cx_Oracle as ora
# Create your models here.

def connections():
    try:
        conn= ora.connect('kosmorpa/test00@192.168.0.122:1522/orcl')
    except Exception as e:
        msg="예외발생"
        print(msg)
    return conn

def memberinsert(addr_list):
    print(addr_list)
    conn=connections()
    cursor=conn.cursor()
    sql="insert into member_table values(member_table_seq.nextVal,:1,:2,:3,:4,:5,:6,0,sysdate)"
    cursor.execute(sql,addr_list)
    cursor.close()
    conn.commit()
    conn.close()

11. view 수정

from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_protect

from web1.models import memberinsert


def home(request):
    return render(request, "web1/base.html")

def tripmember(request):
    return render(request, "web1/tripmember.html")

@csrf_protect
def tripinsert(request):
    #print(request.POST['id'])
    members = (request.POST['id'], 
               request.POST['pwd'], 
               request.POST['name'], 
               request.POST['email'],  
               request.POST['tel'],  
               request.POST['addr']
               )
    memberinsert(members)
    return redirect('/web1/')

12. 회원가입 창에 아이디 중복 체크 만들기

버튼은 따로 만들어주심

<div class="col12">
	<ul class="actions">
		<li>
			<input type="text" name="id" id="id" value="" placeholder="ID"/>
		</li>
		<li>
			<input type="button" id="idchk" value="중복체크"/>
		</li>
		<li>
		<span id="target" class="col-6 col-12-xsmall">ㅇㅇ</span>
		</li>
	</ul>
</div>

이걸 아까 있던 id 자리에 바꿔넣는다.

 

반응형
LIST
반응형
SMALL

+ Recent posts

반응형
LIST