- ANSI SQL92, 99에 기준하여 각 데이터베이스상에서 SQL을 사용할 수 있습니다.
- DQL(Data Query Language), 데이터 질의어, 데이터 검색, 출력과 관련된 쿼리 . SELECT..FROM..WHERE //얘는 있는걸 갖다가 검색해서 쓸 때 쓰는것 씰렉트(뭐를) 패쓰워드 푸롬(위치) 멤바테이블 웨어(조건) 10개만(다갖다써도됨)
- DML(Data Manapulation Language), 데이터 조작어, 데이터 입력, 수정, 삭제와 관련된 쿼리 . INSERT, UPDATE, DELETE // 얘는 데이타 입력 수정 삭제 할 떄 쓰는 거임 -_-)
인써트도 어쩌구저쩌구가 있는데 나중에 하것지 인서트 인투 어쩌구
업데이트 셋 어쩌구 저저구
- DDL(Data Definition Language), 데이터 정의어, 테이블 생성 및 삭제, 테이블 구조 수정과 관련된 쿼리 . CREATE TABLE, DROP TABLE, ALTER TABLE // 아까 쟤네 어디다가 넣냐고 -> 공간 확보! :> 테이블 형태로 만들어져서 다 테이블임
크리에이트 테이블 - 생성맨
드롭 테이블 - 이건 delete 기능임
알터 테이블 - column이 부족할 때 추가 추가
- TCL(Transaction Control Language), 트랜잭션 제어 언어, 안정적인 데이터 처리를 위한 데이터 처리와 관련된 명령어 . COMMIT, ROLLBACK, SAVEPOINT // 트랜잭션 :>! - 응? 계좌이체?
A라는 계좌에서 B라는 계좌로 돈을 이체시킴!
1) A에서 돈을 뺸다
2) 그 돈을 B라는 계좌로 넣는다
원자성... 어 아톰...뭔데 -_-);; Atomic?
이힣ㅎㅎㅎ
- DCL(Data Control Language)데이터 제어 언어, 권한 부여와 관련된 쿼리 . GRANT, REVOKE // ㅋㅋㅋㅋㅋㅋㅋ임 아니네 이건 DBMS가 해준댕 :D 굿
잉 OCP OCJP 볼라면 계정이 있어야한대 _-_) 흐흥
오라클 - 네이버 계정으로 만들었음
비번은 어.. .아마 잊을듯 -_-)
이거 다시 복습 :>
------------------------
Memo의
DBCLOSE
DBOPEN
MEMODAO
MEMOVO
CONSTANT
그리고 test.memo의 MEMOTEST 를 쓰고 있는뎅
//Constant.java
package memo;
public class Constant {
public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
public static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
public static final String USER = "soldesk";
public static final String PASSWORD = "1234";
}
//DBOPEN.java
package memo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBOpen {
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(Constant.DRIVER);
//드라이버를 메모리에 올리는 것
//-_-? ★
try {
con =DriverManager.getConnection(Constant.URL, Constant.USER, Constant.PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
}
//DBclose
package memo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBClose {
public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) {
// TODO Auto-generated method stub
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void close(Connection con, PreparedStatement pstmt) {
// TODO Auto-generated method stub
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//MemoVO
package memo;
public class MemoVO {
private int memono;
private String title;
private String content;
private String wdate;
private int viewcnt;
public int getMemono() {
return memono;
}
public void setMemono(int memono) {
this.memono = memono;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public int getViewcnt() {
return viewcnt;
}
public void setViewcnt(int viewcnt) {
this.viewcnt = viewcnt;
}
}
----------------
//이제 수정중인 애들입니다
//MemoDAO
package memo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MemoDAO {
public int update(MemoVO vo){
int cnt = 0;
Connection con = DBOpen.getConnection();
PreparedStatement pstmt = null;
StringBuffer sql = new StringBuffer();
sql.append(" UPDATE memo ");
sql.append(" SET title = ?, ");
sql.append(" content = ? ");
sql.append(" WHERE memono = ? ");
try {
pstmt = con.prepareStatement(sql.toString());
pstmt.setString(1, vo.getTitle());
pstmt.setString(2, vo.getContent());
pstmt.setInt(3, vo.getMemono());
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
DBClose.close(con, pstmt);
}
return cnt;
}
public MemoVO read(int memono){
MemoVO vo = null;
Connection con = DBOpen.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuffer sql = new StringBuffer();
sql.append(" SELECT * from memo ");
sql.append(" where memono = ? ");
try {
pstmt = con.prepareStatement(sql.toString());
pstmt.setInt(1, memono);
rs = pstmt.executeQuery();
if(rs.next()){
vo = new MemoVO();
vo.setMemono(rs.getInt("memono"));
vo.setTitle(rs.getString("title"));
vo.setContent(rs.getString("content"));
vo.setViewcnt(rs.getInt("viewcnt"));
vo.setWdate(rs.getString("wdate"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBClose.close(con, pstmt, rs);
}
return vo;
}
public int create(MemoVO vo){
int cnt=0;
Connection con = DBOpen.getConnection();
PreparedStatement pstmt = null;
StringBuffer sql = new StringBuffer();
sql.append(" insert into memo(memono, title, content, wdate) ");
Java Resource에 짠 memo 패키지의 java 파일을 좀뒤에 올리겠음 (-_-);;
이건 액션태그 쓰는 법 입니다.
액션 태그
action tag
객체를 생성하는 법을 액션 태그로 만드는 법
이건 한번 밀고 하는 것 ㅋㅋㅋㅋㅋㅋ
즐거운것
큰일났다 ㅋㅋㅋㅋ
--------------자바빈이 뭔데?----------------
출처: http://fromvenus.tistory.com/94
#자바빈(JavaBean)이란?
일반적인 웹사이트는 디자이너와 프로그래머가 협력하여 개발한다. 그런데 프로그래머가 JSP페이지에 자바코드를 입력했을때 디자이너 입장에서는 해석하기 어려워지고 효율또한 매우 떨어지게 된다. 이런 비효율적인 부분을 지원하기위해 제공되는 기능의 형태가 자바빈이다. 자바빈은 JSP페이지의 디자인 부분과 로직부분을 나눔으로써 복잡한 자바코드를 줄이고 프로그램의 재사용성을 증가시킨다.
#자바빈의 설계 규약
자바빈을 작성하기 위해서는 설계규약을 따라야 한다. 만약 설계규약과 맞지 않는 경우 자바빈의 특성을 갖지 않는 클래스가 되어버릴수 있다.
1. 멤버변수마다 별도의 get/set 메소드가 존재해야 한다.
2. get 메소드는 매개변수가 존재하지 않아야한다.
3. set 메소드는 반드시 하나 이상의 매개변수가 존재해야 한다.
4. 생성자는 매개변수가 존재하지 않아야 한다.
5. 멤버변수의 접근제어자는 private이고 각 set/get메소드의 접근제어자는 public , 클래스의 접근제어자는 public 으로 정의한다.
#자바빈 사용하기
1.<jsp:useBean/>태그
자바빈 객체를 생성하기 위한 코드이고 태그 속성은 다음과 같다.
<jsp:useBeanid="빈이름"class="자바빈클래스명"scope="사용범위"/>
id는 JSP페이지에서 자바빈 객체의 변수명, class는 자바빈에 사용할 클래스명(클래스가 패키지 않에 있다면 패키지 경로까지 적어주어야 한다. scope는 자바빈의 사용범위를 뜻하며 request, page, session, application 네종류가 존재한다. 디폴트값은 page로 설정된다.
name은 선언된 자바빈 객체의 id property는 객체내의 속성명, value는 속성에 넣을 값을 의미한다. 여기서 클라이언트에서 전송되어오는 파라미터 값을 속성값으로 할당 하고 싶다면 value 속성대신 param속성을 이용하면된다. 그런데 여기서 자바빈으로 사용되는 클래스의 속성들은 설계규약에 의하여 private으로 설정되는데 <jsp:setProperty/>태그로 접근이 가능한 이유는 변수에 직접적인 접근이 아닌 set 메소드를 호출하여 접근하게 되는 것이다.
3.<jsp:getProperty/>태그
자바빈 클래스의 속성값을 가져오기 위한 태그이고 속성은 다음과 같다.
<jsp:getPropertyname="빈이름"property="속성명"/>
name는 값을 가져올 빈의 id, property는 가져올 속성의 이름이다.
#자바빈 예제
BeanTest.java
package test;
publicclass BeanTest {
private String name = null;
privateintage = 0;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
}
자바빈으로 사용할 클래스이다. 멤버변수는 모두 private으로 선언되어있고 설계규약에 따라 set/get메소드를 만들어줘야 한다.
+ 로 연결하여 assign 하게 된다면 + 하는 String 의 갯수가 늘어나면 늘어날수록 GC 대상 object 수도 함께 늘어나고 그만큼 memory 할당도 추가로 늘어나게 된다는 것입니다.
하지만 이 문제는 query 문을 만드는데서 많이 발생합니다. Query Operation은 매우 무거운 작업입니다. 복잡한 Database 를 쓰는 경우, 여러번의 query 를 통해 결과를 도출하는 것은 엄청난 시간을 소비하기도 합니다. 따라서 가능한 query 횟수를 최소화 하여 원하는 결과를 뽑아내는 작업이 필요하며 이 과정에서 String + operation이 엄청나게 발생하곤 합니다.
[10][메모장] 메모장 version 2.0으로 업그레이드, SSI(Server Side Include)
[01] SSI(Server Side Include) - 하나 이상의 jsp페이지에서 반복적으로 사용되는 코드를 모아 특정 jsp페이지에 저장해두고, 필요시에 추가하여 사용하는 방법을 말합니다.
- 처리 결과가 합쳐지는 것이 아니라 파일의 소스가 하나의 파일에 합쳐진 다음 실행됩니다. list.jsp 소스 + ssi.jsp 소스 = jsp 통합 큰 소스 ==> 실행 --------------------------------------------------------
- 사용 방법 <%@ include file="Local URL" %>
<%@ include file="./ssi.jsp" %>
- Eclipse Project: memo 계속 사용 Folder Name: /WebContent/memov2 Library: WEB-INF/lib/ojdbc14.jar or ojdbc6.jar
★ SSI 파일의 사용의 경우 아래의 Page Directive는 포함되는 JSP 및 포함하는 JSP 파일 모두 대소문자 및 공백도 일치해야합니다.
Note that backslashes (\) and dollar signs ($) in the replacement
string may cause the results to be different than if it were being
treated as a literal replacement string; see Matcher.replaceAll. Use
java.util.regex.Matcher.quoteReplacement to suppress the special
meaning of these characters, if desired.
See Also:
java.util.regex.Pattern
Parameters:
regex the regular expression to which this string is to be
matched
replacement the string to be substituted for each match
Returns:
The resulting String
Throws:
PatternSyntaxException if the regular expression's syntax
is invalid
Since:
1.4
@spec
JSR-51
이런 시스템입니다.
content = content.replaceAll(regex, replacement);
얘를 찾아서, 얘로 바꿔주면 됩ㄴ니다
정규 표현식(正規表現式, 영어:regular expression, 간단히 regexp 또는 regex) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.
4. application 내부 객체 - javax.servlet.ServletContext 인터페이스의 구현 객체 - 서블릿이 서블릿 컨테이너(Tomcat)에서 실행 될 때의 환경 정보를 저장 - 절대 경로 추출시 JSP 형식 String upDir = "/pds/storage"; upDir = application.getRealPath(upDir);
2) action: 폼에서 입력받은 데이터를 보내(전송)는 서버의 주소로써 인터넷 브러우저는 주소상에 도메인 생략시 도메인을 자동으로 연결하여 전송합니다. 예) action="./sungjuk_proc.jsp" ▶ 현재 브러우저로 로딩된 파일과 같은 폴더에있는 jsp로 전송 (*)
action="../sungjuk_proc.jsp" ▶ 현재 폴더의 상위 폴더에 있는 파일로 전송
action="../object/sungjuk_proc.jsp" - 다른 폴더로 가는 것
..의 뜻은 현재 폴더에서 나온다는 뜻 -_-)ㅋㅋ -> 그담에 오부젝트라는 다른 폴더로 감 ▶ 현재 폴더의 상위폴더로 나간 후 object폴더안으로 이동하여 전송
action="http://172.16.4.1:8000/object/sungjuk_proc.jsp" ▶ 전체 IP를 직접 기록한 경우
action="http://www.test.co.kr/object/sungjuk_proc.jsp" ▶ 전체 도메인을 직접 기록한 경우
3) method: 전송 방식 GET: 데이터 조회용(SQL: SELECT) POST: 데이터 수정용(SQL: INSERT, UPDATE, DELETE)
* 특정 기업은 요청을 전부 POST로 요구하는 기업도 있음, POST만 써도 개발 가능
2. GET 전송 방식 - 서버의 데이터를 변경할 목적이 아닌 조회의 목적으로 사용(SQL: SELECT)
- 전송할 데이터를 문자열 형태로 URL의 뒤에 인수로 붙여서 전송합니다. 따라서 보안성이 없어 누구나 전송 내용을 볼 수 있습니다. - 파라미터가 url로 나오니까... Form 태그에서의 'GET'방식은 서버로 전송시 서버의 처리가 지연될 경우 중복해서 데이터 전송이 발생합니다.
- A 태그를 이용할 경우 일반적으로 GET방식 전송만 가능하나 Javascript를 이용하면 POST 방식으로 전송이 가능함.
- 4KB이상의 파라미터 문자열은 전송할 수 없음으로 대용량 전송이 어려움.
- 주소를 공개할 목적으로 사용하는 경우
1) 주소와 데이터의 구분 - ?: 전송되는 데이터(변수)의 시작 - &: 변수가 2개 이상일 경우 구분
갖다 붙여쓰는 데이빗 넘나 똑똑한거 같다
다 외운 데이빗인 것인가 아닌가가 문제이긴함
2) 전송 예
- 한줄로 나타낸 경우 http://localhost:8000/object/form/select2_proc.jsp?city=%EC%8B%9C%EC%B9%B4%EA%B3%A0&period=6%EB%B0%957%EC%9D%BC&img=ro37.jpg
- 여러줄로 나타낸 경우 http://localhost:8000/object/form/select2_proc.jsp ? <-- 전송 데이터의 시작 city=%EC%8B%9C%EC%B9%B4%EA%B3%A0 & <-- 전송 데이터가 여러개 일 경우의 구분자 period=6%EB%B0%957%EC%9D%BC & img=ro37.jpg
요청 페이지가 브러우저의 접속 리스트에 노출됨으로, 처리페이지를 필요에따라 마음대로 호출가능하여 잘못된 데이터 주입으로 서버에러 발생 가능.
3. POST 전송 방식 - 서버의 데이터를 변경할 목적으로 가지고 있음(SQL: INSERT, UPDATE, DELETE)
님왜탈퇴함? 진짜탈퇴함? 왜탈퇴함? 우리의서비스가 어쩌구저쩌구 - 포스트 방식
- 파일의 형태로 전송됨으로 URL상에 나타나지않아 보안성이 있습니다.
- GET방식에 비해서 대용량의 데이터를 전송할 수 있습니다.
- 일반적으로 Form은 post 방식으로 전송됩니다.
※ GET/POST 방식 사용시 HTTP의 사용은 보안성이 약함으로 암호화(JAVA API) 전송이나 HTTPS(서버의 설정 필요)를 사용할 수 있다.
※ GET방식은 특히 URL에 전송값이 노출되어 사용됨으로 보안이 필요 없는 전송에 이용함.
※ 프로젝트 개발시 URL에 기록이 남는것을 방지하기위해 POST 방식만 사용할것을 요청하는 기업도 있음.
4. JSP 코드 첫라인에 한글 변환을 선언함. - 한글등 전송시 브러우저 별 지정된 인코딩 타입에 따라 변환됨으로 한글이 깨짐. URL 인코딩을 각자의 형식으로 변환함으로 추가로 데이터 변환을 해주어야함. 한글 --> Chrome ------------> Server FireFox Opera Internet Explorer
<% request.setCharacterEncoding("utf-8"); %>
조 선언문 필수신것
첨에 해야함 - 나중에 하면 무슬모
5. 뉴스 등록: TEXT, TEXTAREA, PASSWORD - 일반적으로 HTML은 대소문자를 가리지 않으나 HTML태그의 name 속성과 value 속성은 대소문자를 구분합니다.
아! 파라메타가 대소문자 구분한다는 얘기입니다
-------------3시 42분! :>
2시간 30분 뒤면 배송이 완료되었을까
1) TEXT: 한줄을 입력받을때 사용 <input type='text' name='title' value='' size='30'> - text: 한줄만 입력 - value: 초기값 - size: 입력받는 창의 크기 - maxlength: 최대 입력 글자 수
2) TEXTAREA: 여러라인을 입력받을 때 사용 <textarea name='content' rows='10' cols='30'></textarea> - rows: 행의 갯수(문자수) - cols: 열의 갯수(문자수)
3) PASSWORD: 패스워드 입력시 사용, 입력글 순간 비공개 <input type='password' name='passwd' size='30'>
4) Submit Button: 서버로 입력받은 데이터를 전송 <input type='submit' value='등록'>
왜 5가없지가 아니라 다른거군
6. 여행 등록: SELECT ~ OPTION - SELECT: TEXT로 입력을 받으면 사용자가 다양한 값을 입력하여 처리 규칙을 만들기가 힘듬. 따라서 지정된 데이터만 입력받도록 제한을 가하는 기능이 있음.
<SELECT name='area2'>
<OPTION value='일본'>일본</OPTION>
<OPTION value='중국'>중국</OPTION>
<OPTION value='베트남'>베트남</OPTION>
<OPTION value='태국'>태국</OPTION>
<OPTION value='캐나다'>캐나다</OPTION>
</SELECT>
7. 취미: RADIO, CHECKBOX
1) RADIO: 다양한 선택 항목을 출력하고 하나만 선택 가능 - checked="checked": 기본 선택 <input type='radio' name='area' value='서울' checked="checked"> 서울 지역
<input type='radio' name='area' value='인천'> 인천 지역
<input type='radio' name='area' value='경기'> 경기 지역
2) CHECKBOX: 여러개 선택 가능, 취미의 선정, 선택안하면 null이 출력됨 - checked="checked": 기본 선택 <input type='checkbox' name='hobby1' value='독서'>독서
- HTML은 자료를 처리, 저장, 검색하는 기능이 없고 단지 출력하는 기능만 가지고 있습니다. 따라서 이런 데이터를 처리하려면 DBMS(Oracle, MySQL)같은 데이터베이스가 필요하며, 이 데이터베이스에 접속하기위해서 서버스크립트(JSP, PHP, ASP.NET)가 필요합니다.
//쟤도 그런 소리입니다.
어쨌든 우리는 jsp 배워서 데이타베이스에다가 보낸다는 소리입니다.
- JSP: SUN의 서버쪽 스크립트 기술, 모든 운영체제 지원, JAVA 기반, Servlet Container(서버)를 설치해야 실행 할 수 있습니다. - ASP.NET: MS의 스크립트 기술, MS 운영체제만 지원, C# 기반, 윈도우에 웹서버가 기본적으로 설치되어 있으며, .NET Framework를 설치해야 실행 할 수 있습니다. - ASP: MS의 서버쪽 스크립트 기술, MS 운영체제만 지원, Visual Basic 기반, IIS의 asp.dll이 처리하여 HTML로 결과를 생성함, 별다른 서버설치가 필요 없음, 유지보수, 수정이 매우 어렵습니다.
// 얘도 노동자가 되면 먹어줍니다.
- PHP: 서버쪽 공개 스크립트 기술, 모든 운영체제 지원, C 기반, 관련 dll파일이 처리, 속도가 느리고 유지보수, 수정이 매우 어렵습니다.
//얘는 모든 운영체제를 지원해서 아직도 먹어줍니다. (소규모)
3. http 프로토콜을 이용해서 요청과 응답을 하는 서버환경 확인
요새는 톰캣이 먹어주기 때문에 얘만 깔아도 써버 다 씁니다.
내가 보려고 적었는데 자꾸
서부릿을
servlet이 아니고 servelt으로 써진다 ㅡㅡ
출처: http://blog.naver.com/ktw3722/220674776516
자바 컨테이너하고 servlet 컨테이너는 다른 개념임!
그냥 서버라고 생각하면 됨! :> (갱신) -그리고 심지어 c로 짠 서버임 :>
[2] 서블릿의 이해 - Java로 만든 최초의 web관련 언어입니다.
2. 서블릿을 이용한 구성 - CGI에 비해 Thread 기술을 이용하여 동시접속자로 인한 과부하를 많이 해소했습니다. - 자바 기반 Web Application 구축 기술중에 가장 빠른 속도를 가지고 있습니다. - Servlet의 단점은 디자인 부분과 혼합하여 작업하기가 매우 어렵습니다. - 속도는 JSP에 비하여 컴파일 단계가 생략됨으로 빠른 형태를 가지고 있습니다. - JSP가 Servlet으로 변환되는 과정에서 불필요한 코드가 많이 발생하나 서블릿은 이 과정이 생략되어 있어 속도가 매우 빠릅니다. - 확장자가 java로 개발되어 .class 입니다.(jsp파일은 확장자가 *.jsp입니다.)
근뎅 어짜피 느린것도 개발맨이 테스트해서 쓸거라 속도 별로 차이 안남... -.,-
임이래여
이게 디자인이 개 어려워서 그냥 쉽게 만듬! 쪠이얘쓰피
3. JSP를 이용한 구성 - Servlet의 불편한 디자인 부분을 좀더 간결하게 제작하도록 개선된 서버 스크립트입니다. - 하나의 JSP페이지에는 HTML, JavaScript, Java Code등이 혼합되어 존재하게 됩니다. - 디자이너가 작업한 내용이 JSP 페이지로 변경됩니다. - 변경된 JSP 페이지를 개발자가 코드 작업을 하게됩니다. - 대형 사이트의 경우 유지보수 및 기능 확장이 어려워 나중에 JSP, Beans로 분리되게 됩니다.
IE <------ 응답 <----- HTML <----- JSP --> Servlet으로 변환 ------------------------ *.jsp --> *.java --> *.class
4. JSP + Beans(JAVA class) 를 이용한 구성 - JSP는 사이트 구축시 디자이너가 작업하게 되며, 일부 jsp 개발자가 코드 작업을 하게됩니다. . 디자인쪽 비중이 매우 큽니다. - BEANS는 콤포넌트 자바 개발자가 Business Logic(Process Logic)를 구현하는 목적으로 사용됩니다. . DB관련 INSERT, UPDATE, DELETE, SELECT등
빈즈가 JSP의 꽃이래여
근뎅 요새는 이딴거 안쓰고 MVC(-_-?) 로 한대영
배우긴 배우는것
MySQL에서 DAO DTO 같은 애들이 BEANS임
IE <---- 응답 <--- HTML <--- JSP --> Servlet으로 변환 -> JSP Beans --------------------- *.jsp --> *.java --> *.class
JDK는 깔려 있으니까 TOMCAT 깔거임!
설치는 그냥 압축 해제해서 실행하면 됨
파일명을 tomcat-8.0로 바꿔줌
D:\javadb\web 요기다가 넣어줌
한글 처리에서 중요한 것 3가지.
1.서버 -> 브라우저로 자원(페이지)를
보낼 때
그 자원에 한글이 있으면 다 깨짐!
-> 그래서 source 내에서 처리한다! :>
2. 브라우저 -> 서버로 데이터(정보)
를 보낼 때 거기 한글이 있으면
다 깨짐 ^^
↑(GET) 방식으로 데이터를 보낼 때
(GET) = Tomcat의 설정파일에 설정 // <%@ page contentType="text/html;charset=utf-8" %>
- D:/bigdata02/web/tomcat-8.0/webapps/jsptest/WEB-INF . *.xml 환경 설정 파일이 위치, 이곳은 Client가 접속할 수 없습니다. . 반드시 대문자로 폴더명이 되어 있어야 합니다. . 잘못된 예: web-inf, WEB_INF, Web-Inf 대소문자 철저 구분
- D:/bigdata02/web/tomcat-8.0/webapps/jsptest/WEB-INF/classes . 서블릿이 위치 합니다. . JSP Beans등이 위치합니다.
확장자가 jsp면
<%@ page contentType="text/html;charset=utf-8" %>
가 꼭 필요함! :>
한글처리하면서 첫번째로 필요하던 것:>
실행하려면
1. 자원 생성(만들었음)
2. 포트 열기 - 8000! :>
. = 현재 페이지하고 같은 경로
귀찮아서 그냥 찍었다...
2. 테스트 - D:/bigdata02/web/tomcat-8.0/bin/startup.bat를 실행합니다. . 인식이 안되면 톰캣을 재시작하세요.
- contentType: jsp의 출력 형식 지정, 문자 셋을 지정합니다. . 형식: contentType="text/html; charset=UTF-8" ㅇ -_-); <%@ page contentType="text/html; charset=UTF-8" %> . JSP처리 결과가 HTML임으로 MIME Type을 'text/html'과 문자 코드(UTF-8)를 선언. . MIME Type: 브러우저가 출력하는 데이터의 종류를 나타낸 코드값, 브러우저에게 데이터 타입을 알려줌 예)image/jpg는 이미지가 출력됨 . 문자 코드는 UTF-8이 표준화 되어가고 있음으로 권장. . XML, Ajax 사용시 주로 UTF-8를 선언합니다. . EUC-KR, UTF-8 중 어떤 문자셋이든 브러우저가 자동으로 한글 코드를 적용시킴. . 대소문자 상관 없음(자료실의 한글 파일명은 UTF-8을 사용할 것). . HTML 태그의 META태그도 일치시켜야함(브러우저용). <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
임뽀트는 중복 사용이 가능함! ^ㅁ^) 응 그러니까 그냥 java util * java util scanner ad sadsada wqewqe qw 이런거랑 같은거임
- pageEncoding: jsp1.2에 추가된 규약으로 jsp페이지의 문자셋 형식을 지정합니다. <%@ page pageEncoding="UTF-8" contentType="text/html" %>
구냥 따로 문자셋 지정해도 됨미다
1. import속성의 실습, http://127.0.0.1:8000/jsp_test/import.jsp - <%@ page contentType="text/html; charset=UTF-8" %>: Tomcat 서버 입장에서의 한글 처리 방법 선언 - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">: Web Browser 입장에서의 한글 처리 방법
실제의 네트웍 경로를 가리키며, 네트웍 상의 리소스 접근시에 사용된다 URL의 첫 번째 부분은 다음과 같은 프로토콜을 명시하는데, 대부분의 경우 http이며, 가끔은 ftp 혹은 mailto이며, 드물게 gopher, news, telnet, file 등을 사용합니다. 이와 같은 URL 프로토콜 부분을 scheme이라고 한다.
URL URL은 보통 브라우저의 주소 창에 입력하는 주소를 URL이라고 할 수 있습니다. 삼성SDS 멀티캠퍼스의 URL은 “http://www.e-campus.co.kr/” 입니다. 이 주소가 URL이라고 볼 수 있습니다. 또한 좀더 상세하게 찾아보면 다음과 같은 URL도 있을 수 있습니다.
“http://www.e-campus.co.kr/image/img_top.gif”
URL은 보통 다음과 같은 내용으로 구성됩니다. 프로토콜 http:// 도메인 www.e-campus.co.kr 자원을 식별할 수 있는 자원의 경로명 /image/img_top.gif 즉, 위와 같은 URL을 통하여 인터넷 상의 자원을 지정할 수 있습니다. URL을 통하여 지칭할 수 있는 자원의 종류는 제한이 있는데 URL을 통해서 가져올 수 있는 자원은 유형, 무형의 자원 중 명백하게
통합 자원 식별자(Uniform Resource Identifier, URI)는 인터넷에 있는 자원을 나타내는 유일한 주소이다. URI의 존재는 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어 다닌다.
URI는 자원을 식별할 수 있는 문자열정도로 생각하면 될 것 같다
URI 인터넷 상에서 일반적으로 이루어지는 작업은 자원(resource)을 찾고 가져오는 일에 관련되어 있습니다. 자원이란 인터넷상에 존재하는 html 파일이나 gif 파일 등을 의미합니다. 또한 넓은 의미로 생각한다면 인터넷을 통하여 얻을 수 없는 자원도 포함합니다. 이러한 상황을 전제로 URI를 정의하면 다음과 같습니다.
URI 란 리소스를 식별하는 문자열이다. 선호도에 따라 우리가 잘 알고 있는 URL(Uniform Resource Locator) 또는 URN(Universal Resource Name)의 둘 중 하나의 형태로 쓸 수 있다.
위 정의를 보면 URI는 URL이나 URN 둘 중의 하나라고 말하고 있습니다. 둘 중의 하나라면 URI는 URN도 될 수 있고 URL도 될 수 있다는 것을 의미합니다. 그렇다면 URL과 URN은 어떤 의미로 사용할까요?
아래와 같이 하면.. getRequestURL() 는 https://www.abc123.com:80/test1.jsp, getRequestURI() 는 /test1.jsp 라고 나온다.
getRequestURL() 에는 getRequestURI() 내용 외에, 1. http:// 이냐 https:// 이냐의 프로토콜 2. :80 이냐 :8080 이냐의 포트 등이 추가로 표시된다.
http://raisonde.tistory.com/295
보니까 더 어렵다 -_-);;
URI는 인터넷 서비스를 통해 접근하고자 하는 자원의 식별 체계(경로)를 가리킨다. 즉, 어떤 파일이나 어떤 웹페이지에 접근 하고자 할때 사용되는 주소 체계를 말 하는 것이다. URI와 URL의 차이에 대해서 궁금해 하는 사람이 많은데, URL은 URI에 속하는 주소 체계중 하나이다. URI에는 URL말고도 URN, URC 라는 주소체계가 있다. 즉 URI는 이를 모두 포함하는 개념인 것이다.
URI ⊃ {URL, URN, URC}
URL은 우리가 흔히 알고 있는 주소 체계이다. 프로토콜 + 호스트 + 하위 경로로 구성되어 인터넷상의 특정 자원에 접근 할 수 있다. 예를 들어,
http://raisonde.tistory.com/227
는 http라는 프로토콜로, raisonde.tistory.com 이라는 호스트로 접속하여 227 이라는 경로에 가면 원하는 문서가 있다는 말이다.
URN은 좀 더 복잡하지만 안정된, 영구적인 주소체계이다. URL은 해당 경로에 원하는 자원(파일, 웹페이지 등)이 변경되거나 이동 될 경우 더이상 접근이 불가능 해 지는 문제가 있는데 URN은 이런 자원에 대한 접근 경로를 지속적으로 추적 해 줌으로써 특정 자원에 반영구적으로 접근할 수 있다. 이를 위한 추적 에이전시로는 RSS(Resolution System Switcher)가 있으며 주소 체계는 IETF RFC 2141 에서 정의한다.
URC는 인터넷 상에 존재하는 자원에 관한 저자, 위치, 제목을 표현하는 메타 데이터의 일종이다. URL과 URC를 포함하는 컨테이너적인 체계이다.
In some applications, the unknown user requests must log resources, prompting the user to log on at this time to the current page, remember the user access to the URL, when he after successful login URL to the user according to remember last visited page:
<p>The overflow property specifies what to do if the content of an element exceeds the size of the element's box.</p>
<p>overflow:scroll</p>
<div class="scroll">You can use the overflow property when you want to have better control of the layout. The default value is visible.</div>
<p>overflow:hidden</p>
<div class="hidden">You can use the overflow property when you want to have better control of the layout. The default value is visible.</div>
</body>
</html>
---------------
<!DOCTYPE html>
<html>
<head>
<style>
div {
color: red;
}
h1 {
color: initial;
}
</style>
</head>
<body>
<div>
<h1>Initial</h1>
<p>The header and this text is inside a DIV element, which has the color property set to "red". The header element has its color property set to "initial", which in this case is "black".</p>
</div>
<p><b>Note:</b> The initial keyword is not supported as a property value in Internet Explorer, or in Opera before version 15.</p>
</body>
</html>
이거 할떄 졸았음 - 빨간색
<!DOCTYPE html>
<html>
<head>
<style>
span {
color: blue;
border: 1px solid black;
}
.extra span { // 엑쓰트라를 먼저 찾고 - 그담에 자식요소 인것
color: inherit;
}
</style>
</head>
<body>
<div>
Here is <span>a span element</span> which is blue, as span elements are set to be.
</div>
<div class="extra" style="color:green">
Here is <span>a span element</span> which is green, because it inherits from its parent.
</div>
<div style="color:red">
Here is <span>a span element</span> which is blue, as span elements are set to be.
</div>
</body>
</html>
http://webdir.tistory.com/347
졸은거 땜빵!
overflow
요소의 박스에 콘텐츠가 넘칠때 표현방법을 지정한다.
CSS
div{width: 150px;height: 150px;overflow: scroll;}
overflow-x와 overflow-y 속성에 대한 축약 속성이다.
이 속성의 두 번째 값은 선택적이며, 하나의 값만 지정할 경우 overflow-x와 overflow-y 속성에 모두 적용된다.
<p>Click the "Try it" button to change the overflow-x property of the DIV element:</p>
<button onclick="myFunction()">Try it</button>
<div id="myDIV">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,<br> sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<br> Ut wisi enim ad minim veniam,<br> quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
Oracle 뿐만 아니라 DB2 에서도 실행되는(?) 수행되는 이라고 해야 맞으려나?? - -;; 암튼... 이번엔 JAVA 의 IF ~ ELSE 문과도 같은 CASE WHEN 문에 대해서 알아 봅시다.
CASE ~ WHEN ~ THEN ~ ELSE ~ END
[형식] CASE 컬럼명 | 표현식 WHEN 조건식1 THEN 결과1 WHEN 조건식2 THEN 결과2 ....... WHEN 조건식n THEN 결과n ELSE 결과 END
조건문과 조건문 사이에는 콤마(,) 를 사용하지 않는다. CASE 문은 반드시 END 로 끝내야 한다. CASE 표현식은 ANSI SQL 형식도 지원한다. 결과 부분은 NULL 을 사용해서는 안된다.
case when x = y then a else b end : 조건 x =y 가 true 일 경우 a 이고 그렇지 않으면 b
case when x < y then a when x = y then b else c end : 조건 x<y 가 true 일 경우 a 로, 조건 x = y 일 경우엔 b 로 그렇지 않으면 c 로 변경
case XYZ when 'foo' then 'moo' else 'bar' end : XYZ 가 foo 일 경우 moo 로 변경, 그렇지 않으면 bar 로 변경
예제 만들기!
CREATE TABLE TEST_CASE_WHEN (A VARCHAR2 (5), B VARCHAR2 (5));
INSERT INTO TEST_CASE_WHEN VALUES ('*','*'); INSERT INTO TEST_CASE_WHEN VALUES ('+','+'); INSERT INTO TEST_CASE_WHEN VALUES ('-','-'); INSERT INTO TEST_CASE_WHEN VALUES ('.','.');
COMMIT;
토드나 SQLPLUS 혹은 SQLGATE 에서 Qurey 를 날려 봅시다.
자, Alias 인 as B 를 붙이므로 좀더 Grid 의 컬럼이 보기 깨끗해집니다. ^^
SELECT a, CASE WHEN b = '*' THEN 'star' WHEN b = '+' THEN 'plus' WHEN b = '-' THEN 'minus' ELSE '????' END AS B FROM test_case_when;
DBMS의 중요한 목적 중 하나는 데이터를 효율적으로 관리하는 것이다. 그래서 개별 테이블을 만들어 가급적 중복성을 피해서 꼭 필요한 데이터를 저장하게 된다. 하지만 각각의 테이블 하나만 놓고 본다면 그안에 들어있는 데이터는 정보로서의 가치가 많이 떨어진다. 하지만 각각의 테이블에 분리되어 있는 연관성 있는 데이터들을 연결하거나 조합하여 데이터를 사용할 수 있다면 중요한 정보로서 가공될수 있다.
이런 작업들을 조인(Join)이라고 한다.
1. WHERE 절
조인에 대해 알아보기 전에 먼저 WHERE 절 에 대해 살펴 봐야 한다.
WHERE 절은 SELECT, UPDATE, DELETE 등 여러 DML 문장에서 사용되어 특정 조건을 처리하는 필터 역할을 수행한다. 그리고 조인에 사용되는 조건들 역시 WHERE 절에 기술한다. SQL 문장을 얼마나 잘 작성하느냐의 척도는 WHERE 절을 얼마만큼 잘 사용하느냐에 달려 있다.
IN
BETWEEN ..AND 조건과는 다르게 여러 개의 값을 동시에 비교해야 할 경우에는 IN 을 사용한다.
IN연산자는 OR 연산자와 동일한 기능을 수행하며 비교할 값들이 많을때 IN 을 사용하면 문장이 짧아진다.
부서 ID가 30 OR 60 OR 90 인 사원들만 구하겠다 할때 사용할 수 있다.
EXISTS
IN과 비슷한 용도로 EXISTS 조건이 있다 어떤 값에 포함되는지 여부를 체크하는 것이 IN 이라면 EXISTS는 특정 컬럼값이 존재하는지 여부를 체크한다. IN은 괄호 안에 비교할 값이 올 수도 있고 서브쿼리가 올 수도 있는 반면에 EXISTS는 오직 서브쿼리만 올 수 있다.
테이블 부서ID가 30, 60, 90인 사원을 구하고 싶을때 EXISTS를 사용했다.
결과는 IN을 사용했을때와 동일하면서 SQL 문장은 더 길어졌다 왜 사용할까?
EXISTS는 IN보다 탁월한 성능을 발휘한다 그만큼 쿼리결과가 빨리나온다. 문장은 길어졌지만 오라클 SQL 엔진 입장에서는 EXISTS가 더빨리 처리 되는 것이다. 이것에 대해서는 SQL튜닝과 관련된 곳에서 공부를 더 해야 한다.
1. import의 사용 - CLASSPATH은 하드디스크상에 클래스들이 어디에 위치하는지 경로를 지정하는 역활을 합니다. - import문은 그 경로상에서 어떤 패키지들을 참조(조회)할것인지 지정하는 명령어입니다. 따라서 CLASSPATH에 경로가 등록이 되었다고 클래스를 사용할 수 있는 것이 아니라 import 문을 이용하여 패키지를 지정해야 합니다. - 다른 패키지를 가져다 사용할 경우 선언합니다. - 참고할 패키지의 경로를 지정합니다.
package corejava;
//import java.text.DecimalFormat;
//임포트를 안하면 소속을 찾지 못해서 오류뜸
//java.text.DecimalFormat;는
//java 폴더 안의 text 폴더 안에 DecimalFormat 클래스가 있는 것
// ㅇㅇ
//import java.text.*;
// 얘는 그냥 모든 걸 다 쓰겠다고...
// 자바 텍스트 패키지의 모든것을... -_-+
//어짜피 c처럼 끌고 들어오는 게 아니라서 - 라이부러리 x
// 그냥 *해줘도 상관없음염
//ctrl+shift + O - 해주면 Organize source 해줘서 임포트 한방에 해줌
- 객체를 저장하는 기술인 Collection Framework의 단점을 개선한 기능 - 클래스나 메소드에 자료형을 매개변수 형식으로 사용할 수 있는 기능. - Class ArrayList<E>에서 'E'가 있는 곳에는 ArrayList를 선언하고 생성할 때 사용할 실제타입 - E는 Element(원소)를 말하며, new ArrayList<String>() 이면 'E'는 'String' 클래스를 가르키며, < > 안의 String은 유형 매개 변수 (type parameter)이다. 따라서 boolean add(Object o) 메소드는 boolean add(String o) 가 된다. - 'E'는 ArrayList의 인스턴스를 만들때 < > 안에 넣는 타입을 말합니다.
응그래요... ㅎㅎ...
에러 나는 경우
package day12;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Generic {
public static void main(String[] args) {
//ArrayList 객체 10개를 저장할 수 있는 list 객체 변수 선언
ArrayList list = new ArrayList(10);
list.add(new Integer(10)); //Integer 추가
list.add("List Test"); //String 추가
//객체배열에서 순차적으로 객체를 추출하기위한 Iterator 객체 생성
Iterator i = list.iterator();
Integer su = (Integer)i.next();
System.out.println("su=" + su);
su = (Integer)i.next(); //ERROR 강제 발생 부분
//왜냐면 기껏 Integer로 가져와서는 이상하게 받음...
System.out.println("su=" + su);
}
}
- Generic 클래스 . 제네릭 클래스는 형 매개변수(type parameter)를 가지는 클래스입니다. . 형매개변수는 객체가 생성시 전달받으며 속성이나 메소드의 자료형으로 사용됩니다.
package day12;
class SimpleGeneric<T> {
private T[] values;
private int index;
SimpleGeneric(int len) { // Constructor
values = (T[]) new Object[len];
index = 0;
}
public void add(T... args) {
for (T e : args)
values[index++] = e;
}
public void print() {
for (T e : values)
System.out.print(e + " ");
System.out.println();
}
}
public class GenericClassExample {
public static void main(String[] args) {
SimpleGeneric<Integer> gInteger = new SimpleGeneric<Integer>(10);
SimpleGeneric<Double> gDouble = new SimpleGeneric<Double>(10);
gInteger.add(1, 2);
gInteger.add(1, 2, 3, 4, 5, 6, 7);
gInteger.add(0);
gInteger.print();
gDouble.add(10.0, 20.0, 30.0);
gDouble.print();
}
}
이게 왜 자동으로 바뀌는데? -_-);;;;;;
부터 막혔음..
package day12;
class SimpleGeneric<S>{
//클래스 설계도
private S[] values;
private int index;
SimpleGeneric(){
}
SimpleGeneric(int len){
values = (S[]) new Object[len];
index = 0;
}
public void add(S ... args){
//이렇게 하면 동일한 타입 1개든 100개든 받을 수 있음
//근데 타입은 같아야함 :>
//S 타입 200개 (ㅇㅋ)
//S타입 1개 + T타입 2개 = x
for(S e: args)
values[index++] = e;
}
//foreach 문인데
//S타입 e를 생성 -> args의 각 요소를 표시
//그냥 끝까지 도는 것 :>
//S가 Double이면
//double e : args 같은 것
public void print(){
for(S e : values)
System.out.println(e + " ");//으으 이것도 언박싱
System.out.println();
}
}
public class GenericClassExample {
public static void main(String[] args) {
SimpleGeneric <Integer> gInteger = new SimpleGeneric<Integer>(10);
SimpleGeneric <Double> gDouble = new SimpleGeneric <Double> (10);
- ANSI SQL92, 99에 기준하여 각 데이터베이스상에서 SQL을 사용할 수 있습니다.
- DQL(Data Query Language), 데이터 질의어, 데이터 검색, 출력과 관련된 쿼리 . SELECT..FROM..WHERE //얘는 있는걸 갖다가 검색해서 쓸 때 쓰는것 씰렉트(뭐를) 패쓰워드 푸롬(위치) 멤바테이블 웨어(조건) 10개만(다갖다써도됨)
- DML(Data Manapulation Language), 데이터 조작어, 데이터 입력, 수정, 삭제와 관련된 쿼리 . INSERT, UPDATE, DELETE // 얘는 데이타 입력 수정 삭제 할 떄 쓰는 거임 -_-)
인써트도 어쩌구저쩌구가 있는데 나중에 하것지 인서트 인투 어쩌구
업데이트 셋 어쩌구 저저구
- DDL(Data Definition Language), 데이터 정의어, 테이블 생성 및 삭제, 테이블 구조 수정과 관련된 쿼리 . CREATE TABLE, DROP TABLE, ALTER TABLE // 아까 쟤네 어디다가 넣냐고 -> 공간 확보! :> 테이블 형태로 만들어져서 다 테이블임
크리에이트 테이블 - 생성맨
드롭 테이블 - 이건 delete 기능임
알터 테이블 - column이 부족할 때 추가 추가
- TCL(Transaction Control Language), 트랜잭션 제어 언어, 안정적인 데이터 처리를 위한 데이터 처리와 관련된 명령어 . COMMIT, ROLLBACK, SAVEPOINT // 트랜잭션 :>! - 응? 계좌이체?
A라는 계좌에서 B라는 계좌로 돈을 이체시킴!
1) A에서 돈을 뺸다
2) 그 돈을 B라는 계좌로 넣는다
원자성... 어 아톰...뭔데 -_-);; Atomic?
이힣ㅎㅎㅎ
- DCL(Data Control Language)데이터 제어 언어, 권한 부여와 관련된 쿼리 . GRANT, REVOKE // ㅋㅋㅋㅋㅋㅋㅋ임 아니네 이건 DBMS가 해준댕 :D 굿
6. NULL, NOT NULL - NULL인 경우는 INSERT시에 값을 입력하지 않아도 됩니다. - NULL속성일 경우 컬럼값을 입력하지 않으면 "NULL"기호가 값으로 입력됩니다. - NOT NULL일 경우는 컬럼에 반드시 데이터를 INSERT시에 입력해야 합니다. - 컬럼의 값이 NULL인 경우는 데이터가 입력된 적이 없다는 뜻입니다.
그래서 입력 스트림 따로 / 출력 스트림 따로 만듬 (입구와 출구가 다름) - 단방향 구조!
아오씨 발목 건조해
한글은 유니코드 어쩌구 때문에 InputStream / OutputStream(1바이트짜리) 못 쓰고 Reader랑 Writer(2바이트짜리) 써야함.
바이트 단위 처리 2바이트 문자단위 (한글 처리 불가능) (한글 처리 가능) ------------------------------------------------------------------------------- InputStream 기본 입력 스트림 클래스 Reader OutputStream 기본 출력 스트림 클래스 Writer
FileInputStream 파일 입력 스트림 클래스 FileReader FileOutputStream 파일 출력 스트림 클래스 FileWriter
BufferedInputStream 버퍼 입력 기능 클래스 BufferedReader BufferedOutputStream 버퍼 출력 기능 클래스 BufferedWriter
DataInputStream 데이터 타입을 지정하여 입력할수 있는 클래스 DataOutputStream 데이터 타입을 지정해서 출력할수 있는 클래스
ObjectInputStream ois; Class 객체를 읽어 올 수 있습니다. ObjectOutputStream oos; Class 객체를 출력 할 수 있습니다.
그렇다
인풋스트림 / 아웃풋스트림에 앞에 파일 붙이면 - 파일로 바이너리 데이터를 입력받고 / 내보내고
이번에 앞에 버퍼드 붙이면 중간에 버퍼를 사용해서 쌓아놨다가 한꺼번에 데이터를 읽어오고 / 내보내고
프로세스 - 쓰레드의 집합으로 하나의 돌고있는 프로그램 - 현재 실행되고 있는 프로그램 :>!
프로세스간 자원 공유 불가능!!! - 그래서 프로세스 많이 발생 시키면 자원(메모리) 가 바닥난다.
쓰레드 - 독립된 작업처리 단위로 프로세스를 구성한다.
반복적으로 동기화하여 실행되는 프로그림 루틴이다.
메소드(함수)단위의 처리 모듈이며 프로세스의 구성 요소임
근데 쓰레드는 많이 발생해도 자원을 공유해서 프로세스보다 부담이 적당 :> 꺙
얘네는 동시에 실행되지는 않는다!!
쓰레드 스케줄러에 의해서 스레드의 여러상태중 실행상태로 변경가능!!
. 각각의 Thread는 자신의 일을 하고 있으며, 동시에 실행되지 않는다. . 스레드 스케줄러에 의해서 스레드의 여러상태중 실행상태로 변경할 수 있다. . 스레드의 상태는 준비상태, 실행상태, 대기상태, 정지상태가 있다. . 스레드는 자원을 공유하는 특징이 있어 멤버필드와 static 필드를 공유한다.
run()메소드 안에 처리로직을 구현하거나 / 처리로직을 호출하는 로직이 구현되어있당
자바는 레퍼런스를 참조해서 C언어거보다 속도랑 안정성이 떨어짐... - 그래서 네트워크에선 잘 안씀
쓰레드 예시
스타크래프트 - 실행 (프로세스 시작)
cgv가 미네랄 누르면 미네랄캠 - 쓰레드
다른애가 조패러감 - 쓰레드
요거 외우기
그러니까 쓰레드 스케줄러에 의해서 준비 -> 실행 가는거고ㅇㅇ
1) 객체 생성
2) start() 준비상태
- 쓰레드 스케줄러(에 등록이 되어서)가 보내줄 때까지 준비상태
3) run() - 실행중인 것 (콜백 메소드 -자동으로!)
- 근데 쓰레드 스케줄러가 다시 준비상태로 가라면 다시 2)로감 2)<->3)
4) -1) 정지상태! (run 메소드가 실행이 완료된 것)
4) -2) 대기상태 (실행상태에서 잠깐 빠져나온 상태)
4) -2) -1) sleep() wait() suspend() 가 코드에서 호출되었을 때 3)에서 4)-2)로 감
sleep()은 자기가 준비상태로 갈 시간을 알고 있음 - 자다 일어나서 준비상태로 뾸뾸뾸 감
다른애들은 굳이 불러줘야 감
그리고 다시 대기 상태에서 준비상태로 가려면
notify() notifyall() resume()을 코드에서 호출하면 다시 준비상태로감
start()는 콜백 메소드가 아니라서 써줘야함 흥
JVM은 스레드를 실행할 수 있는 여유가 생겼을 때 자신이 작성한 스레드 스케줄러에 의해서 스레드의 run()메소드를 호출한다.
run()은 JVM이 호출하는 콜백 메소드!
콜백 메소드: 개발자가 호출을 코드상에 지시하는 것이 아니라 JVM이 호출하는 메소드!
콜백 메소드: 그래서 자동으로 호출되어지는것 -_-)ㅋㅋ
이 run()메소드 안에는 스레드 상태에서 처리하려고 하는 모든 비즈니스 로직이 구현되어 있어야 함! :>
sleep()는 지정된 시간동안 스레드를 쉬게 하고 그 시간이 지나면 다시 쓰레드가 작동됨!
wait()는 현재 스레드를 무한정 대기 시킨 후 notify()나 nofityall 메소드를 통해서 재실행함
suspend()는 스레드의 실행을 일시적으로 중지 시킨 것인데 resume() 을 통해서 다시 실행됨
- yield(): 스레드의 실행 권한을 무조건 다른 스레드에게 넘겨 준다.(양보) - stop(): 스레드 실행을 완전히 종료 한다. - getName(): 쓰레드의 이름을 알려줍다. - Thread.currentThread()는 현재 실행중인 쓰레드를 알려준다.
단일 스레드
: 메인 메소드가 대표적인 단일 쓰레드! (프로세스에서 디폴트로 할당되는 스레드)
하나의 프로세스가 하나의 쓰레드로 실행되는 환경!
모든 프로세스는 최소한 하나의 쓰레드를 가지게 되며 메인 쓰레드에서 더이상 새로운 쓰레드를 생성하지 않았다면 이 프로세스는 단일 쓰레드 환경이 된다.
멀티 쓰레드
: 하나의 프로세스에 두 개 이상의 쓰레드가 존재하는 것
- 여러 메소드가 계속적으로 실행상태에 있으면서 자원을 공유하고 이용하는 처리 행태
스레드의 생성 방법
- 스레드 클래스를 상속받는 방법
- Runnable 인터페이스를 구현하는 방법
자바는 다중 상속이 안됨으로 클래스가 특정 클래스를 상속할 필요가 있는 경우는 반드시 Runnable인터페이스를 구현해야 한다.
[02] 스레드 실습 1. 스레드를 이용하지 않은 경우 >>>>> NonThread.java
파워복붙
package day11;
class GenClass {
private int num;
private String name;
public GenClass(String a, int b) { // 생성자
name = a;
num = b;
}
public void start() {
for (int i = 0; i < num; i++) {
System.out.println(name + " : " + i);
}
}
}
public class NonThread {
public static void main(String args[]) {
GenClass t1 = new GenClass("first", 5);
GenClass t2 = new GenClass("second", 5);
GenClass t3 = new GenClass("third", 5);
t1.start();
t2.start();
t3.start();
}
}
그냥 쓰타트밖에 없음 -_-)
2. Thread 클래스를 상속받은 경우 - CallBack Method: JVM이 자신의 실행 스케쥴러를 만들고 거기에 등록된 순서에 따라 자동 호출하는 메소드
파워복붙
package day11;
class MyThread extends Thread { //쓰레드를 부모로 가짐
//그래서 이거 객체로 만들면 멀티쓰레드임
//쓰레드의 자식이니까 얘도 쓰레드
//엄마건 내거 상속인것
private int num;
private String name;
public MyThread(String a, int b) {
name = a;
num = b;
}
public void run() { // Callback 메소드
for (int i = 0; i < num; i++) {
System.out.println(name + " : " + i);
}
}
}
public class ThreadTest1 {
public static void main(String args[]) {
MyThread t1 = new MyThread("first", 1000);
MyThread t2 = new MyThread("second", 1000);
MyThread t3 = new MyThread("third", 1000);
t1.start();
t2.start();
t3.start();
//이거 돌리면 순위가 매번 다름 ㅇㅇ 쓰레드 스케줄러 마음!!
}
}
3. Runnable 인터페이스를 사용한 경우 - 스레드 내용을 가지고 있는 클래스가 추가적인 기능이 필요해 다른 클래스를 상속받는 경우는 Runnable인터페이스를 implements(구현)해서 사용한다.
package day11;
class ThreadOne implements Runnable {
// 자바는 다중 상속이 안됨으로 클래스가
// 특정 클래스를 상속할 필요가 있는 경우는 반드시
// Runnable 인터페이스를 구현해야 한다.
private int num;
private String name;
public ThreadOne(String a, int b) {
name = a;
num = b;
}
public void run() {
for (int i = 0; i < num; i++) {
System.out.println(name + " : " + i);
}
}
}
public class ThreadTest2 {
public static void main(String args[]) {
// Runnable Interface를 구현한 클래스 객체를
// Thread 클래스의 생성자로 할당합니다.
Thread t1 = new Thread(new ThreadOne("first", 1000));
Thread t2 = new Thread(new ThreadOne("second", 1000));
Thread t3 = new Thread(new ThreadOne("third", 1000));
t1.start();
t2.start();
t3.start();
}
}
runnable - interface라서 implements 해주기 때문에
thread - 얘가 class니까 만약에 다른 애를 extends 했을 경우에 Runnable을 써주면
쓰레드 대신 쓸 수 있음 - 그래서 씀
4. 쓰레드 기본메소드와 특징확인
package day11;
class MyRuns implements Runnable {
public void run() {
show();
}
public void show() {
for (int i = 0; i < 100; i++) {
if (((Thread.currentThread()).getName()).equals("a")) {
//스레드가 여러개일 때 현재 스레드.의이름.이 a냐고?(맞으면: true / 아님 false)
System.out.print("a");
// System.out.print("[A"+i+"]");
} else if (((Thread.currentThread()).getName()).equals("b")) {
// System.out.print("[B"+i+"]");
System.out.print("b");
} else if (((Thread.currentThread()).getName()).equals("c")) {
// System.out.print("[C"+i+"]");
System.out.print("c");
} else {
System.out.print("[" + Thread.currentThread().getName() + i + "]");
}
}
}
}
public class MyRunsMain {
public static void main(String[] args) {
MyRuns mr1 = new MyRuns();
Thread t1 = new Thread(mr1, "a");
Thread t2 = new Thread(mr1, "b");
Thread t3 = new Thread(mr1, "c");
// Thread t3=new Thread(mr1);
t1.start();
t2.start();
t3.start();
}
}
//이 코드 돌리면 점유율을 알 수 있슴니다 -_-)ㅋ
5. Thread와 자원 공유 - 멤버필드, static필드 - 같은자원(같은 객체의 멤버필드)을 여러개의 쓰레드가 공유할 수 있다. - 문제점발생: 좌석예약, 계좌입출금 등등 - 문제점은 동기화 처리(synchronized)로 해결할 수 있다.
오예 씽크로나이즈드!!
동기화! :D 이예~~~~~~~~~~~~~~ 책에서본거~~~~~~~~~~ 내용은 모르지만~~~
지네 처리할 것을 보장하는 식으로 해결함 ㅇㅇ 넘나조은것
package day11;
class MemberPrint implements Runnable {
//임플리먼츠 때문에 쓰레드임 :>
private int i = 0; //
public void run() {
show();
}
public void show() {
for (; i < 100; i++) {
if (((Thread.currentThread()).getName()).equals("a")) {
System.out.print("[A" + i + "]");
} else if (((Thread.currentThread()).getName()).equals("b")) {
System.out.print("[B" + i + "]");
} else if (((Thread.currentThread()).getName()).equals("c")) {
System.out.print("[C" + i + "]");
}
}
}
}
public class MemberPrintMain {
public static void main(String[] args) {
MemberPrint mr1 = new MemberPrint();
Thread t1 = new Thread(mr1, "a");
Thread t2 = new Thread(mr1, "b");
Thread t3 = new Thread(mr1, "c");
t1.start();
t2.start();
t3.start();
}
}
이따구로는 하면 안되고 아래 예제를 봅시다
package day11;
class StaticLockPrint implements Runnable {
private static int i; //
static {
i = 5;
}
public void run() {
show();
}
public void show() {
synchronized (StaticLockPrint.class) {
//이렇게 막으면 먼저 들어온 애가 다 돌때까지는 접근 못함
for (; i < 100; i++) {
if (((Thread.currentThread()).getName()).equals("a")) {
System.out.print("[A" + i + "]");
} else if (((Thread.currentThread()).getName()).equals("b")) {
System.out.print("[B" + i + "]");
} else if (((Thread.currentThread()).getName()).equals("c")) {
[03] 우선순위 - java.lang.MIN_PRIORITY, java.lang.NORM_PRIORITY, java.lang.MAX_PRIORITY - setPriority(int p): 현재 스레드의 우선순위를 인자 p로 설정하기 위한 메소드 - getPriority(): 현재 스레드의 우선순위를 반환하는 메소드 1. sleep()를 적용한 경우 - 특정 스레드에 CPU의 자원이 집중하는 것을 막을 수 있다.
class RunThread2 extends Thread { public RunThread2(String name) { super(name); } public void run() { for ( int i = 1; i <= 30000000 ; i++ ) { if ( i % 50 == 0 ){ System.out.println("Thread [" + getName() + "] : " + i); try{ //sleep(1); //0.001초 System.out.print(""); }catch(Exception e){ } } } } } public class SchedulingTest2 { public static void main(String args[]) { Thread[] t = new RunThread2[5]; t[0] = new RunThread2("☆"); t[1] = new RunThread2("★"); t[2] = new RunThread2("◆"); t[3] = new RunThread2("◇"); t[4] = new RunThread2("○"); t[0].start(); t[1].start(); t[2].start(); t[3].start(); t[4].start(); } }
[23] NETWORK 이론및 관련클래스, Socket, ServerSocket의 이해 및 실습
1. Intranet / Internet의 구분 - 라우터를 기준으로 안쪽을 intranet, 외부를 Internet이라고 합니다.
그래서 학원 거 같은거슨 인트라넷
1) IP Address. . . . . : 172.16.203.31 - 접속 위치를 나타내는 프로토콜 - IP는 항구와 같은 위치 정보에 해당하며 컴퓨터를 구분하는 용도로 사용. - Port는 항구에서 짐을 싫어 나르는 부두(port)와 같으며 네트워크로 접속되는 지점 - 하나의 IP에 할당된 여러개의 네트워크 프로그램을 구분하는 용도로 사용. - 하나의 포트는 하나의 프로그램과 매핑(연결)됨 - IP 하나당 사용 가능한 포트 : 0 ~ 65535 (2Byte) - 알려진 사용할 수 없는 포트 20, 21 : FTP, 파일 전송 22 : Secure Shell 접속 23 : Telnet, 원격 접속 25 : SMTP, 메일 전송 80 : HTTP, Apache, IIS등 웹서버, 인터넷 웹 페이지 서비스 3306 : MySQL 기본 포트, DBMS 1521 : Oracle 기본 포트, DBMS 8080 : Apache, 기타 웹 서버 1433 : MS-SQL 기본 포트, DBMS - 1500번 이하는 시스템이 사용하는 포트가 많음으로 1500번 이상 사용을 권장함.
3. 네트워크를 지원하는 java.net 패키지의 기본클래스 - URL 클래스 . URL 클래스는 웹상에 존재하는 자원에 접근하거나 네트웍상의 유일한 주소를 나타내기 위한 방법을 제공하며, 또한 위치정보를 관리하기 위한 클래스 이다. . 해당 위치에 스트림을 개설할 수 있다.(openStream() 이용)
- URL 객체 생성후 스트림 개설 URL객체를 생성할때는 MalformedURLException 에러처리를 해야 한다. try{ URL uri = new URL("http", "hostname", 80, "default.htm"); InputStream is = uri.openStream();
- URLConnection 클래스 : URL을 목표지점으로 하는 네트웍 연결을 위한 작업을 수행함 - URL객체의 스트림 생성과 URLConnection 객체의 스트림 생성 : URL 객체 URL uri = new URL("http", "hostname", 80, "default.htm"); InputStream is = uri.openStream(); : URLConnection 객체 URL uri = URL("http", "hostname", 80, "default.htm"); URLConnection con = uri.openConnection(); InputStream is = uri.getInputStream();
또는
URL uri = URL("http", "hostname", 80, "default.htm"); URLConnection con = uri.openConnection(); con.setDoOutput(true); //스트림방향을 출력으로 설정 OutputStream os = uri.getOutputStream();
4. Socket, ServerSocket - ServerSocket: 클라이언트보다 먼저 실행되어 클라이언트의 접속 요청을 기다리며, 클라이언트가 접속하면 양방향 통신을 할 수 있는 Socket . 객체를 생성한다 - Socket: 다른 Socket과 데이터를 송수신 한다.
- Network 프로그램의 운영순서 ⓐ Server: ServerSocket 생성 ⓑ Server: 포트감시 시작, Client의 접속을 기다림 ⓒ Client: Socket 생성시에 인자 값으로 서버의 IP, PORT를 지정, 서버에 접속 요구 ⓓ Server: Client의 요구를 받아 Socket 객체 생성 ⓔ Server: 생성된 Socket 객체를 이용해 Client에게 데이터를 보냄 ⓕ Client: Socket객체로 데이터를 받고 필요한 데이터를 다시 서버로 전송함
와 오늘 마ㅣㅇ했읍니다 ㅇㄴㅁㅇㅁㄴㅇㄴㅁㅇㅂ조ㅓㄷㅂㅈ
계속 일거봥ㄴ먕하빈다
그리고 cmd에서
package day11;
import java.io.*;
import java.net.*;
public class TestServer {
public static void main(String[] args) {
System.out.println("***** 개발자_1 서버 프로그램 작동됨 *****");
ServerSocket server = null;
try {
// 2007 포트로 ServerSocket 생성
server = new ServerSocket(2007);
// 서버 = 소켓(포트)
while (true) { // 데몬이 되기 위한 무한 루프
System.out.println("클라이언트 접속을 대기중입니다.");
Socket client = server.accept(); // Lock
InetAddress ia = client.getInetAddress();
int port = client.getLocalPort();// 접속에 사용된 PORT
// 나가고 - 들어올 때 포트가 필요함 :> - 요기서는 열어놓느라고 필요함
String ip = ia.getHostAddress(); // 원격 Client IP
System.out.println("클라이언트 접속:" + " Local Port: " + port + " IP: " + ip);
// 한글을 출력할 수 있습니다.
// Client로 출력할 객체 생성
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));