테스트 환경을 구축해놓고 공부하는 기타 다른 블로그들을 보며 일주일간 삽질을 했기에..ㅠㅠ 이번 기회에 정리.
이번에 다시 느낀 건 역시 블로그 보단 공식 사이트가 진리다...

신규 업무를 위해 신규 DB서버 구축이 필요했는데, SQL Server를 사용해야 함.

요구사항
1. 본점 Oracle DB 연결(Linked Server)
2. 매일 정해진 시간에 자동으로 00 발송
3. SQL Server 2019 사용

DB Link 전 필수사항
1. Oracle 11g 설치(DB instance는 불필요해서 software만 설치)
2. ODBC 설치 후 시스템 DSN 생성(불필요한 것 같음. 현재 Linked Server로 연결된 이름은 모두 TNS이름이랑 맞췄고 ODBC로 설정된 이름은 다름, 기타 블로그에서 만들라고 해서 만들었으나 추후 확인)
3. tnsnames.ora 파일 설정

DB Link 설정
1. Server Objects(서버개체) 마우스 우클릭 - New - Linked Server... 선택
2. Linked Server 설정

OK 버튼을 누르면 자동으로 연결 테스트가 진행됨

3. 연결 테스트 성공 후 DB 셀렉트 테스트
select * from openquery(DB Link명, 'select 1 from dual'); 
Oracle 연결 테스트이기 때문에 위처럼 테스트를 진행
Openquery를 사용하지 않고 스키마처럼 .으로 진행하는 방식도 있으나 성능이 떨어짐(테이블의 모든 데이터를 가져온 후 조건 필터링하기 때문) openquery는 링크된 db에서 필터링 후 데이터 가져옴

'데이터베이스' 카테고리의 다른 글

Oracle ~~초과 ~~ 미만 구하기  (0) 2024.01.10
SQL Server Job 스케줄러 생성  (0) 2023.12.26
SQL Server 프로시저 만들기  (0) 2023.12.26
sql Developer 필수 정보 및 환경설정  (0) 2021.08.12
MySql SqlDeveloper 연결  (0) 2021.08.07
Posted by 知彼知己百戰不殆
,

급 궁금해져서 찾아본 String 클래스의 주소값 확인 방법

System.identityHashCode("~~~~");
위 메소드를 println 해보면 String도 객체 주소값을 찍어볼 수 있다.

 

Posted by 知彼知己百戰不殆
,

Thread 기초

언어/JAVA 2023. 12. 17. 10:44

1. Thread Class와 Runnable Interface 구현 2가지 방법 존재
  - Thread Class 상속 시 다른 Class 상속 불가
  - Runnable Interface 구현 시 다른 Class 상속 가능

Thread 클래스 상속 (출처:Java 18 API docs)
Runnable Interface 구현 시(출처:Java 18 API docs)


출처 : https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/lang/Thread.html

 

Thread (Java SE 18 & JDK 18)

All Implemented Interfaces: Runnable Direct Known Subclasses: ForkJoinWorkerThread A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently. Every thread has a

docs.oracle.com

2. start()와 run() 호출 차이
  - thread의 run()을 호출하는 것은 class에 선언된 메서드를 호출하는 것
  - start()를 호출하는 것은 새로운 thread가 작업을 실행하는데 필요한 call stack을 생성하고, run()을 호출해서 생성된 call stack에 run()이 첫 번째로 올라가게 됨

테스트용 thread 클래스
run() 메소드 호출(단순 메소드 호출) 시 call stack의 첫 메소드가 main메소드
start() 메소드 호출 시 main 메소드 thread에는 영향을 미치지 않음

3. 데몬 스레드(daemon thread)
  - 일반 스레드의 작업을 돕는 보저 역할
  - 일반 스레드가 종료되면 데몬 스레드는 강제 종료
  - "thread변수명".start(); 를 호출하기 전 "thread변수명".setDaemon(boolean 값); 을 해야 데몬 스레드로 지정

