개발PC에서 개발하고 도커에서 운영시 주의점

로컬에서 오라클의 프로시져를 호출 시
파라미터(가령 날짜)가 잘 전달 되었지만
도커에서는 에러가 난다.

프로시져도 마찬가지로 로컬에서 호출 시
문제없다.

실제 서버에서 호출 시 ORA-01861이 발생했고
이는 서로 오라클 세션간의 환경이 다름을 의미한다.

그래서 비교한것이

SELECT * FROM nls_session_parameters WHERE PARAMETER LIKE '%DATE%' OR PARAMETER LIKE '%LANG%'; 

그래서 DB Connection을 얻을 때 아래와 같은 처리를 했다

  @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource() {
            @Override
            public Connection getConnection() throws SQLException {
                Connection connection = super.getConnection();
                setupConnection(connection);
                return connection;
            }

        };
        dataSource.setJdbcUrl(this.jdbcUrl);
        dataSource.setDriverClassName(this.driverClassName);
        dataSource.setUsername(this.username);
        dataSource.setPassword(this.password);

        return dataSource;
    }


  public void setupConnection(Connection connection) {

        try (Statement stmt = connection.createStatement()) {
            stmt.addBatch("ALTER SESSION SET TIME_ZONE='+9:00'");
            stmt.addBatch("ALTER SESSION SET NLS_LANGUAGE='KOREAN'");
            stmt.addBatch("ALTER SESSION SET NLS_DATE_FORMAT='RR/MM/DD'");
            stmt.addBatch("ALTER SESSION SET NLS_DATE_LANGUAGE='KOREAN'");
            stmt.executeBatch();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

더 나은 해결책을 찾아보다가 도커로 배포되는 리눅스에 환경변수가 있음을
나중에 생각난것이다.
애초에 도커의 환경변수를 설정 해줬으면 됬을 것을 ...

현재 alpine 리눅스이므로

FROM openjdk:8-jre-alpine
RUN apk --no-cache add tzdata && \
     cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
     echo "Asia/Seoul" > /etc/timezone

우분투는 /etc/localtime 이 /usr/share/zoneinfo/Asia/Seoul 로 링크를 걸면 된다.
EC2일 경우에

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

만약 EB(Elastic Beanstalk)일 경우
.ebextensions 디렉토리에
00_timezone.config를 작성한다
https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/ebextensions.html

 commands:
 set_time_zone:
  command: ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime