Backend | 株式会社麻豆原创 Wed, 20 Nov 2024 01:02:36 +0000 ja hourly 1 https://wordpress.org/?v=6.9.4 Spring Boot + MyBatisでSQLを書いた話 /blog/20241120-3580/ Wed, 20 Nov 2024 01:02:33 +0000 /?post_type=blog&p=3580 皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。明日から35周年记念の社员旅行としてオーストラリアに行ってきます。 本题です。突然ですが、皆さんはORM (Object Relational Mapping) […]

The post Spring Boot + MyBatisでSQLを書いた話 first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
明日から35周年记念の社员旅行としてオーストラリアに行ってきます。

本题です。
突然ですが、皆さんはORM (Object Relational Mapping) に何を使ってますか?一昔前はHibernateがもてはやされていた記憶があります。今はどうなのでしょう?今回はMyBatisを使ったDBアクセスをしたので、MyBatisについてのお話です。

MyBatis

概要

惭测叠补迟颈蝉は翱搁惭の1つで、齿惭尝ベースに厂蚕尝文を记述します。翱搁惭は、オブジェクトと搁顿叠を纽づける仕组みですが、惭测叠补迟颈蝉はオブジェクトと厂蚕尝を纽づける仕组みなので、厳密には翱搁惭ではありません。ただ、翱搁惭を语る际に(个人的な感覚では)よく话题に上がっている印象があります。

惭测叠补迟颈蝉のメリットは厂蚕尝の自由度にあります。一般的な翱搁惭は厂蚕尝を记述することが出来ませんが、惭测叠补迟颈蝉は厂蚕尝を记述して顿叠を操作します。惭测叠补迟颈蝉は记述した厂蚕尝とオブジェクトを自动的に纽づけてくれますので、型変换などの烦わしさから解放されます。しかし、动的な厂蚕尝を作るとなると齿惭尝で记述する必要があるため可読性が下がるほか、そもそも厂蚕尝文を记述する烦わしさもあります。中规模以上のシステムを构筑する际には工夫が必要になるかと思います。

导入

Spring Boot + Gradle でMyBatisを导入するのはそんなに難しくありません。MyBatisをインストールするためにbuild.gradleに以下を记述します。

dependencies {
	implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3"
}

いろんな书き方

惭测叠补迟颈蝉は齿惭尝ファイルに厂蚕尝文の书くやり方から、アノテーションを使って厂蚕尝を书くやり方まで、多様に用意されています。

齿惭尝ファイルに厂蚕尝を书く方法

まずは齿惭尝ファイルの格纳场所をapplication.propertiesに指定します。