4. sleep() 사용법(?)
  - "thread변수명".sleep(~~); 으로 선언해도 되나 sleep() 메소드는 static 메소드이기 때문에 내가 지정한 스레드가 현재 실행중인 thread가 아니라면 main thread가 영향을 받음
  - Thread.sleep(); 으로 호출해야 의미 전달에 혼선이 없음

Posted by 知彼知己百戰不殆
,
실행 환경 : sql developer에서 조회 시 2분 정도 걸리는 쿼리(1달치 조회 시 약 800만건 조금 넘게 존재)
1. createstatement 후 setFetchSize 설정
2. executeQuery 실행 후 바로 다음 라인에 Fetch Size 콘솔 로그 남김. (executeQuery 바로 윗 줄에는 로그 파일에 조회 날짜 조건 출력)
3. fetch size 확인 로그는 execute 실행 후 한 참 뒤에 콘솔 로그 출력. 콘솔 로그 출력 전에는 결과 출력 file size = 0
4. fetch size 로그 출력 후 바로 file size 증가하는 것 확인.
위의 상황으로 볼 때 rs.next() 시 쿼리를 실행하는 것이 아니라 Statement.executeQuery 실행 시 쿼리 결과 값을 갖고 있는 것으로 추정.(약 800만건의 데이터를 텍스트 파일로 저장 시 약 2.06gb)
그리고 파일 쓰기가 계속 진행되고 있는 동안 로그 파일에 조회 날짜 출력을 안 함
여기서 궁금한 점은 2기가나 되는 데이터를 어디에 들고 있다가 파일로 쓰기 시작하는 것인지 궁금.
 
참고 URL

2. https://www.ibm.com/docs/en/db2-for-zos/11?topic=applications-retrieving-data-from-tables-using-statementexecutequery-method

 

DB2 11 - Java - Retrieving data from tables using the Statement.executeQuery method

To retrieve data from a table using a SELECT statement with no parameter markers, you can use the Statement.executeQuery method. About this taskThis method returns a result table in a ResultSet object. After you obtain the result table, you need to use Res

www.ibm.com

3. https://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28615

 

Result Set

28/54 17 Result Set Standard Java Database Connectivity (JDBC) features in Java Development Kit (JDK) include enhancements to result set functionality, such as processing forward or backward, positioning relatively or absolutely, seeing changes to the data

docs.oracle.com

 

'언어 > JAVA' 카테고리의 다른 글

String의 JVM에 들어가있는 주소값 출력  (1) 2023.12.17
Thread 기초  (0) 2023.12.17
class 초기화 블럭(initialization block)  (0) 2023.09.10
인스턴스 변수와 this  (0) 2023.09.10
클래스 상속과 메소드 오버라이딩  (0) 2023.05.06
Posted by 知彼知己百戰不殆
,

Test 클래스의 초기화 블럭과 기본 생성자를 만들어 줌

초기화 블럭도 만들어줬으나 생성자의 초기화로 값이 덮어짐

기본 생성자 코드 제거 후

코드를 실행하니 초기화 블럭의 초기값 세팅 정상 작동

그럼 만약 생성자에서 초기화 변수를 하나 제거한다면???

예상대로 생성자 초기화에서 없는 부분이 초기화블럭에 있다면 초기화 블럭의 초기값이 그대로 들어감

'언어 > JAVA' 카테고리의 다른 글

Thread 기초  (0) 2023.12.17
executeQuery와 Fetch size  (0) 2023.12.13
인스턴스 변수와 this  (0) 2023.09.10
클래스 상속과 메소드 오버라이딩  (0) 2023.05.06
Math.random과 Random 클래스 차이  (0) 2022.11.18
Posted by 知彼知己百戰不殆
,

• Test 클래스의 붉은색 네모 부분이 인스턴스변수
인스턴스변수에 접근할 땐 this 키워드로 접근

this 키워드는 참조변수로 인스턴스 자신을 가리킴.
❌ static 메서드에서는 인스턴스멤버들 사용 불가. static 메서드가 호출된 시점에 인스턴스 멤버가 메모리에 존재하지 않을 수 있음

Posted by 知彼知己百戰不殆
,

 

이번에 결혼 준비를 하며 생각보다 커플 사진을 안 찍었다는 걸 느꼈고,

