gradle 추가
dependencies {
	...
    implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1"
    implementation group: 'org.postgresql', name: 'postgresql', version: '42.1.4'
}


xml 파일 설정
...
spring:
  application:
    name: dockerTestApp
  datasource:
    url: jdbc:postgresql://서버ip:5432/db명
    username: id
    password: 비밀번호
    driver-class-name: org.postgresql.Driver

이부분만 추가해주면 db 셋팅 부분은 끝났다!

간단하게 실제 db의 테이블에서 정보를 가져와 보자

간단한 예제
public class Anonymous {
    private String name;

    public String getName() {
        return name;
    }
}
  • 테이블과 매핑되는 class
import com.test.hello.domain.Anonymous;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface AnonymousMapper {
    @Select("SELECT * FROM anonymous WHERE anonymous_id = #{id}")
    Anonymous find(@Param("id") Integer id);
}
  • table과 Anonymous class를 mapping해주는 mapper
@RestController
public class AnonymousController {

    @Autowired
    AnonymousMapper anonymousMapper;

    @GetMapping("/user")
    public String getName() {
        return anonymousMapper.find(1).getName();
    }
}
  • 실행해주는 controller
  • 성모님 말씀이 요즘엔 Autowired를 안쓰는 추세라고 한다. 다른 방법을 적용해 보자!



db 정보 숨기기



1. 환경 변수 사용하기


1.Edit configuration에서 환경 변수 값 설정

인텔리제이에서는 다음과 같은 UI를 제공해 준다. 여기서 설정해주자.

img


2.xml 파일 수정

  datasource:
      url: ${db.url}
      username: ${db.username}
      password: ${db.password}
      driver-class-name: org.postgresql.Driver

만약 명령어를 통해 jar 파일로 실행 시킨다면

java -jar -Durl=jdbc:postgresql://ip/db명 -Dusername=유저명 -Dpassword=비밀번호 와 같은 형식으로 실행시킬 수 있다.



2. Jasypt 사용하기

1.gradle 추가

// https://mvnrepository.com/artifact/org.jasypt/jasypt
compile group: 'org.jasypt', name: 'jasypt', version: '1.9.2'


2.config 파일 추가

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class JaspyConfig {

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("thisiskey"); //암호화에 사용할 키 -> 중요
        config.setAlgorithm("PBEWithMD5AndDES"); //사용할 알고리즘
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}


3.암호화 하기

이제 암호화를 실행할 것이다. 어디서 하던지 상관없는데 CommandLineRunner를 사용해서 Application에서 실행해 보겠다. (테스트 파일에서 실행해도 좋을 것 같다.)

@SpringBootApplication
public class DockerTestApplication implements CommandLineRunner {
    public static void main(String[] args) {
    SpringApplication.run(DockerTestApplication.class, args);
  }


    @Override
    public void run(String... args) {
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword("thisiskey"); //2번 설정의 암호화 키를 입력

        String enc = pbeEnc.encrypt("cafe24@~~~~~~~~`"); //암호화 할 내용
        System.out.println("enc = " + enc); //암호화 한 내용을 출력

        //테스트용 복호화
        String des = pbeEnc.decrypt(enc);
        System.out.println("des = " + des);
    }
}

위와 같은 방식으로 우리가 필요한 url과 username, password를 암호화 시키면 된다.


4.암호화 값 적용

yml 파일에서 암호화 된 값을 적용하자.

url: ENC( 암호화된 값) 으로 설정한다.

이때 암호화 방법과 키에 따라 다르겠지만, 암호화 된 값은 매번 같은 값이 나오는 것은 아니다 !

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: ENC(aWMfwdRL4shAoa3binQxM0gOn5dWtmHyhWxuuFx2vDEwBhhXxSWJ3NEWZYsgbfQsdTx7tyvPKio=)
    username: ENC(cqyeXqEpfPcAKuAoFrJ7IQ==)
    password: ENC(XQFHn29LATCsIljeVYtmXmvHBfZrSPP6)

우리는 db 설정에 필요한 값을 암호화 했지만, 환경 변수설정이 필요할 때 유용하게 사용할 수 있을것 같다.