'Develop > DB - mssql' 카테고리의 다른 글

table 조각모음  (0) 2020.07.03
작업 스케줄러 일일체크 쿼리  (0) 2020.06.15
DB 조각모음  (0) 2020.05.18
mssql 계정 비밀번호 변경  (0) 2018.05.29
MSSQL 키보드 단축키 설정  (0) 2018.05.16


'Develop > DB - mssql' 카테고리의 다른 글

작업 스케줄러 일일체크 쿼리  (0) 2020.06.15
Index 조회 쿼리  (0) 2020.06.15
mssql 계정 비밀번호 변경  (0) 2018.05.29
MSSQL 키보드 단축키 설정  (0) 2018.05.16
프로시저 작성 시 필수 코드  (0) 2018.04.16

1. 잠금(Lock)의 개념

  데이터에 잠금(Lock)을 건다고 하면 언뜻 생각하기엔 데이터가 들어있는 방에 들어가지 못하게 방문을 걸어 잠근다는 느낌이 들지만, 사실은 방문에 "이 방에는 U-Lock이 걸려있음" 이라고 써 붙이는 개념에 가깝다.
  그 방에 누군가 SELECT를 시도한다면, 시도하는 사람은 그 방에 또 "S-Lock이 걸려있음"이라고 써붙이게 되는데 이때 이전에 걸려있던 "U-Lock"과 지금 걸려고 시도하는 "S-Lock"의 호환성을 비교하게 된다. 다행히도 "U-Lock"은 "S-Lock"과 호환되므로 "S-Lock"을 걸 수 있게 되고, SELECT에 성공하게 된다.
  만약 누군가가 그 방에 UPDATE를 시도한다면 그 사람은 그 방에 U-Lock을 걸려고 시도하겠지만 U-Lock은 U-Lock과 호환되지 않으므로 Lock을 걸지 못하고 기다리게 된다. 말하자면 이 Update시도는 기존 트랜잭션이 끝날때까지 "Block"되게 되는 것이다.

  걸어잠그는 것과 걸어잠갔다고 써붙이는 것이 무슨 차이가 있냐고?

  이 방에 들어있는 Data에 접근할 때는 서로간의 약속이 되어 있다. 예를 들면 "Select를 시도할 때는 S-Lock을 걸어야 한다"라던지... "X-Lock이 걸려있을 때는 S-Lock을 걸 수 없다"라던지... 뭐 이런 약속들이다. 그런데 만약 이 약속을 어기는 사람이 있다면 어떻게 될까? 위에서 언급했듯이 실제로 방 문을 걸어잠그는 것이 아니기 때문에 약속을 무시하는 사람은 방에 마음대로 들어갈 수 있게 된다. 예를 들어서... 이미 X-Lock이 걸려있는 Row에

SELECT * FROM TEST_TAB WHERE ID=3을 시도하면 BLOCK되겠지만
SELECT * FROM TEST_TAB WITH (READUNCOMMITTED) WHERE ID=3를 시도하면 Data를 읽을 수 있게 된다. (WITH (READUNCOMMITTED) 라는 잠금 힌트는 Select할 때 S-Lock을 걸지 말라는 의미이다.)

현재 걸려있는 Lock을 확인하려면

EXEC SP_LOCK
을 실행하면 된다. 만약 특정 세션의 Lock 상태를 확인하려면 세션 ID를 인자로 주면 된다.
EXEC SP_LOCK @@spid

2. 잠금의 세기
  잠금의 "세기" 라는 것은 여러가지 종류의 Lock들 간의 "호환 관계"라고 정리할 수 있다. S-Lock과 U-Lock이 "호환된다"라 함은 "S-Lock"이 걸려있는 상태에서 제 3의 세션에서 그 데이터에 "U-Lock"을 걸 수 있다는 의미이다.

 

2.1 공유 잠금 (Shared-Lock, S-Lock)

  공유잠금은 가장 낮은 강도의 잠금으로서, 일반적으로 Select를 할 때 공유잠금이 발생하며, Select가 완료되는 즉시 공유잠금은 해제된다. (트랜잭션이 완료되기 전이더라도 Select 완료 시점에서 잠금이 해제된다는 것이 중요하다.) 공유잠금은 서로 다른 공유잠금과 호환된다. 이 말은 바로 동일한 데이터를 서로 다른 세션에서 동시에 Select할 수 있다는 의미이다. 반면에 공유 잠금은 배타적잠금과는 호환되지 않는데 이 의미는 다른 트랜잭션에서 Update를 수행한 레코드(Uncommitted Data)에 대해 Select를 할 수 없다는 의미로 해석하면 된다.

 