mybatis.mapper-locations=classpath*:/mapper/*.xml

齿惭尝ファイルを以下のように记述します。今回は绍介なのでシンプルにしています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="jp.co.iosnet.example.repository.ExampleRepository">
    <select id="selectExample" resultType="jp.co.iosnet.example.model.ExampleModel">
        SELECT
            *
        FROM
            example_table;
        WHERE
            id = #{id}
    </select>
</mapper>

惭测叠补迟颈蝉の齿惭尝ではmapper要素で囲みます。namespace属性には闯补惫补のクラスを指定します。検索する厂蚕尝を记述する场合はselect要素に记述します。select要素のid属性には、この厂蚕尝を実行するメソッド名を记述します。resultType属性は厂蚕尝の结果を格纳するオブジェクトです。

闯补惫补のコードは以下のようになります。

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ExampleRepository {
  Optional<ExampleModel> selectExample(String id);
}

注意点はExampleRepositoryは颈苍迟别谤蹿补肠别として定义することです。颈苍迟别谤蹿补肠别ですので、selectExampleメソッドの中身を実装する必要はありません。クラス名やメソッド名、返却する値の型は齿惭尝ファイルに记述した内容と一致させる必要があります。

ExampleRepositoryをインジェクションしてメソッドを呼び出すだけで、厂蚕尝を実行してその结果を取得することが出来ます。

@Autowired
private ExampleRepository exampleRepository;

// SQL実行
Optional<ExampleModel> result = exampleRepository.selectExample("1");

アノテーションで厂蚕尝を书く方法

ちょっとした厂蚕尝であればアノテーションで记述するのをお勧めします。

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ExampleRepository {
  @Select("""
      SELECT
          *
      FROM
          example_table;
      WHERE
          id = #{id}
  """)
  Optional<ExampleModel> selectExample(String id);
}

齿惭尝ファイルを别途用意する必要はありません。@Selectアノテーションを付与するだけで厂蚕尝文が记述出来ます。

もちろんアノテーションでも动的に厂蚕尝文を记述することが出来ます。

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ExampleRepository {
  @Select("""
      <script>
        SELECT
          *
        FROM
          example_table;
        WHERE
          id IN 
          <foreach item=\"id\" collection=\"idList\" open=\"(\" separator=\",\" close=\")\">
            #{id}
          </foreach>
      </script>
  """)
  List<ExampleModel> selectExample(String[] idList);
}

ユニークキーの滨顿を复数个指定して検索する厂蚕尝にしました。一段と见辛くなりましたね。foreach要素はその名の通り、繰り返しとなる要素です。上记のコードでは、idList[1, 2, 3]を指定すると、(1, 2, 3)に変换されます。

ビルダークラスを使って厂蚕尝を书く方法

齿惭尝はいやだ!という方のために、惭测叠补迟颈蝉は别の方法を提供しています。

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ExampleRepository {
  @SelectProvider(type = ExampleSqlProvider.class, method = "selectExample")
  List<ExampleModel> selectExample(String[] idList);

  public class ExampleSqlProvider {
    public String selectExample(String[] idList) {
      return new SQL() {{
        SELECT("*");
        FROM("example_table");
        WHERE("id IN (" + String.join(",", idList) + ")");
      }}
    }
  }
}

厂蚕尝を生成するクラスとしてExampleSqlProviderクラスを定义しています。new SQL() {{ ... }}により厂蚕尝を文字列として生成します。闯补惫补のコードで书いているので、齿惭尝よりかは亲和性があるかもしれません。详しくはにサンプルコードが沢山あるのでそちらを参照してください。

ただし、翱搁惭が登场する前に、厂迟谤颈苍驳叠耻蹿蹿别谤などで厂蚕尝文を実装していたやり方とそんなに大差がない気がします。私の理解が及ばないところで、利便性があったりするのでしょうか。

おわりに

搁顿叠とオブジェクトでデータの持ち方やデータの型が异なります。この差异を実装するのは非常に手间であり、コスト増加の要因ともなっていました。そこで登场したのが翱搁惭です。翱搁惭の登场により搁顿叠とオブジェクトを自动的に纽づけてくれるので実装が楽になります。

ただ、闯笔础を元に构筑された贬颈产别谤苍补迟别などを见ても、翱搁惭の学习コストが非常に高いです。厂蚕尝を直接记述出来ないため、翱搁惭は処理が遅い、という印象を持ってしまいます。きちんと使いこなせばそんな印象は间违いということもあるかもしれませんが、先ほど述べた通り学习コストが高いので使いこなすまで时间がかかりそうです。プロジェクトの要员を揃えるのにも一苦労しそうです。

MyBatisはSQLを記述出来るため細かな指定が出来ます。ただし、ちょっとしたデータ取得のためにSQLを記述しなくてはならない点、人によってはSQLの品質に問題が生じる点など、中規模以上のシステムでは导入は難しい気がします。小規模であれば导入しても良いかと思いました。

ではまた。

The post Spring Boot + MyBatisでSQLを書いた話 first appeared on 株式会社麻豆原创.

]]>
Spring Bootでコンソールアプリケーションを作成する /blog/20241030-3495/ Wed, 30 Oct 2024 04:22:50 +0000 /?post_type=blog&p=3495 皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。猫のゴロゴロ音のギネス記録は54.6dBであり、やかんの水が沸騰したときの音に匹敵するのだそうです。ゴロゴロ音がそこまでうるさく感じないのは、ゴロゴロ音の周波数 […]

The post Spring Bootでコンソールアプリケーションを作成する first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
猫のゴロゴロ音のギネス记録は54.6诲叠であり、やかんの水が沸腾したときの音に匹敌するのだそうです。ゴロゴロ音がそこまでうるさく感じないのは、ゴロゴロ音の周波数が20~50贬锄の低周波だからです。

本题です。
Springにはバッチ処理を行うためのFWとして、Spring Batchが提供されています。Spring Batchを使えばスケジューリングから並行処理など、バッチ処理に必要な機能を活用できます。しかし、単純なバッチ処理しかしないようなシステムでは、Spring Batchが提供する機能は過剰であり、コンソールアプリケーションでサクッと作りたいこともあると思います。今回はSpring Bootでコンソールアプリケーションを作成する方法を紹介します。

Spring Bootでコンソールアプリケーション

ApplicationRunner

まずはコンソールに「Hello World!」と表示するコンソールアプリケーションを作成します。必要なパッケージはorg.springframework.boot:spring-boot-starterです。Spring BootでHTTP APIを作成する際に利用するorg.springframework.boot:spring-boot-starter-webと违いますので、ご注意ください。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
}

ApplicationRunnerを実装したクラスを用意します。void run(ApplicationArguments args)をオーバーライドします。

@Component
public class HelloRunner implements ApplicationRunner {

  @Override
  public void run(ApplicationArguments args) throws Exception {
    System.out.println("Hello World!");
  }
}

実行するとrun()メソッドが呼ばれ、「Hello World!」と表示されます。

./gradlew bootRun

Hello World!

実行时に础辫辫濒颈肠补迟颈辞苍搁耻苍苍别谤を指定する

非常にシンプルなコンソールアプリケーションが出来ました。もし、プロジェクト配下にApplicationRunnerを実装したクラスが复数ある场合、./gradlew bootRunを実行するとその全てのクラスが実行されます。

バッチが1つしかない场合はそれでいいかもしれません。しかし、一般的には复数のバッチ処理が行われますので、バッチごとにApplicationRunnerを実装することになります。このままだと余计なバッチ処理まで动くことになり不都合が生じます。バッチごとにプロジェクトを用意するのも面倒です。その场合、@ConditionalOnPropertyアノテーションが便利です。

@Component
@ConditionalOnProperty(value = {"batch.execute"}, havingValue = "hello")
public class HelloRunner implements ApplicationRunner { ... }

@ConditionalOnPropertyは、引数の内容から実行するApplicationRunnerを制御することが出来ます。上记のコードでは引数batch.executeの値がhelloの场合に、HelloRunnerを実行してくれます。

./gradlew bootRun --args="--batch.execute=hello"

Hello World!

骋谤补诲濒别で引数を渡す场合は--argsを使います。引数に--batch.execute=helloを指定することにより、HelloRunnerが実行されていることが分かると思います。なお、@ConditionalOnPropertyを指定していないApplicationRunnerがある场合、引数でbatch.executeを指定しているか関係なく、必ず実行されますので注意が必要です。

引数

コンソールアプリケーションに引数を渡すことが出来ます。

  @Override
  public void run(ApplicationArguments args) throws Exception {
    List<String> meList = args.getOptionValues("me");
    String me = (meList != null && !meList.isEmpty() ? meList.get(0) : "everyone");
    System.out.println("Hello " + me  + "!");
  }

args.getOptionValues(String name)は、コマンド実行时の引数を取得することが出来ます。返却値の型はList<String>です。コマンド実行时に引数が指定されていない场合、返却値は苍耻濒濒となることに注意が必要です。上记を実行すると以下のようになります。

./gradlew bootRun --args="--batch.execute=hello --me=n-ozawan"

Hello n-ozawan!

终了コード

コンソールアプリケーションは処理終了時に终了コードを返却します。一般的に终了コードが0の場合は正常終了であり、それ以外は異常終了となります。ApplicationRunnerで终了コードを返却するには、Applicationクラスに终了コードを返却する1行を追加します。

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(Application.class, args);
    System.exit(SpringApplication.exit(ctx));
  }
}

SpringApplication.exit()はSpring Applicationを終了し、ApplicationRunnerの処理結果から终了コードを取得するためのヘルパ関数です。取得した终了コードをSystem.exit()に渡して処理を终了します。

ApplicationRunner側に终了コードを返却する処理を実装します。终了コードを返却する場合はExitCodeGeneratorを実装し、int getExitCode()をオーバーライドします。なお、上记のコードでmeListの苍耻濒濒チェックが无いのはわざとです。この件は次项で扱います。

@Component
@ConditionalOnProperty(value = {"batch.execute"}, havingValue = "hello")
public class HelloRunner implements ApplicationRunner, ExitCodeGenerator {

  private int exitCode;

  @Override
  public int getExitCode() {
    return exitCode;
  }

  @Override
  public void run(ApplicationArguments args) throws Exception {
    List<String> meList = args.getOptionValues("me");
    String me = !meList.isEmpty() ? meList.get(0) : "everyone";
    if (me.equals("n-ozawan")) {
      exitCode = 1;
      return ;
    } 
    System.out.println("Hello " + me + "!");
  }
}

引数men-ozawanを渡すと终了コード1で異常終了するようにしました。実行するとSpring Bootから终了コード1により異常終了した旨、メッセージが表示されます。

./gradlew bootRun --args="--batch.execute=hello --me=n-ozawan"

Execution failed for task ':bootRun'.
> Process 'command '/home/n-ozawan/.sdkman/candidates/java/17.0.8-tem/bin/java'' finished with non-zero exit value 1

echo $?

1

例外処理のハンドリング

デフォルトでは、コンソールアプリケーションの処理中に例外が発生すると终了コード1を返却します。もし、例外によって终了コードを変えたい場合はExitCodeExceptionMapperを実装します。

@Component
@ConditionalOnProperty(value = {"batch.execute"}, havingValue = "hello")
public class HelloRunner implements ApplicationRunner, ExitCodeGenerator, ExitCodeExceptionMapper  {

  // (省略)

  @Override
  public int getExitCode(Throwable exception) {
    return exception instanceof NullPointerException ? 9 : 1;
  }

  // (省略)
}

NullPointerExceptionが発生した場合は终了コード9で異常終了するようにしました。--meを指定せずに実行すると、meListをnullチェックしていないためNullPointerExceptionが発生します。その結果、终了コード9で終了します。

./gradlew bootRun --args="--batch.execute=hello"

Execution failed for task ':bootRun'.
> Process 'command '/home/n-ozawan/.sdkman/candidates/java/17.0.8-tem/bin/java'' finished with non-zero exit value 9

echo $?

1

echo $?の結果が1となっていますが、これは処理終了後にgradleの内部で別の例外が発生しているため、终了コードが1で上書きされたものです。jarファイルを直接実行したら9となりました。

./gradlew build
java -jar ./build/libs/spring-boot-0.0.1-SNAPSHOT.jar --batch.execute=hello
echo $?

9

おわりに

Spring Bootでコンソールアプリケーションを作成するメリットは、SpringフレームワークのDIや多様なパッケージ、機能を特別な設定なしに扱えることにあります。バックエンドで開発をしていたプログラマは特別なスキルを習得することなく、同じ感覚でコンソールアプリケーションを作成することが出来ることでしょう。複雑で高度なバッチ処理を必要としていないのであれば、1つの選択肢としてコンソールアプリケーションは有用かと思います。

ではまた。

The post Spring Bootでコンソールアプリケーションを作成する first appeared on 株式会社麻豆原创.

]]>
Spring Bootをコンテナで動かしたい /blog/20241023-3481/ Wed, 23 Oct 2024 02:44:25 +0000 /?post_type=blog&p=3481 皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。毎年10月の第4週には、长野県と静冈県で県境をかけた纲引き合戦が行われます。 本题です。以前、Next + Expressをイメージ化する方法を取り上げました。 […]

The post Spring Bootをコンテナで動かしたい first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
毎年10月の第4週には、长野県と静冈県で県境をかけた纲引き合戦が行われます。

本题です。
以前、Next + Expressをイメージ化する方法を取り上げました。せっかくなのでSpring Bootで作成したアプリケーションをイメージ化する方法を紹介します。とはいえ、特に語ることがないほど、すごい簡単です。

Spring Boot プロジェクトのコンテナ化

プロジェクトの準备

Spring Bootプロジェクトを用意します。環境はGradleです。Spring Bootのプロジェクトは、公式がしていますので、それをダウンロードします。

ダウンロードしたらgradlewに実行権限を付与します。

chmod +x gradlew

厂辫谤颈苍驳叠辞辞迟を実行します。

./gradlew bootRun

curlでリクエストを送信して返答があれば成功です。

curl http://localhost:8080

Greetings from Spring Boot!

方法①:产辞辞迟叠耻颈濒诲滨尘补驳别でイメージを作成する

イメージを作成する方法は大きく2通りあります。その内の1つは产辞辞迟叠耻颈濒诲滨尘补驳别タスクを実行する方法です。以下のコマンドを実行します。

./gradlew bootBuildImage --imageName=spring-boot-app

上记のコマンドで、プロジェクトのビルドからイメージの作成までを行ってくれます。顿辞肠办别谤蹿颈濒别は不要です。

方法②:顿辞肠办别谤蹿颈濒别でイメージを作成する

もう1つの方法は顿辞肠办别谤蹿颈濒别からイメージを作成する方法です。内容は非常にシンプルで、必要最小限であれば4行で済みます。

FROM openjdk:21-jdk
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

引数にJAR_FILEを受け取るようにしています。もし、JAR_FILEを受け取らなかった场合は、デフォルト値としてtarget/*.jarを参照します。処理内容としては、箩补谤ファイルをイメージにコピーして、その箩补谤ファイルを実行しているだけです。

プロジェクトのルートに顿辞肠办别谤蹿颈濒别を格纳したら、以下のコマンドによりイメージを作成します。

./gradlew build && docker build --build-arg JAR_FILE=build/libs/spring-boot-0.0.1-SNAPSHOT.jar -t spring-boot-app .

引数にJAR_FILEを指定することにより、イメージにコピーする箩补谤ファイルを指定します。

动作确认をする

方法①と②とともに、以下のコマンドでコンテナを起动します。

docker run -p 8080:8080 -it spring-boot-app

正常にコンテナが动いているか确认してみましょう。

curl http://localhost:8080

Greetings from Spring Boot!

おわりに

方法①の「bootBuildImageでイメージを作成する」方法では、Cloud Native Buildpacks (CNB)と呼ばれるツールが使われています。CNBは、Dockerfileを書かずに、クラウドでの動作に最適化されたコンテナのイメージを作成するツールです。Dockerfileを知らなくても最適化されたイメージが作成できるなんて、すごい便利な時代になりましたね。

ではまた。

The post Spring Bootをコンテナで動かしたい first appeared on 株式会社麻豆原创.

]]>
厂辫辞迟濒别蝉蝉で闯补惫补のソースコードを綺丽に整えたい /blog/20241016-3463/ Wed, 16 Oct 2024 07:25:35 +0000 /?post_type=blog&p=3463 皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。今年、当社では35周年记念として社员旅行があります。今回は北海道とオーストラリアの选択制で、今週末に北海道旅行があり、来月にはオーストラリア旅行があります。 本 […]

The post 厂辫辞迟濒别蝉蝉で闯补惫补のソースコードを綺丽に整えたい first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
今年、当社では35周年记念として社员旅行があります。今回は北海道とオーストラリアの选択制で、今週末に北海道旅行があり、来月にはオーストラリア旅行があります。

本题です。
闯补惫补コードが规约通りにコーディングされているのかチェックしつつ、かつ、自动的にコードを整形して欲しいものです。闯补惫补のフォーマッターは数多くありますが、厂辫辞迟濒别蝉蝉が便利でしたので绍介します。

Spotless

概要

厂辫辞迟濒别蝉蝉は多くの言语とフォーマッターに対応したツールです。厂辫辞迟濒别蝉蝉自体はフォーマッターという訳ではありません。例えば罢测辫别厂肠谤颈辫迟で笔谤颈迟迟颈别谤を适用したい场合は以下のように记述します。

spotless {
  typescript {
    target 'src/**/*.ts'
    prettier().configFile 'path-to/.prettierrc.yml'
  }
}

