목록DEV&OPS/Java (148)
삶 가운데 남긴 기록 AACII.TISTORY.COM
로그인 html 프로젝트의 WebContent 폴더 아래에 새 html 파일을 생성하고 이름을 login.html 으로 설정합니다. ID: PW: 로그아웃 로그인/로그아웃 서블릿 작업중인 패키지 경로에 새 서블릿 LoginOut.java 를 생성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import j..
세션은 클라이언트 마다 개별적으로 생성되어 클라이언트의 브라우저를 종료할 때까지 서버쪽에서 그 객체(정보)를 유지합니다. HttpSession 생성 HttpSession객체는 개발자가 수동으로 생성하는게 아니라 HttpServletRequest의 getSession() 메서드를 이용해서 객체를 획득합니다. 새 서블릿 SessionTest.java를 생성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpSe..
쿠키(Cookie) 클라이언트 단위로 상태정보를 유지해야 할 때 쿠키를 사용합니다. 예를들어 로그인 후 로그아웃 할 때까지 인증 상태를 유지 한다던지, 쇼핑몰 장바구니에 선택한 상품 정보들을 유지 한다던지 같은 유지 정보들을 관리합니다. 쿠키는 텍스트로 name=value 형태로 저장하며 만료 일자나 시간을 지정할 수 있습니다. 쿠키 저장(전송) 작업중인 패키지에 클래스 CookieTest.java를 생성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; im..
ServletContext 서블릿 컨텍스트는 서버 쪽에서 웹 어플리케이션 단위로 값(정보)를 유지하는 방법입니다. 서블릿 컨테이너가 시작될 때 ServletContext 객체가 자동으로 생성되어 웹 어플리케이션이 종료될 때까지 계속 유지 합니다. init() 메소드를 재정의하여 추출 작업중인 패키지에서 class 파일을 하나 생성하고 이름을 ServletContextTest.java로 만들고 아래처럼 작성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax..
web.xml 서블릿 실행에 관한 정보를 설정할 때는 web.xml의 태그로 설정합니다. web.xml은 WAS(톰캣)을 시작할 때 WAS가 읽어들이는 정보입니다. web.xml의 태그 안쪽에 아래의 태그와 태그의 내용을 추가합니다. initParam net.aacii.test.InitParamServlet id guest password 1234 1 initParam /initParamTest 태그는 설정하려는 서블릿을 지정해줍니다. 태그는 서블릿에 변수를 전달할 때 사용합니다. 서블릿에서 직접 변수를 입력할 수도 있지만 수정할 때 다시 컴파일 하고 다시 deploy 해야 하지만 web.xml에 변수를 설정해주면 WAS의 재시작 만으로 설정된 변수값들을 사용할 수 있습니다. 일반적으로 서블릿 객체가 메..
질의 문자열 질의 문자열은 브라우저 주소창에 서버로 전송할 parameter들을 문자열로 표현한 것입니다. 질의 문자열은 아래와 같은 규칙이 있습니다. 1. ?name=value 형식으로 전달하며 여러개를 전달할때는 &기호를 구분자로 사용합니다. 예) ?id=guest&name=BTS 2. 영문자 숫자 일부 특수문자는 그대로 전송되지만 한글등 나머지 문자는 %기호와 함께 16진수로 바뀌어 전달됩니다. 예)?id=guest&name=%C8%AB%FF%00 3. 공백 문자는 + 기호로 전달합니다. HTML 태그 태그는 서버로 전송할 질의 문자열을 입력할 수 있도록 할 수 있습니다. GET방식과 POST방식으로 질의 문자열 전송 방식(method)를 결정할 수 있습니다. GET방식은 255 바이트 미만의 데이..
자바 웹 어플리케이션은 브라우저에서 아래 처럼 접근 할 수 있습니다. http://서버주소:포트번호/웹어플리케이션이름/서블릿orJSP 서블릿 경로(build path) 프로젝트 이름을 우클릭하고 Build Path -> Configure Build Path 를 선택합니다. 여기 source 탭에 아래 부분에 Default output folder: 항목에 Browse... 버튼을 클릭합니다. 폴더 목록에서 jsp> WebContent > WEB-INF 폴더를 선택한 후 Create New Folder를 선택합니다. 그러면 자바 소스 파일들이 컴파일 후에 방금 지정한 WEB-INF/classes 에 생성되는 것입니다. 서블릿 작성(package 경로: net.aacii.test) src 경로에 net.aa..
Web Service 네트워크상 분산된 자원들을 연동하여 자원을 공유하는 서비스입니다. SOAP기반 웹 서비스와 RESTful 기반 웹서비스가 있습니다. SOAP(Simple Object Access Protocol)는 XML로 이루어진 WSDL(Web Services Description Language) 자원(data)을 UDDI라는 전역 서비스 저장소에 등록(publish)하여 공개하면 서비스 요청자가 검색 후 SOAP프로토콜을 이용하여 메시지를 주고받는 방식입니다. SOAP envelope + SOAP header + SOAP body로 구성된 XML 메시지를 주고 받습니다. 내용이 많아서 무겁고, UDDI를 거쳐야하고, 개발환경이 지원해줘야 하므로 한계점이 명확합니다. RESTful은 리소스를 ..
REST Client REST API를 이용하여 서버가 리소스를 제공하는 경우 클라이언트 측에서 리소스를 받기 위해 REST Client API가 필요합니다. 그중 하나인 OkHttp 라이브러리를 이용해 JAVA용 REST Client를 구현하는 예제를 소개합니다. OkHttp OkHttp는 Square 에서 만든 간편하게 REST API나 http기반의 요청 응답을 처리할 수 있는 라이브러리입니다. 오픈소스로 공개된 소프트웨어입니다. https://github.com/square/okhttp GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM. Square’s meticulous HTTP cli..
byte는 8 bits 2진법(0 or 1)으로 표현된 데이터 입니다. 16진법은 0~9, A~F 까지 기호를 사용하여 숫자를 표현(코딩)하는 방식입니다. 64진법은 0~9, a~z, A~Z, +, / 기호를 이용하여 숫자를 표현(코딩)하는 방식입니다. byte array 는 2진수로 이루어진 데이터 입니다만 사람이 읽기 어려우므로 16진법(Hex digits)이나 64진법(base64)으로 변환하여 2진수의 배열(byte array)을 문자처럼 사용하기도 합니다. java에서 byte 데이터를 16진수 String으로 바꿀 때 보통 아래와 같은 소스 코드를 이용합니다. Integer.toString(((int) bytedata & 0xff)+0x100, 16).substring(1); Integer.t..
Base64는 64진법이라는 뜻입니다. 디지털 신호인 2진법은 너무도 길어서 8진법이나 16진법 등으로 묶어서 표현 하기도 합니다. 64진법은 영어권의 ASCII 문자들을 써서 표현 할 수 있는 가장 큰 진법인데 그래서 Base64는 전자 메일을 통한 2진 데이터 전송에 많이 쓰이고 있습니다. 보통 알파벳 대문자 A~Z, 소문자 a~z, 숫자0~9, 그리고 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있습니다. Base64의 정확한 규격은 RFC 1421, RFC 2045에 정의 됩니다. 연속된 8비트를 인코딩하도록 정의되어 있습니다. 인코딩된 결과는 padding된 비트 때문에 원본보다 용량이 4/3 정도 늘어나게 됩니다. 2진(binary)데이터를 알파벳 등으로 변환하는 것이기 때문에 이미지 데이터도..
비동기 채널 비동기 채널은 non-blocking 방식으로 동작하는데 차이점은 스레드 풀에게 작업 처리를 요청하고 즉시 리턴한뒤 콜백 메소드를 호출하여 작업 완료 후 실행되는 코드들은 콜백 메소드에 담아서 처리하는 방식입니다. 비동기 채널 그룹 비동기 채널 그룹은 같은 스레드 풀을 공유하는 비동기 채널들의 모음이라고 할수 있습니다. 하나의 스레드 풀을 사용한다면 모든 비동기 채널은 같은 채널 그룹에 속해야 합니다. 채팅 서버(비동기 채널 방식) import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousChannelGroup; impor..
Non-Blocking 블로킹 방식은 accept()에서 블로킹 되고, read() 메소드도 데이터를 읽을 준비를 위해 블로킹 됩니다. 그래서 연결된 SocketChannel당 하나의 스레드가 할당되어야 합니다. 그래서 연결된 클라이언트 수가 많으면 스레드 풀(ExecutorService)를 사용했었습니다. 그런데 non-blocking 방식에서는 connect(), accept(), read(), write() 메소드에서 블로킹을 하지 않습니다. non-blocking방식에서는 요청이 없거나 데이터를 보내지 않으면 null이나 0을 즉시 리턴하며 버퍼에는 아무 데이터도 저장되지 않습니다. 그래서 Selector를 사용해서 이벤트 리스너 역할을 합니다. Non-blocking 채팅 서버 import ja..
TCP 블로킹 채널 NIO에서는 non-blocking과 blocking 동기와 비동기 모두 제공하고 있습니다. ServerSocketChannel은 클라이언트의 SockeChannel의 연결 요청을 수락하고 SocketChannel을 생성 한 후에 서버와 클라이언트간 통신을 수행합니다. 소켓 채널 연결 및 데이터 전송 서버측 예제 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; p..
java.nio.channels.FileChannel 파일 채널을 통해 파일 읽기 쓰기를 할수 있습니다. 동기화 처리가 되어 있어서 멀티 스레드 환경에 안전하게 사용할 수 있습니다. 파일 생성 및 쓰기 import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class FileChannelWriteEx { ..