2.2 배타적 잠금 (Exclusive-Lock, X-Lock)

  배타적잠금은 가장 높은 강도의 잠금으로서, Update가 행해진 시점부터 그 트랜잭션이 Commit될 때까지 배타적 잠금이 걸린다. 배타적 잠금은 다른 모든 종류의 잠금과 호환되지 않는다. 이 의미는 어떠한 약한 잠금이라도 걸려있는 레코드에 대해서는 Update가 불가능하며, 반대로 Update가 진행중인 레코드에 대해서는 Select를 포함한 어떠한 작업도 불가능하다는 의미가 된다.

 

2.3 업데이트 잠금 (Update-Lock, U-Lock)

  업데이트잠금은 공유잠금과 배타적잠금의 중간 강도의 잠금이다. 공유잠금과는 호환되지만 다른 업데이트잠금이나 배타적 잠금과는 호환되지 않는다. 일반적으로는 Update의 Filter(Where절)가 수행되는 단계에서 업데이트 잠금이 걸리며, Filter된 결과에 대해 실제로 Update를 시도할 때 업데이트잠금은 배타적 잠금으로 전환된다. (만약 테이블에 인덱스가 없거나 Where절이 인덱스를 탈 수 없게 되어 있다면, 테이블을 풀스캔하면서 모든 레코드에 업데이트잠금을 걸 것이다.)

  업데이트잠금은 잠금힌트를 통해 업데이트문이 아닌 Select문에도 걸 수 있다. 보통 컨버젼 데드락을 방지하기 위해 Select문에 업데이트 잠금을 거는 경우가 많다.

SELECT ColA, ColB FROM TAB_NAME WITH (UPDLOCK) WHERE ColA = 'AA'

 

 

3. 잠금의 크기

3.1 잠금의 크기

  잠금의 크기라 함은 어느 정도의 범위를 잠글 것인가에 관한 이야기이다. 대체로 Row Lock (Key Lock), Page Lock, Table Lock 정도가 있다.

  "잠금 비용"이란 잠금을 거는 과정에서 발생하는 성능 손실을 말한다. 만약 Lock을 걸어야 할 페이지가 너무 많다면, 차라리 Table 전체에 Lock을 거는 것이 "잠금 비용"이 훨씬 낮을 것이다.

  "동시성 비용"이란 잠금을 걸면서 동시성이 낮아져서 발생하는 성능 손실을 의미한다. Page Lock 여러개를 Table 하나로 대체하였다면 "잠금 비용"은 낮아지겠지만 대신 "동시성 비용"은 높아질 것이다.

  SQL Server는 "잠금 비용"과 "동시성 비용" 간에 균형을 적절히 고려하여 잠금의 범위를 결정하게 된다. 일반적으로 약 40%의 페이지에 Lock을 걸어야 한다면 테이블 Lock으로 대체된다고 한다

  잠금의 크기를 줄이기 위해서는 적절한 인덱스를 사용하는 것이 중요한데, 인덱스를 타지 못하여 Table Full Scan이 발생한다면 업데이트할 데이터를 찾는 과정에서 테이블 전체에 Lock을 걸게 되기 때문이다.

 

3.2 내재된 잠금 (Intent-Lock)

  내재된 잠금은 앞의 세가지 잠금과는 약간 다른 차원의 이야기이다. 내재된 잠금을 이해하기 위해서는 "잠금의 크기"를 먼저 이해해야 한다. 

  만약 세션1에서 어떤 Row에 잠금을 걸었다고 가정하자. 그 상태에서 세션2에서 그 Row가 속한 테이블 전체에 테이블잠금을 걸려고 시도하면 어떻게 될까? 당연히 테이블잠금이 걸리면 안된다. (만약 테이블락을 걸 수 있다면 세션1은 레코드잠금을 건 상태에서 다음 작업을 못한 채 꼼짝도 못하게 될 것이다. )

  그렇다면, 세션2는 어떻게 이 테이블의 Row 중 하나에 락이 걸려있다는 것을 알 수 있을까? 테이블에 락을 걸기 전에 모든 페이지와 모든 Row를 다 조사해야 할까? 실제로 SQL Server는 그 반대로 구현되어 있다. 즉, 세션 1이 그 Row에 업데이트 잠금을 걸 때, 해당 레코드가 속한 상위 페이지와 상위 테이블에 내재된 잠금을 함께 걸게 된다. 이렇게 함으로서 세션 2는 테이블에 락을 걸기 전에 해당 테이블만 확인해보면 락을 걸어도 될지를 결정할 수 있게 된다.

내재된 잠금은 IX, IU 와 같이 표기한다. (Intent Exclusive Lock, Intent Update Lock)

 

다음과 같이 테스트해보자.

BEGIN TRAN UPDATE test SET val = 2 WHERE pk = 100 EXEC SP_LOCK @@spid

SP_LOCK 프로시져로 살펴보았을 때 내재된 잠금은 다음과 같이 확인된다.

 

 

위의 결과는 52번 세션에서 인덱스(KEY)에 배타적잠금(Mode = X)를, 그것이 속한 페이지와 테이블에는 내재된 배타적잠금을 (Mode = IX)를 걸었다는 의미가 되겠다.

 

 

4. 잠금의 호환성 (Lock Compatibility)
  위의 잠금들 간의 호환 관계는 다음과 같은 간단한 테이블로 정리된다.
  위에서 언급한 바와 같이 Update Lock과 Shared Lock이 호환된다 함은 Update Lock이 걸려있는 페이지에 Shared Lock을 또 걸수 있다는 의미가 된다.

 

Requested modeExisting granted mode

IS

S

U

IX

SIX

X

Intent shared (IS)

Yes

Yes

Yes

Yes

Yes

No

Shared (S)

Yes

Yes

Yes

No

No

No

Update (U)

Yes

Yes

No

No

No

No

Intent exclusive (IX)

Yes

No

No

Yes

No

No

Shared with intent exclusive (SIX)

Yes

No

No

No

No

No

Exclusive (X)

No

No

No

No

No

No

