728x90
반응형

1 HA 와 OPS 그리고 RAC


일반적으로 DB서버를 구현 할 때는 1개의 서버를 사용. 그러나 이런 방식은 Instance  역할을 하는 서버에 장애가 발생했을 때 Storage 에 저장된 데이터를 사용할 수 없게 되는 위험이 늘 존재함


이런 문제를 대비하기 위해 HA 구조가 등장


HA 구성이란 High Availability 의 약자로 고 가용성이란 뜻, 이름 그대로 서버의 사용 가능시간을 최대한 늘이는 것이 목표인 서버 구성방법. 두 대의 서버를 동일하게 구성해서 서버 1대는 Active 로 두고 서버 1대는 Standby 로 설정해서 만약 Active 상태의 서버가 장애가 발생 할 경우 Srandby 상태의 서버가 즉시 Active 상태로 바뀌여서 투입되어 서비스 중단이 발생하지 않도록 조치되는 구성


오라클에서는 Dataguard  방식이 위 설명과 같은 HA 구성 방식




그러나 이런 HA 방식이 가지는 다양한 문제가 있어서 Oracle에서는 HA 방식을 한 단계 더 발전시킨 OPS 라는 방식을 도입


OPS 라는 방식이란 평소에는 사용자들이 Instance 1과 Instance 2 를 통해서 데이터가 저장된 Storage 에 접근해서 데이터를 조회, 변경 등의 작업을 수행하는데 Instance 1에서 장애가 발생할 경우 남아 있는 Instance 2 를 통해서 Storage 에 접근 가능하기 때문에 서비스가 중단되는 경우를 예방. 서비스의 중단시간을 획기적으로 개선한 HA 을 구현하는 대표적인 방법


HA 와 OPS 의 차이점 :  HA 는 Active 상태와 Srandby 상태로 구분되어 하나의 서버만 구동되는 반면 OPS 는 모든 노드가 Active 상태로 동작하기 때문에 이론적으로 부하기 분산됨으로 속도가 빨라질 수 있음


또 HA 방식은 각 서버 별로 Storage 를 별도로 가지고 있기 때문에 데이터의 동기화문제가 발생 할 수 있지만 OPS 방식은 하나의 Storage 를 사용하기 때문에 이런 문제가 발생하지 않음


* RAC Ping 


PAC Ping 이란 Instance 1 에서 변경 완료 된 데이터를 Instance 2로 가져오기 위해서 우선 디스크에 저장을 한 후 해당 데이터를 Instance 2 로 복사해 오는 작업


이런 과정이 디스크를 사용해서 시간이 오래 걸리기 때문에 OPS 환경에서 RAC Ping 작업은 성능 저하의 주요 원인으로 지적됨


8i 까지는 OPS 9i 부터는 RAC 




RAC는 Instance 1 과 Instance 2 를 연결하는 Interconnnect 라는 특징이 생김. Interconnnect 는 디스크를 거치지 않고 메모리의 데이터를 Interconnnect 를 통해서 즉시 서로 교환하는 구조로 설정됨


그래서 Instance 1 에 있는 데이터와 Instance 2 에 있는 데이터를 서로 즉시 볼 수 있기 때문에 이 기능을 Cache Fusion ( 캐쉬 퓨전 ) 이라고 부름 


Cache Fusion 기술이 도입되면서 사용자가 어떤 물리적인 Instance 에서 작업하는가는 중요하지 않게 됨


여러 Instance 를 마치 하나의 서버처럼 만들어버리기 때문에 이것이 가능한데 이런 역할을 해 주는 것이 클러스터용 소프트웨어. 9i 버전까지는 이 클러스터용 프로그램을 오라클 사가 아닌 별도의 회사에서 만들어서 제공함






2. Cache Fusion 이란?




1) Cache Fusion 개념


RAC 에서는 어떤 Instance 에서 작업을 해도 하나의 서버에서 작업을 하는 것과 같은 효과를 내게 되는데 이런 것을 가능하게 해 주는 RAC의 대표먹인 서비스 두가지가 GES , GCS 


GES (Global Enqueue Service) 란 어떤 Instance 에서 데이터 변경작업 ( 트랜잭션 ) 을 하든 하나의 Instance 에서 데이터 변경 작업을 하는것과 같이 관리하는 기능


