-
(국비교육) 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 의 데이터가 저장되는 공간
*
* 리턴 타입이 있는 메소드는 종료되기 직전에 결과값을 반환합니다.
* 누구에게? 자신을 호출한 메소드에게 반환합니다.
* 하위 메소드에게 리턴값 주고 소멸됩니다.☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)
자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모
inpa.tistory.com
자바의 메모리 구조
Java의 메모리 구조에 대해서 공부했던 내용을 정리한 글입니다.개인적으로 공부한 자료라 틀린 부분이 있을 수 있습니다.여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자1) 메모
velog.io
■ 워크스페이스 변경
Switch Workspace -> Other
workspaceJSP 로 다시 만들어준다.
■ UTF-8 로 지정해주기
EUC-KR : 2byte로 한글을 표현한 인코딩 방식
UTF-8 : UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 (가변적)
MS-949 : 한글 표현
https://zepettoworld.tistory.com/24
EUC-KR 과 UTF-8 가 무엇인가요?
어느날 'UTF-8과 EUC-KR의 차이가 뭐죠?' 이란 질문을 받았다. 나를 포함한 개발자들은 시원한 대답을 하지못했고 EUC-KR , UTF-8이 어떤 인코딩 방식인지 이 글을 쓰며 정리를 해보려 합니다. Bit 와 Byte
zepettoworld.tistory.com
■ Dynamic Web project 생성
■ jar 파일 넣어주기
■ 코딩 서체 등록하기
https://github.com/intel/intel-one-mono
GitHub - intel/intel-one-mono: Intel One Mono font repository
Intel One Mono font repository. Contribute to intel/intel-one-mono development by creating an account on GitHub.
github.com
TTF 와 OTF의 차이는? 폰트 다운로드 전.. : 네이버블로그 (naver.com)
TTF 와 OTF의 차이는? 폰트 다운로드 전 확인해보세요
TTF? OTF? 어떤 포맷을 다운로드해야 할까? 인터넷에서 개인과 기업에서 배포하고 있는 무료 폰트를 ...
blog.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
SQL Injection 이란? (SQL 삽입 공격)
1. SQL Injection 1.1 개요 SQL InjectionSQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는
noirstar.tistory.com
■ 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
서브넷 마스크(Subnet Mask)란?
네트워크 설정을 보면 IP 주소와 서브넷 마스크라는 것을 볼 수 있습니다.
medium.com
http://www.ktword.co.kr/test/view/view.php?m_temp1=961
서브넷 마스크
Subnet Mask, Netmask, Subnetting, Subnet 서브넷 마스크, 서브네트 마스크, 서브네팅, 서브넷팅, 서브넷, 서브네트(2022-04-17)
www.ktword.co.kr
https://coding-chobo.tistory.com/38
허브 / 스위치 / 라우터 / 공유기 차이 및 비교
허브 (L1 더미허브) 허브의 개념 허브는 전기적인 신호를 증폭시켜 LAN의 전송거리를 연장시키고, 여러 대의 디바이스를 연결해 네트워크를 만들어주는 장비입니다. 포트는 허브에 따라 다양하며
coding-chobo.tistory.com
기본 게이트웨이(Default Gateway) 및 라우트 테이블(Route Table) :: 코딩초보의 블로그 (tistory.com)
기본 게이트웨이(Default Gateway) 및 라우트 테이블(Route Table)
■ 게이트웨이 란 네트워크 관리자는 대게 IP 범위의 시작 주소를 기본 게이트웨이로 사용하여 컴퓨터의 라우팅 기능을 구성하고 모든 클라이언트가 해당 IP 주소 (Ex. 192.168.0.1 - 게이트웨이)를
coding-chobo.tistory.com
'개발 > 국비교육' 카테고리의 다른 글