식전 영상에 쓰일만한 사진을 한 번 찍어보기 위해 여자친구가 스냅 업체를 알아보았어요.

그러던 중 "우기웨딩"이란 곳을 알게 되어서 스냅을 찍어보게 되었어요.

012

원래 강아지와 찍는게 목적이 아니었지만... 제가 키우는 강아지를 웨딩 사진에 한 번쯤은 남겨보고 싶어

작가님께 요청을 드려봤습니다.........

작가님도 강아지 사진은 처음이라 고민이 많아지시더라구요 ㅎㅎㅎ

게다가 강아지가 아직 1살 조금 넘은터라 매우 활발하기 때문에 

과연 아무리 사진 작가님이어도 사진 찍는게 가능할까 의문이 들기도 했어요 ㅜㅜ

와 근데 강아지 사진 처음 찍어보신다고 하셨던 거 같은데 정말 잘 찍어주셨습니다..

우기웨딩은 1인 대표님이 직접 촬영하시는 거라 보조 스탭들도 없고 도와주시는 분이 없는데

혼자서 막 강아지 간식 흔드시면서 온 몸으로 강아지 관심을 끌기 위해

피나는 노력을 해주셨습니다 ㅎㅎㅎㅎ (온 몸이 땀으로 젖은 건 안 비밀)

0123

덕분에 저희 웨딩 사진 중 인생 첫 강아지이자 마지막 강아지와 함께 남길 수 있는 추억을 만들어주셔서

정말 감사하다는 표현 전달하고 싶습니다.
(사진 다 찍고 수정본이랑 원본을 1주 좀 넘으니 바로 주셨습니다.. 고생하셨어요...)

그리고 원래 예정엔 없었지만...

우리 잘생긴 똥개놈... 독사진도 많이 찍어주셔서

프사용 사진도 많이 건질 수 있었습니다 ㅎㅎㅎㅎㅎ

1석 2조...우기웨딩 만세.....!

Posted by 知彼知己百戰不殆
,
public class Main {
	public static void main(String[] args) {
		ParentsClass pc = new ChildClass();
		pc.a();
	}
}

class ParentsClass {
	public void a() {
		System.out.println("Parensts a() call");
		b();
		System.out.println("Parents a()");
	}
	public void b() {
		System.out.println("Parensts b() call");
		a();
		System.out.println("Parents b()");
	}
}

class ChildClass extends ParentsClass{
	public void a() {
		System.out.println("Child a() call");
		super.a();
		System.out.println("Child a()");
	}
	public void b() {
		System.out.println("Child b() call");
		System.out.println("Child b()");
	}
}

main함수에서 Parents 타입의 변수에 Child 클래스(Parents 상속)의 메소드 호출 시 호출 결과

Child클래스에서 super로 Parents 클래스의 a 메소드를 호출 했을 때 Parents 클래스의 a 메소드에서 b 메소드 호출.
머릿속으로는 Parents 클래스의 b 메소드가 호출될 줄 알았지만 Child 클래스의 b메소드가 호출되었다.

메소드 오버라이딩 하면 부모 클래스에서 호출하는 메소드가 자식 클래스에도 있으면 자식 클래스의 메소드가 우선 호출되는 것으로 보임.

 ❗️Child 클래스에서 b메소드를 주석처리 후 Parents 클래스의 b 메소드 안에 a()만 주석 처리 후 실행했더니

위와 같은 결과가 도출되었다.
메소드 오버라이딩이 없으면 부모 클래스에서 자식 클래스에 없는 메소드를 호출하면 부모 클래스의 메소드가 실행되었음

1년 동안 Java를 안 건드리다가 오랜만에 Java를 다시 보니 기억이 가물가물 ㅠㅠ

생성자 관련해서 예전에 썼던 글도 참고하면 좋을 듯

https://blair6383.tistory.com/249

 