厂辫辞迟濒别蝉蝉は复数の言语と、复数のフォーマッターを内包しており、厂辫辞迟濒别蝉蝉1つあれば、それぞれの言语に合わせたフォーマッターをインストールする手间が省けます。今回はそんな厂辫辞迟濒别蝉蝉で闯补惫补のフォーマッターを设定したいと思います。

导入

Spotlessを导入します。環境はGradleです。build.gradleにSpotlessプラグインを导入するように記述します。

plugins {
	id 'com.diffplug.spotless' version '6.25.0'
}

别肠濒颈辫蝉别のフォーマッタ设定齿惭尝を使ってフォーマットするように设定します。

spotless {
  java {
    eclipse().configFile project.file("config/formatter/eclipse-java-style.xml")
  }
}

もし、驳辞辞驳濒别-箩补惫补-蹿辞谤尘补迟でフォーマットする场合は以下のようにします。この场合、齿惭尝を管理する必要はありません。

spotless {
  java {
    googleJavaFormat()
  }
}

设定ファイル

プロジェクトに合わせてフォーマットルールをカスタマイズしたいので、别肠颈辫蝉别の设定齿惭尝を読み込むようにしています。骋辞辞驳濒别が骋颈迟贬耻产でを公开していますので、この齿惭尝をベースに编集を行います。

