JDBC

자바로 OracleDB에 접속하기 위한 라이브러리
jdbc driver를 jdk와 OracleDB의 버전에 맞게 오라클 홈페이지에서 다운 받아 프로젝트의 build path에 등록


SELECT 등 DB를 조회하여 값을 가져올 때)
String url = "jdbc:oracle:thin:@아이피:1521/사용할디비이름";
String sql = "쿼리문";

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "디비아이디", "디비암호");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);

// rs.next();
// column 한줄 씩 읽기
whie(rs.next()) {
int id = rs.getInt("ID");
System.out.println(id);
}

rs.close();
st.close();
con.close();


INSERT, UPDATE, DELETE 등 DB를 조작할 때)
String title = "TEST";
String writerId = "abcd";
String content = "wow";
String files = "";

String url = "jdbc:oracle:thin:@아이피:1521/사용할디비이름";
String sql = "INSERT INTO notice ("
+ "    title,"
+ "    writer_id,"
+ "    content,"
+ "    files"
+ ") VALUES (?,?,?,?)";

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "디비아이디", "디비암호");
PreparedStatement st = con.prepareStatement(sql);
// 쿼리문의 ?에 index는 1부터 시작.
st.setString(1, title);
st.setString(2, writerId);
st.setString(3, content);
st.setString(4, files);
int result = st.executeUpdate();
// executeUpdate 메서드는 DML 실행된 Rows 정수 결과값을 반환한다.

System.out.println(result);

st.close();
con.close();

st.set타입(인덱스, 넣을값변수) 시 넣을값은 홑따옴표에 감싸인 값 형태로 들어간다.
명령문 형식으로 들어가길 바란다면 쿼리문을 "SELECT * FROM 테이블 WHERE " + 넣을값변수 + " LIKE~" 등으로 넣어준다

'Development > Java' 카테고리의 다른 글

Servlet #1  (0) 2022.08.11
Tomcat  (0) 2022.08.11
Java Thread & Sync  (0) 2022.08.04
JAVA Collection & Generic  (0) 2022.08.04
이클립스에서 GitHub contribution 안되는 문제  (0) 2022.08.02

자바 스레드와 비동기처리

 

 

main도 GC도 Thread로 동작
(가비지컬렉터는 우선 순위가 낮고 동적 할당된 메모리를 수거하는 보조적인 업무를 하는 데몬스레드)

 

프로세스 context 스위칭 fork() 