클래스 상속과 클래스 타입 참조변수 확인

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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 public class GrandParents { String pStr = "grand parents"; GrandParent

blair6383.tistory.com

 

'언어 > JAVA' 카테고리의 다른 글

class 초기화 블럭(initialization block)  (0) 2023.09.10
인스턴스 변수와 this  (0) 2023.09.10
Math.random과 Random 클래스 차이  (0) 2022.11.18
Scanner객체 NoSuchElementException 오류  (0) 2021.06.20
Java 버전별 달라진 점.  (0) 2020.07.22
Posted by 知彼知己百戰不殆
,

맥북을 새로 바꾸게 되면서 git프로젝트를 가져왔으나 lombok이 설치되어 있지 않아 오류가 잔뜩 터졌다...
그래서 얼른 https://projectlombok.org/download lombok 링크로 들어가 lombok.jar파일을 다운 받았다.
그리고 터미널을 열고 lombok.jar 위치에서 java -jar lombok.jar를 실행하고 IDE를 못 찾는다는 오류가 나왔다.

그래서 직접 수동으로 SpringToolSuite4.ini 파일을 찾아서 선택해줌.

선택 후 Install / Update를 눌렀으나... 오류... 권한이 없단다...
구글링 하니 sudo쓰래.. 그래...다시 sudo java -jar lombok.jar 실행... 반복... 오류.... 며칠을 삽질했다. 
진짜 구글링 하면서 나오는 모든 오류 해결법은 다 해본듯... 
그렇게 포기를 다짐할 찰나... 기분좋게 음주를 하고 온 날 불현듯 스치는 뇌리

설마! 파일자체의 권한이 없어서 그런가??

흠...소유자 권한은 7인데 나머지 권한은 5였다. 즉, rwxr-xr-x였다.
젠쟝ㅠㅠ 이것부터 확인했었으면 그 동안 개뻘짓 안 했을텐데 시간이 정말 아까웠다 ㅠㅠ
오랜만에 토이 프로젝을 다시 시작하려고 하니 별의 별일이 많이 생긴다 ㅠㅠ

chmod 775 SpringToolSuite4.app 후 터미널에서 다시 lombok.jar 실행 => 결론은 성공

'OS > Mac OS' 카테고리의 다른 글

SpringToolSuite4 can't be opened 오류  (0) 2023.03.27
Mac 부하테스트(stress test)  (0) 2020.12.27
Eclipse for mac OS Catalina  (0) 2019.12.02
MACOS Sieera able to Unidentified Apps  (0) 2018.01.22
Oralcle DB 설치  (0) 2017.09.05
Posted by 知彼知己百戰不殆
,

개발하기 위해 Mac을 샀으니 개발 tool을 설치했다. 

평소 window컴에서 자주 사용하던 sts4를 설치했다. 설치한 날은 문제없이 실행돼서 git repository도 다운받았다. 

하지만 다음 날 코드 수정하기 위해 들어갔으나 can't be opened 오류가 발생하면서 sts가 열리지 않았다.

https://stackoverflow.com/questions/71183897/the-application-sts-cant-be-opened

 

The application "STS" can't be opened

The first installation of STS on my Mac works fine, and this error pops up after restarting the computer. The problem with stS4-4.13.1 installed is still the same. Attempting to specify the jdk ver...

stackoverflow.com

해답은 여기서 찾을 수 있었다. 

Eclipse 기반인 STS가 열리면서 패키지 내용을 수정하는 것 같은데 그 때 처음 sts를 설치할 때의 서명이 깨지게 되어 위변조 파일이라 생각하여 열리지 않는 것. 따라서 다시 서명을 한 번 해줘야 함.

sudo codesign --force --sign - /Applications/SpringToolSuite4.app

현재 STS4 앱에 다시 자체 서명을 함으로써 해당 버전이 최종 버전으로 인식하게 하는 것

'OS > Mac OS' 카테고리의 다른 글

[오류] Spring Tool Suite4 Lombok 설치  (0) 2023.04.29
Mac 부하테스트(stress test)  (0) 2020.12.27
Eclipse for mac OS Catalina  (0) 2019.12.02
MACOS Sieera able to Unidentified Apps  (0) 2018.01.22
Oralcle DB 설치  (0) 2017.09.05
Posted by 知彼知己百戰不殆
,