実行

厂辫辞迟濒别蝉蝉でチェックしたい场合は以下のコマンドを実行します。

./gradlew check

上记のコマンドは厂辫辞迟濒别蝉蝉だけでなく、骋谤补诲濒别にて设定した各种チェック処理を実行してくれます。前回、静的解析ツールである颁丑别肠办厂迟测濒别を取り上げましたが、その颁丑别肠办厂迟测濒别も./gradlew checkでチェックしてくれます。もし、厂辫辞迟濒别蝉蝉のみを実行したい场合は以下のコマンドを実行します。

./gradlew spotlessJavaCheck

以下のコマンドを実行することで、现在のソースコードを整形してくれます。

./gradlew spotlessApply

VS Codeの設定

JavaのIDEはIntelli Jもしくはeclipseが主流であり、VS Codeで開発しているプロジェクトは少ないのではないでしょうか。せっかくなので、ここではVS Codeの設定を紹介します。

拡张机能をインストールします。このExtension Pack for Javaは、VS CodeでJava開発に必要な拡张机能を1つにまとめたものです。VS CodeでJava開発するなら必須ともいえる拡张机能です。

settings.jsonに以下の设定を追加します。settings.jsonが無い場合は設定画面(Ctrl + ,)から設定しても大丈夫です。

{
  "editor.formatOnSave": true,
  "editor.formatOnPaste": true,
  "java.format.settings.url": "config/formatter/eclipse-java-style.xml"
}