(테이블 출처 : http://msdn.microsoft.com/en-us/library/ms172925.aspx)

 

 

 

5. 잠금의 길이

  잠금의 길이란 잠금이 지속되는 시간을 의미한다. 

  일반적인 공유잠금(S-Lock)은 SELECT 문이 끝나면 자동으로 풀린다. 반면에 단독잠금(X-Lock)과 업데이트잠금(UPD-Lock)은 트랜잭션 종료시까지 지속된다.

  공유잠금(S-Lock)의 길이는 경우에 따라 달라질 수 있어, 격리 수준이 Serializable이나 Repeatable Read인 경우 S-Lock도 트랜잭션 종료시까지 지속된다. 

'Develop > DB - mysql' 카테고리의 다른 글

MariaDB Master - Slave 간 Replication 구성  (0) 2021.02.18
MYSQL DB SIZE 조회  (0) 2020.07.17
mariaDB process kill  (0) 2020.06.15

Basic Widget

1. TextView

String을 화면에 나타내기 위한 Widget으로 Text의 색, 크기, 폰트 등을 설정할 수있으며 String은 리소스에 정의된 값을 읽어와 사용한다,

HTML class를 이용하여 HTML형식의 Text로 표한 가능

- text 

  -> 텍스트 뷰에 보이는 문자열을 설정할 수 있음

- textColor 

  -> 텍스트뷰에서 표시하는 문자열의 색상을 설정함

- textSize 

  -> 텍스트뷰에서 표시하는 문자열의 크기를 설정함

- textStyle 

  -> 텍스트뷰에서 표시하는 문자열의 스타일 속성을 설정함

- typeFace 

 -> 텍스트뷰에서 표시하는 문자열의 폰트를 설정함

- singleLine 

 -> 텍스트 뷰에서 표시하는 문자열이 한줄로만 표시되도록 설정함

- ellipsize 

 -> Text의 길이가 View의 크기보다 클 경우 처리 방식을 설정

- width, height, maxWidth, minWidth, maxHeight, minHeight

 -> View의 크기를 dp,sp,px로 나타냄

- ems, maxEms, minEms

 -> em을 기준으로 View Width 크기

 -> em은 폰트의 기본크기를 기준으로 한 크기

- lines, maxLines, minLines

 -> Line을 기준으로 한 View의 Height 크기

- gravity 

 -> 텍스트 뷰 내에서 텍스트의 정렬값을 지정

- lineSpacingExtra, lineSpacingMultiplier 

 -> 줄간 여백을 설정함

- letterSpacing 

 -> 글자간 간격

- autoLink, linksClickable

 -> link를 자동으로 표시하고 클릭할수있게 해주는 속성

- textlsSelectable

 -> 텍스트 내에서 선택이 가능하게 하는 속성


2. Button

사용자가 선택을 할 때 사용하는 Widget으로 Background에 selector를 설정하여 상태에 따라 다른 이미지를 보여주도록 만들 수 있다

- 버튼은 TextView를 상속받은 class로 TextView와 동일한 속성을 가지면 TextView의 background에 selector라고 하는 상태에 따라 다른 이미지를 보여주는 리소스를 설정하여 버튼처럼 보이도록 만든다

- selector를 만들기 위해서는 우선 버튼이 눌렸을 때와 눌리지 않았을 때 이미지가 필요

- 리소스에 이미지를 추가하기 위해서는 우선 drawable 디렉토리르 생성

- Android를 Project로 변경하고 app->src->main->res에서 New-> Android resource directory를 선택

- New Resource Directory에서 Resource type을 선택하고 drawable로 하고 Avilable qualifiers에서 Desity를 선택한 다음 X-High Density를 선택

- Selector를 생성하기 위해서는 res/drawable 에서 New->Drawable resource file 선택

- file name으로 button_selector라고 적고 Root Element는 selector를 선택

- 안드로이드에서는 색깔을 가지고 이미지처럼 만들어서 사용할 수 있도록 기능 제공



3. CompoundButton

선택 또는 취소를 나타내는 Widget으로 CheckBox, RadioButton, Toggle, Switchr 가 있다.

-CheckBox는 예/아니오를 나타내기 위해 사용하는 Widget이다



'Develop > Android' 카테고리의 다른 글

Layout 종류  (0) 2018.08.29
Layout 종류  (0) 2018.08.28
안드로이드 다국어 설정  (0) 2018.08.22
안드로이드 스튜디오 cannot resolve symbol r  (0) 2017.08.18
[Android] Activity 화면 전환  (0) 2017.01.03

Layout 종류


1.     GridLayout

n  행과 열로 이루어진 격자 모양으로 위젯을 배치할 수 있도록 하는 레이아웃

n  API14부터 제공

n  Gridlayour-v7을 이용하여 하위버전에서도 사용가능

n  GridLayout내에 위젯을 배치하면 orientation에 의해 자동으로 가로 또는 세로로 우선 배치되고 가로 또는 세로의 개수는 columnCountrowCount로 설정할 수 있다.

n  위젯은 layout_column layout_row로 원하는 위치를 지정할 수 있고, layout_gravity로 정렬 방식을 지정할 수 있다.

n  위젯은 layout_columnSpanlayout_rowSpanCell간 합치기를 할 수 있있다.

n  API21부터는 layout_columnWeight, layout_rowWeight를 제공한다.

 

-       테이블 레이아웃

n  행과 열로 이루어진 격자 모양으로 위젯을 배치할 수 있도록 함

n  각 칼럼은 위젯의 크기에 따라 늘어나거나 줄어들 수 있음

n  테이블 레이아웃은 테이블로우(TableRow)와 함께 사용됨

n  테이블 레이아웃은 하나의 행에 테이블로우 하나를 넣을 수 있으므로 여러 개의 테이블로우가 들어갈 수 있도록 함

n  각각의 위젯들은 테이블로우 안에 포함되어 테이블 레이아웃에 추가됨

n  칼럼의 수는 들어가는 위젯에 따라 자동으로 결정됨


2.     FrameLayout

n  FrameLayoutChild View를 겹쳐서 보여줄 수 있는 Layout이다.

n  FrameLayout에 배치된 Child Viewlayout_gravity를 이용하여 화면의 상단, 하단, 중앙 등에 배치 할 수 있다.

n  Child Viewlayout의 특정 위치에 배치하고자 하는 경우에도 FrameLayout을 사용한다. FrameLayoutlayout_margin_leftlayout_margin_top을 이용하여 x,y의 위치에 배치한다.

n  FrameLayoutTab등의 container로 사용되거나, Fragkment를 배치하기 위한 Layout으로 자주 사용된다.


3.     ScrollView

n  LinearLayout과 같은 Layout 이나 ImageView, TextView 와 같은 Widget들은 내부적으로 Scroll을 가지고 있지 않다.

n  View내부에 Content가 화면의 크기보다 큰 경우, Scroll을 하여 Content를 보여주기 위해서 ScrollView가 사용된다.

n  ScrollView는 내부에 오직 1개의 Child View만을 가져야 한다

  n수평방향 스크롤의 경우 HorizontalScrollView를 사용한다.


'Develop > Android' 카테고리의 다른 글

Basic Widget  (0) 2018.08.30
Layout 종류  (0) 2018.08.28
안드로이드 다국어 설정  (0) 2018.08.22
안드로이드 스튜디오 cannot resolve symbol r  (0) 2017.08.18
[Android] Activity 화면 전환  (0) 2017.01.03

Layout의 종류

1.     Layout의 종류

n  대표적인 레이아웃

레이아웃 이름

설명

리니어 레이아웃

- 박스 (Box) 모델

- 사격형 영역들을 이용해 화면을 구성하는 방법

- 표준 자바의 BoxLayout과 유사

상대 레이아웃

- 규칙(Rule)기반 모델

- 부모 컨테이너나 다른 뷰와 상대적 위치를 이용해 화면을 구성하는 방법

프레임 레이아웃

- 중복 배치 모델

- View를 동일한 위치에 중복하여 배치할 가능

- margin gravity를 이용하여 View를 특정한 위치에 배치 가능

- FragementVisibility를 이용한 View Change등에 주로 사용

그리드 레이아웃

- 격자(Grid) 모델

- 격자 모양의 배열을 이용하여 화면을 구성하는 방법

- HTML에서 많이 사용하는 정렬 방식과 유사하여 실용적임

스크롤 뷰

- 스크롤이 가능한 컨테이너

- 뷰 또는 뷰그룹이 들어갈 수 있으며 화면 영역을 너어갈 때 스크롤 기능 제공

 

2.     LinearLayout

n  속성

ü  채우기(fill model)
->
뷰를 부모 뷰의 여유 공간에 어떻게 채울 것인지 설정함

ü  방향(orientation)
->
뷰를 추가하는 방향을 설정함

ü  정렬방향(gravity)
->
뷰의 정렬 방향을 설정함

ü  여유 공간(margin)
->
뷰의 여유 공간을 설정함

ü  공간가중치(weight)
->
뷰가 차지하는 공간의 가중치 값을 설정함

n  정렬 방향 설정하기

ü  두 가지 정렬 속성

정렬 속성

설명

Layout_gravity

부모 컨테이너의 여유 공간에 뷰가 모두 채워지지 않아 여유 공간안에서 뷰를 정렬 할 때

gravity

뷰에서 화면에 표시하는 내용물을 정렬할 때(텍스트 뷰의 경우 내용물은 글자가 되고 이미지뷰의 경우 내용물은 이미지가 됨)

 

- layout_gravity

è  뷰의 layout_widthlayout_height 속성을 wrap_content로 할 경우에 같이 사용할 수 있음

n   공간가중치 설정하기

ü  Layout_weight 속성

è  LinearLayout Child를 배치하고 남은 여백을 어떻게 배치할 것인가를 설정

è  Layout_weight가 설정되어 있는 child간 값의 비율로 여백을 분배

è  Layout_wegiht는 여백을 나눠가지는 비율이지 child view간의 상대적 크기가 아님

3.     RelativeLayout

ü  부모 컨테이너나 다른 위젯들과 상대적 위치를 이용하여 배치하는 레이아웃

ü  다른 widget의 정보를 기준으로 내 위치를 결정하는 방식으로 ChildParent나 다른 Child의 위치를 기준으로 내 위치를 결정하고 align을 맞춰 크기를 결정한다.


'Develop > Android' 카테고리의 다른 글

Basic Widget  (0) 2018.08.30
Layout 종류  (0) 2018.08.29
안드로이드 다국어 설정  (0) 2018.08.22
안드로이드 스튜디오 cannot resolve symbol r  (0) 2017.08.18
[Android] Activity 화면 전환  (0) 2017.01.03

안드로이드 다국어 설정 방법


다국적 안드로이드 앱을 만들기 위해서는 다국어 지원이 필수이다.


해당 다국어 설정 방법은 안드로이드 기기에 셋팅된 언어에 따라 언어를 커스터마이징 하여 출력하는 방법이다.



res/values 에서 새로운 values resource file을 만들어준다.




Locale 선택 후





다국어 지원을 하고자 하는 xml과 file name 을 같게 하여 입력 하고 지원 하고자 하는 언어를 선택한다

여기서 Directory name 을 보면 values-ko 로 되어있는데 ko는 대한민국의 국가 코드 이다.




실행을 하고 각각 만든 xml 두개의 파일에서 언어부분만 커스터 마이징하여 적어주면


안드로이드 기기에 셋팅된 언어 설정에 따른 다국어 지원이 가능해진다.




'Develop > Android' 카테고리의 다른 글

Layout 종류  (0) 2018.08.29
Layout 종류  (0) 2018.08.28
안드로이드 스튜디오 cannot resolve symbol r  (0) 2017.08.18
[Android] Activity 화면 전환  (0) 2017.01.03
[Android] 프로젝트 생성 및 에뮬레이터 실행  (0) 2016.12.23

mssql 계정 비밀번호 변경


sp_password @old = null, @new = '신규비밀번호', @loginame ='계정정보'

go


--@old : 기존 비밀번호 null 처리

--@new : 새로 지정할 비밀번호

--@loginname : 비밀번호를 변경할 계정

'Develop > DB - mssql' 카테고리의 다른 글

Index 조회 쿼리  (0) 2020.06.15
DB 조각모음  (0) 2020.05.18
MSSQL 키보드 단축키 설정  (0) 2018.05.16
프로시저 작성 시 필수 코드  (0) 2018.04.16
키값 혹은 내부코드 자동 채번  (0) 2018.04.16

자바 reflection

리플렉션(reflection)은 자바 프로그래밍 언어의 기능 중 하나다. 리플렉션을 사용하면 자바 프로그램을 실행해서 해당 프로그램을 조사하거나 스스로를 살펴볼(introspect) 수 있다. 또한 프로그램의 내부 프로퍼티를 조작할 수도 있다. 예를 들어 리플렉션을 사용하면 자바 클래스에서 해당 클래스의 멤버의 이름을 모두 획득해서 표시할 수 있다.


자바 클래스에서 스스로를 조사하고 조작하는 이러한 기능이 그리 대단해 보이지 않을 수도 있다. 하지만 이러한 기능을 지원하지 않는 프로그래밍 언어도 있다. 예를 들어 파스칼, C, C++ 프로그램에서는 해당 프로그램 안에 정의된 함수에 대한 정보를 얻을 수 있는 방법이 없다.


실제로 자바 빈(JavaBeans)에서 리플렉션을 적용했다. 자바 빈을 사용하면 소프트웨어 컴포넌트를 빌더 툴을 사용해서 시각적으로 조작할 수 있다. 이러한 빌더 툴은  자바 컴포넌트(클래스)가 동적으로  로드될 때, 리플렉션을 사용해서 해당 컴포넌트의 프로퍼티를 획득한다.


간단한 예제

리플렉션이 어떻게 동작하는지 아래의 간단한 예를 통해 살펴보자:

   import java.lang.reflect.*;
 
   public class DumpMethods {
      public static void main(String args[])
      {
         try {
            Class c = Class.forName(args[0]);
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++)
            System.out.println(m[i].toString());
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }


아래와 같이 실행해 보면

java DumpMethods java.util.Stack


결과는 다음과 같다:

public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)


보다시피 java.util.Stack 클래스의 메서드 명이 출력된다. 메서드의 파라미터와 리턴 타입 또한 패키지 명을 포함해서 출력된다.


이 프로그램은 Class.forName을 사용해서 기술된 클래스를 로드한 후, getDeclaredMethods를 호출해서 해당 클래스에 정의된 메서드 목록을 얻는다. java.lang.reflect.Method는 클래스에서 단일 메서드를 나타내는 클래스다.



리플렉션 사용을 위한 설정

Method와 같이 리플렉션을 위한 클래스는 java.lang.reflect 패키지에서 찾을 수 있다. 이 패키지에 있는 클래스를 사용하려면 세 단계를 거쳐야만 한다. 첫 단계로 조작하려는 클래스에 해당하는 java.lang.Class 객체를 얻어야 한다. java.lang.Class는 실행 중인 자바 프로그램에서 클래스 또는 인터페이스를 나타내기 위해 사용한다.


Class 객체를 얻을 수 있는 한 가지 방법은 다음과 같다:

Class c = Class.forName("java.lang.String");


와 같이 사용하면 String에 대한 Class 객체를 얻을 수 있다. 또는 다음과 같이 사용할 수도 있다:

Class c = int.class;   // 또는
Class c = Integer.TYPE; 


와 같이 사용하면 기본형에 대한 Claass 정보를 얻을 수 있다. 두 번째 방법의 경우, 기본현에 대한 래퍼 클래스(Integer와 같이)에 미리 정의된 TYPE 필드에 접근한다.


두 번째 단계는 getDeclaredMethods와 같은 메서드를 호출하는 작업으로, getDeclaredMethods를 호출하면 해당 클래스에 선언된 메서드의 목록을 모두 얻을 수 있다.


이러한 정보를 모두 얻고 나면, 세 번째 단계로 리플렉션 API를 사용해서 해당 정보를 조작할 수 있다. 예를 들어 아래와 같은 일련의 문장을 실행하면,


Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());