GCS (Global Cache Fusion) 란 Cache Fusion 기능이 구현되기 위한 필수 서비스로서 어떤 사용자가 자신의 Instance 에서 원하는 데이터를 찾지 못해서 다른 Instance 에 있는 데이터를 요청했을 때 Insterconnect 를 통해서 데이터를 전달해 주는 서비스를 말함


GCS 에서는 데이터 블록을 전송하고 관리할 때 아래의  3가지 모드로 구분함 


  - Null (N) 모드 : 해당 블록을 사용중인 사용자가 없다는 것을 뜻함


  - Share (S) 모드 : 해당 블록을  select 하고 있는 세션이 있다는 뜻함


  - Exclusive (X) 모드 : 해당 블록을 누군가가 변경하고 있다는 뜻함




3. Interconnnect ( 인터커넥트 ) 란?


앞에서 살펴본 예에서 알 수 있듯이  RAC의 핵심 기능인 Cache Fusion이라는 특징 때문에 블록들


이 이동하는 길인  Interconnect 가 RAC 전체 성능에 아주 중요한 역할을 하게 됩니다. 


Interconnect  를 통해 이동하는  정보는  크게  Clusterware  가  Cluster 를  유지하고  운영하기 위해 


사용하는 정보와 실제 데이터 블록  , Parallel Query 관련 정보들이 있습니다. 


일반적으로  Cluster 를 유지하고 운영하는 정보인  GCS/GES 관련 정보는  256 bytes 정도로 아주 


작지만  실제  데이터  블록은  DB_BLOCK_SIZE ( 10g/11g  기준으로  기본  크기는  8k )  나  Non-


Standard Block Size 의 크기로 GCS/GES 정보에 비해 아주 큽니다. 


그리고  Parallel Query 관련 정보는  Parallel_Execution_message_size 에 의해 크기가 결정되는 데 


기본크기는  8k 로 설정되어 있습니다. 


이런 내용들이 얼마나 자주 왕래하느냐가 성능에 아주 중요한 영향을 주게 되며 당연히 가급적이


면 이동하는 양을 줄이는 것이 튜닝에 아주 핵심적인 관점이 되겠죠? 


그래서  RAC 튜닝에서  Interconnect 의 사용량을 측정하여 튜닝하는 것이 아주 자주 언급이 됩니


다. 


 


즉  Interconnect 를 사용하는 량을 줄이거나 혹은  Interconnect 의 속도를 높이는 것이  RAC 튜닝


에서 아주 중요하다는 뜻입니다. 




출처: http://dbkwon.tistory.com/18 [DB STORY]

728x90
반응형
728x90
반응형

“윈도우 PC 에서 Apache + MySQL + PHP 를 사용할 수 있는 Bitnami WAMP 를 설치하고 Apache 를 설정하는 매뉴얼 입니다. “

공식사이트 : https://bitnami.com


1. 다운로드 및 설치
1) bitnami 사이트에 접속하여 WAMP 를 다운받습니다.
2) URL : https://bitnami.com/stack/wamp/installer
3) 설치 과정에서 MySQL 서버의 root 비밀번호를 입력하는 창에 사용할 비밀번호를 입력합니다.

2. MySQL Secure Installation


3. phpMyAdmin 접속
1) http://127.0.0.1/phpmyadmin 접속합니다.
2) 타 호스트에서 접속허용 설정하기 위해 C:\Bitnami\wampstack-7.0.8-1\apps\phpmyadmin\conf\httpd-app.conf 파일 20라인쯤에 아래 내용을 추가합니다.
(설치한 WAMP 의 Apache 버전이 2.4.20 으로 Require ip 문법으로 허용설정)


4. 웹애플리케이션 Alias 방식 추가

1) C:\Bitnami\wampstack-7.0.8-1\apache2\conf\httpd.conf 파일의 503 라인쯤 아래 줄을
추가합니다.

2) C:\Bitnami\wampstack-7.0.8-1\apache2\conf\extra 폴더에 httpd-alias.conf 파일을 만들고 아래와 같은 형태로 작성합니다.

