DELETE FROM AA FROM AA aa INNER JOIN BB bb ON aa.key = bb.key WHERE ~

 

mssql에서 delete와 inner join 을 같이 쓸 때 특이점은 from이 두 번 나온다는 것이다.

dataGridView1.CellValueChanged += dataGridView1_CellValueChanged;


void dataGridView1_CellValueChanged(object sender, EventArgs e)
            {
                int rowIndex = dataGridView1.CurrentCell.ColumnIndex;
                if (dataGridView1.Columns[rowIndex].HeaderText == "Column2")
                {
                    MessageBox.Show("success");
                }
            }

Column에서 Enter키나 Tab 키를 눌렀을 때 Column의 Header Text를 비교 한 뒤 해당 하는 Cell이면

메시지 박스에 success 출력

 

DataGridView 셀의 값에 변경 내용을 검색 하려면

 CellValueChanged 이벤트

 

DataGridView 셀의 상태 변경을 감지 하려면

 CellStateChanged 이벤트

 

1.DataSet 
 - Db (mssql, mysql, oracle...) 에 있는  Database  역활을 합니다 (개체형태의 database)
 - 따라서.. DataTable을 여러개 가질수 있습니다
 - ex) https://msdn.microsoft.com/ko-kr/library/aeskbwf7(v=vs.110).aspx

2.DataTable 
 - DB의 Table 역활을 합니다. (개체형태의 table)
 - 실제 db-table처럼 컬럼과 대응하는 값이 있습니다
 - https://msdn.microsoft.com/ko-kr/library/system.data.datatable(v=vs.110).aspx

3.DataGridView
 - 데이터 바인딩이 가능한 컨트롤입니다
 - DataTable과 바인딩을 맺을수 있습니다
 - ex) http://www.csharpstudy.com/WinForms/WinForms-datagridview.aspx


참고로, DataRow, DataColumn, SqlConnection., SqlDataAdapter 클래스도 존재합니다. 역할은 이름에서 유추할수 있습니다.

- SqlConnection : 설정된 연결문자를 이용해서 db-open/close를 담당합니다
- SqlDataAdapter : 말그대로 어뎁터입니다. 이기종간 (여기선 DataSet - DB) 데이터 중계 역활을 합니다
- DataSet : 어뎁터를 통해서 값을 받거나 수정된 값을 가집니다
- DataTable : 여러개의 테이블중 1개의 테이블에 대응됩니다. (join  테이블도 포함). 
- DataRow : table의  1개 row값을 가집니다
- DataColumn : table의 1개 column값을 가집니다.


'DB' 카테고리의 다른 글

DB 정규화  (0) 2019.01.09
statement와 preparedStatement의 차이  (0) 2019.01.05
프로시저란?  (0) 2018.12.26
left, right, inner, outer, natural join  (0) 2018.11.20
DB 성능 순서  (0) 2018.09.20

java.lang.NoClassDefFoundError: org/apache/jsp 에러에 대해서 알아보자


결론부터 말하자면 jsp파일을 컴파일 하고 저장된 java파일과 class파일의 이름이 jsp파일의 이름을 바꿨는데도 시스템에서 수정되지 않아 생기는 오류이다.

에러를 자세히 보면 jsp 폴더 안에 있는 board/boardWrite_jsp 파일이 wrong name: org/apache/jsp/board/BoardWrite_jsp 

즉,  잘못된 이름의 파일이 저장되어 있다는 뜻으로 해석 가능하다. 이를 해결하기 위해 



서버를 더블 클릭 한뒤



그림과 같이 Open launch configuration을 클릭.



Arguments를 클릭 한 뒤 Dctalina. base나 Dctalina.home 의 파일 경로를 복사 한뒤 파일을 열어 붙여 넣기 한다.

그러고 난뒤 work->Catalina -> localhost -> 자신이 하고 있는 프로젝트명의 파일 -> org -> apache -> jsp  순으로 파일을 이동한다.

