[꼼꼼한 개발자] 꼼코더

12. 코드로 배우는 스프링 웹 프로젝트 - [스프링과 DataBase 연동] - 커넥션 풀 설정 본문

Spring/코드로 배우는 스프링 웹 프로젝트

12. 코드로 배우는 스프링 웹 프로젝트 - [스프링과 DataBase 연동] - 커넥션 풀 설정

꼼코더 2022. 12. 31. 16:33
반응형

🏘 커넥션 풀 설정

여러 명의 사용자를 동시에 처리하는 웹 애플리케이션은

데이터베이스 연결을 ‘커넥션 풀(Connection Pool)’을 이용한다.

커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것이다.

즉, 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다.

 

이처럼 미리 만들어 놓은 커넥션을 이용하면 Connection에 필요한 비용을 줄일 수 있다. 따라서 DB에 빠르게 접속할 수 있다.

 

따라서 아예 스프링에 커넥션 풀을 등록해서 사용하는 것이 좋다.

 

Java는 DataSource라는 인터페이스를 통해서 커넥션 풀을 사용한다.

DataSource를 통해 매번 데이터베이스와 연결하는 방식이 아닌

미리 연결을 맺어주고 반환하는 구조를 이용하여 성능 향상을 꾀한다.

 

커넥션 풀은 여러종류가 있고, spring-jdbc 라이브러리를 이용하는 방식도 있다.

예제는 HikariCP를 사용한다.

 


📚 라이브러리 추가, DataSouce 설정

pom.xml 파일에 HikariCP 추가.

 

👨🏻‍💻 root-context.xml 파일 수정

직접 <bean> 태그를 정의해서 작성하야 하고 <property>를 이용해 여러 속성에 대해 설정할 수 있다.

 

HikariCp에 대한 자세한 설정은

예제는 최소한의 설정만을 이용해서 작성했다.

 

스프링에서 root-context.xml은 스프링이 로딩되면서 읽어 들이는 문서이다,.

주로 이미 만들어진 클래스들을 이용해서 스프링의 Bean으로 등록할 때 사용.

 

빈을 등록하는 방법은

  • 프로젝트에 직접 작성하는 클래스 : 어노테이션 사용
  • 외부 jar 파일 등으로 사용하는 클래스 : <bean> 태그 사용

☕️Java 설정을 이용하는 경우

java 설정의 경우 RootConfig 클래스와 @Bean을 이용해서 처리한다.

  • @Bean : XML 설정에서 <bean> 태그와 같은 역할

@Bean이 선언된 메서드의 반환 (값)객체는 스프링의 객체(Bean)로 등록된다.

 

👨🏻‍💻 RootConfig 추가

 

스프링이 시작되면 root-context.xml을 읽어 아래와 같은 형태로 id가 dataSource인 객체가 처리된다.

 


 

✍🏻 Test 작성

스프링 경험이 많지 않다면 항상 빈을 정의하고 테스트를 작성하는 습관을 가지자.

 

👨🏻‍💻 DataSourceTests 추가

ex00 패키지로 돌아와 org.zerock.persistence 패키지 → DataSourcetest 클래스 추가

 

 

테스트 코드는 스프링에 빈으로 등록된 DataSource를 이용해서 Connection을 제대로 처리할 수 있는지 확인.

💁🏻‍♂️ 결과

testConnection() 내부적으로 HikariCP가 시작, 종료 되는 로그가 확인.

 

 


 

✍🏻 실습 관련 어노테이션 정리

JUnit 을 사용하는 테스트 클래스에는 RunWith, ContextConfiguration 어노테이션이 붙는다. 책에서 RunWith는 스프링와 JUnit 간 인터페이스 역할을, ContextConfiguration은 스프링 컨텍스트 설정파일을 읽는 역할을 한다고 하나 크게 와닿지 않았다.

이런 마음을 갖고 공부를 하던 중 저 의미를 이해하게 되어 글을 남긴다.

 

✍🏻 @RunWith

RunWith(SpringJUnit4ClassRunner.class)는 말 그대로 SpringJUnit4ClassRunner.class를 실행한다는 것이고, 이 클래스는 내부적으로 스프링 컨테이너를 생성해준다.

 

✍🏻 @ContextConfiguration

생성된 스프링 컨테이너에 스프링 빈을 추가하기 위해서는 application-context.xml 파일과 같은 설정 파일을 읽어야 하는데, 이런 설정파일을 로드하는 어노테이션이 ContextConfiguration이다.

만약 스프링 컨테이너가 필요 없다면, 즉, 스프링 빈 팩토리에서 빈을 로드하는 것이 아닌, 직접 new로 객체를 생성해가며 테스트 코드를 작성할 것이라면 위의 어노테이션을 제거해도 된다.

 

🧹 정리

JUnit 테스트에 스프링 컨테이너를 사용할거면 위의 어노테이션을 넣어주자.

 

 

 

 


 

👀 소감

커넥션 풀 테스트에만 4시간 가량이 소요 됐다..그래도 성공은 했다..여러 가지 오류가 있었다.

우선 먼저 말하자면 ‘아이디’ ‘비밀번호’ 오타로 인한 어처구니없는 실수로 인하여 많은 시간이 소요 됐었다..

정신이 혼미했지만 그 외 여러 오류를 부딪혀 가면서 얻은 지식이 있으니 좋게 생각해 본다.

 

또 정말 중요한 부분을 깨달았는데 오류 메세지 중 파란색 글자도 원인을 파악할 수 있는 중요한 부분 이지만

그 옆에 문장도 원인도 유추할 수 있는 메세지가 있으니 그 메세지도 중요시 확인해 보자! (매우 좋은걸 얻어 갔다.)

 

예) (파란부분)java.lang.NoClassDefFoundError: (원인 부분)javax/servlet/SessionCookieConfig

 

경험하고 해결했던 오류들

https://ccomccomhan.tistory.com/74 

 

[ERROR] spring 오류 해결방법 모음 - Loading class com.mysql.jdbc.Driver', java.lang.NoClassDefFoundError: javax/servlet/

1️⃣ 1번째 오류 메세지 Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary

ccomccomhan.tistory.com

 

 

💬 그 외 오류들

failed to load applicationcontext junit

java.lang.IllegalStateException

Failed to load ApplicationContext

java.sql.SQLNonTransientConnectionException

 

이처럼 많은 오류들을 많았었다. (좋은 경험이였다)

 


 

🧹 최종 정리

  •  
  • 여러 명의 사용자를 동시에 처리하는 웹 애플리케이션의 데이터베이스 연결은 ‘커넥션 풀(Connection Pool)’을 이용한다.
  • 커넥션 풀은 데이터베이스와 연결된 커넥션(연결점)을 미리 만들어 놓고 이를 pool(공간?)로 관리하는 것.
  • root-context.xml은 스프링이 로딩되면서 읽어 들이는 문서이다,.
  • root-context.xml은 주로 이미 만들어진 클래스들을 이용해서 스프링의 Bean으로 등록할 때 사용한다.
  • 스프링 경험이 많지 않다면 항상 빈을 정의하고 테스트를 작성하는 습관을 가지자.
  • HikariCP 같은 외부 jar 파일 등으로 사용하는 클래스는 빈을 등록할 때 xml에 <bean> 태그를 사용한다.

 

 

 

 

 

 

Comments