Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Server-Side Kotlin + Spring Boot + Exposedでやったこと

Server-Side Kotlin + Spring Boot + Exposedでやったこと

2024. 3. 8実施の@サーバーサイドKotlin LT大会 vol.11の登壇資料です。

https://server-side-kotlin-meetup.connpass.com/event/309183/

セーヤン

March 07, 2024
Tweet

More Decks by セーヤン

Other Decks in Technology

Transcript

  1. 3 今日お話しすること 1. Server-Side Kotlinを選定してローンチしたプロダクト 2. システム構成 3. API機能 4.

    オニオンアーキテクチャーの導入 5. 帳票の作成 6. Exposedの活用 7. Spring Boot2系→3系へのアップデート対応 8. 最後に
  2. 6 API機能 ユーザー情報 閲覧履歴 お気に入り お知らせ 商品情報 カート 注文 決済

    配送 キャンペーン … User 注文管理 配送管理 … Admin 認証認可 共通エラハン ロギング … 共通 全API合計数70本 (現時点)
  3. 8 オニオンアーキテクチャーの導入 data class MailAddress(val value: String) { init {

    if (value.isEmpty() || value.length > 256) { throw ArgumentException("メールアドレス は1文字以上256文字以内である必要があります") } if (!value.matches(Regex("^[a-zA-Z0-9.!#\$%&'*+\\ /=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+ )*\$"))) { throw ArgumentException("メールアドレス の形式が間違っています") } } } ValueObjectの例 ❏ データクラスを積極的に活用 した ❏ VOでは、イニシャライザブ ロック内でバリデーションを 実施するようにした
  4. 9 帳票の作成 ライブラリの選定 帳票ライブラリ:JasperReports 帳票作成ツール:Jaspersoft Studio Jaspersoft Studioでテンプレートを作 成しておき、resources配下に格納する ことでライブラリを通じて、プログラ

    ムでデータをマッピングすることがで きる JasperReports コードを書いてPDFを作成することが できて、テンプレート依存がない 複雑な表現が必要な場合には、コード も複雑化してくると想像できる OpenPDF 複雑なグラフやリッチな表現があるわけではないため、OpenPDFを選定
  5. 10 帳票の作成 OpenPDFを活用して作成したPDF @Service class InvoicePdfGenerator(private val userDeliveryAddressRepository: IUserDeliveryAddressRepository) :

    IInvoicePdfGenerator { override fun createPdf(order: Order): ByteArray { try { val userDeliveryAddress = userDeliveryAddressRepository.getProfiledUserDeliveryAddressByUserId(o rder.user.id.value) ?: throw NotFoundUserDeliveryAddressException("ユーザープロ フィール情報が見つかりませんでした") val pdfOutputBytes = ByteArrayOutputStream() val document = Document(PageSize.A4) val writer = PdfWriter.getInstance(document, pdfOutputBytes) val bf = BaseFont.createFont( "fonts/ipaexm.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED ) val font = Font(bf, 12f, Font.NORMAL) document.open() // ヘッダー生成 createHeader(document, font, order, userDeliveryAddress) …
  6. 11 Exposedの活用 ORMとしてExposedを選定: 現時点の利用バージョン 0.41.1 ExposedにはDAOとDSLが提供されているが、基本的にはDAOを活用して いる class ProductEntity(id: EntityID<Int>)

    : IntEntity(id) { companion object : IntEntityClass<ProductEntity>(Product Table) var productId by ProductTable.id val categoryList by CategoryInProductEntity referrersOn CategoryInProductTable.productId var productName by ProductTable.name val query = ProductTable.select { ProductTable.createdAt greater DateTime.now().minusMonths(2) } val totalCount = query.count() val products = ProductEntity .wrapRows( query .orderBy(this.convertSortTableColumn(command.sortCo lumn) to command.sortOrder) .limit(command.limit, offset = command.offset.toLong()) ).toList().map { Product(it) } return ProductList(products, totalCount) DSLのwrapRowsメソッドも活用している
  7. 12 Spring Boot2系→3系へのアップデート対応 ライブラリ / 言語 前バージョン 後バージョン Spring Boot

    2.5.4 3.2.0 Spring Boot Security 2.5.4 3.2.0 SpringFox 2.9.2 - Springdoc-openapi - 2.2.0 Kotlin 1.5.21 1.8.22 Java 16 17 Spring Security 5.5.2 6.2.0
  8. 13 Spring Boot2系→3系へのアップデート対応 パッケージ名の変更 パッケージ名の変更 javaxからjakartaへの変更 • Java16から17へバージョンアップ • インポートの修正

    • javaxに依存しているライブラリの特定 とバージョンアップ Spring Securityのアップデート Springdoc-openapiへ変更 ・@Configurationの付与 ・@EnableWebSecurityの付与 ・WebSecurityConfigurerAdapterの継承を廃止 ・SecurityFilterChainをBean定義 ・mvcMatchersからrequestMatchersのラムダ 式に変更 ・AuthentificationManageBuilderの削除 SpringFoxがSpring Boot3系では動かな いため、Springdoc-openapiへ変更 • アノテーションの変更 • マイグレーションガイド :https://springdoc.org/#migrating -from-springfox