String에 선언된 첫 번째 메서드를 텍스트 형식으로 표시하게 된다.


이후에 다룰 예제에서는 지금 설명한 세 단계를 결합해서 사용한다. 이를 통해 특정한 목적에 맞게 리플렉션을 활용하는 방식을 효과적으로 처리하는 예제를 한꺼번에 보여주고자 한다.


결론

자바 리플렉션을 사용하면 클래스와 데이터 구조에 대한 정보를 이름을 기반으로 동적으로 얻을 수 있다는 점에서 매우 유용하다. 뿐만 아니라 리플렉션을 사용하면 자바 프로그램을 실행하는 동안에 해당 클래스를 조작할 수 있다. 이 기능은 믿을 수 없을 정도로 강력하며, C, C++, 포트란, 파스칼과 같은 자바 이외의 언어에서는 리플렉션에 해당하는 기능이 전혀 없다.



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

String, StringBuffer, StringBuilder  (0) 2016.12.01
Quick sort  (0) 2016.11.21
자바 reflection  (0) 2016.11.17
문자열 "ABCDEFG"를 역순으로 출력  (0) 2016.11.17
JAVA의 접근제한자  (0) 2016.11.15

MSSQL 키보드 단축키 설정

앞서 컴퓨터를 사용하는 이유는