C:\Users\kim\Downloads\apache-tomcat-9.0.10\apache-tomcat-9.0.10\work\Catalina\localhost\start_project\org\apache\jsp

    빨간색 글자로 표시한 부분이 각자의 파일을 차이점이 될 것이다. 
이제 jsp 파일안에 들어있는 java파일과 class파일들을 삭제한뒤 다시 컴파일을 실행시키면 오류가 해결 될 것이다.


java.lang.NullPointerException 에러는 무엇인가?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.Scanner;
 
public class Main {
   static Integer[][] arr = new Integer[3072][6143];
    
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int num = sc.nextInt();
       star(num-1,0,num);
       for(int i=0; i<num; i++) {
           for(int j=0; j<2*num-1; j++) {
               if(arr[i][j]==1) {
                   System.out.print("*");
               }else {
                   System.out.print(" ");
               }
           }
           System.out.println();
       }
   }
   static void star(int x, int y, int size) {
       if(size==3) {
           arr[y][x] = 1;
           arr[y+1][x-1= 1;
           arr[y+1][x+1= 1;
           
           arr[y+2][x+2= 1;
           arr[y+2][x+1= 1;
           arr[y+2][x] =1;
           arr[y+2][x-1=1;
           arr[y+2][x-2=1;
       }else {
           size /= 2;
           star(x,y,size);
           star(x-size,y+size,size);
           star(x+size,y+size,size);
       }
   }
}
 
cs


이와 같이 12번 째 줄에 NullPointerException 예외가 발생된다.

이를 해결하고자 구글에 NullPointerException 에러를 검색해봤다. 


---------------------------------------------------------------------------------------------------------------------------------------------------------------


레퍼런스 변수를 선언하면 객체의 포인터가 생성됩니다. 즉, 레퍼런스 변수는 객체의 주소 (참조값)을 저장합니다. 프리티미트 타입 (기본 타입)인 int 타입의 변수를 다음과 같이 선언한다고 가정해보면:

int x; x = 10;

이 예제의 첫번째 명령문에서 변수 x는 int 타입으로 선언되어, 자바는 이 변수의 값을 0으로 초기화합니다 (단, 변수 x가 클래스의 필드로 정의되었을 때). 그리고 두 번째 명령문과 같이 해당 변수 x에 10이라는 값을 대입 연산자를 사용하여 할당하면, 변수 이름 x가 가리키는 메모리 위치에 10이라는 값이 쓰여집니다.

그러나 레퍼런스 타입의 변수를 선언할 때는 다르게 처리됩니다. 다음의 코드를 살펴보면:

Integer num;

num = new Integer(10);

첫번째 명령문에서 num이라는 이름으로 선언된 변수는 프리미티브 값을 저장하지 않습니다. 대신, Integer라는 이름의 타입은 래퍼클래스로서, 레퍼런스타입이므로 해당 변수는 주소 (참조값)을 저장합니다. 첫번째 명령문은 아직 어떤 것을 참조하라고 정의하지 않았기 때문에 자바는 그 변수를 null로 초기화합니다 (단, 변수 num이 클래스의 필드로 정의되었을 때). 이것은 "나는 아무것도 참조하지 않아"라는 의미입니다.

두 번째 명령문은 new라는 키워드를 사용해서 Integer 클래스 객체를 생성하고 해당 객체의 주소 (참조값을) num이라는 변수에 저장합니다. 이렇게 객체를 생성하고 객체의 참조값을 저장한 변수를 사용해서 해당 객체에 접근할 수 있습니다. 이 때, . 연산자를 사용합니다.

만약 레퍼런스 타입의 변수를 선언하고 객체를 생성하지 않으면 (즉, 객체의 참조값을 해당 변수에 저장하지 않으면) Exception이 발생됩니다. 즉, 객체가 생성되기 전에 num 변수를 사용해서 해당 클래스의 객체를 접근하고자 하면 NullPointerException이 발생됩니다. 이러한 경우 대부분 컴파일러가 해당 문제를 인식해서 경로 메시지로 알려줄 것입니다. "num 변수가 아직 초기화되지 않았어"라고요.

아래와 같은 메소드에 대해서,

public void doSomething(Integer num) { // do something to num }

다음과 같이 호출한다면,

doSomething(null);

num 변수의 값은 null이 됩니다. 이러한 null 값을 가지는 num 변수를 사용해서 객체의 필드 혹은 메소드에 접근하고자 한다면 NullPointerException이 발생하게 되는 것입니다. 이와 같은 exception이 발생되지 않게 하는 최선의 방법은 다음과 같이 레퍼런스 변수를 사용하기 전에 null 값을 저장하고 있는지를 체크하는 것입니다.

public void doSomething(Integer num) { if(num != null) { // do something to num } }

-------------------------------------------------------------------------------------------------------

12번째줄의

if(arr[i][j]==1)를 if(arr[i][j]!=null) 로 고치니 문제가 해결됬다.


'프로그래밍 > JAVA' 카테고리의 다른 글

싱글턴 패턴 사용하는 이유  (0) 2019.01.06
abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

 셀프 넘버




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.Collections;
 
public class Main {
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<=10000; i++) {
            list.add(self_num(i));
            
        }
        Collections.sort(list);
        for(int i=0; i<=10000; i++) {
            if(!(list.contains(i))) {
                System.out.println(i);
            }
        }
    }
    static int self_num(int num) {
        int sum=0;
        String st_num = String.valueOf(num);
        sum+=num;
        for(int i=0; i<st_num.length(); i++) {
            sum+=Integer.parseInt(String.valueOf(st_num.charAt(i)));
        }
        return sum;
    }
}
 
 
cs


'백준 알고리즘 > JAVA' 카테고리의 다른 글

자바 백준 1764번 듣보잡  (1) 2018.09.02
자바 백준 5585번 거스름돈  (0) 2018.09.02
자바 백준 7568번 덩치  (1) 2018.08.25
자바 백준 1065번 한수  (0) 2018.08.23
자바 백준 2231번 분해합  (0) 2018.08.23

Initializing Java Tooling' has encountered a problem

오류에 대해서 알아보자.

이와 같은 에러는 프로젝트 파일을 외부에서 가져와서 import 후 사용할 경우 종종 발생한다.

해결방법은 \프로젝트폴더(workspace)경로\.metadata\.plugins\org.eclipse.core.resources\.projects의 하위폴더를 모두 삭제한 뒤 

이클립스를 재부팅하면 된다. (이때 Problems occurred while trying to save the state of the workbench라는 오류가 뜨면 OK!를 누르면 된다)


재부팅하면 아까 지웠던 .projects 폴더 내 하위폴더가 자동으로 재생성 되는데 이때 systemTemp 파일을 생성하지 못하는 경우에는 Could not write metadata for '/RemoteSystemsTempFiles' 라는 오류메시지가 또 뜨면 마지막 project 폴더에 RemoteSystemsTempFiles 이름으로 폴더를 하나 생성해주면 해결된다.


참고 : https://hunit.tistory.com/193

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 의 경로에 있는 파일에


ojdbc5.jar 는 Oracle 8i, 9i,& 10g  ojdbc6.jar 는 Oracle 11g이상의 버전을 의미한다.

 

JSP에서 JDBC 커넥션 풀을 설정 할 때 잘 알고 사용해야겠다.


다음은 JDBC 커넥션 풀을 설정하는 방법이다.


먼저 server.xml에서 Resource 태그를 추가한다.


driverClassName, url, username, passowrd 등은 우리가 디비 연결시 필수적으로 필요했던 항목이고

maxActive는 미리 생성해놀 커넥션의 수이다.

maxWiat의 경우 미리 생성한 커넥션 이상의 요청이 들어왔을 때 추가로 커넥션을 생성할 때 최대 기다릴 수 

있는 시간을 설정하는 것이다. 즉 timeout 을 설정

type은 커넥션을 관리하는 DataSource이다.


MemberDAO 클래스는 싱글턴 패턴(Singleton Pattern 디자인 패턴의 일종) 으로 클래스를 설계한다.


MemberDAO 클래스의 getConnection() 메소드로 커넥션 객체를 얻어내는지 확인하기 위한 테스트 JSP 파일을 만들어서 확인한다.






starting tomcat v9.0 server at localhost has encountered a problem


서버를 작동하는데 필요한 시간이 초과되어서 뜨는 오류이다.



Servers -> Tomcat v9.0 Server at localhost 를 더블 클릭해준다.



탭중에 Timeouts 를 선택하여 시간을 늘리면 된다. 20~30초 사이로 시간을 늘려보자.



데이터베이스 정규화 1NF, 2NF, 3NF, BCNF



 데이터베이스 정규화란 데이터베이스의 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발생할 수 있는 각종 이상현상(Anamolies)들을 방지할 수 있습니다. 



데이터베이스 정규화의 목적은 주로 두 가지입니다.


1. 불필요한 데이터(data redundancy)를 제거한다.

2. 데이터 저장을 "논리적으로" 한다. 


여기서 2번 데이터 저장을 논리적으로 한다는 것은 데이터 테이블의 구성이 논리적이고 직관적이어야한다는 것입니다. 


우선 정규화를 안 했을 때의 문제점에 대해서 알아보겠습니다.




위와 같이 정규화가 되지 않은 구조의 테이블(Adam이라는 학생이 두 번 들어가 있습니다.)의 경우, 데이터 핸들링시 다양한 이상현상이 발생하게 됩니다.


1. Update : Adam의 Address가 변경되었을 때, 여러줄의 데이터를 갱신해야합니다. 이로인해 데이터의 불일치(inconsistency)가 발생할 수 있습니다.


2. Insert : 만약 학생이 아무 과목도 수강하지 않는다고 하면, Subject_opted 컬럼에는 NULL이 들어갈 것입니다. 


3. Deletion : 만약 Alex 학생이 과목 수강을 취소한다면 Alex의 레코드가 아예 테이블에서 지워져버립니다.


위와 같이 정규화가 제대로 되지 않은 테이블의 경우 갱신/삽입/삭제 시 다양한 문제점이 발생할 수 있습니다. 이를 테이블의 구성을 논리적으로 변경하여 해결하고자 하는 것이 바로 정규화입니다.


정규화의 법칙(Normalization Rule)은 1차정규화, 2차정규화, 3차정규화, BCNF, 4차정규화, 5차정규화로 나눌 수 있는데, 실무적으로 4차, 5차 정규화까지 하는 경우는 많지 않다고 합니다. 따라서 이 포스팅에서도 BCNF까지만 알아보겠습니다.



1. 1차 정규화


1차 정규형은 각 로우마다 컬럼의 값이 1개씩만 있어야 합니다. 이를 컬럼이 원자값(Atomic Value)를 갖는다고 합니다. 예를 들어, 아래와 같은 경우 Adam의 Subject가 Biology와 Maths 두 개 이기 때문에 1차 정규형을 만족하지 못합니다.



위의 정보를 표현하고 싶은 경우 이렇게 한 개의 로우를 더 만들게 됩니다. 결과적으로 1차 정규화를 함으로써 데이터 redundancy는 더 증가하였습니다. 데이터의 논리적 구성을 위해 이 부분을 희생하는 것으로 볼 수 있습니다.



2. 2차 정규화


2차 정규화부터가 본격적인 정규화의 시작이라고 볼 수 있습니다. 2차 정규형은 테이블의 모든 컬럼이 완전 함수적 종속을 만족하는 것입니다. 이게 무슨 말이냐면 기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것입니다. 위 테이블의 경우 기본키는 (Student, Subject) 두 개로 볼 수 있습니다. 이 두 개가 합쳐져야 한 로우를 구분할 수가 있습니다. 근데 Age의 경우 이 기본키중에 Student에만 종속되어 있습니다. 즉, Student 컬럼의 값을 알면 Age의 값을 알 수 있습니다. 따라서 Age가 두 번 들어가는 것은 불필요한 것으로 볼 수 있습니다.


Student Table



Subject Table


이를 해결하기 위한 방법은 위처럼 테이블을 쪼개는 것입니다. 그러면 두 테이블 모두 2차 정규형을 만족하게 됩니다. 위 테이블의 경우 삽입/갱신/삭제 이상을 겪지 않게됩니다. 하지만 조금 더 복잡한 테이블의 경우, 갱신 이상을 겪기도하는데 이를 해결하는 것이 바로 3차 정규화입니다.


3. 3차 정규화



이와 같은 데이터 구성을 생각해봅시다. Student_id가 기본키이고, 기본키가 하나이므로 2차 정규형은 만족하는 것으로 볼 수 있습니다. 하지만 이 데이터의 Zip컬럼을 알면 Street, City, State를 결정할 수 있습니다. 또한 여러명의 학생들이 같은 Zip코드를 갖는 경우에 Zip코드만 알면 Street, City, State가 결정되기 때문이 이 컬럼들에는 중복된 데이터가 생길 가능성이 있습니다. 정리하면 3차 정규형은 기본키를 제외한 속성들 간의 이행적 함수 종속이 없는 것 입니다. 풀어서 말하자면, 기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정할 수 없는 것입니다. 


3차 정규화는 2차정규화와 마찬가지로 테이블을 분리함으로써 해결할 수 있는데, 이렇게 두 개의 테이블로 나눔으로써 3차 정규형을 만족할 수 있습니다. 이를 통해 데이터가 논리적인 단위(학생, 주소)로 분리될 수 있고, 데이터의 redundancy도 줄었음을 알 수 있습니다.




4. BCNF


BCNF는 (Boyce and Codd Normal Form) 3차 정규형을 조금 더 강화한 버전으로 볼 수 있습니다. 이는 3차 정규형으로 해결할 수 없는 이상현상을 해결할 수 있습니다. BCNF란 3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형입니다. 아래와 같은 경우를 생각해보면, 후보키는 수퍼키중에서 최소성을 만족하는 건데, 이 경우 (학생, 과목) 입니다. (학생, 과목)은 그 로우를 유일하게 구분할 수 있습니다. 근데 이 테이블의 경우 교수가 결정자 입니다. (교수가 한 과목만 강의할 수 있다고 가정) 즉, 교수가 정해지면 과목이 결정됩니다. 근데 교수는 후보키가 아닙니다. 따라서 이 경우에 BCNF를 만족하지 못한다고 합니다. 3차 정규형을 만족하면서 BCNF는 만족하지 않는 경우는 언제일까요? 바로 일반 컬럼이 후보키를 결정하는 경우입니다. 


학생

과목 

교수 

학점 

 1

AB123

 김인영

 A

 2

 CS123

 Mr.Sim

 A

 3

 CS123

 Mr.Sim 

 A


 위와 같이 테이블이 구성된 경우에 데이터가 중복되고, 갱신 이상이 발생합니다. 예를 들어 Mr.Sim이 강의하는 과목명이 바뀌었다면 두 개의 로우를 갱신해야합니다. 이를 해결하기 위해서는 마찬가지로 테이블을 분리합니다.


교수 테이블


교수

과목

 김인영

AB123 

 Mr.Sim

CS123 


수강 테이블


학생

과목 

학점 

 1

 AB123 

 A

 2

 CS123 

 A

 3

 CS123 

 A



출처: https://3months.tistory.com/193 [Deep Play]

'DB' 카테고리의 다른 글

DataSet DataTable DataGridView  (0) 2019.03.25
statement와 preparedStatement의 차이  (0) 2019.01.05
프로시저란?  (0) 2018.12.26
left, right, inner, outer, natural join  (0) 2018.11.20
DB 성능 순서  (0) 2018.09.20

+ Recent posts