개발자의 오르막

SW 심화과정 17일차 본문

교육과정 ( SW 개발자 심화과정 )/Java

SW 심화과정 17일차

계단 2019. 7. 31. 12:24

# 데이터가 null 값일 때 SQL 처리

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Test110 {

	public static void main(String[] args) throws Exception{
		String data = null;
		// data의 null 값이 'null' 값으로 들어가기 때문에, 필드 숫자크기를 넘김
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		
		
		String sql = (data != null) ?
				"insert into temp20t values('" +data +"')" :
				"insert into temp20t values(null)";
		
		// 나름 해결책이지만 null 가능 필드가 2개면 경우의 수가 4개, 3개면 8개..
		// 이런 문제 때문에 현업에서는 PreparedStatement를 더 선호한다.
		// char는 아예 4자리 이상만 잡게 한다.
		
		Statement stmt = conn.createStatement();
		stmt.executeUpdate(sql);
		
		
		
		stmt.close();
		conn.close();

	}

}
/*
- create table temp20t(data char(3) null);
- insert into temp20t values('abc');
- insert into temp20t values(null);
  null 은 빈 값을 의미한다.
- insert into temp20t values('null');
  'null'은 4글자라 데이터에 삽입이 안됨.
- select * from temp20t where data is null; (O)
  select * from temp20t where data = null; (X)
  null 과의 비교는 is 를 이용한다.
*/

# PreparedStatement

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;

public class Test111 {

	public static void main(String[] args) throws Exception{
		String data = null;
		// data의 null 값이 'null' 값으로 들어가기 때문에, 필드 숫자크기를 넘김
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		
		String sql = "insert into temp20t values (?)";
		PreparedStatement stmt = conn.prepareStatement(sql);
		
		stmt.setString(1, null);
		stmt.executeUpdate();
		
		stmt.close();
		
		conn.close();

	}

}
/*
- Statement 가 어떤 SQL 문장이든 실행하는 범용적인데 반해
  PreparedStatement 는 생성시에 준비한 그 문장만 실행가능
    대신 ? 영역을 setString, setInteger 등을 이용하여 채울 수 있음
  (순서가 1 부터 시작하는 것을 주의)
  execute 시에 매개변수 없음을 주의한다.
    이걸 쓰면 null 값을 넣을 때 ''를 붙여야 할지를 결정할 필요 X
*/

 

# 가변파라미터 ...args 의 매개변수

package main;



public class Test112 {
	
	// 매개변수로 String 을 0.. * 개를 넣어도 에러가 안나는 선언 방식
	// 실은 String... 은 String[] 과 동일하다.
	
	public static void test( String...args) {
		System.out.println(args.length);
		
	}
	
	public static void test2(Object...args) {
		for(int i=0; i<args.length; i++) {
			if(args[i] == null) {
				System.out.println("null");
			}
			else if(args[i] instanceof Integer) {
				int r = ((Integer)args[i]).intValue();
				System.out.println(r + 1);
			}
			else if(args[i] instanceof Double) {
				Double r = ((Double)args[i]).doubleValue();
				System.out.println(r + 0.1);
			}
			else if(args[i] instanceof String) {
				System.out.println((String)args[i]);
			}
			
		}
	}
	// Object arg_1 = 100; → 100 을 new Integer(100) 로 자동변환
	// Object arg_3 = 3.14; → 3.14 를 new Double(3.14) 로 자동변환
	// Object arg_4 = null; 가능
	public static void main(String[] args) throws Exception{
		Integer i = 100;
		int j = i;
		System.out.println(j);
		
		test("apple");
		test();
		test("apple", "banana");
		
		// Object를 매개변수로 하기 때문에, 100을 타입변환해줘야 들어갈 수 있음.
		// .intValue() 필요
		test2(100, "Hello");
		
		
	}

}
/*
- autoBoxing / unboxing
  Object i = 100; (o)
  int j = i; (x)
  
  Integer i = 100; (o)
  int j = i; (o)
  
  
*/

# sql Frame

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Test113 {
	
	
	public static int update( String sql, Object...args) throws Exception {
		int rc = 0;
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		
		
		PreparedStatement stmt = conn.prepareStatement(sql);
		
		// 여러개의 칼럼에 넣기 위해서 i+1로 해야, 칼럼순서를 반영할 수 있다.
		for(int i=0; i<args.length; i++) {
			if(args[i] == null) {
				stmt.setObject(i+1, null);
			}
			else if(args[i] instanceof Integer) {
				int r = ((Integer)args[i]).intValue();
				stmt.setInt(i+1, r);
			}
			else if(args[i] instanceof Double) {
				Double r = ((Double)args[i]).doubleValue();
				stmt.setDouble(i+1, r);
			}
			else if(args[i] instanceof String) {
				stmt.setString(i+1, (String)args[i]);
			}
		
			rc = stmt.executeUpdate();
		}
		
		
		stmt.close();
		conn.close();
		
		return rc;
		
	}
	public static void main(String[] args) throws Exception{
		String sql = "insert into temp20t values(?)";
		update(sql,"KIM", 1, 2, 3);
		
		
	}

}

# Annonymous class

package main;

interface ITemp{
	public void print();
}


