1. io를 통한 채팅 프로그램 개발 경험이 정말로 큰 도움이 되었음.(종료) 

   =>덕분에.. 이젠 내가 대충 소켓,스레드 사용해서 어떤 프로그램을 만들고 싶다라고 생각이 들면.. 자바 도큐만
   보면서 구현이 가능할듯.. 뭐랄까.. 나름 상당한 고민을 했었고.. 그만큼 풀어냈다고 혼자 착각중임 -_-;
   큰 수확은.. 예외 핸들링을 통한.. while() 업무의 종료 조건 / 수행 조건의 구분이엇고.. 스레드에게 작업을
   시킨다는 것,병렬 처리의 필요성과 순차적 의존에 대한 한계등.. 대해서도 여러가지 깨달음이 있었음..  
    글고 PrintWriter(system.out) .. 그리고 오토 플러쉬.. 머리에 담아 뒀었는데.. 실제로 시행착오를 겪었고.. 
    디버깅해서 원인을 찾고.. 뒤통수 한대 맞은 기분이었음..OTL

2. 기존 nio 계획중 모든 기능 구현이 아닌, 우선 간단한 버전 (채널및 셀렉터 사용, 다이렉트 버퍼 사용)
   으로 다중 (63명) 채팅 룸 하나 구현. (한마디로 셀렉터 하나만 사용하겠다는 의미 클라1개,서버 2개) (오늘중으로 처리 가능)

