Amazon CodeWhisperer は、IDE で完全なコード行と完全な関数コードの提案を生成する AI コーディング コンパニオン アプリで、より多くの作業をより速く完了できるようにします。この連載では、Amazon CodeWhisperer について詳しく紹介していきますので、お楽しみに!
アマゾン
コードウィスパラー
2023 年は、生成 AI が正式にその輪から抜け出す年と言えるでしょう。企業向けの大規模な言語モデルや個人を支援する AI ツールなど、無数のツールや製品が登場しています。中でも、AI プログラミング アシスタントの分野では多くの優れた製品が登場し、プログラマーが問題を作成および解決する方法を微妙に変えてきました。以前は、対応する公式 Web サイトを見つけたり、有名なフォーラムで答えを見つけたりするために検索エンジンに頼ることがよくありましたが、今では AI プログラミング アシスタントに頼るだけで多くの問題を解決できます。
Amazon Cloud Technology は、AI プログラミング アシスタント - Amazon CodeWhispererを開始しました。これは、AI コーディング コンパニオン アプリケーションを使用して、アプリケーションをより迅速かつ安全に構築できます。Amazon Cloud TechnologyはAIの分野で十分な蓄積があり、開発者がユーザーエクスペリエンスをフィードバックできる十分な経験と製品のユーザーエクスペリエンスも備えており、関連製品を繰り返し提供し続けています。同時に、Amazon Cloud の強力な利点とパワーにより、AI とクラウドを接続できます。これは、現在のクラウドネイティブ時代に不可欠な機能です。
目標と事前準備
まず、今日達成したい目標を紹介します。それは、Spring Bootフレームワークに基づいて、単純にユーザー ログインを実装することです。IntelliJ開発ツールを使用し、依存関係の管理には Maven を選択します。使用される依存関係は次のとおりです。
ウェブ
JPA
H2
まず CodeWhisperer プラグインをインストールし、プラグインで Amazon Toolkit を検索してダウンロードします。
ダウンロードが完了したら、Amazon アカウントをバインドして使用を開始します。自動提案はデフォルトでオンになっています。
プロジェクトの構造を次の図に示します。
pom.xml ファイルは次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
左にスワイプするとさらに表示されます
始める
健康診断
まず、最も単純なControllerを実装します。/pingをリクエストしてpongを返すだけです。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class PingController {
@RequestMapping("/ping")
public @ResponseBody String greeting() {
return "pong";
}
}
左にスワイプするとさらに表示されます
テスト ケースはコードの正しさを検証するために不可欠な部分です。簡単なテスト ケースを書いてみましょう。現時点では、CodeWhisperer がその強みを発揮し始めており、実行したいテスト コードを完全に指示する @Test アノテーションを 1 行書き込むだけです。
以下は完全なテストコードです。
package com.example.demo;
import com.example.demo.controller.PingController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@AutoConfigureMockMvc
@WebMvcTest(PingController.class)
public class TestWebApplication {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/ping")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string("pong"));
}
}
左にスワイプするとさらに表示されます
テスト ケースを実行すると、スムーズに成功します。
ユーザークラスの設計
ユーザーモデルを定義して、Table To Class の実装における特定のテーブル設計機能と、フィールドの関連付けおよび制約の設計機能があることを確認してみましょう。
必要なテーブル フィールドを推測し、インデックス制約を提案できます。これは初心者にとって大きな助けになります。テーブル構造の設計を指導する「熟練した」仲間がいると想像してください。その場合、テーブル構造の設計は比較的合理的になります。
package com.example.demo.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Indexed;
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "game_users")
public class User {
@Id
private Long id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false, length = 64)
private String password;
@Column(unique = true, nullable = false)
private String email;
}
左にスワイプするとさらに表示されます
DAO層の実装
公式 Web サイトの GIF 表示によると、コードの推論はコメントを通じて行うことができ、DAO 層の実装はそれに委ねられます。
電子メール アドレスに基づいてユーザーをクエリすることに関する上記のコメントによると、対応するプロンプトがすでに表示されています。コメントで複数のメソッドを説明して、もう一度テストしてみましょう。
こちらもスムーズに導入できました!
package com.example.demo.dao;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface UserDao extends JpaRepository<User, Long> {
// function to implement find user by email
Optional<User> findByEmail(String email);
Optional<User> findByUsername(String username);
// two function to implement find user by id or email
Optional<User> findById(Long id);
Optional<User> findByEmailIgnoreCase(String email);
// function to implement check user is existed
Boolean existsByEmail(String email);
}
左にスワイプするとさらに表示されます
要約すると、CRUDのDAO層実装はCodeWhisperer によって完了できます。テスト用にいくつかのデータを事前に挿入できることを期待しています。簡単なログ テストは簡単です。
package com.example.demo;
import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import org.slf4j.Logger;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
class LoadDatabase {
public static final Logger log = org.slf4j.LoggerFactory.getLogger(LoadDatabase.class);
// this is Bean is loaded once in the application context
// it is used to load the data into the database
@Bean
public CommandLineRunner initDatabase(UserDao dao) {
return args -> {
log.info("Preloading " + dao.save(new User(1L, "test1", "111111", "[email protected]")));
log.info("Preloading " + dao.save(new User(2L, "test2", "222222", "[email protected]")));
};
}
}
左にスワイプするとさらに表示されます
サービス層の実装
サービス層の番です。ここでは、ユーザー名に基づいてユーザーをクエリし、対応するデータを返すだけです。メソッド シグネチャの作成が途中まで進んだとき、メソッド シグネチャは基本的に期待どおりであり、一定の記憶力と連想能力を備えていたため、入力をやめるよう提案されました。DAOレイヤーで定義されたOptional<User>。対応するメソッドもここで処理できます。
package com.example.demo.service;
import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class UserDetailServiceImpl {
private final UserDao userdao;
@Autowired
public UserDetailServiceImpl(UserDao userdao) {
this.userdao = userdao;
}
public User getUserByUsername(String username) throws Exception {
Optional<User> user = userdao.findByUsername(username);
if (user.isPresent()) {
return user.get();
} else {
throw new Exception("User not found");
}
}
}
左にスワイプするとさらに表示されます
コントローラー層の実装
最後に、最も外側のエントリを実装し、関連するビジネス検証 (ユーザー名が空かどうか、およびパスワードが正しいかどうか) を単純に実行します。ここではデモンストレーションに使用されます。
ユーザーに関連する処理はなく、パスワードの正当性の検証は基本的に要件を満たしています。
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserDetailServiceImpl;
import org.apache.coyote.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
public class UserController {
private final UserDetailServiceImpl userDetailService;
@Autowired
public UserController(UserDetailServiceImpl userDetailService) {
this.userDetailService = userDetailService;
}
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody User user) {
try {
if (user.getUsername().isEmpty()) {
return ResponseEntity.badRequest().body("user name is empty");
}
User res;
res = userDetailService.getUserByUsername(user.getUsername());
if (res == null) {
return ResponseEntity.badRequest().body("user not found");
}
if (res.getPassword().equals(user.getPassword())) {
return ResponseEntity.ok(res);
}
return new ResponseEntity<>("user password invalid", HttpStatus.BAD_REQUEST);
} catch (Exception e) {
return ResponseEntity.notFound().build();
}
}
}
左にスワイプするとさらに表示されます
最後に、フォーマットエラーとユーザーパスワードエラーの状況をテストしてみましょう。
予想通り。
要約する
CodeWhisperer は現在でも非常に賢く、私たちが使用するのに便利です。メモリおよび関連付け機能を備えた AI プログラミング ツールとして、CodeWhisperer が今日実証したメモリ関連付け効果は非常に優れており、特定のテーブル構造設計機能を備えており、いくつかの単純なテスト ケースの完成度も良好です。将来的には、いくつかの単純で些細な要件やテスト ケースもそれに引き継がれる可能性があります。より複雑なシナリオについては、モデルのデータ量と品質が引き続き最適化されているため、次々と解決できると思います。
スターが失われることはなく、開発が速くなります。
フォローした後は、必ず「Amazon Cloud Developer」にスターを付けてください
聞いたので、下の 4 つのボタンをクリックしてください
バグに遭遇することはありません!