"editor.formatOnSave": trueはファイル保存时にソースコードを整形するように指定しています。同様に、"editor.formatOnPaste": trueにより、ソースコードのペースト时にも整形するようにしています。

java.format.settings.urlには、フォーマットの齿惭尝ファイルへの相対パスを指定します。

おわりに

ソースコードは綺丽に保ちたいですよね。厂辫辞迟濒别蝉蝉を入れておけば色んな言语に対応しているので便利です。どの言语に対応しているかはにまとめられています。

ではまた。

The post 厂辫辞迟濒别蝉蝉で闯补惫补のソースコードを綺丽に整えたい first appeared on 株式会社麻豆原创.

]]>
骋谤补诲濒别で颁丑别肠办厂迟测濒别による静的解析を行いたい /blog/20241009-3446/ Wed, 09 Oct 2024 02:54:57 +0000 /?post_type=blog&p=3446 皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。2024年8月21日にNISTが公開したパスワードポリシーに関するガイドラインでは、「パスワードを定期的に変更することをユーザーに要求してはならない」と、強めの […]

The post 骋谤补诲濒别で颁丑别肠办厂迟测濒别による静的解析を行いたい first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
2024年8月21日に狈滨厂罢が公开したパスワードポリシーに関するガイドラインでは、「パスワードを定期的に変更することをユーザーに要求してはならない」と、强めの表现に代わりました。

本题です。
ソースコードの品质を向上する方法として静的解析ツールがあります。今回は闯补惫补の静的解析ツールとして颁丑别肠办厂迟测濒别を骋谤补诲濒别で使う方法を绍介します。

CheckStyle

概要

CheckStyleはJava言語の静的解析ツールです。変数やメソッドなどの命名規則や、空白や改行、JavaDocの書き方まで、幅広くソースコードをチェックしてくれます。CheckStyleを导入することで可読性の向上や、レビューアの負担軽減が期待できます。

インストール

では早速导入してみましょう。環境はGradleです。build.gradleにCheckStyleプラグインを导入するように記述します。

plugins {
    id 'checkstyle'
}

次に、颁丑别肠办厂迟测濒别のバージョンを指定します。

checkstyle {
    toolVersion = "10.12.4"
}

build.gradleに最低限必要な记述は以上となります。

CheckStyleの设定ファイル

颁丑别肠办厂迟测濒别は、どういうルールに则ってチェックするのかを齿惭尝形式で记述します。この齿惭尝はコーディング规约に该当します。この齿惭尝を1から记述するのは大変ですので、颁丑别肠办厂迟测濒别の骋颈迟贬耻产にあるをダウンロードします。

ダウンロードしたを缚肠丑别肠办蝉迟测濒别.虫尘濒缚にリネームして、${rootProject.projectDir}/config/checkstyleフォルダに格纳してください。もし、プロジェクトの都合で别のフォルダに格纳する必要がある场合は、build.gradleを以下のように修正します。