3) D:\www\MSG\public_html 디렉토리를 생성하고 웹애플리케이션을 작성 후 브라우저에서 http://IP주소/MSG 로 접속합니다.

5. 웹애플리케이션 User home Directories 방식 추가
1) C:\Bitnami\wampstack-7.0.8-1\apache2\conf\httpd.conf 파일의 172, 487 라인쯤 아래와 같이 주석을 해제합니다.

2) C:\Bitnami\wampstack-7.0.8-1\apache2\conf\extra 폴더에 httpd-userdir.conf 아래와 같이 수정합니다.

3) C:/Users/유저명/public_html 디렉토리를 생성하고 웹애플리케이션을 작성 후 브라우저에서 http://IP주소/~유저명 으로 접속합니다.

6. MySQL root 비밀번호 초기화
1) 먼저 CMD 창을 관리자 모드로 실행하여 MySQL 버전을 확인합니다.

2) C:\>mysql-init.txt 문서작성
① MySQL5.6 이전 버전의 경우

② MySQL 5.7 이후 버전의 경우

3) Bitnami WAMP Stack Manager Tool 을 실행하여 MySQL DaTabase 를 ‘Stop’ 합니다.
4) CMD 창 관리자 모드에서 다음과 같이 실행합니다.

5) MySQL 을 시작하면 초기화 된 root 비밀번호로 접속 가능합니다.

7. php.ini 설정
1) PHP 수정 시 변경사항 즉시 적용을 위한 opcache값 수정 (개발자 모드)

2) 기타 주요설정


728x90
반응형

'Web Programming > php' 카테고리의 다른 글

