728x90

전체 글 323

Bean의 Scope 중 싱글톤과 프로토타입의 차이

Scope: Bean Object가 생성되어 존재할 수 있는 범위 1. 싱글톤(Singleton) Scope 아무런 설정을 하지 않으면 기본적으로 싱글톤 Scope를 가지며, Property가 공유된다. DI DL 시 매번 같은 Object가 사용된다. 싱글톤 Scope를 가지는 Bean이 많아지면 어플리케이션 구동 시 등록될 Bean의 수가 많아짐으로 구동속도가 느려지게 된다. 등록방법 -> @Component Annotation 사용 시, 기본적으로 싱글톤 Scope을 가지는 Bean으로 등록된다. 2. 프로토타입(Prototype) Scope 싱글톤 Scope과 달리 DI DL 시 매번 새로운 Object가 사용된다. 등록방법 -> @Component Annotation과 더불어 @Scope("pr..

Spring 2024.04.19

try-catch block에서 finally 블록이 필요한 이유

컴파일할 때는 문제가 없던 프로그램도 동작 도중에 종종 오류가 발생한다. 사용자가 항상 개발자의 생각대로 프로그램을 사용하지 않기 때문이다. 숫자만 입력해야하지만 문자열을 입력하기도 하고, 파일을 업로드하기 전 파일의 이름을 지정하지 않기도 한다. 이럴 때 발생하는 오류를 사전에 방지하는 것은 중요하다. 그런데 개발자가 이러한 오류가 발생할 때마다 프로그램이 종료되는 것을 원치 않을 수 있다. 오류를 무시하고 싶을 수도 있고, 그 오류가 발생 했을 때 수행할 적절한 동작을 직접 정의하고 싶을 수도 있다. 이럴 때 활용하는 것이 try-catch-finally 구문이다. public class Main { public static void main(String[] args) { int [] arr = ne..

JAVA 2024.04.16

Java에서 큰 수를 다룰 때 쓰는 자료형이란? (BigDecimal 에 관해)

BigDecimal을 쓰는 이유 Test 자바는 IEEE 754 부동 소수점 방식을 사용해서, 정확한 실수를 저장하지 않고 최대한 완벽에 가깝기를 바라는 근사치 값을 저장하기 때문에 통과하지 못한다. 금융권에서 달러를 다루는 개발자가 double을 이용해서 이런 사소한 값 차이가 발생한다면 부동 소숫점 방식이 아닌, 정수를 이용해 실수를 표현하는 java.math.BigDecimal 클래스를 사용해야 한다. 따라서, Java 언어에서 돈과 소수점을 다룬다면 BigDecimal은 선택이 아니라 필수다. 변수 intValue : 정수. 정수를 저장하는데 BigInteger를 사용한다. scale : 지수. 정확히는 소수점 첫째 자리부터 0이 아닌 수로 끝나는 위치까지의 총 소수점 자리수이다. precisio..

JAVA 2024.04.06

[친절한 SQL 튜닝 스터디] 7장. SQL 옵티마이저

SQL 옵티마이저 7.1 통계정보와 비용 계산 원리 7.1.1 선택도와 카디널리티 선택도(Selectivity)란, 전체 레코드 중에서 조건절에 의해 선택되는 레코드 비율을 말하낟. 가장 단순한 ‘=’ 조건으로 검색할 때의 선택도만 살펴보면, 컬럼 값 종류 개수(Number of Distinct Values, 이하 ‘NDV’)를 이용해 아래와 같이 구한다. 선택도 = 1 / NDV 카디널리티(Cardinality)란, 전체 레코드 중에서 조건절에 의해 선택되는 레코드 개수이며, 아래 공식으로 구한다. 카디널리티 = 총 로우 수 * 선택도 = 총 로우 수 / NDV 7.1.2 통계정보 통계정보에는 오브젝트 통계와 시스템 통계가 있다. 오브젝트 통계는 다시 테이블 통계, 인덱스 통계, 컬럼 통계(히스토그램 ..

[친절한 SQL 튜닝 스터디] 6장. DML 튜닝

6.0 DML 성능 영향 요소 기본적인 DML 튜닝을 설명하기 전 DML 성능에 영향을 미치는 요소에 대해 설명한다. 인덱스 인덱스를 위한 데이터를 생성하거나 삭제하는 작업은 DML 성능에 영향을 준다. INSERT, DELETE는 인덱스 조작을 한 번만 수행한다. UPDATE는 인덱스 조작을 두 번 수행한다. (DELETE, INSERT) 시스템마다 다르지만 인덱스 1개에 100만 건 데이터를 넣을 때는 5초 인덱스 3개에 100만 건 데이터를 넣을 때는 40초 무결성 제약 PK, FK, Check, Not Null 같은 제약도 DML 성능에 영향을 미친다. 시스템마다 다르지만 PK가 없으면 100만건 데이터를 넣을 때는 1.3초 PK가 있으면 100만건 데이터를 넣을 때는 4.95초 조건절 조건절을 ..

카테고리 없음 2024.04.04

Equals() 메소드 정의할 때 hashcode 함수를 정의해야 하는 이유

equals와 hashCode는 같이 재정의하라는 말을 다들 한 번쯤 들어봤을 것이다. 대부분의 IDE Generate 기능에서도 equals와 hashCode를 같이 재정의해주며 lombok에서도 EqualsAndHashCode 어노테이션으로 같이 재정의해준다. equals만 재정의할 경우 우선 예제로 사용될 Car 클래스를 살펴보자. public class Car{ private final String name; public Car(String name){ this.name = name; } // intellij Generate 기능 사용 @Override public boolean equals(Object o){ if (this == o) return true; if (o == null || get..

JAVA 2024.04.01

[친절한 SQL 튜닝 스터디] 5장. 소트 연산 튜닝

5.1 소트 연산에 대한 이해 소트 수행 과정 소트는 PGA에 할당한 Sort Area에서 수행하며 PGA가 부족하면 Temp 테이블 스페이스를 사용 메모리 소트 : PGA 내에서 소트 완료할 경우 디스크 소트 : Temp 테이블 스페이스까지 사용하여 소트를 완료할 경우 소트는 최대한 발생하지 않도록 SQL을 작성해야 하고, 소트가 불가피하다면 메모리 내에서 수행을 완료할 수 있도록 해야 함 아래는 소트 오퍼레이션 종류에 대해 설명한다. Sort Aggregate : 전체 로우를 대상으로 집계를 수행할 때 나타난다. -- Sort Area에 변수를 하나 만들어 데이터를 읽으면서 최대값 비교하며 최대값을 찾아 리턴 SELECT MAX(SAL) FROM 직원;​​ MAX, MIN, SUM, AVG 함수를 사..

[친절한 SQL 튜닝 스터디] 4장

4.1 NL 조인 NL 조인 (Nested 조인) : 기본 조인이며 다중 for문처럼 조인하는 방식 수행 빈도가 많은 것은 인덱스를 타야 하므로 Inner 쪽(이중 for문으로 설명하자면 안쪽 for문을 의미) 테이블은 인덱스를 반드시 사용해야 한다. NL 조인 실행 계획 : 아래는 NL 조인 실행 계획 예시이다. 사원이 Outer에 해당하고 고객이 Inner에 해당한다. NESTED LOOPS TABLE ACCESS (BY INDEX ROWID) OF '사원' (TABLE) INDEX(RANGE SCAN) OF '사원_X1' (INDEX) TABLE ACCESS (BY INDEX ROWID) OF '고객' (TABLE) INDEX(RANGE SCAN) OF '고객_X1' (INDEX)​ 힌트를 사용한 ..

[친절한 SQL 튜닝 스터디] 3장. 인덱스 튜닝

3.1.1 테이블 랜덤 액세스 절차 쿼리문에 사용하는 컬럼을 인덱스가 모두 포함하는 경우가 아니라면, 인덱스를 스캔한 후에 ROWID 획득한다. ROWID(오브젝트 번호, 데이터파일 번호, 블록번호)가 가리키는 테이블 블록을 버퍼 캐시에서 먼저 찾아본다. 못 찾을 때만 ROWID를 가지고 디스크에서 찾아 블록을 읽는다. 1장에서 설명했지만, 디스크에서 읽는 방법은 엄청 느리지만, 버퍼 캐시를 탐색하는 것도 생각보다 고비용 구조이므로 테이블 랜덤 액세스 수 자체를 줄여야 한다. 3.1.2 인덱스 클러스터링 팩터 - 클러스터링 팩터(Clustering Factor, 이하 'CF')는 '군진성 계수', 특정 컬럼을 기준으로 같은 값을 갖는데이터가 서로 모여있는 정도를 의미한다. - 인덱스 ROWID로 테이블을..

[친절한 SQL 튜닝 스터디] 2장. 인덱스 기본

2.1 인덱스 구조 및 탐색 2.1.1 미리 보는 인덱스 튜닝 데이터를 찾는 두 가지 방법은 다음과 같다. 1) 테이블 전체를 스캔한다. 2) 인덱스를 이용한다. 인덱스 튜닝의 두 가지 핵심요소 첫 번째는 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것이다. 즉. ‘인덱스 스캔 효율화 튜닝’이다. 두 번째 핵심요소는 테이블 액세스 횟수를 줄이는 것이다. 인덱스 스캔 후 테이블 레코드를 액세스할 때 랜덤 I/O 방식을 사용하므로 이를 ‘랜덤 액세스 최소화 튜닝’이라고 한다. SQL 튜닝은 랜덤 I/O와의 전쟁 데이터베이스 성능이 느린 이유는 디스크 I/O 때문이다. 읽어야 할 데이터량이 많고, 그 과정에 디스크 I/O가 많이 발생할 때 느리다. 인덱스를 많이 사용하는 OLTP 시스템이라면 디스크 I/O ..

728x90