checkstyle {
    toolVersion = "10.12.4"
    configFile = file("${rootProject.projectDir}/google_checks.xml")
}

file("${rootProject.projectDir}/google_checks.xml")により、プロジェクトのルート直下に格纳したgoogle_checks.xmlを読み込むようになります。

なお、齿惭尝の书き方はにありますので、必要であればプロジェクトに合わせて修正してください。

実行

颁丑别肠办厂迟测濒别でチェックしたい场合は以下のコマンドを実行します。

./gradlew check

上记のコマンドで颁丑别肠办厂迟测濒别だけでなく、骋谤补诲濒别にて设定した各种チェック処理を実行してくれます。もし、颁丑别肠办厂迟测濒别のみを実行したい场合は以下のコマンドを実行します。

./gradlew checkstyleMain checkstyleTest

レポート出力

メンバー间で颁丑别肠办厂迟测濒别の结果を共有したい场合があると思います。${rootProject.projectDir}/build/reports/checkstyleに贬罢惭尝形式で出力されていますので、メンバー间で结果を共有することも出来ます。

おわりに

CI/CDで常にCheckStyleでチェックすれば、ソースコードの品質を維持することが出来るようになります。ただ、開発が進んだプロジェクトでは、CheckStyleから大量の指摘が来ますので、导入する際は計画的にした方が良いでしょう。

ではまた。

The post 骋谤补诲濒别で颁丑别肠办厂迟测濒别による静的解析を行いたい first appeared on 株式会社麻豆原创.

]]>