3. 앞으로 db나갈 예정인데.. 쿼리에 대해 학습겸 해서..  간단하게 쿼리 생성 툴 만들 예정. (예전에 jsp
   교재 땜에 마구잡이로 구현은 해놨었음.)

  =>요걸 실전에 쓸수 있을정도로 만들라면.. ui는 대충 구현(swing사용)..  아주 복잡해질 reflect도 집어치우고..

   1.그냥 사용자가 클래스 이름(=테이블이름), 멤버 필드 타입,변수명 타입,변수명,(pk = 인스턴스 구분까지) ... 
     지정하게 하면 
   2.이클립스가 세터,게터 자동 지원하는 것처럼..  특정 필드 세터(update쿼리) , 게터(selecte쿼리)를 생성
     해줌 (=>xml 파일로 쏴주는 것도 간단할듯.. java.util.property 클래스 땡큐~
   3.복잡한 테이블간 or 행(row)간 or 열(col)간  where  xx and bb  join 등의 복잡한 연산은.. 접어둠


   vs  

   1. data define language : create , alter, drop  생성
   2. modify : insert, update, delete 생성
   3. query : select 
   로 구분하고.. 각 타입에 따라 패턴이 있을테니.. 고민해보고 만들어 봐도.. 

  vs row(레코드) 단위로 처리: delete 
      column(필드) 단위로 처리: insert , update, selete

결론: 관계형 db 만세~  테이블 = 클래스 , pk column & 하나의 row = 인스턴스 , 각각의 column = 클래스 멤버필드
   음.. 그리고 잘은 모르지만.. get,set,조회,정렬,삽입,삭제,생성,소멸등.. 복잡한 비지니스라는 것도 잘개 쪼개면.. 
   거의다 쿼리 단위로 쪼개질듯..  글고 클래스간 관계(association)도 fk를 통해서 표힌이 가능하고..하여간 db쿼리 공부겸 
   툴 만들기 늦어도 다음주 부터 시작. 

추가: 관계형 db의 한계.. 객체 지향의 interface , extends 등의 상속과, 해당 클래스와 메서드간 연결을 못한다. 
       그럼으로 POJO(Plain old java Object) 처럼 아무것도 상속 받지 않고, 겟,셋만 구현한 빈 클래스로 dao를
       만들어서.. 사용한다. 서버와 디비 사이단에.. 하이버네이트, 또 머가 있었드라..?

자바 ee5 : 애플릿 컨테이너 , 어플리케이션 컨테이너, 웹 컨테이너(jsp컨테이너로 jsp,서블릿 관리), ejb컨테이너,
      데이터베이스

--front end--
JAVA CLIENT LAYER (html,xml,css,기타등등.. view단에서 바로 db와 연결할라면.. JQuery=Ajax + html)
{
client tier :일반 어플리케이션 client , 다이나믹 웹 어플리케이션 client
}

--back end--  (jsp 등등)
JAVA SEVER LAYER (사용자=클라이언트의 요청(view)에 따라 컨트롤하여 비지니스 수행(control -> model = db쿼리작업)
{
web tier : jsp 페이지
business tier : EnterprizeBean A , EnterprizeBean B , ...
}

DATABASE LAYER
{
els tier : DB A , DB B ...
}

(etc)오늘 받은 jdbc 쿼리 문서중.. where 조건 연산자를 보니까.. 프로그래밍 언어의 조건(논리,비교) 연산자와는 조금 달리
    실제 비지니스에서 필요한 조건 연산(범위,테이블간(도메인)간 조인, 인스턴스(로우)간 컬럼간.. 등등)과 데이터 베이스의 
     무결성(not null)등등.. 그리고 제공하는 내장 프로시저의 경우.. api를 공부하듯 보면 될듯..
     아 글고 join 문(& 연산자 같음) 사용시 퍼포먼스 올리기 위해 "인덱스"를 사용하는 것이 좋습니다. 란 말이 있는데.. 예전에
     담배 피다 떠올린.. 숫자 중복 코드에서 배열의 인덱스 + 논리 연산자만 가지고 했을때 약 20배의 성능이 좋아 졌던 것과 
     유사한듯.. 
     그게 아니라도 최소한 문자열 비교보단, 숫자 비교가 빠르지..
     
     select = 컬럼(필드),컬럼,컬럼...
     from = 테이블,테이블,테이블...  
     where = 조건 & 조건 or 조건... 
     values = 값, 값, 값...
     
    말 그대로 if else 의 조합 + 게터,세터 아닌가..

    특정 부서의(테이블) 특정 이름 직원(컬럼일수도 있고 테이블일 수도 있고)의 연봉정보(테이블)를 알고 싶어요~  
    조인을 연산을 통해.. 추출하거나, 서브쿼리를 이용한다고 함. 

    채팅 프로그램에 db를 사용한다면;; p2p가 아니고 서버 브로드 캐스트 방식일때.. 해당 채팅룸의 모든 데이터를 db에
    남겼다면,..  xxx날짜에 채팅한 사람중 로그인,아웃 시간이(사용시간) 3시간이 넘고 여자면서 나이가 20~30대인 사람들
    의 데이터를 조회해주세요. 란.. 요청에 대해 어떻게 처리를 할것인가?  전부 and , between 조건으로 처리할 것인가?
    테이블을 멋지게 설계해두고 효율적인 방법으로 타겟을 좁혀 나갈것인가..


    오.. oracle sequence 란게.. 순차적으로 자동증가 하는 값을 생성하는 오라클 객체라네..  내가 오늘 채팅 구현할때
    쬐끔 신경쓰였던 것이.. 클라가 accpet 단에서 개별적으로 i/o스레드를 배정받는데.. 이 경우에 채팅에서 유저를 식별
    하기 위한 name or nickname or id를 어떻게 처리해야 할까였다. 왜냐하면 유저에 대한 아웃풋 스트림의 경우 다중 채팅
    임으로 모아둘(컨테이너를 포함하는 클래스) 필요가 있었고.. 식별을 일반 리스트처럼 인덱스의 경우는 별 문제가 없지만..
    , 셋or 맵 구조라면.. 중복되지 않는 키값이 필요했다. 내 경우엔 i/o 스레드 객체에 소켓 정보를 저장해두지 않고 인풋 스트
    림만 개별 스레드가 보관하는 방식이라.. 아웃풋 스트림을 모아둔 클래스에 서비스 메서드로 중복되지 않는 문자열을 만들게
    끔.. 초간단하게.. guest 란 기본 문자열에 number란 static 변수를 0부터  getUniqueName() 호출 시마다 return "guest" +
     num++; 요 딴식으로 구현했었다. -_-; (자동 증가 = 시퀀스라니까.. 떠올랐다;;)
     key&Object로 하냐..(물론 일반 프로그램이라면.. 클라쪽에서 어셉 요청
    (한마디로 서버주소 적은 소켓 객체 생성 성공) 

(etc2) java.sql.Connection , java.sql.Statement, java.sql.ResultSet, PreparedStatement 등등.. 내가 공부하고 있는 jsp
 교재를 보면서 한번씩 보고 이해하고 사용해봤던 클래스들이다.. 디비와의 통신(i/o스트림) 또한 자바라면 .. 소켓io,파일
 io와 거의 똑같이 설계했을 것이다. 스트림 생성-> i/o작업 -> 스트림 종료..  익숙해서 반갑다 ^_^//

 Class.forName()도 나오네..(reflect 개념에 속함.. 문자열에 매치하는 타입이 있으면 리턴) 내가 이번에 파일 매니저 만들면
 서 구현했던 팩토리 클래스도 xml에서 읽어올때 
 workerMap.put((String)entry.getKey(), Class.forName((String)entry.getValue())) 요렇게 했었는데..

 아.. 뒤에 보니까 드라이버 이름,db url,포트, 계정 이름, 비번등.. .. 약 한달전인가.. 오라클 12c 갈때 sid가 먼지도 몰랐던 때..
 도대체 왜 계정 생성이 안되는지.. 10시간 넘게 고민했었던 당시의 기억이 떠오른다.. 내 경운 11g 로 버전 낮춰서 초 간단하게
 계정 생성 성공.. (12가 먼가 복잡한 개념이 있었음;;)

  dbConnection.createStatement()도 눈에 익숙하고.. 정말로 jsp 책에 절하고 싶은 기분.. 리절트셋이니.. 트랜잭션이니..
  등등.. 리절트 셋의 개념도 잡아 주었고..커넥션 풀링의 개념은.. 책에서도 나왔었고.. 이번에 nio 서버 구현 공부를 하면서
  풀링에 대한 고민도 했었고.. 

  하핫.. 짧은 교재 벌써 다 봤네.. 조금 쉬었다가 nio 채팅 서버,클라 구현 GoGo!
    
(etc3)똥을 싸놓은 파일 매니저의 경우에.. 그 뒤에 꽤나 큰 수정이 있었다.. 허나 중요한 것이 아니기에 우선순위에서 밀림
   .. 다음주는 db쿼리 툴 , jsp 에 우선 순위.. 내 웹서버(정확히는 jsp 컨테이너인 톰캣아..스클립틀릿과 html들아 지못미..)


by givingsheart 2014. 1. 1. 16:41