2022-03-11(금)

Jeongyun Heo·2022년 3월 11일
0

DB 커넥션 재활용 - 재활용 전

DBMS도 서버이기 때문에 Thread를 만든다

DAO의 메서드를 호출할 때마다 DB에 연결한다
DB에 연결하는 과정에서
사용자 인증, 권한 검사 -> 시간이 소요됨, 메모리가 사용됨

리프레시 할 때마다 커넥션 하고 버려지고...
가비지가 계속 생긴다

🔹 문제점
메서드 호출이 종료되면 DB 커넥션은 가비지가 된다
-> 메모리 낭비 발생

DBMS 쪽의 스레드도 일정시간 동안 대기상태가 된다
대기상태 -> 사용하지 못하는 상태 -> 메모리 낭비

DBMS T
클라이언트와 연결되면 요청을 처리할 스레드가 준비된다

모든 서버는 동시에 클라이언트의 요청을 처리하기 위해서 스레드 기법으로 돌아간다

문제점 요약
요청이 들어올 때마다 커넥션이 이루어지고 요청이 끝나는 순간 버려진다

클라이언트가 요청할 때마다 DB 연결이 이루어지고, 호출이 끝나는 순간 DB 연결은 버려진다.
-> 시간 낭비, 메모리 낭비 증대

DB 커넥션 재활용 - DB 연결 객체 단순 공유

Connection 객체 1개 공유

장점
DB 연결을 한 번만 수행하기 때문에
• 인증 시간 절약
• 권한 검증 시간 절약
• 가비지 최소화 -> 메모리 절약

DBMS T
한 개의 클라이언트 연결만 유지
-> 메모리 낭비를 줄인다

문제
여러 클라이언트가 같은 Connection을 통해서 작업을 수행하는데

임시 데이터베이스
rollback을 요청하면 기존에 이 스레드를 통해 수행한 모든 데이터 변경 결과는 취소된다.

문제점
수동 커밋 상태로 작업을 할 경우
commit이나 rollback을 하면 다른 클라이언트의 데이터 변경 결과까지 처리해 버리는 문제가 발생한다

왜?
commit/rollback은 DB 커넥션 단위로 수행되기 때문이다.

그래서 Connection 객체는 1개를 공유하면 안 된다

DB 커넥션 재활용 - Pooling 기법을 활용한 DB 커넥션 재활용

DB 커넥션 Pool

핵심
기존 연결 사용

① DAO가 작업할 때 필요한 DB 연결 객체는 DB 커넥션 풀에서 제공한다
② 작업이 끝나면 DB 연결 객체는 DB 커넥션 풀에게 반납한다
③ 반납된 DB 연결 객체는 다음 작업에서 재사용된다

이점
① 클라이언트 요청당 한 개의 독립적인 DB 연결 객체를 사용
-> 다른 클라이언트의 commit/rollback에 간섭을 받지 않는다

② DB 커넥션 객체를 재사용
-> 인증 및 권한 검증 시간을 줄인다, 메모리 낭비 줄인다

실무에서 다 이렇게 돌아감

스레드당 한 개의 DB 커넥션 사용

실행이 완료되면 반납

DB 커넥션풀

동시에 2개의 클라이언트가 요청을 하면?

없으니까 새로 만든다

기존에 있으면 기존거 사용하고
없으면 새로 만든다

DB 커넥션 풀을 직접 만들 필요 없음. 이미 존재함.

spring boot dbcp configuration 검색

https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

implementation 'org.springframework.boot:spring-boot-starter-jdbc'

https://search.maven.org/artifact/org.springframework/spring-jdbc/5.3.13/jar

의존 라이브러리이기 때문에 tx 라이브러리까지 가져온다

git commit -m "2022-03-11(금) DB 커넥션풀"

모든 DB 커넥션풀은 DataSource 인터페이스 규칙에 따라서 만들어야 한다

인터페이스 레퍼런스에 저장하는 방식으로 하기

잘 됨

실행이 완료되면 반납

@Bean -> 스프링 프레임워크에게 다음 메서드를 호출한 후 리턴 값을 보관하라고 지시하는 애너테이션

@Autowired -> 스프링 프레임워크에게 보관된 객체 중에서 다음 타입의 객체가 있다면 주입해 줄 것을 지시하는 애너테이션

@Bean -> 다음 메서드를 호출한 후 이 메서드가 리턴한 값을 스프링 부트에 보관하라고 지시하는 애너테이션

DataSource의 설정은 application.properties 파일 내에서

이따가 우리 프로젝트도 이렇게 바꾸기

Bean 주석 막으면 에러 뜸

application.properties - mylist-boot/src/main/resources

저장된 값을 이 변수에 자동으로 꽂아다오

변수에 값이 잘 들어가 있다

@Bean
=> 스프링 부트를 시작할 때 다음 메서드를 호출하게 만든다.
=> 이 메서드가 리턴한 값은 스프링 부트의 객체풀(object pool)에 보관한다.

0개의 댓글