본문 바로가기
Spring/SpringBoot

[SpringBoot] Boot환경에서 JNDI사용하기

by J4J 2021. 5. 17.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 스프링 부트에서 JNDI 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다.

 

 

반응형

 

 

기존 환경

 

[ 1. application.yml ]

 

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jndi?serverTimezone=UTC
    username: root
    password: root
    
...

 

 

기존에는 위와 같이 application.yml에 datasource가 등록되어 있습니다.

 

그리고 비즈니스 로직 구간도 구성이 되어 있어서 포스트맨에서 API를 호출할 경우 다음과 같이 조회가 되고 있습니다.

 

기존환경 결과

 

 

이와 동일한 결과가 나오도록 JNDI로 변경해보도록 하겠습니다.

 

 

 

 

JNDI로 변경

 

[ 1. pom.xml에 dependency 추가 ]

 

<!-- JNDI설정을 위한 dbcp -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
</dependency>

 

 

 

[ 2. resource 설정 클래스 생성 (com.spring.jndi.config.JndiResource) ]

 

package com.spring.jndi.config;

import org.apache.catalina.Context;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.ContextResource;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JndiResource {
	
	@Bean
	public TomcatServletWebServerFactory tomcatFactory() {
		return new TomcatServletWebServerFactory() {
			@Override
			protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
				tomcat.enableNaming();
				return super.getTomcatWebServer(tomcat);
			}
			
			@Override
			protected void postProcessContext(Context context) {
				context.getNamingResources().addResource(getResource());
			}
		};
	}
	
	public ContextResource getResource() {
		ContextResource resource = new ContextResource();
		resource.setName("jndi/mysql"); // 사용될 jndi 이름
		resource.setType("javax.sql.DataSource");
		resource.setAuth("Container");
		resource.setProperty("factory", "org.apache.commons.dbcp2.BasicDataSourceFactory");
		
		// datasource 정보
		resource.setProperty("driverClassName", "com.mysql.cj.jdbc.Driver");
		resource.setProperty("url", "jdbc:mysql://localhost:3306/jndi?serverTimezone=UTC");
		resource.setProperty("username", "root");
		resource.setProperty("password", "root");
		
		return resource;
	}
}

 

 

[ 3. application.yml 수정 ]

 

spring:
  datasource:
    jndi-name: jndi/mysql
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3306/jndi?serverTimezone=UTC
#    username: root
#    password: root

...

 

 

 

기존에 application.yml에 datasource를 등록하던 것을 위와 같이 변경해주면 됩니다.

 

그리고 설정한 것을 기반으로 프로젝트를 실행하여 동일한 API를 호출하면 다음과 같이 동일한 결과가 나옵니다.

 

JNDI설정 결과

 

 

그리고 위에서 설정한 JndiResource를 두 개 이상 생성해주고 profile설정을 해주면 개발/운영환경으로 나누어 사용할 수도 있습니다.

 

다음 포스팅에서는 profile을 이용하여 개발/운영환경도 나누고 또한 데이터베이스도 2개 이상 사용되는 경우에서 JNDI를 설정해보도록 하겠습니다.

 

 

 

 

 

 

이상으로 스프링 부트에서 JNDI 사용하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글