{"id":6599,"date":"2022-10-17T22:13:42","date_gmt":"2022-10-17T13:13:42","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6599"},"modified":"2022-10-18T18:10:50","modified_gmt":"2022-10-18T09:10:50","slug":"vault-with-spring","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6599","title":{"rendered":"Vault with Spring"},"content":{"rendered":"<h1>Vault with Spring<\/h1>\n<p>\uc5ec\ub7ec\uac00\uc9c0 \ucc3e\uc544\ubcf4\uc558\ub294\ub370&#8230;<br \/>\n\uacb0\uacfc\uc801\uc73c\ub85c \uc544\ub798 \ubc29\uc2dd\uc774 \uac00\uc7a5 \uac04\ub2e8\ud558\uace0 \uc774\ud574\ud558\uae30 \uc27d\uad70\uc694.<\/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    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\n  path: team1\/foo<\/code><\/pre>\n<h2>DTO<\/h2>\n<pre><code class=\"language-java\">@Getter\n@Setter\npublic class VaultDTO {\n    private String username;\n    private String password;\n}<\/code><\/pre>\n<h2>config<\/h2>\n<p>VaultEndpoint \uc5d0 \ub300\ud55c \ub2e4\ub978 \uc124\uc815\ubc29\ubc95\uc740 <a href=\"https:\/\/www.baeldung.com\/spring-vault\">\uc5ec\uae30<\/a> \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\ub2e4\ub978 \uc778\uc99d\ubc29\ubc95\uc740 <a href=\"https:\/\/docs.spring.io\/spring-vault\/docs\/current\/reference\/html\/index.html#vault.core.authentication\">\uc5ec\uae30<\/a> \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\"language-java\">@Configuration\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    @Value(&quot;${vault.props.path}&quot;)\n    private String vaultPath;\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\n    public VaultDTO getDTO() {\n        \/\/ secret \uc0dd\uc131\ud558\uae30\n        \/\/ VaultDTO vaultDTO = new VaultDTO();\n        \/\/ vaultDTO.setUsername(&quot;username1&quot;);\n        \/\/ vaultDTO.setPassword(&quot;password1&quot;);\n        \/\/\n        \/\/ vaultTemplate.write(&quot;team1\/foo2&quot;, vaultDTO);\n\n        \/\/ vault kv put team1\/foo username=username1 password=password1\n        return Objects.requireNonNull(vaultTemplate().read(vaultPath, VaultDTO.class)).getData();\n    }\n}<\/code><\/pre>\n<h2>Application<\/h2>\n<pre><code class=\"language-java\">@RestController\n@SpringBootApplication\n@RequiredArgsConstructor\npublic class VaultTestApplication {\n\n    private final VaultConfig vaultConfig;\n\n    @RequestMapping(&quot;\/&quot;)\n    public String home() {\n        VaultDTO vaultDTO = vaultConfig.getDTO();\n\n        System.out.printf(&quot;username : %s%n&quot;, vaultDTO.getUsername());\n        System.out.printf(&quot;password : %s%n&quot;, vaultDTO.getPassword());\n\n        return &quot;OK!&quot;;\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(VaultTestApplication.class, args);\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Vault with Spring \uc5ec\ub7ec\uac00\uc9c0 \ucc3e\uc544\ubcf4\uc558\ub294\ub370&#8230; \uacb0\uacfc\uc801\uc73c\ub85c \uc544\ub798 \ubc29\uc2dd\uc774 \uac00\uc7a5 \uac04\ub2e8\ud558\uace0 \uc774\ud574\ud558\uae30 \uc27d\uad70\uc694. \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; 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 path: team1\/foo DTO @Getter @Setter public class VaultDTO { private String username; private String password; }\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6599\">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":[31],"tags":[],"class_list":["post-6599","post","type-post","status-publish","format-standard","hentry","category-nomad"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6599","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=6599"}],"version-history":[{"count":7,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6599\/revisions"}],"predecessor-version":[{"id":6615,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6599\/revisions\/6615"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}