{"id":6610,"date":"2022-10-18T22:43:28","date_gmt":"2022-10-18T13:43:28","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6610"},"modified":"2022-10-18T17:44:39","modified_gmt":"2022-10-18T08:44:39","slug":"spring-vault-repository","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6610","title":{"rendered":"Spring Vault Repository"},"content":{"rendered":"<h1>Spring Vault Repository<\/h1>\n<p>Spring Vault \ub294 Repository \ubc29\uc2dd\uc73c\ub85c\ub3c4 secret \uc744 \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n<h2>\uc758\uc874\uc131 \ucd94\uac00<\/h2>\n<pre><code class=\"language-gradle\">dependencies {\n    implementation &#039;org.springframework.boot:spring-boot-starter-web&#039;\n    implementation &#039;org.springframework.vault:spring-vault-core:2.3.2&#039;\n    implementation &#039;org.springframework.data:spring-data-keyvalue&#039;\n    compileOnly &#039;org.projectlombok:lombok&#039;\n    annotationProcessor &#039;org.projectlombok:lombok&#039;\n    testImplementation &#039;org.springframework.boot:spring-boot-starter-test&#039;\n}<\/code><\/pre>\n<h2>application.yaml<\/h2>\n<pre><code class=\"language-yaml\">vault.props:\n  schema: http\n  host: 52.79.XXX.XXX\n  port: 8200\n  roleId: 2067e81e-beXXXXXXXXXXXX\n  secretId: ab42a69b-94aa-0fXXXXXXXXXXXXXXXXXXX<\/code><\/pre>\n<h2>entity \uc0dd\uc131<\/h2>\n<p><code>team1\/logininfo<\/code> \uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-java\">@Getter\n@Secret(backend = &quot;team1&quot;, value = &quot;logininfo&quot;)\npublic class LoginInfo {\n    @Id\n    private String id;\n\n    private String username;\n    private String password;\n}<\/code><\/pre>\n<h2>repository \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">public interface LoginInfoRepository extends CrudRepository&lt;LoginInfo, String&gt; {\n}<\/code><\/pre>\n<h2>VaultConfig \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">@Configuration\n@EnableVaultRepositories\npublic class VaultConfig extends AbstractVaultConfiguration {\n\n    @Value(&quot;${vault.props.schema}&quot;)\n    private String schema;\n\n    @Value(&quot;${vault.props.host}&quot;)\n    private String host;\n\n    @Value(&quot;${vault.props.port}&quot;)\n    private String port;\n\n    @Value(&quot;${vault.props.roleId}&quot;)\n    private String roleId;\n\n    @Value(&quot;${vault.props.secretId}&quot;)\n    private String secretId;\n\n    @Override\n    public VaultEndpoint vaultEndpoint() {\n        try {\n            return VaultEndpoint.from(new URI(String.format(&quot;%s:\/\/%s:%s&quot;, schema, host, port)));\n        } catch (URISyntaxException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public ClientAuthentication clientAuthentication() {\n        AppRoleAuthenticationOptions options = AppRoleAuthenticationOptions.builder()\n                .roleId(AppRoleAuthenticationOptions.RoleId.provided(roleId))\n                .secretId(AppRoleAuthenticationOptions.SecretId.provided(secretId))\n                .build();\n        return new AppRoleAuthentication(options, restOperations());\n    }\n}<\/code><\/pre>\n<h2>Application \uc218\uc815<\/h2>\n<pre><code class=\"language-java\">@RestController\n@SpringBootApplication\n@RequiredArgsConstructor\npublic class SpringVaultRepositoryApplication {\n\n    private final LoginInfoRepository repository;\n\n    @RequestMapping(&quot;\/&quot;)\n    public String home() {\n        \/\/ vault kv put team1\/logininfo\/foo username=username1 password=password1\n        Optional&lt;LoginInfo&gt; loginInfo = repository.findById(&quot;foo&quot;);\n\n        loginInfo.ifPresent(info -&gt; System.out.printf(&quot;username : %s%n&quot;, info.getUsername()));\n        loginInfo.ifPresent(info -&gt; System.out.printf(&quot;password : %s%n&quot;, info.getPassword()));\n\n        return &quot;OK!&quot;;\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(SpringVaultRepositoryApplication.class, args);\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring Vault Repository Spring Vault \ub294 Repository \ubc29\uc2dd\uc73c\ub85c\ub3c4 secret \uc744 \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud55c\ub2e4. \uc758\uc874\uc131 \ucd94\uac00 dependencies { implementation &#039;org.springframework.boot:spring-boot-starter-web&#039; implementation &#039;org.springframework.vault:spring-vault-core:2.3.2&#039; implementation &#039;org.springframework.data:spring-data-keyvalue&#039; compileOnly &#039;org.projectlombok:lombok&#039; annotationProcessor &#039;org.projectlombok:lombok&#039; testImplementation &#039;org.springframework.boot:spring-boot-starter-test&#039; } application.yaml vault.props: schema: http host: 52.79.XXX.XXX port: 8200 roleId: 2067e81e-beXXXXXXXXXXXX secretId: ab42a69b-94aa-0fXXXXXXXXXXXXXXXXXXX entity \uc0dd\uc131 team1\/logininfo \uc5d0\uc11c \uac12\uc744 \uc870\ud68c\ud55c\ub2e4. @Getter @Secret(backend = &quot;team1&quot;, value = &quot;logininfo&quot;)\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6610\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-6610","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6610"}],"version-history":[{"count":2,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6610\/revisions"}],"predecessor-version":[{"id":6613,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6610\/revisions\/6613"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}