php 숫자연산  (0) 2018.08.30
php var_dump, 문자결합  (0) 2018.08.30
php echo  (0) 2018.08.30
PHP 란  (0) 2018.08.30
PHP 페이징 처리  (0) 2018.08.30
728x90
반응형
01.<!--?php
02.$currentPage $_REQUEST["page"];
03.if(!$currentPage$currentPage = 1;
04. 
05.$totalRecord = 111;  // 전체 레코드수
06.$recordPerPage = 10; // 페이지 당 뿌릴 레코드 수
07.$pagePerBlock = 10; // [1] ~ [10] 까지 한번에 10개씩
08. 
09.function handlePage($totalRecord,$recordPerPage,$pagePerBlock,$currentPage){ // 전체레코드,  페이지당 레코드수(10) , 블럭당페이지수(10), 현재페이지
10. 
11. $totalNumOfPage ceil($totalRecord/$recordPerPage); //16page
12. $totalNumOfBlock ceil($totalNumOfPage/$pagePerBlock); //2block
13. $currentBlock ceil($currentPage/$pagePerBlock); // 1page
14.   
15. $startPage = ($currentBlock-1)*$pagePerBlock+1;  // 1page
16. $endPage $startPage+$pagePerBlock -1; // 10page
17. if($endPage --> $totalNumOfPage$endPage $totalNumOfPage;
18.  
19. //NEXT,PREV 존재 여부
20. $isNext = false;
21. $isPrev = false;
22.  
23. if($currentBlock $totalNumOfBlock$isNext = true;
24. if($currentBlock > 1)      $isPrev = true;
25.  
26. if($totalNumOfBlock == 1){
27.  $isNext = false;
28.  $isPrev = false;
29. }  
30.  
31. if($isPrev){
32.  $goPrevPage $startPage-$pagePerBlock// 11page
33.  echo "<a href="\"$PHP_SELF?page=$goPrevPage\"">[PREV]</a>"
34. }
35. for($i=$startPage;$i<=$endPage;$i++){
36.  echo "<a href="\"$PHP_SELF?page=$i\"">[".$i."]</a>";
37. }
38. if($isNext){
39.  $goNextPage $startPage+$pagePerBlock// 11page
40.  echo "<a href="\"$PHP_SELF?page=$goNextPage\"">[NEXT]</a>";
41. 
42.}
43. 
44.handlePage($totalRecord,$recordPerPage,$pagePerBlock,$currentPage);
45. 
46.?>


728x90
반응형

'Web Programming > php' 카테고리의 다른 글

php 숫자연산  (0) 2018.08.30
php var_dump, 문자결합  (0) 2018.08.30
php echo  (0) 2018.08.30
PHP 란  (0) 2018.08.30
Window PHP 설치  (0) 2018.08.30
728x90
반응형

Java Error Message 정리 자료입니다.


1. ERROR Exception in thread "main" java.lang.NoClassDefFoundError: 파일명
발생되는 경우 클래스 파일을 찾을 수 없는 경우
조 언 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조) 
  
2. ERROR cannot resolve symbol
symbol : class in(에러가 난 부분)
location : class StackTest(찾으려는 위치)  
발생되는 경우 이해할 수 없는 클래스나 메소드, 변수명이 올경우
조 언 보통 이 에러는 철자가 틀렸을 경우에 많이 발생한다. 클래스, 메소드, 변수의 철자를 세심히 확인해 본다.
특히, 철자를 확인할때 대소문자 구분을 확실히 체크한다.(자바는 대소문자를 구별한다.) 그리고 클래스에서 발생할 경우 import를 해주었는지 확인해 봅니다. 
  
3. ERROR non-static variable 변수이름(or method 메소드이름) cannot br referenced from a static context
발생되는 경우 static 메소드 안에서 static 으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경우.
특히, 메소드의 경우는 인스턴스를 사용하지 않고 static메소드 내에서 바로 선언한 경우.
조 언 static 선언자의 사용여부를 살펴보고 static 메소드 안에 static으로 선언되어지지 않은 메소드나 변수가 있느지 확인해본다.
만약 그런것이 있으면 메소드를 새로 만들어 그쪽에서 선언한다. 단, 인스턴스를 생성해서 불러줘야 한다는 것을 잊지 말아야한다. 
  
4. ERROR valiable 변수명 might not have been initialized
발생되는 경우 지역변수인 변수명의 변수가 초기화가 되어있지 않았을 경우
조 언 지역변수(메소드 내에서 선언한 변수)를 초기화 하지 않은채 선언했을 경우 발생한다.
멤버 필드가 아닌 경우는 반드시 변수 선언시 초기화를 해주어야 한다.
(멤버 필드는 자바 프로그램 자체에서 자동으로 default값으로 초기화 해준다.) 
  
5. ERROR class 클래스명 is public, should be declared in a file named 클래스명.java
발생되는 경우 클래스명이 public으로 선언되었는데 파일명과 다를 경우
조 언 public으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 한다.
클래스명과 파일명의 대소문자 및 철자가 같은지 비교해 본다.
또한, public으로 선언된 클래스가 하나 이상 있는지 찾아본다.(반드시 하나만 있어야한다.) 
  
6. ERROR push(java.lang.object)[메소드(인자로 받을 수 있는 형)] in java.util.Stack(메소드의 클래스) cannot be applied to (int)[잘못 들어간 형]
발생되는 경우 메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우
조 언 사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다.
API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 본다. 
  
7. ERROR java.lang.NoSuchMethodError: main
Exception in thread "main"
발생되는 경우 클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우
조 언 자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 합니다.
main() 메소드를 빼먹지 않았는지 확인해 보십시요. 또한 public static void main(String[] args) 형식으로 씌어졌는지도 확인해 보십시요.
(main 클래스는 반드시 위와 같은 형식으로 만들어져야 합니다.) 
  
8. ERROR unreported exception java.io.IOException(Exception명); must be caught or declared to be thrown
발생되는 경우 예외가 발생하는데 예외처리를 해주지 않았을 경우
조 언 예외를 발생하는 메소드 같은 경우는 반드시 예외처리를 해주어야 합니다.
예외를 발생하거나 예외처리를 해야하는 메소드는 API를 확인해 보시면 알 수 있습니다.
그렇지 않다면 컴파일 후 지금처럼 에러가 난 예외를 예외처리해 주시면 됩니다.
또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용해서 처리할 수 있고
try{} catch{} 구문을 이용해서 직접 처리해 주셔도 됩니다.(예외 강좌를 참고하세요.)
특히, 예외도 클래스이므로 반드시 예외가 들어간 패키지를 import 해주어야 합니다. 
  
9. ERROR Note : Calculator.java(파일명) uses or overrides a deprecated API.
Note : Recompile with -deprecation for details.  
발생되는 경우 JDK 버전이 높아졌거나 보안등의 기타이유로 사용이 deprecated된 메소드를 사용한 경우
조 언 이건 예외라기 보다는 경고 입니다.(실행하면 됩니다.^^)
JDK가 버전이 높아지거나 보안등의 이유에 따라 예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났습니다.
그런 메소드를 deprecated 되었다고 하는데 이것은 API상에 나왔있습니다.
또한, 컴파일할때 -deprecation 옵션주면 어떤 메소드가 deprecate됐는지 알수있읍니다.
사용이 중지 됐다고 보기 보다는 사용을 가능하면 하지 않게끔 해주는 거죠.
대치되었거나 버전 업된 메소드를 사용하시면 됩니다.

  
10. ERROR MouseEvent(클래스명) should be declared abstract; it does not define mouseDragged(java.awt.event.MouseEvent)[메소드명(메소드가 포함된 클래스)] in MouseEvent(클래스명)  
발생되는 경우 implements한 Interface의 모든 메소드를 구현하지 않아서 발생됨  
조 언 Interface는 모든 메소드가 선언만 되고 구현되지 않은 추상(abstract) 메소드입니다.
만약 Interface를 implements하려면 implements한 클래스가 Interface에서 선언한 모든 메소드를 구현해 주어야 합니다.
하나라도 빠질 경우 implements한 클래스도 추상 클래스로 보고 에러가 발생합니다.
에러에 구현해 주어야할 메소드명이 나오므로 그곳에 쓰여있는 메소드를 구현해 주면 됩니다.
만약, 그 메소드를 구현해 주었는데 에러가 나면 철자 및 대소문자를 다시 확인해 보십시요.
  
11. ERROR incompatible types
found : /null(입력한 자료형)
required : int(요구하는 자료형)
발생되는 경우 입력을 했을때 맞지 않는 자료형이나 클래스형을 입력할 경우
조 언 incompatible 은 '성미가 맞지 않는','모순된' 이라는 뜻을 가진 단어 입니다.
단어뜻 처럼 입력 경우 required 에 나타난 자료형 및 클래스형을 요구하는데
found 에서 나타난 자료형 및 클래스형을 써주어서 입력을 하지 못하게 되어서 발생하는 에러입니다.
found 에 나타난 자료형을 required 에 나타난 자료형으로 변경해 주시면 됩니다.

  
12. ERROR package java.servlet(패키지명) does not exist
발생되는 경우 import한 패키지가 존재하지 않을 경우
조 언 import한 패키지가 존재하지 않을 경우에 발생하는 에러입니다.
철자와 대소문자를 먼저 확인하고 CLASSPATH 설정을 확인해 보시기 바랍니다.
또한 그 곳에 패키지가 jar파일로 있는지도 확인해 보셔야 합니다.
(API에 나와있는 패키지는 rt.jar에 다 있습니다.
단 javax가 붙거나 다름으로 시작되는 확장 패키지는 설치해 주어야합니다.(javax.swing 제외))  
  
13. ERROR java.lang.NullPointerException
Exception in thread "main"(메소드) java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:341)... [에러가 일어난 부분]
발생되는 경우 참조하거나 사용한 클래스 또는 자료형이 초기화 되지 않은 경우
조 언 보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발생합니다.
자바의 변수들은 기본적으로(자동으로 초기화 되는 멤버필드등을 제외하고) 초기화를 요구합니다.
에러에 체크된 부분을 검토해 보시고 초기화를 해주십시요.  
  
14. ERROR ';'(빠진 부분) expected
발생되는 경우 문법상으로 써야할 것을 쓰지 않은 경우 발생합니다.
조 언 주로 ';'을 안써주시거나 아님 '()'(괄호)를 열기만 하고 닫지 않은 실수를 할 경우 발생합니다.
대부분 이 에러가 발생한 경우는 에러에 나온것을 소스에 추가해 주시면 됩니다. 
  
15. ERROR unexpected type
required : value(요구하는 타입)
found : class(소스상 써준 타입)

발생되는 경우 써주어야 할 타입이 아닌 잘못된 타입을 써주었을 경우
조 언 unexpected type 에러를 해석하면 '기대하지 않은 타입'이란 뜻을 가지고 있습니다.
즉, 원하는 타입(required)이 아닌데 잘못된 타입(found)을 써준 경우 발생합니다.
에러 체크된 부분의 타입을 required 에서 나타난 타입으로 변경해 주시면 됩니다.

  

16. ERROR java.lang.ArrayIndexOutOfBoundsException
at Test.main(Test.java:10)[클래스.메소드(파일명:에러난 위치)]
Exception in thread "main"(예외가 던져진 메소드)

발생되는 경우 배열의 범위를 넘어선 값을 넣었을 경우
조 언 위의 에러는 특이하게 컴파일은 이상없이 되지만 실행을 하면 발생하는 에러입니다.
배열의 범위를 넘어설 경우에 발생하므로 에러난 위치의 배열의 참조 범위를 확인해보시고
선언해둔 배열의 범위에 맞게 조정해 주시면 됩니다.  
  
17. ERROR illegal start of expression
발생되는 경우 선언자(modifier)를 잘못 집어 넣은 경우
조 언 에러의 단어뜻을 확인해 보면 '표현의 시작이 부적격 합니다.'하고 해석할 수 있습니다.
보통 선언자가 맞지 않거나 쓰일데가 아닌데 선언자를 줄 경우에 많이 발생합니다.
특히 메소드안에서 static 선언자를 쓴 경우에는 직격으로 볼수 있죠.
에러가 난 부분의 선언자를 제거하거나 맞는 것인지 다시 확인해 보십시요.  
  
18. ERROR java.io.InputStream(클래스) is abstract; cannot be instantiated
발생되는 경우 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우
조 언 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우에 발생하는 에러입니다.
왜냐하면, 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할수 없기 때문입니다.(객체를 못만든다구요.)
이 경우에는 인스턴스를 다른 방법으로 생성하시면 됩니다.
예를 들어 인스턴스를 반환하는 메소드를 이용한다거나 상속을 통해서 상속받은 클래스의 인스턴스를 만들어
직접 인스턴스를 만드는 효과를 낼수도 있구요. 원하시는 방법으로 바꾸어 보시길...  
  
19. ERROR local variable name(변수명) is accessed from within inner class; needs to be declared final
발생되는 경우 Local Class의 변수를 final로 선언하지 않은 경우
조 언 Local Class의 변수는 참조변수의 참조값 변동을 방지하기 위하여 final 선언자를 붙여주어야 합니다.
변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상수 처럼 쓰이며
만약 이 값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값의 복사본을 참조 값으로 넘기게 됩니다.
그러므로 Local Class에서 참조값 변동없이 변수를 참조할 수 있게 되는 것입니다.
Local Class를 정의해준 곳을 살펴보고 final 선언자를 확실하게 확인하시기 바랍니다.  
  
20. ERROR inner classes cannot have static declarations
발생되는 경우 내부 클래스 안에서 static 선언자를 쓴 경우
조 언 내부 클래스 안에서는 static 선언자를 쓸수 없습니다.
내부 클래스 안에서 사용된 static 선언자를 제거해 주십시요.  
  
21. ERROR referenceto List is ambiguous,both class java.util.List(클래스) in java.util(패키지)
and class java.awt.List(클래스) in java.awt(패키지) match  
발생되는 경우 클래스 사용시 다른 패키지내에 동일이름의 클래스들이 있어서 참조가 모호할 경우
조 언 예시를 보면 아시겠지만 import 한 패키지중에 같은 이름을 사용하는 클래스를 클래스 이름만으로
생성함으로서 참조가 모호해질 경우 발생하는 에러입니다.
이와 같은 경우는 import를 하나 제거 하거나 아님 java.util.List 이런식으로
직접 그 클래스의 패키지를 같이 써줌으로서 모호성을 제거할수 있습니다.

  
22. ERROR m()(메소드명) in B(클래스명) cannot override m()(메소드명) in A(클래스명);
attempting to use incompatiable return type  
발생되는 경우 클래스를 상속받고서 메소드를 오버라이드 하고자할때 잘못한 경우
조 언 클래스를 상속받고서 메소드를 오버라이드 할 경우에는 지켜야 하는 규칙이 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 메소드의 파라미터 개수, 데이터형이 같아야 합니다.
3. 메소드의 리턴형이 같아야 합니다.
4. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 합니다.
5. 상위 메소드와 동일하거나 접근범위가 더 넣은 접근 제한자를 사용해야 합니다.

님의 메소드 오버라이드시 위 규칙을 잘 지켰는가를 다시 한번 확인해 보세요.

  
23. ERROR getPathBetweenRows(int,int)(메소드) has protected access in javax.swing.jTree(클래스)
발생되는 경우 protected로 선언된 메소드를 상속 없이 직접 불러쓸 경우
조 언 protected로 선언되어 있는 메소드는 상속하거나 같은 package에 있을 때만 쓸 수 있습니다.
상속해서 다시 public 메소드로 값을 받던지 아니면
public 메소드 중에서 비슷한 기능을 하는 메소드가 있는지 찾아서 바꾸어주어야 합니다.  
  
24. ERROR invalid method declaration; return type required
발생되는 경우 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우
조 언 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우에 발생하는 에러이므로
에러가 발생한 메소드를 확인해보고 리턴 타입을 맞게 적어주어야 합니다.  
  
25. ERROR Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
발생되는 경우 static으로 선언된 변수중 초기화가 안되어 있는 것이 있는 경우
조 언 static으로 선언된 변수중에 초기화가 안된게 있는 경우에 발생하는 에러이므로
에러가 발생한 변수를 확인해보고 알맞은 초기화를 시켜주거나 변수의 위치를
자동 초기화가 가능한 메소드 밖의 클래스 변수로서 사용하게 합니다.  
  
26. ERROR Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment
발생되는 경우 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft에
보시면 3개의 키가 있을 겁니다. 그중에서 첫번째 키인 Java 런타임 환경 을 마우스
오른쪽 버튼으로 클릭하여 Java Runtime Environment로 이름을 바꿔주시면 됩니다.

  
27. ERROR Error Registry Key 'Sofrware\JavaSofrware\Java Runtime Environment\CurrentVerison'
has value '1.1',but '1.3' is requried.
Error: could not find java.dll
Error: could not find java 2 Runtime Enviroment.  
발생되는 경우 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft -> Java Runtime Environment의 Current version의 값을 1.3으로 되어있는지 확인해 주시면 됩니다.

  
28. ERROR java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver(드라이버명)  
발생되는 경우 JDBC로 데이터 베이스에 연결하는 중 드라이버를 찾지 못할 경우
조 언 JDBC를 연결하는 중에 드라이버를 찾지 못할 경우에 발생하는 에러이므로
각 데이터 베이스에 맞는 드라이버가 제대로 다운로드 되었는지 확인해 보시고
드라이버의 위치가 클래스 패스에 잡혀 있는지 확인해주시면 됩니다.  
  
29. ERROR Method printIn(java.lang.String)(메소드명) not found in class java.io.PrintStream(클래스명)  
발생되는 경우 자신이 사용한 클래스의 메소드가 맞지 않는(=없는)경우
조 언 자신이 사용한 클래스의 메소드가 맞지 않는(=없는) 경우에 발생하는 에러이므로
API를 통해서 사용하고자 하는 클래스와 메소드를 다시 한번 확인해 봅니다.
보통 이경우 메소드의 철자나 대소문자를 잘못 쓴 경우가 많으니 그점을 유심히 살표봅니다.
마지막으로 철자와 대소문자도 맞는다면 메소드의 인자의 객체형을 맞게 주었는지 확인해보면 됩니다. 

728x90
반응형
728x90
반응형

1. 크롤링(Crawling) ?


크롤링이란 사전적으로 기어다니는 것을 뜻하는데, 웹(Web) 상을 돌아다니면서 정보를 수집하는 행위를 뜻합니다.

크롤링의 대상은 웹 상의 자원들이며, 이것들은 정적인 문서가 될 수 있고, API와 같은 서비스가 될 수가 있습니다. 어떤 것이라도 다수의 데이터를 수집하고, 수집된 데이터를 토대로 필요한 정보만 추출하는 것을 크롤링이라고 부릅니다.



2. 크롤링 라이브러리


크롤링을 위한 다양한 라이브러리들이 존재하는데, 자신에게 맞는 라이브러리를 찾아 적용하면 됩니다. 대표적으로 데이터를 수집할 수 있는 라이브러리에는 Beautiful Soup, 자바 버전인 Jsoup가 있고, 브라우저를 이용한 Selenium 등이 있으며, 이번 포스팅에서는 Jsoup를 사용해서 크롤링 하는 방법에 대해서 포스팅 했습니다.



3. 크롤링 매커니즘


크롤링 매커니즘은 대략적으로 아래의 단계를 통해서 진행됩니다.


1) 대상 선정 -> 2) 데이터 로드 -> 3) 데이터 분석 -> 4) 데이터 수집



4. Jsoup 사용


Jsoup를 사용하기 위해서는 https://jsoup.org/download 에 접속해서 아래와 같이 jar파일을 받아서 프로젝트에 jar파일을 추가해줍니다.

혹시 모르시는 분들을 위해서 ( 해당 프로젝트 우클릭 > Properties > Java Build Path > Add External JARs에서 다운받은 jar파일을 추가해주면 됩니다. )

이제 Jsoup를 사용할 준비는 완료 되었으니, 간단한 예제를 통해서 가져온 데이터를 가공해서 콘솔에 출력하는 것을 확인 해보겠습니다.



package test;
 
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class JsoupParser {
 
    /*
     *  Document 클래스 : 연결해서 얻어온 HTML 전체 문서
     *  Element 클래스  : Documnet의 HTML 요소
     *  Elements 클래스 : Element가 모인 자료형
     */
     
    public static void main(String[] args) {
        // Jsoup를 이용해서 네이버 스포츠 크롤링
        Document doc = null;
         
        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException e) {
            e.printStackTrace();
        }
         
        // 주요 뉴스로 나오는 태그를 찾아서 가져오도록 한다.
        Elements element = doc.select("div.home_news");
         
        // 1. 헤더 부분의 제목을 가져온다.
        String title = element.select("h2").text().substring(0, 4);
 
        System.out.println("============================================================");
        System.out.println(title);
        System.out.println("============================================================");
         
        for(Element el : element.select("li")) {    // 하위 뉴스 기사들을 for문 돌면서 출력
            System.out.println(el.text());
        }
         
        System.out.println("============================================================");
    }
 
}


