{"id":2168,"date":"2016-05-30T07:54:06","date_gmt":"2016-05-30T07:54:05","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2168"},"modified":"2016-05-30T07:54:06","modified_gmt":"2016-05-30T07:54:05","slug":"vaadin-couchbase-crud-sample","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/vaadin-couchbase-crud-sample\/","title":{"rendered":"Vaadin\/\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 CRUD \uc0d8\ud50c"},"content":{"rendered":"<p>\uc9c0\ub09c\uc8fc \uc81c\uc774\ud3ec\ucfe0\uc2a4\uc5d0 \uc788\uc744 \ub54c \ub9cc\ub09c <a href=\"https:\/\/twitter.com\/mattitahvonen\">\ub9c8\ud2f0 \ud0c0\ubcf4\ub128<\/a>\uc5d0\uc11c \uadfc\ubb34\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/vaadin.com\/home\">Vaadin<\/a>. \uadf8\ub4e4\uc740 \uc218\ub144 \ub3d9\uc548 Java\ub85c \ub9ac\uce58 \uc778\ud130\ub137 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc704\ud55c \uc624\ud508 \uc18c\uc2a4 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc81c\uc548\ud574 \uc654\uc73c\uba70 \uc815\ub9d0 \uc798 \ud574\ub0b4\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc800\ub294 \uac1c\uc778\uc801\uc73c\ub85c \uc644\uc804\ud55c \uc6f9 \ucd5c\uc2e0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 Java\ub85c\ub9cc \uc791\uc131\ud558\uac8c \ub418\uc5b4 \uc815\ub9d0 \uae30\uc069\ub2c8\ub2e4.<\/p>\n<p>Couchbase\uc5d0 \uac1c\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \uc791\ub3d9\ud558\ub294 Vaadin CRUD \uc0d8\ud50c\uc744 \ub9cc\ub4dc\ub294 \ub370 10\ubd84\uc774 \uac78\ub838\uc2b5\ub2c8\ub2e4. \uacb0\uacfc\ub294 \ub2e4\uc74c\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/ldoguin\/couchbase-vaadin-spring-data-example\">Github<\/a>. \uadf8 \uc774\ud6c4\ub85c JPA \uae30\ubc18 \uc0d8\ud50c\ub3c4 \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud588\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/ldoguin\/spring-data-vaadin-crud\">\uc5ec\uae30<\/a>. \uc791\uc5c5\uc774 \uc5bc\ub9c8\ub098 \uc801\uac8c \ud544\uc694\ud558\uba70 JPA\uc5d0\uc11c Couchbase\ub85c \uc804\ud658\ud558\ub294 \uac83\uc774 \uc5bc\ub9c8\ub098 \uc26c\uc6b4\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/github.com\/ldoguin\/spring-data-vaadin-crud\/commit\/d811d560d68fc37906b85a49a50fd1512108a001\">diff<\/a>.<\/p>\n<h2>\uc2a4\ud504\ub9c1 \ub370\uc774\ud130 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc640 \ubc14\uc544\ub518\uc758 \ub9cc\ub0a8<\/h2>\n<h3>\ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131<\/h3>\n<p>Spring \ud504\ub85c\uc81d\ud2b8\ub97c \uc2dc\uc791\ud560 \ub54c \uccab \ubc88\uc9f8 \ub2e8\uacc4\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/start.spring.io\/\">\uc2a4\ud504\ub9c1 \ucd08\uae30\ud654<\/a>. \uc5ec\uae30\uc5d0\uc11c \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc6d0\ud558\ub294 \ubc84\uc804\uacfc \uc885\uc18d\uc131\uc744 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Spring Boot \ubc84\uc804 1.4.0(\uc2a4\ub0c5\uc0f7)\uc744 \uc120\ud0dd\ud558\uace0 \uc885\uc18d\uc131\uc73c\ub85c Vaadin \ubc0f Couchbase\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/vaadin-couchbase-crud-sample\/vaadincouchbasecrud.png\" \/><\/p>\n<p>\uc774\uc81c \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud558\uace0 \uc6d0\ud558\ub294 \ud3b8\uc9d1\uae30\uc5d0\uc11c Maven \ud504\ub85c\uc81d\ud2b8\ub85c \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uae30\ubcf8 \uac1c\uc778 \uc5d4\ud2f0\ud2f0 CRUD<\/h3>\n<p>\uc774 CRUD \uc0d8\ud50c\uc740 \ub2e4\uc74c\uc744 \uc800\uc7a5\ud569\ub2c8\ub2e4. <strong>\uace0\uac1d<\/strong> \uac1d\uccb4\uc785\ub2c8\ub2e4. \uace0\uac1d\uc774 <em>id<\/em>, a <em>\uc774\ub984<\/em> \ubc0f <em>\uc131<\/em>. \ub610\ud55c \uc131\uc740 null\uc774 \uc544\ub2c8\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \uc5d4\ud2f0\ud2f0\ub85c \ud45c\ud604\ud558\ub824\uba74 \uc5d4\ud2f0\ud2f0\uc5d0 <strong>\ubb38\uc11c<\/strong> \uc8fc\uc11d\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4, <strong>@Id<\/strong> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \ud544\ub4dc\uc5d0 \ucd94\uac00\ud558\uace0, \uac8c\ud130\uc640 \uc138\ud130\ub97c \uc0dd\uc131\ud558\uba74 \uc644\ub8cc\ub429\ub2c8\ub2e4. null\uc774 \uc544\ub2cc \uc81c\uc57d \uc870\uac74\uc744 \ud45c\ud604\ud558\ub824\uba74 Java \uc720\ud6a8\uc131 \uac80\uc0ac \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4. <strong>@NotNull.<\/strong> \uc5d4\ud2f0\ud2f0\ub97c \uc791\uc131\ud560 \ub54c \uc774\ub97c \uc120\ud0dd\ud558\ub3c4\ub85d \ud558\ub824\uba74 \uc720\ud6a8\uc131 \uac80\uc0ac\uae30 \ube48\uc744 \uc120\uc5b8\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre>\n<code>package hello;\n\nimport java.util.Objects;\nimport java.util.UUID;\n\nimport javax.validation.constraints.NotNull;\n\nimport org.springframework.data.couchbase.core.mapping.Document;\n\nimport com.couchbase.client.java.repository.annotation.Id;\n\n@Document\npublic class Customer {\n\n    @Id\n    private String id = UUID.randomUUID().toString();\n\n    private String firstName;\n\n    @NotNull\n    private String lastName;\n\n    protected Customer() {\n    }\n\n    public Customer(String firstName, String lastName) {\n        this.firstName = firstName;\n        this.lastName = lastName;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getFirstName() {\n        return firstName;\n    }\n\n    public void setFirstName(String firstName) {\n        this.firstName = firstName;\n    }\n\n    public String getLastName() {\n        return lastName;\n    }\n\n    public void setLastName(String lastName) {\n        this.lastName = lastName;\n    }\n\n    @Override\n    public String toString() {\n        return String.format(\"Customer[id=%s, firstName=&apos;%s&apos;, lastName=&apos;%s&apos;]\", id, firstName, lastName);\n    }\n\n    @Override\n    public int hashCode() {\n        int hash = 7;\n        hash = 37 * hash + Objects.hashCode(this.id);\n        return hash;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        if (this == obj) {\n            return true;\n        }\n        if (obj == null) {\n            return false;\n        }\n        if (getClass() != obj.getClass()) {\n            return false;\n        }\n        final Customer other = (Customer) obj;\n        return Objects.equals(this.id, other.id);\n    }\n\n}\n<\/code><\/pre>\n<h3>\uace0\uac1d \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac<\/h3>\n<p>\uc5d4\ud2f0\ud2f0\ub97c \uc815\uc758\ud55c \ud6c4\uc5d0\ub294 \uad00\ub828 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ud655\uc7a5\ud558\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. <strong>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ud398\uc774\uc9d5 \ubc0f \uc815\ub82c \uc800\uc7a5\uc18c<\/strong>. \uc774 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub294 <strong>\uace0\uac1d<\/strong> \uc5d4\ud2f0\ud2f0\uc5d0 \ubb38\uc790\uc5f4\uc744 \ud0a4\ub85c \uc9c0\uc815\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc800\ub294 <em>findAll<\/em> \uba54\uc11c\ub4dc\ub97c \ubc18\ud658\ud558\ub294 <strong>\ubaa9\ub85d<\/strong> \ub300\uc2e0 <strong>\ubc18\ubcf5 \uac00\ub2a5<\/strong> Vaadin \uad6c\uc870\uc640 \ub354 \uc798 \uc5b4\uc6b8\ub9ac\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uadf8\ub9ac\uace0 <em>findAll<\/em> \uba54\uc11c\ub4dc\ub294 \ubdf0\ub85c \ubc31\uc5c5\ub429\ub2c8\ub2e4. \ubdf0\uac00 \uc790\ub3d9\uc73c\ub85c \uc815\uc758\ub418\ub3c4\ub85d \ud558\ub824\uba74 \ubdf0\uc5d0<strong> ViewIndexed <\/strong>\uc8fc\uc11d\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub610\ud55c \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. <em>spring.data.couchbase.auto-index<\/em> \uc18d\uc131\uc744 \ucc38\uc73c\ub85c \uc124\uc815\ud558\uace0 <em>application.properties<\/em> \ud30c\uc77c\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.<\/p>\n<p>\ub610\ud55c <em>\uc131\uc73c\ub85c \ucc3e\uae30(\ubb38\uc790\uc5f4 lastName) <\/em>\uba54\uc11c\ub4dc\ub97c \uc785\ub825\ud569\ub2c8\ub2e4. \uba54\uc11c\ub4dc \uc774\ub984\uc5d0 \ub530\ub77c \uc801\uc808\ud55c N1QL \ucffc\ub9ac\uac00 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub429\ub2c8\ub2e4. \ud558\uc9c0\ub9cc N1Ql \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\ub824\uba74 \uae30\ubcf8 \uc778\ub371\uc2a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub294 \ub610\ud55c <strong>@N1QLPrimaryIndexed<\/strong> \uc5b4\ub178\ud14c\uc774\uc158.<\/p>\n<pre>\n<code>package hello;\n\nimport java.util.List;\n\nimport org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed;\nimport org.springframework.data.couchbase.core.query.ViewIndexed;\nimport org.springframework.data.couchbase.repository.CouchbasePagingAndSortingRepository;\n\n@ViewIndexed(designDoc = \"customer\")\n@N1qlPrimaryIndexed\npublic interface CustomerRepository extends CouchbasePagingAndSortingRepository<Customer, String> {\n\n    List<Customer> findAll();\n\n    List<Customer> findByLastName(String lastName);\n\n}\n<\/code><\/pre>\n<h3>\uad6c\uc131<\/h3>\n<p>\uc2a4\ud504\ub9c1 \uc2a4\ud504\ub9c1 \ubd80\ud305 \uc2a4\ud0c0\ud130 \ub370\uc774\ud130 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc790\ub3d9 \uad6c\uc131\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774 \uc790\ub3d9 \uad6c\uc131\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc124\uc815\ud558\uc5ec \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <em>spring.couchbase.bootstrap-hosts<\/em> \uc18d\uc131\uc785\ub2c8\ub2e4. \uc9c0\uae08\uae4c\uc9c0 \ub0b4 <em>application.properties<\/em> \ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\uc785\ub2c8\ub2e4:<\/p>\n<p>\u00a0<\/p>\n<pre>\n<code>spring.couchbase.bootstrap-hosts=localhost\nspring.data.couchbase.auto-index=true\n<\/code><\/pre>\n<p>\u00a0<\/p>\n<h3>\uace0\uac1d \ub9cc\ub4e4\uae30<\/h3>\n<p>\uc774\uc81c \uc800\uc7a5\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 \uac83\uc744 \uac16\ucd94\uc5c8\uc2b5\ub2c8\ub2e4. <strong>\uace0\uac1d<\/strong> \uc5d4\ud2f0\ud2f0\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. \uc774\ub97c \uc27d\uac8c \uc2dc\ub3c4\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>CommandLineRunner<\/strong>:<\/p>\n<pre>\n<code>@SpringBootApplication\npublic class Application {\n\n    private static final Logger log = LoggerFactory.getLogger(Application.class);\n\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class);\n    }\n\n    @Bean\n    public CommandLineRunner loadData(CustomerRepository repository) {\n        return (args) -> {\n            repository.save(new Customer(null, \"Dessler\"));\n        };\n    }\n\n    @Bean\n    public Validator validator() {\n        return new LocalValidatorFactoryBean();\n    }\n}\n<\/code><\/pre>\n<p>\uc55e\uc11c \uc5b8\uae09\ud55c \uc720\ud6a8\uc131 \uac80\uc0ac\uae30 \ube48\ub3c4 \ucd94\uac00\ud55c \uac83\uc744 \ubcf4\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ube48\uc740 <strong><a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/current\/api\/index.html?org\/springframework\/data\/couchbase\/core\/mapping\/event\/ValidatingCouchbaseEventListener.html\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc774\ubca4\ud2b8 \ub9ac\uc2a4\ub108 \uc720\ud6a8\uc131 \uac80\uc0ac<\/a><\/strong> \uc2a4\ud504\ub9c1 \ubd80\ud305 \uc790\ub3d9 \uad6c\uc131\uc5d0 \uc758\ud574 \uc790\ub3d9\uc73c\ub85c \uc120\uc5b8\ub429\ub2c8\ub2e4.<\/p>\n<h3>UI\uc5d0 Vaadin \uc0ac\uc6a9<\/h3>\n<p>\ubc31\uc5d4\ub4dc\uac00 \uc900\ube44\ub418\uc5c8\uc73c\ub2c8 \uc774\uc81c \ud504\ub860\ud2b8\uc5d4\ub4dc\uc5d0 \ub300\ud574 \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uac1d \ubaa9\ub85d\uc744 \ud45c\uc2dc\ud558\uace0 \ubaa9\ub85d\uc758 \uc694\uc18c\ub97c \ucd94\uac00, \ud3b8\uc9d1 \ub610\ub294 \uc81c\uac70\ud558\ub294 \uae30\ub2a5\uc744 \uac16\ucd98 \uae30\ubcf8 CRUD \uc571\uc744 \ub9cc\ub4e4\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \uc5ec\uae30 \uc2a4\ud06c\ub9b0\uc0f7\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/vaadin-couchbase-crud-sample\/vaadincrudui.png\" \/><\/p>\n<p>\uc774\ub97c \uad6c\ucd95\ud558\ub824\uba74 \uba3c\uc800 \uc0ac\uc6a9\uc790\uac00 \uc774\ub984\uacfc \uc131\uc744 \uc785\ub825\ud560 \uc218 \uc788\ub294 \uc591\uc2dd\uc744 \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc591\uc2dd\uc744 \ud655\uc7a5\ud558\ub294 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. <strong>AbstractForm<\/strong> \uc758 <strong>\uace0\uac1d<\/strong>. \uc774 \ud074\ub798\uc2a4\ub294 Vaadin Core\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc73c\ubbc0\ub85c \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. <a href=\"https:\/\/vaadin.com\/directory#!addon\/viritin\">\ube44\ub9ac\ud2f4<\/a>.<\/p>\n<blockquote><p>\ube44\ub9ac\ud2f4\uc740 \ubc14\uc544\ub518\uc758 \uc11c\ubc84 \uce21 \uac1c\uc120 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4. \ud575\uc2ec \ud504\ub808\uc784\uc6cc\ud06c\uc758 \uc77c\ubd80 \uc798\ubabb\ub41c \uae30\ubcf8\uac12\uc744 \uc218\uc815\ud558\uace0 \uae30\uc874 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc704\ud55c \ubcf4\ub2e4 \uc720\ucc3d\ud558\uace0 \uc9c0\ub2a5\uc801\uc778 API\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \ub610\ud55c \ub370\uc774\ud130 \ubc14\uc778\ub529\uc5d0 \ub300\ud55c \uba87 \uac00\uc9c0 \uc8fc\uc694 \uac1c\uc120 \uc0ac\ud56d\uc744 \uc81c\uacf5\ud558\uba70 \uc11c\ubc84 \uce21 \uad6c\uc131\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 \uc644\uc804\ud788 \uc0c8\ub85c\uc6b4 \uad6c\uc131 \uc694\uc18c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4(\uc704\uc82f \uc138\ud2b8\uac00 \ud544\uc694 \uc5c6\uc74c).<\/p><\/blockquote>\n<p>\uadf8\ub9ac\uace0 \uc608 <strong>AbstractForm<\/strong> \ud074\ub798\uc2a4\uac00 Spring \ub370\uc774\ud130 \ubc0f \uc720\ud6a8\uc131 \uac80\uc0ac\uae30\uc640 \uae54\ub054\ud558\uac8c \ud1b5\ud569\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 <em>\uc774\ub984<\/em> \uadf8\ub9ac\uace0 <em>\uc131<\/em> \ud544\ub4dc\uc758 <strong>\uace0\uac1d<\/strong> \ud074\ub798\uc2a4\uc5d0\uc11c \ub450 \uac1c\uc758 \ud14d\uc2a4\ud2b8 \ud544\ub4dc\ub97c \uc815\uc758\ud569\ub2c8\ub2e4. <em>\uc774\ub984<\/em> \uadf8\ub9ac\uace0 <em>\uc131<\/em>. \uace0\uac1d \ud544\ub4dc\uc640 \uc774\ub984\uc774 \uac19\uc544\uc57c \ud569\ub2c8\ub2e4. \uc774 \ucef4\ud3ec\ub10c\ud2b8\uc758 \ub610 \ub2e4\ub978 \uc7a5\uc810\uc740 \uc5d4\ud2f0\ud2f0\uc758 \uc720\ud6a8\uc131 \uac80\uc0ac \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uac00\uc838\uc628\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84\uc5d0\uc11c \uc790\ub3d9 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \ub354 \ubcf5\uc7a1\ud55c \uc5b4\ub178\ud14c\uc774\uc158\ub3c4 \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<strong style=\"line-height: 20.8px;\">@NotNull<\/strong><span style=\"line-height: 1.6em;\">\u00a0\uac19\uc740 <strong>@Size <\/strong>\ub610\ub294 <strong>\ud328\ud134<\/strong>.<\/span><\/p>\n<pre>\n<code>package hello;\n\nimport org.vaadin.viritin.form.AbstractForm;\nimport org.vaadin.viritin.layouts.MFormLayout;\n\nimport com.vaadin.spring.annotation.SpringComponent;\nimport com.vaadin.spring.annotation.UIScope;\nimport com.vaadin.ui.Component;\nimport com.vaadin.ui.TextField;\n\n@SpringComponent\n@UIScope\npublic class CustomerEditor extends AbstractForm<Customer> {\n\n    \/* Fields to edit properties in Customer entity *\/\n    TextField firstName = new TextField(\"First name\");\n    TextField lastName = new TextField(\"Last name\");\n\n    public CustomerEditor() {\n        setVisible(false);\n    }\n\n    @Override\n    protected Component createContent() {\n        return new MFormLayout(firstName, lastName, getToolbar());\n    }\n\n}\n<\/code><\/pre>\n<p>\uc774\uc81c \uc591\uc2dd\uc774 \uc900\ube44\ub418\uc5c8\uc73c\ubbc0\ub85c \ud45c \uadf8\ub9ac\ub4dc\ub97c \ud45c\uc2dc\ud558\ub294 \uc804\uccb4 UI\ub97c \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uac83\uc774 Vaadin \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc8fc\uc694 \uad6c\uc131 \uc694\uc18c\uc778 \uba54\uc778 \uc6f9 \ud398\uc774\uc9c0\uac00 \ub420 \uac83\uc785\ub2c8\ub2e4. \uba54\uc778 \uc6f9 \ud398\uc774\uc9c0\uc758 <strong>\uace0\uac1d \uc800\uc7a5\uc18c<\/strong> \ubc0f <strong>\uace0\uac1d \ud3b8\uc9d1\uc790<\/strong> \uac00 Spring \ube48\uc774\ub77c\uba74 \uc0dd\uc131\uc790\uc5d0\uc11c \uc9c1\uc811 \uc8fc\uc785\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Java UI \uc791\uc131\uc5d0 \uc775\uc219\ud558\ub2e4\uba74 \uc544\ub798\uc758 \uc8fc\uc11d \ucc98\ub9ac\ub41c \ucf54\ub4dc\ub294 \uac04\ub2e8\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<pre>\n<code>package hello;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.vaadin.viritin.fields.MTable;\nimport org.vaadin.viritin.layouts.MVerticalLayout;\n\nimport com.vaadin.annotations.Theme;\nimport com.vaadin.server.FontAwesome;\nimport com.vaadin.server.VaadinRequest;\nimport com.vaadin.spring.annotation.SpringUI;\nimport com.vaadin.ui.Button;\nimport com.vaadin.ui.UI;\n\n@SpringUI\n@Theme(\"valo\")\npublic class VaadinUI extends UI {\n\n    private final CustomerRepository repo;\n\n    private final CustomerEditor editor;\n\n    private final MTable<Customer> grid;\n\n    private final Button addNewBtn;\n\n    @Autowired\n    public VaadinUI(CustomerRepository repo, CustomerEditor editor) {\n        this.repo = repo;\n        this.editor = editor;\n        this.grid = new MTable<>(Customer.class).withProperties(\"id\", \"firstName\", \"lastName\").withHeight(\"300px\");\n        this.addNewBtn = new Button(\"New customer\", FontAwesome.PLUS);\n    }\n\n    @Override\n    protected void init(VaadinRequest request) {\n        \/\/ Connect selected Customer to editor or hide if none is selected\n        grid.addMValueChangeListener(e -> {\n            if (e.getValue() == null) {\n                editor.setVisible(false);\n            } else {\n                editor.setEntity(e.getValue());\n            }\n        });\n\n        \/\/ Instantiate and edit new Customer the new button is clicked\n        addNewBtn.addClickListener(e -> editor.setEntity(new Customer(\"\", \"\")));\n\n        \/\/ Listen changes made by the editor, refresh data from backend\n        editor.setSavedHandler(customer -> {\n            repo.save(customer);\n            listCustomers();\n            editor.setVisible(false);\n        });\n\n        editor.setResetHandler(customer -> {\n            editor.setVisible(false);\n            listCustomers();\n        });\n\n        editor.setDeleteHandler(customer -> {\n            repo.delete(customer);\n            listCustomers();\n        });\n\n        \/\/ Initialize listing\n        listCustomers();\n\n        \/\/ build layout\n            setContent(new MVerticalLayout(addNewBtn, grid, editor));\n        }\n\n        private void listCustomers() {\n            grid.setBeans(repo.findAll());\n        }\n\n    }\n<\/code><\/pre>\n<p>\uc774\uc81c \ubaa8\ub4e0 \uc900\ube44\uac00 \ub05d\ub0ac\uc73c\ub2c8 \uc77c\ubc18\uc801\uc778 Java Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc73c\ub85c \uc2e4\ud589\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4.  \uaf64 \uc27d\uc8e0?<\/p>","protected":false},"excerpt":{"rendered":"<p>Last week while I was at JFokus I met Matti Tahvonen, he works at Vaadin. They have been proposing an open source web framework for rich Internet applications in Java for years and do it really well. I am personally [&hellip;]<\/p>","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1818],"tags":[1595,1594],"ppma_author":[9023],"class_list":["post-2168","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-java","tag-spring-data-couchbase","tag-vaadin"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vaadin\/Couchbase CRUD Sample - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/vaadin-couchbase-crud-sample\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vaadin\/Couchbase CRUD Sample\" \/>\n<meta property=\"og:description\" content=\"Last week while I was at JFokus I met Matti Tahvonen, he works at Vaadin. They have been proposing an open source web framework for rich Internet applications in Java for years and do it really well. I am personally [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/vaadin-couchbase-crud-sample\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-30T07:54:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Vaadin\/Couchbase CRUD Sample\",\"datePublished\":\"2016-05-30T07:54:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\"},\"wordCount\":820,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"spring-data-couchbase\",\"vaadin\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Java\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\",\"name\":\"Vaadin\/Couchbase CRUD Sample - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-05-30T07:54:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vaadin\/Couchbase CRUD Sample\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vaadin\/Couchbase CRUD Sample - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/vaadin-couchbase-crud-sample\/","og_locale":"ko_KR","og_type":"article","og_title":"Vaadin\/Couchbase CRUD Sample","og_description":"Last week while I was at JFokus I met Matti Tahvonen, he works at Vaadin. They have been proposing an open source web framework for rich Internet applications in Java for years and do it really well. I am personally [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/vaadin-couchbase-crud-sample\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-05-30T07:54:05+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"7\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Vaadin\/Couchbase CRUD Sample","datePublished":"2016-05-30T07:54:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/"},"wordCount":820,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["spring-data-couchbase","vaadin"],"articleSection":["Best Practices and Tutorials","Java"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/","url":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/","name":"Vaadin\/Couchbase CRUD Sample - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-05-30T07:54:05+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vaadin\/Couchbase CRUD Sample"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"\ub85c\ub791 \ub3c4\uadc4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent\ub294 \ud30c\ub9ac\uc5d0 \uc0ac\ub294 \uad34\uc9dc \uae08\uc18d\uacf5\ud559\ub3c4\uc785\ub2c8\ub2e4. \uc8fc\ub85c Java\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0 AsciiDoc\uc73c\ub85c \uad6c\uc870\ud654\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uba70 \ub370\uc774\ud130, \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc0f \uae30\ud0c0 \uc720\ud589\uc5b4\uc5d0 \ub300\ud574 \uc790\uc8fc \uc774\uc57c\uae30\ud569\ub2c8\ub2e4. \ub610\ud55c Clever Cloud\uc640 Nuxeo\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\ub85c \ud65c\ub3d9\ud558\uba70 \ud574\ub2f9 \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub354 \ud06c\uace0 \uac15\ub825\ud558\uac8c \uc131\uc7a5\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uc2dc\uac04\uacfc \uc804\ubb38\uc131\uc744 \ubc14\ucce4\uc2b5\ub2c8\ub2e4. \ud604\uc7ac Couchbase\uc5d0\uc11c \uac1c\ubc1c\uc790 \uad00\uacc4\ub97c \uc6b4\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","first_name":"Laurent","last_name":"Doguin","user_url":"","author_category":"","description":"Laurent\ub294 \ud30c\ub9ac\uc5d0 \uc0ac\ub294 \uad34\uc9dc \uae08\uc18d\uacf5\ud559\ub3c4\uc785\ub2c8\ub2e4. \uc8fc\ub85c Java\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0 AsciiDoc\uc73c\ub85c \uad6c\uc870\ud654\ub41c \ud14d\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uba70 \ub370\uc774\ud130, \ub9ac\uc561\ud2f0\ube0c \ud504\ub85c\uadf8\ub798\ubc0d \ubc0f \uae30\ud0c0 \uc720\ud589\uc5b4\uc5d0 \ub300\ud574 \uc790\uc8fc \uc774\uc57c\uae30\ud569\ub2c8\ub2e4. \ub610\ud55c Clever Cloud\uc640 Nuxeo\uc758 \uac1c\ubc1c\uc790 \uc639\ud638\uc790\ub85c \ud65c\ub3d9\ud558\uba70 \ud574\ub2f9 \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub354 \ud06c\uace0 \uac15\ub825\ud558\uac8c \uc131\uc7a5\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uc2dc\uac04\uacfc \uc804\ubb38\uc131\uc744 \ubc14\ucce4\uc2b5\ub2c8\ub2e4. \ud604\uc7ac Couchbase\uc5d0\uc11c \uac1c\ubc1c\uc790 \uad00\uacc4\ub97c \uc6b4\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=2168"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/2168\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=2168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=2168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=2168"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=2168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}