public class Test114 {	
	public static void main(String[] args) throws Exception{
		final int i = 100;
		
		
		ITemp t = new ITemp() {
			public void print(){
				System.out.println("HelloWorld" + i);
			}
		};
		
		t.print();
		
		
		
	}

}
/*
- 인터페이스의 메소드를 재정의하면, 인스턴스를 생성할 수 있다.
- Annoymous class : 이름이 없는 클래스, 조상은 있다 : ITmp
  ITemp 를 상속받고 - 그러면 모든 메소드 오버라이딩 해 줄 수 있다.
- 이름이 없어서 재사용은 불가능하다.
    클래스 선언하고, 인스턴스는 생성하고 끝이 난다.
- t가 왜 가리킬 수 있는거지?
    조상의 참조형 변수는 자손의 인스턴스를 가리킬 수 있는데, 이때 자손의 인스턴스는
  Annoymous class로 재정의 한 인스턴스라서, 가리킬 수 있다.
    이때 호출되는 메소드는 자손의 오버라이딩 된 메소드가 호출된다.
    
  final 로 선언된 로컬변수는 Annoymous class에서 사용 가능하다.
    원래 로컬변수는 
 */

# Cookie

package study3;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class StateServlet extends HttpServlet{

	@Override
	public void service(HttpServletRequest request, 
			HttpServletResponse respond) 
					throws ServletException, IOException {
		String use = request.getParameter("use");
		
		if("addCookie".equals( use )) {
			Cookie ck = new Cookie("name", "apple");
			respond.addCookie(ck);
		}
		else if("readCookie".equals(use)) {
			Cookie[] cks = request.getCookies();
			if( cks != null) {
				for(int i=0; i<cks.length; i++) {
					String l = cks[i].getName() + "," + cks[i].getValue();
					System.out.println(l);
				}
			}
		} else {
			System.out.println("Cookie is null");
		}
	}
	
}
/*
- http://localhost:8081/study3/state?use=addCookie
- 요청 → 응답, 요청의 방법이 두가지 GET/POST 있다. GET은 엽서, POST는 택배
- 엽서의 주소와 내용을 구분하는 선의 역할 : ? 이다.
- ? 오른쪽의 내용은 key=value 형태로 구성되고
  request.getParameter 를 이용하여 추출할 수 있다.
- 거의 대부분 GET 방식이고, Form 에서 method="POST" 로 지정된 경우만 POST 방식
- Cookie 의 주요 기능 : 장바구니, 로그인 정보
*/

# Session

package study3;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionServlet extends HttpServlet{

	@Override
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		// 처음만 true, 그 이후에는 false
		System.out.println(session.isNew());
		
		session.setAttribute("apple", "Object!!!");
		Object value = session.getAttribute("apple");
		System.out.println(value.toString());
	}

}
/*
- Session 은 서버 쪽에 생성되는 기억공간
- 절대로 변치 않는 값 생성
- 최초 getSession() 호출시에는 고유넘버가 없이 요청이 들어온다.
- 기억장소 생성, Map<String,Object> 형태
- 고유 넘버 생성
- Session 키 값으로 고유 넘버를 쿠키에 저장
- 그 이후에 getSession() 호출 : 고유넘버 물고 왔으니 그걸로 기억장소를 찾음
- 즉, 브라우저마다 개별적인 기억장소가 생성된다.

- 쿠키와 세션은 많이 비슷하다 : 브라우저마다 개별적인 기억공간
  1. 쿠키는 브라우저에, 세션은 서버에
  2. 쿠키는 파일, 세션은 MAP<String,Object> 을 이용
  3. 쿠키는 조작이 가능할 수도 있지만 세션은 어렵다.
  
    초반엔 세션, 요즘엔 쿠키를 많이 쓰는 경향이 있다.
    세션에 많은 값들을 저장하게 되면 WAS에 부담이 걸릴 확률이 높다.
    때문에 스위치에서 여러 대의 WAS를 두어 데이터를 분산 처리하는데,  
    클라이언트 쪽에서 정보를 요청할 때 Key값이 서버 측에 있으면 Value를 찾을 수 없음
    쿠키로 각 클라이언트 쪽에 Key값을 저장하고, 활용하여 Data를 가져온다.
    
    
*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


# JSPServlet

package study3;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class JSPServlet extends HttpServlet{
	
	private ServletContext application = null;
	private ServletConfig config = null;

	/*
	- init 은 적재되는 시점에 호출된다.
	- 처음으로 호출된다.
	- int i = 0;
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		this.config = config;
		application = config.getServletContext();
	}
	// - <%!-- %> 은 여기에 온다. 멤버
	
	@Override
	protected void service(HttpServletRequest request, 
			HttpServletResponse response) 
					throws ServletException, IOException {
		HttpSession session = request.getSession();
		PrintWriter out = response.getWriter();
		
		// <% ... %> 은 여기에 온다. 로컬
		// <%= .. %> 은 out.println(...); 으로 감싸준다.
		// int j = 0;
		// out.println(i++);
		// out.println(j++);
		
		// Test115.jsp 파일은 이것과 유사한 형태로 변환되고, 
		// 컴파일되고, 인스턴스 만들어지고, 적재된 뒤에 실행된다.
		
		out.flush();
		out.close();
		
	}
}

'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글

SW 심화과정 21일차  (0) 2019.08.05
SW 심화과정 18일차  (0) 2019.08.02
SW 심화과정 16일차  (0) 2019.07.30
SW 심화교육 15일차  (0) 2019.07.29
SW 심화교육 12일차  (0) 2019.07.26
Comments