반복적인 일을 줄이기 위해서라고 했다.


반복적인 일을 줄이기 위해서는 단축키 사용이 필수적이다.


MSSQL에서도 단축키들이 많지만,


본인이 자주 쓰는 쿼리를 설정할 수가 있다.



SSMS에서 도구 -> 옵션



환경 -> 키보드에 들어가면 자주 쓰는 쿼리를 저장해서 단축키 처럼 사용할 수가 있다.


많이들 쓰는 단축키이겠지만 내가 쓰는 쿼리는 다음과 같다.


바로 가기저장 프로시저
Alt+F1sp_help
Ctrl+F1sp_tableinfo 또는 sp_helpindex
Ctrl+1sp_who
Ctrl+2sp_lock
Ctrl+3sp_helptext
Ctrl+4sp_helpstats
Ctrl+5select top 1000 * from
Ctrl+6set statistics io on;set statistics profile on;set statistics time on
Ctrl+7
Ctrl+8set statistics io on
Ctrl+9SET TRANSACTION ISOLATION LEVEL READ uncommitted
Ctrl+10set statistics io off;set statistics profile off;set statistics time off
ALTER|AND|BEGIN|BREAK|CASE|CHECKPOINT|CLOSE|COALESCE|COMMIT|CREATE|CROSS|DEALLOCATE|DECLARE|DELETE|DROP|ELSE|END|EXCEPT|EXEC|EXECUTE|EXISTS|FETCH|FROM|GROUP|IF|IN|INSERT|JOIN|LEFT|ON|OPEN|OPTION|OR|ORDER|PIVOT|RETURN|ROLLBACK|SELECT|SET|THEN|UNION|UPDATE|USE|WAITFOR|WHILE|WHERE


'Develop > DB - mssql' 카테고리의 다른 글

DB 조각모음  (0) 2020.05.18
mssql 계정 비밀번호 변경  (0) 2018.05.29
프로시저 작성 시 필수 코드  (0) 2018.04.16
키값 혹은 내부코드 자동 채번  (0) 2018.04.16
RAISERROR  (0) 2018.04.16

+ Recent posts