(하나의 프로세스가 자식 프로세스를 만들어 다른 프로그램의 cpu 리소스를 빼먹어 성능저하와 형평성문제 발생

=> 스레드 context 스위칭 

(프로세스에 cpu가 리소스를 할당하고 그 후 해당 프로세스에서 thread에 할당 받은 리소스를 나누어 주어 형평성 문제를 해결)
(데이터와 힙 메모리 영역을 프로세스와 자식 스레드들이 공유하고 스레드는 스택과 포인터 영역만을 지역스코프처럼 사용하기 때문에 동일 프로세스 내 스레드끼리 데이터 공유가 쉽다. 프로세스 context 스위칭의 경우 다른 프로그램이므로 데이터 공유가 어려웠다) 

 

동기형 - 순차적 진행
비동기형 - 동시진행(할당된 리소스(시간분배 등)을 중간중간 빠른 속도로 전환하며 진행)

 

 

Thread 객체에 필요한 Runnable 인터페이스 객체


Thread th1 = new Thread(Runnable);


인터페이스는 익명함수로 객체 구현이 가능하다

(일회성의 구현 객체를 위해 소스 파일을 만들고 클래스를 선언하는것은 비효율적)
인터페이스이므로 인터페이스 명세에서 요구하는 메소드는 구현해줘야 한다. run()
Thread th1 = new Thread(new Runnable() {
    public void run() {
      func();
    }
  });
th1. start();

일회성이 아니라면 Runnable을 빼서 따로 오버라이드 해준다

 


스레드 시작 객체&메서드
Thread, Runnable, Runnable.run(), Thread.start()

 


자주 쓰는 스레드의 속성&메서드
Thread.sleep() // 밀리초(long millis) 입력.
Thread th = Thread.currentThread(); // 사용 중인 현재 쓰레드
th.getId()  // 식별자 가져오기
th.getName() // 이름 가져오기
th.setName() // 이름 지정
th.getPriority() // 0~10 우선순위. 숫자가 클수록 우선순위 높음. 기본 5.
th.setPriority() // 우선순위 설정. 
th.setDaemon(boolean) // 유령스레드 설정 토글. 데몬스레드(업무가 없다, 다른 스레드를 도우는 스레드, 다른 스레드가 종료되면 함께 종료됨 ex_가비지컬렉터)
th.getState() // 현재 상태 확인. Timed waiting | runnable | terminated 등등... 대문자 String으로 반환하므로 조건문에 사용
생성 되었을 때 NEW, 스레드 실행 중 RUNNABLE, sleep 등으로 인한 대기중 TIMED_WATING, 작업 종료 TERMINATED
th.join(); // 우선적으로 작업이 끝나도 해당 스레드의 작업 종료를 기다림. milliSceond 를 인자로 줘 기다리는 시간을 지정할 수 있다
th.isAlive() // 해당 스레드가 작업중인지 boolean 값으로 리턴
th.interrupt() // 해당 스레드에 종료 요청을 보냄. 예외처리 InterruptedException에 걸리지만 종료는 되지 않는다.
th.isInterrupted() // 중지 요청을 받았는지 boolean 값으로 리턴

스레드 그룹 객체
ThreadGroup thGroup = new ThreadGroup("GroupName"), 첫번째 인자로 그룹네임이 아닌 다른 그룹을 줄 경우 계층 형성
// 스레드 생성 시 그룹 설정 가능 new Thread(thGroup, Runnable)

그룹 메서드
thGroup.list(); // 스레드name, priority, groupname 출력
thGroup.activeCount();
thGroup.activeGroupCount();  // 활성화 중인 스레드, 하위 그룹 갯수확인


Critical Section (임계영역) & Monitor Lock
(스레드는 부모 프로세스의 데이터, 힙 영역을 공유하기에 전역변수와 같은 데이터 영역에 올라가는 것을 동시에 끌어다 쓰면 문제가 발생한다. 이를 방지하기 위해 임계영역을 정해 해당부분은 Object나 this와 같은 어떠한 객체가 없으면 기다렸다가 들어가야 하거나, 되돌리는 등으로 구현해줄 수 있다) 

 


임계영역에 락을 거는 방법


synchronized(잠금객체)

{임계영역 코드}

public synchronized void function()

{임계영역 코드}

메소드 단위 동기화(성능에 큰 영향이 있으므로 권장되지 않음)

ReentrantLock indexLock = new ReentrantLock(); 

// 잠금객체 부분에 Object, this 대신 사용하거나 아래와 같이 사용한다
indexLock.lock();
임계영역 코드
indexLock.unlock();

또는
indexLock.tryLock(); // boolean 반환
// 조건문을 활용해 먼저 진입해 잠겨진 임계영역에 다른 스레드가 도달할 시 대기하지 않고 진행하게 할 수 있다

 


임계영역이 여러 곳일 때


ReentrantReadWriteLock listLock  = new ReentrantReadWriteLock (); 
listLock.writeLock().lock();
임계영역 코드
listLock.writeLock().unlock();
listLock.readLock().lock();
임계영역 코드
listLock.readLock().unlock();


writeLock은 하나의 스레드만 소유 가능하고 readLock은 동시에 여러 스레드가 소유 가능하다
writeLock이 잠기면 readLock을 소유한 스레드도 임계영역에 들어갈 수 없다
writeLock이 풀리면 readLock은 서로를 동기화 시키지 않고(대기하지 않고) 한꺼번에 진행된다

'Development > Java' 카테고리의 다른 글

Servlet #1  (0) 2022.08.11
Tomcat  (0) 2022.08.11
JDBC  (0) 2022.08.07
JAVA Collection & Generic  (0) 2022.08.04
이클립스에서 GitHub contribution 안되는 문제  (0) 2022.08.02

제너릭
데이터 저장을 위해 배열을 사용할 때마다 저장할 데이터 타입에 따라 다른 클래스를 만들어줘야 하는 문제를 최상위 부모 클래스인 Object를 사용함으로써 해결하려함.  (Object[] 참조변수 = new 자식클래스[])
그러다 오브젝트를 통해 기본 데이터타입을 배열에 넣을때 생기는 불편함이 발생.
(기본 형식(int,float 등)은 참조할 수 없기에 꺼내거나 넣을때마다 참조변수로 일일히 타입캐스팅 해야함 )
이를 개선하기 위해 만들어진 wrapper 클래스와 auto boxing/unboxing 기능(int를 알아서 integer 등의 참조변수 형식으로 형변환,풀어주는 기능)과 그래도 남아있는 불편함을 해소하기 위한 제너릭의 탄생.
(서비스 함수에서 참조타입을 받아오고 리턴해주는 부분에서 제너릭을 활용함으로써 하나의 데이터타입 또는 객체로
다양한 타입의 데이터를 저장 가능)
작성해야할 오버라이딩 된 상속클래스는 줄이고 재사용(jar) 가능하게 함으로써 소스를 줄일 수 있다

public class GList<T> {}

public T get(int index) {
  if (current <= index)
    throw new IndexOutOfBoundsException();
  return (T) nums[index];

 


컬렉션
Collection -> List, Set, Queue 과 다른 인터페이스를 쓰는 Map 이 존재함. 전부 인터페이스로 만들어져있으며
구현체는 각기 다른 내부 데이터구조 함수에 따라 사용할 수 있다.
검색 위주, 입력 위주에 따라 데이터구조를 바꿔주는게 성능에 좋기 때문에
개발 초기에는 ArrayList 등 간단한 배열데이터 구조를 사용해 개발 후 나중에 최적화된 구조로 바꿔준다.
링크드리스트는 입력 삭제가 많을 경우 좋지만, 검색은 각 객체 내부에 만들어진 포인터 변수인 넥스트|비포노드를 참조에 참조를 하는 형식으로 찾기에 데이터 검색이 느리다. 
도서 데이터처럼 검색이 많을 것으로 예상되는 데이터는 트리구조가 적합하나, 데이터 삽입은 느리다.

인스턴스화 객체로 자주 사용되는 녀석
List -> ArrayList 데이터 중복 가능, 식별자 존재 
Set -> HashSet 데이터 중복 불가, 중복이 불가능하기에 식별자가 값과 같음
Map -> HashMap 식별자가 데이터로써 존재. (key:key, data:data)

Map<String, Object> map = new HashMap<>();
map.put("title", abcd);

'Development > Java' 카테고리의 다른 글

Servlet #1  (0) 2022.08.11
Tomcat  (0) 2022.08.11
JDBC  (0) 2022.08.07
Java Thread & Sync  (0) 2022.08.04
이클립스에서 GitHub contribution 안되는 문제  (0) 2022.08.02

깃헙에서 토큰을 받아 자체 제공하는 깃헙 인터페이스로 푸시를 하는데

 

contribution에 잔디가 심어지지 않는다.

 

확인해보니 깃헙에서 사용하는 이메일과 동기화 해야한단다.

 

이클립스 -> window -> preferences -> type filter text...   git 입력

아무것도 없으면 Add Entry... 클릭 후 Key에 user.email 입력 Value에 깃허브 이메일 주소 입력.

한번 더 해서 user.name, 이메일 앞부분 입력. 위 같으면 kimamugae 입력한다.

 

 

깃헙 이메일 주소가 없을 경우 깃헙 우측상단 본인 아이디 아이콘 클릭후 settings -> emails 에서 추가해주면 된다.

'Development > Java' 카테고리의 다른 글

Servlet #1  (0) 2022.08.11
Tomcat  (0) 2022.08.11
JDBC  (0) 2022.08.07
Java Thread & Sync  (0) 2022.08.04
JAVA Collection & Generic  (0) 2022.08.04

+ Recent posts