[SpringBoot] 게시판 구현하기 20 (스프링 프로파일 적용하기)
FRAMEWORK/Spring

[SpringBoot] 게시판 구현하기 20 (스프링 프로파일 적용하기)

반응형

들어가기 전에

하기 포스팅은 "스프링부트 시작하기(김인우 저)" 책을 공부하며 적은 포스팅입니다. 이번 포스팅에서는 스프링 프로파일 적용하는 법에 대해 알아보겠습니다.

스프링 프로파일 적용하기

스프링 웹 어플리케이션을 개발하다보면 로컬, QA, PROD 환경에 따라 핵심 로직은 동일하지만 몇 가지 설정을 바꾸어 사용하게 됩니다. 예를 들어, 데이터베이스 주소나 로그는 환경에 따라 변경됩니다. 이를 위해, 스프링에서는 프로파일이라는 기능을 제공합니다. 프로파일은 각각의 환경에 맞는 설정을 지정해 실행 또는 패키징 시 원하는 설정을 사용할 수 있도록 해줍니다.

  • 로컬이나 QA 환경에서 사용하는 데이터베이스를 PROD 환경와 동일하게 운영하게 되면, 실제 고객 데이터를 가지고 테스트를 하게 될 수 있어 데이터베이스를 따로 사용합니다.
  • 로컬에서는 개발자가 원하는대로 모든 로그를 남겨볼 수 있지만, PROD 환경에서도 그 로그들을 모두 남기게되면, 개인정보가 들어있을 수도 있고 로그양에 의해 디스크가 풀 차서 문제가 발생할 수도 있습니다.

설정 파일 분리하기

여기서는 개발환경과 운영환경을 분리해보겠습니다. 개발환경에서는 정렬된 로그 및 쿼리 결과 등 모든 로그를 출력하고, 운영환경에서는 에러 로그만 출력하도록 지정하겠습니다.

 

application.properties 파일을 복사해 application-dev.properties와 application-prod.properties 파일을 만듭니다. 이렇게 파일을 나눠쓰게 되면, application.properties는 환경에 관계없이 공통적으로 사용하는 설정을 하게 됩니다.

// application.properties
spring.profiles.active=dev

spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.allow-pool-suspension=true

spring.mvc.hiddenmethod.filter.enabled=true

mybatis.configuration.map-underscore-to-camel-case=true

spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.use-new-id-generator-mappings=false
  • datasource의 테스트 쿼리나 myBatis의 카멜표기법 설정, JPA의 데이터베이스 관련 설정 등 환경이 바뀌더라도 동일하게 사용할 부분을 넣어줍니다.
  • spring.profiles.active=dev는 application-dev.properties의 dev를 의미합니다.
// application-dev.properties
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.hikari.username=아이디
spring.datasource.hikari.password=비밀번호

spring.thymeleaf.cache=false
spring.web.resources.cache.period=0
  • cache를 사용하면 수정한 결과가 바로 반영되지 않습니다. 따라서 개발환경의 설정파일에는 datasource 설정과 Thymeleaf의 캐시를 사용하지 않도록 설정합니다.
// application-prod.properties
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.hikari.username=아이디
spring.datasource.hikari.password=비밀번호
  • 운영 환경의 경우 쿼리를 정렬해주는 log4jdbc를 사용하지 않습니다. 그리고, Thymeleaf나 resources의 캐시는 사용할 수 있도록 따로 설정을 하지 않았습니다.
  • 실제로 하게 되면, 개발과 운영 사이 데이터베이스를 달리써야 하지만, 현재 분리된 서버가 없기 때문에 동일하게 지정했습니다.

로그 설정하기

개발환경에서는 모든 로그가 출력되어야 했지만, 운영환경에서는 저장 공간의 제약 및 성능 문제로 로그 양을 줄일 필요가 있습니다. 따라서, 개발환경과 다르게 운영환경의 로그를 설정하는 법에 대해 확인해보겠습니다. 

  • 아래 실습의 경우, 극단적으로 운영환경에 로그를 남기지 않는 방식으로 실제로는 데이터 관련 로그 역시 남깁니다(개인정보 제외 - 개인정보가 있다면 사설IP를 가진 서버를 이용함).

logback-spring.xml 파일의 로거를 아래와 같이 변경합니다.

...
	</appender>

	<springProfile name="dev">
		<logger name="board" level="DEBUG" append-ref="console"/>
		<logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog"/>
		<logger name="jdbc.resultsettable" level="INFO" appender-ref="console-infolog"/>
	</springProfile>
	
	<springProfile name="prod">
		<logger name="board" level="ERROR" append-ref="console"/>
	</springProfile>
	
	<!-- 루트 로거 -->
	<root level="error">
		<appender-ref ref="console"/>
	</root>
    
</configuration>
  • <springProfile> 태그를 이용해 각 환경별로 나누어 로거를 설정합니다.
  • 이 실습에서는, 개발환경과 운영환경 간 로그 차이를 확실히 확인하기 위해 운영환경에서 error 레벨만 로그로 출력하도록 했습니다.

결과 확인하기

먼저 application.properties에서 spring.profiles.active=dev로 설정하고 실행해보겠습니다.

profiles.active=dev

  • 기존과 다르게 The following profiles are active: dev라는 로그가 추가되었습니다.
  • dev로 여전히 설정을 유지한채로 게시판 목록을 조회할 경우 기존과 동일하게 로그가 찍힘을 확인할 수 있습니다.

이번에는 application.properties에서 spring.profiles.active=prod로 변경한 후 실행해보겠습니다.

profiles.active=prod

  • 기존과 다르게 쿼리로그가 뜨지 않는 것을 확인할 수 있습니다.
반응형