-
(국비교육) 22 - 메모리 + UTF-8설정 + input type +개발/국비교육 2023. 6. 30. 19:17
■ 메모리
중요 : 호출스텍은 예외처리할 때 필요합니다. 기억해주세요.
* 메소드 영역(Method Area)
- 클래스 데이터
- 프로그램 실행 중 어떤 클래스가 사용되면 JVM 은 해당 클래스 파일을
읽어서 이곳에 저장하면서 동시에 클래스 변수도 이곳에 저장한다.= Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간
= 상수
- 모든 스레드에서 정보가 공유
* 호출 스텍(Stack)
* 지역변수, 메소드의 매개변수와 같이 잠시 사용되고
* 필요가 없어지는 데이터가 저장되는 공간
* 메소드 작업에 필요한 메모리 공간을 제공합니다.
* 메모리에서 메소드가 작업을 수행하는 동안
* 지역변수와 연산의 중간 결과값이 저장되는 공간입니다.
* 메소드가 작업을 마치면 할당되었던 메모리 공간은 반환 -> 비워짐
* 호출 스택은 제일 상위에 있는 메소드가 지금 실행 중입니다.
* 나머지는? 모두 대기중 입니다.
* 언제나 호출 스텍의 제일 상위에 있는 메소드가 작업중(실행중) 입니다.
* 아래 있는 메소드가 바로 위에 있는 메소드를 호출해서 사용중 입니다.
* =Last In First Out, 나중에 들어온 데이터가 먼저 나간다.
* 스레드마다 하나씩 존재한다.
*
* 힙영역(Heap)
* 인스턴스가 이곳에 생성됩니다. ==== 인스턴스 변수
* new 연산자로 생성된 객체, Array 와 같은
* 동적으로 생성된 데이터가 저장되는 공간
* Heap 에 저장된 데이터는
* Garbage Collector 가 처리하지 않는 한 소멸되지 않는다.
* Reference Type 의 데이터가 저장되는 공간
*
* 리턴 타입이 있는 메소드는 종료되기 직전에 결과값을 반환합니다.
* 누구에게? 자신을 호출한 메소드에게 반환합니다.
* 하위 메소드에게 리턴값 주고 소멸됩니다.■ 워크스페이스 변경
Switch Workspace -> Other
workspaceJSP 로 다시 만들어준다.
■ UTF-8 로 지정해주기
EUC-KR : 2byte로 한글을 표현한 인코딩 방식
UTF-8 : UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 (가변적)
MS-949 : 한글 표현
https://zepettoworld.tistory.com/24
■ Dynamic Web project 생성
■ jar 파일 넣어주기
■ 코딩 서체 등록하기
https://github.com/intel/intel-one-mono
TTF 와 OTF의 차이는? 폰트 다운로드 전.. : 네이버블로그 (naver.com)
■ 만들어보기
href ="" : 어디로 갈지 링크 설정
어디서 열리게 할 지 설정 가능하다.
class 는 . 으로 style 지정
<input> : 입력창
<text> : 키보드에 있는 모든 문자
<password> : 암호입력
<email> : 이메일 입력
<date> : 년월일
<datetime> : 년월일시분초
<color> : 색깔 파레트
<number> : 숫자
※ 영문자 e 는 지수를 나타내서 입력 가능하다.
<file> : 파일 업로드
이름을 지정해줘야 불러올 수 있다.
maxlength="" : 글자 입력 수 제한
required="" : 필수 입력
<form action=""> : 액션에 적어준 주소로 안에 넣어준 값을 가지고 갈거
자바 코드를 사용해야 하기 때문에 jsp 로 간다.
아이디 비밀번호가 노출된다.
method="post" 를 쓰면 아이디 비밀번호를 숨길 수 있다.
■ jsp 파일 만들기
request.getParameter : name 이 id 인 것을 찾는다.
다음과 같이 결과값을 출력할 수 있다.
변수를 선언하여 다음과 같이 코드를 줄일 수 있다.
mid 값은 유니크 값으로 되어 있기 때문에
값이 1개밖에 안나온다.
count 뒤 , 는 컬럼을 연결할 때 다음과 같이 쓴다.
id, pw 변경될 때마다 값을 가져오기 위해 다음과 같이 설정해준다.
홀따옴표 안에 쌍따옴표 + 는 연결해주는 역할
id 는 string 타입이기 때문이다.
https://noirstar.tistory.com/264
■ DB 연결하기
* 에러해결
statement 를 부를 때 java.sql 로 불러줘야 한다.
나는 java beans 로 부르니 오류가 떴다.
rs.next() 를 if 로 걸어준 이유는 우리가 찾을 아이디 1개이기 때문이다.
결과값은 있다면 1 없으면 0 으로 나온다.
왜냐면 우리가 조건을 count(*) 로 걸어줬기 때문이다.
만든 홈페이지 코드보기를 하면 랜더링 돼 java 는 안보이고 html 코드만 보인다.
만약 결과값이 있다면 name 값을 반환하여 반겨주고,
그렇지 않을 경우 else 조건을 걸어 다시 로그인하는 페이지로 넘겨줄 수 있다.
<%@page import="java.sql.Statement"%> <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.Connection"%> <%@page import="java.sql.ResultSet"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 결과</title> </head> <body> <% String id = request.getParameter("id"); String pw = request.getParameter("pw"); //java String sql = "SELECT Count(*), mname FROM member WHERE mid='"+id+"' AND mpw = '"+pw+"'"; Connection conn = null; Statement stmt = null; ResultSet rs = null; Class.forName("org.mariadb.jdbc.Driver"); String url = "jdbc:mariadb://localhost:3306/choongang"; String dbID = "hjsong96"; String dbPW = "0614"; conn = DriverManager.getConnection(url, dbID, dbPW); stmt = conn.createStatement(); rs = stmt.executeQuery(sql); int result = 0; String name = null; if(rs.next()) { result = rs.getInt(1); name = rs.getString(2); } %> 당신이 입력한 ID : <%=id %><br> 당신이 입력한 PW : <%=pw %><br> 결과 : <%=result %><br> <%if(result == 1) {%> <%=name %>님 반갑습니다. <% response.sendRedirect("./main.jsp"); } else { %> ID/PW를 다시 확인하세요. <a href="./login.html">로그인하러가기</a> <% response.sendRedirect("./login.html"); } %> </body> </html>
response.sendRedirect(""); : 강제 해당하는 페이지로 이동시킴
그러나 속도가 빨라서 반겨주는 멘트와 로그인하는 창이 보이지 않는다.
해당 코드를 사용하면 아까와 같은 멘트는 확인이 불가하다.
다음과 같이 코드를 줄여 쓸 수 있다.
■ servlet
jsp 는 webapp 에서 생성
html 코드 속 자바를 활용한다.
servlet 은 java 에서 생성
반대로 java 코드에서 html 을 활용한다.
servlet 은 일일히 다 입력해줘야 한다.
출력하기 위해서는 /test 를 입력해주면 된다.
■ 데이터 전송객체(=DTO, Data Transfer Object)
package com.poseidon.dto; //데이터 전송 객체 DTO : public class MemberDTO { private int mno, mgrade, count; private String mname, mid, mpw, mjoindate; public int getMno() { return mno; } public void setMno(int mno) { this.mno = mno; } public int getMgrade() { return mgrade; } public void setMgrade(int mgrade) { this.mgrade = mgrade; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public String getMname() { return mname; } public void setMname(String mname) { this.mname = mname; } public String getMid() { return mid; } public void setMid(String mid) { this.mid = mid; } public String getMpw() { return mpw; } public void setMpw(String mpw) { this.mpw = mpw; } public String getMjoindate() { return mjoindate; } public void setMjoindate(String mjoindate) { this.mjoindate = mjoindate; } }
■ 데이터 베이스 접속 정보 저장 (DBConnection)
다중환경 속에서 첫번째 부르고 객체 내보내는데 괜찮지만
동시에 접속하면 여러개 만들 수 있다.
따라서 싱크를 맞춰서 다른 사람이 처리중일때는 못 쓰도록 synchronized 를 걸어준다.
package com.poseidon.db; //데이터베이스 접속 정보를 저장합니다. import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { private static DBConnection dbConnection; private DBConnection() {} public synchronized static DBConnection getInstance() { if (dbConnection == null) { dbConnection = new DBConnection(); } return dbConnection; } public Connection getConn() { Connection conn = null; final String url = "jdbc:mariadb://localhost:3306/choongang"; final String id = "hjsong96"; final String pw = "0614"; try { Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(url, id, pw); } catch (Exception e) { e.printStackTrace(); } return conn; } }
■ 데이터 접속 객체(=DAO Data Access Object)
package com.poseidon.dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.poseidon.db.DBConnection; //DAO 데이터 접속 객체 : Data Access Object public class MemberDAO { public String login(String id, String pw) { String name = null; String sql = "SELECT Count(*), mname FROM member WHERE mid='" + id + "' AND mpw = '" + pw + "'"; Connection con = null; Statement stmt = null; ResultSet rs = null; con = DBConnection.getInstance().getConn(); try { stmt = con.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) { if (rs.getInt(1) == 1) { name = rs.getString(2); } } } catch (SQLException e) { e.printStackTrace(); } finally { try { rs.close(); stmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } } return name; } }
해당 처리를 완료하면 jsp 코드를 다음과 같이 줄일 수 있다.
연결되는 모습 확인 가능하다.
DAO 파일에 있는 String 을 MemberDTO 로 변경해서 사용 가능하다.
리턴값도 변경해줘야 한다.
dto.getCount() 로 구분한다.
왜냐면 가끔씩 아이디를 null 혹은 root 와 같이 만드는 사람도 있기 때문에
변수를 줄이고자 함수를 활용한다.
* DAO 와 loginAction 바꿔주기
package com.poseidon.dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.catalina.startup.SetContextPropertiesRule; import com.poseidon.db.DBConnection; import com.poseidon.dto.MemberDTO; //DAO 데이터 접속 객체 : Data Access Object public class MemberDAO { public MemberDTO login(String id, String pw) { //String name = null; MemberDTO dto = new MemberDTO(); String sql = "SELECT Count(*), mname FROM member WHERE mid='" + id + "' AND mpw = '" + pw + "'"; Connection con = null; Statement stmt = null; ResultSet rs = null; con = DBConnection.getInstance().getConn(); try { stmt = con.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) { dto.setCount(rs.getInt(1)); //첫 번째 값 dto.setMname(rs.getString(2)); //두 번째 값 } } catch (SQLException e) { e.printStackTrace(); } finally { try { rs.close(); stmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } } return dto; } }
<%@page import="com.poseidon.dto.MemberDTO"%> <%@page import="com.poseidon.dao.MemberDAO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String id = request.getParameter("id"); String pw = request.getParameter("pw"); MemberDAO dao = new MemberDAO(); MemberDTO dto = dao.login(id, pw); if(dto.getCount() == 1) { response.sendRedirect("./main.jsp"); } else { response.sendRedirect("./login.html"); } %>
■ Servlet
우리가 method = post 로 설정해서 doPost 에 작업한다.
<th> 테이블 해더
※ 단축키
Alt + Shift + a : 한번에 선택 후 변경 가능
※ 내 ip 확인하기
ipconfig 하면 내 ip 정보 확인 가능하다.
ipconfig all 하면 더 자세한 정보 얻을 수 있다.
서브넷 마스크(Subnet Mask)란?. 네트워크 설정을 보면 IP 주소와 서브넷 마스크라는 것을 볼 수… | by Su Bak | Medium
http://www.ktword.co.kr/test/view/view.php?m_temp1=961
https://coding-chobo.tistory.com/38
기본 게이트웨이(Default Gateway) 및 라우트 테이블(Route Table) :: 코딩초보의 블로그 (tistory.com)
'개발 > 국비교육' 카테고리의 다른 글