위의 코드를 살펴 보면 url을 통해서 파싱할 웹 페이지를 선정하고, connection을 통해서 데이터를 가져옵니다. 그리고 나서 각각의 select문을 사용해서 필요한 데이터를 추출해서 출력하는 예제입니다. 그 결과는 아래와 같습니다.


selector를 사용해서 가져올 때 각각의 애트리뷰트 및 id 또는 class를 지정해서 가져올 수 있는데 아래와 같이 사용하면 됩니다.


ex) select(tag.className) >> 클래스 명을 지정해서 해당하는 데이터를 가져옵니다.

     select(tag#id) >> id를 지정해서 해당하는 데이터를 가져옵니다.

     select(tag[attribute]) >> 애트리뷰트를 지정해서 해당하는 데이터를 가져옵니다.

     select(parent Tag > child Tag) >> 부모 태그의 하위 자식태그를 지정해서 해당하는 데이터를 가져옵니다.


그 외, 지원되는 다양한 기능에 대해서 알고 싶으면 다음의 참조 링크를 확인하시면 됩니다.


노드 : https://jsoup.org/apidocs/org/jsoup/nodes/Node.html

엘리먼트 : https://jsoup.org/apidocs/org/jsoup/nodes/Element.html



출처: http://toma0912.tistory.com/74?category=195708 [토마's 개발노트]

728x90
반응형

'Web Programming > java-jsp' 카테고리의 다른 글

JSTL에서 LIST Size  (0) 2018.09.04
For input string: ""  (0) 2018.09.04
java 경력 기술 면접 질문 리스트  (0) 2018.08.29
java 기술 면접 질문 리스트  (1) 2018.08.29
신입 자바 개발자 면접 질문  (0) 2018.08.29

+ Recent posts