Skip to content
 
 

Latest commit

 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

準備

Java

Java11をインストールしてください。

IDE

IDEを使う場合は、gradle projectをインポートしてください。また、lombokを使用していますので、お使いのIDEでlombokが使えるように設定してください。

実行

gradleでbootRunタスクを実行してください。http://localhost:8080 でアクセスできます。 IDEを使って実行しても構いません。

課題

本リポジトリのプログラムについて

SkillCheckResource.javaで定義されているデータについて、全件取得する、または条件を指定して絞り込めるAPIを持ったサーバーアプリケーションです。

questions

Q1〜Q4の回答はREADME.mdに記載し、Q5はプログラムを修正、Q6、Q7は新規にクラスを作成し、別途申し上げる方法で回答してください。

Q1: 本アプリケーションで定義されているAPIのパス、パラメーター名と型を記載してください。

A1:

※ A1〜A4 は Q5〜Q7 の実装前(元のソース)の状態についての回答です。実装後の最終的なAPI仕様は末尾の「Q5〜Q7 実装後のAPI仕様」を参照してください。

項目 内容
パス /skillCheck
HTTPメソッド GET
レスポンス形式 application/jsonSkillCheckResource の配列)
パラメーター名 必須 説明
name String 任意 名称の部分一致(String.contains
age Integer 任意 指定値以上の年齢(age >= 指定値

いずれも Optional で受け取っているため未指定可。未指定の場合はその条件を適用しない(両方未指定なら全件取得)。 なお hasSkillSkillCheckResourceCriteria にフィールドとしては存在するが、SkillCheckController@RequestParam には定義されていないため、現状はAPIパラメーターとしては機能しない(Q4参照)。

Q2: Q1のAPIによりデータを取得した場合のレスポンス(一例)を記載してください。

A2:

GET /skillCheck(パラメーター未指定・全件取得)のレスポンス:

[
  {
    "name": "taro yamada",
    "age": 28,
    "hasSkill": true,
    "skills": [
      { "id": 1, "name": "Java" },
      { "id": 2, "name": "Kotlin" }
    ]
  },
  {
    "name": "shiori yamada",
    "age": 24,
    "hasSkill": true,
    "skills": [
      { "id": 3, "name": "JavaScript" },
      { "id": 4, "name": "TypeScript" }
    ]
  },
  {
    "name": "sho yamada",
    "age": 38,
    "hasSkill": false,
    "skills": []
  },
  {
    "name": "kazumasa yamada",
    "age": 44,
    "hasSkill": false,
    "skills": []
  },
  {
    "name": "yasufumi yamada",
    "age": 35,
    "hasSkill": true,
    "skills": [
      { "id": 1, "name": "Java" },
      { "id": 4, "name": "TypeScript" }
    ]
  }
]

絞り込みを行う例として GET /skillCheck?name=taro&age=20 は以下を返す。

[
  {
    "name": "taro yamada",
    "age": 28,
    "hasSkill": true,
    "skills": [
      { "id": 1, "name": "Java" },
      { "id": 2, "name": "Kotlin" }
    ]
  }
]

Q3: 本アプリケーションで例外が発生するパターンのAPIのパス、パラメーター名と値を記載してください。

A3:

1. age に90以上を指定し、かつ name を指定しない場合(RuntimeException / HTTP 500)

パス パラメーター名
/skillCheck age 90 以上の整数(例: 90, 91

SkillCheckService の判定は「nameage の両方が指定されている場合」「age のみ指定されている場合」「name のみ指定されている場合」の順に分岐しており、上限チェック(90歳以上)は age のみが指定された分岐にしか存在しない。 そのため GET /skillCheck?age=90RuntimeException("90歳以上は検索対象外です") となり HTTP 500 が返る。

{
  "timestamp": "2026-08-27T04:52:27.907+00:00",
  "status": 500,
  "error": "Internal Server Error",
  "path": "/skillCheck"
}

一方 GET /skillCheck?name=taro&age=90 は2条件指定の分岐に入り上限チェックを通らないため、例外は発生せず HTTP 200 で空配列 [] が返る。 name に空文字を渡した GET /skillCheck?name=&age=90 も同様で、namenull ではなく空文字として扱われるため2条件分岐に入り、例外は発生しない。

2. age に整数以外を指定した場合(型変換エラー / HTTP 400)

パス パラメーター名
/skillCheck age 整数に変換できない文字列(例: abc, 28.5

Optional<Integer> へのバインドに失敗し MethodArgumentTypeMismatchException が発生、HTTP 400 が返る。

{
  "timestamp": "2026-08-27T04:52:28.067+00:00",
  "status": 400,
  "error": "Bad Request",
  "path": "/skillCheck"
}

なお GET /skillCheck?age=(値が空)は空文字が null に変換され Optional.empty() となるため、エラーにはならず全件取得となる。

Q4: Q1のAPIでhasSkill=trueを指定した際にどういうレスポンスになるか記載してください。

A4:

hasSkillSkillCheckController.search の引数に @RequestParam として定義されていない。 Spring MVC はハンドラーメソッドの引数に定義されていないクエリパラメーターを単に無視する(未知のパラメーターに対するエラーは発生しない)ため、hasSkill=true は検索条件として一切使われない。

結果として GET /skillCheck?hasSkill=trueパラメーターを何も付けない GET /skillCheck と同じレスポンスhasSkillfalsesho yamada / kazumasa yamada を含む全5件)になる。

SkillCheckResourceCriteria には hasSkill フィールド自体は存在するものの、Controller から値が渡されないため常に boolean の初期値 false のままであり、さらに SkillCheckServicePredicatehasSkill を参照していないため、いずれにせよ絞り込みには影響しない。

Q5: Q1のAPIで、SkillCheckResource.hasSKillの値を条件として検索できるように、パラメーター(名称: hasSkill, 型: Boolean)を追加してください。その際、SkillCheckService.java内のコメントに記載された条件を維持するようにしてください。

Q6: Q1のAPIに、複数のキー(年齢・名前など)でソートできる機能を追加してください。 どのようなパラメーター設計・受け取り方・バリデーションにするかも含めて、ControllerクラスとServiceクラスを修正してください。

【要件】

  1. Q1のAPIに、複数のソート条件を指定できる機能を追加すること。
  2. パラメーター設計・受け取り方・バリデーションは自分で考えて実装すること。形式は自由に設計してよい。
  3. 指定可能なキーは name, age とすること。不正な値の場合はRuntimeExceptionを発生させること。
  4. Comparatorの連結やStream APIの活用が望ましい。
  5. SkillCheckServiceで複数キーによるソート処理を実装し、SkillCheckControllerから呼び出すこと。
  6. 必要に応じてenumやバリデーション用クラスを作成してもよい。

Q7: 以下の要件を満たすように、ControllerクラスとServiceクラスを新規に作成してください。 すでに実装されているSkillCheckControllerクラスとSkillCheckServiceクラスを参考にして構いません。

【要件】

  1. SkillCategoryの一覧を取得するAPI(GET /skillCategories)を実装すること。
  2. Serviceクラスには、SkillCategoryの一覧取得のロジックを実装すること。
  3. SkillCategoryは「id(Long型)」「name(String型)」の2つのプロパティを持つものとする。
  4. APIのリクエストパラメータとして「name(部分一致)」による絞り込みを可能にすること。
  5. nameパラメータが未指定またはnull、空文字列の場合は全件取得とすること。
  6. nameパラメータが50文字を超える場合はRuntimeExceptionを発生させること。

所要時間参考

  • Q1-Q4: 30分(コードリーディング)
  • Q5: 30分(機能追加)
  • Q6: 60-90分(設計+実装)
  • Q7: 60分(新規実装)
  • 合計: 約3時間

評価ポイント

  1. コードの正確性(40%)
  2. 設計の適切性(30%)
  3. コードの保守性・可読性(20%)
  4. ドキュメント・コメント(10%)

提出物

  • 修正後のソースコード一式
  • README.mdの回答(Q1-Q4)

補足

  • 本課題は個人で取り組んでください。
  • AIツールは利用しても構いませんが、提出物の内容については自身で理解して説明できるようにしてください。面接時に設計意図や実装方針を確認します。 例:なぜそのパラメーター設計にしたか、バリデーションや例外処理の方針、拡張性の工夫など

Q5〜Q7 実装後のAPI仕様

A1〜A4 は実装前の状態についての回答のため、実装後の最終的なAPI仕様をここに記載する。

パス パラメーター名 必須 説明
GET /skillCheck name String 任意 名称の部分一致
GET /skillCheck age Integer 任意 指定値以上の年齢
GET /skillCheck hasSkill Boolean 任意 スキル保有有無の完全一致(Q5で追加)
GET /skillCheck sort String(繰り返し指定可) 任意 ソート条件。キー:並び順 形式(Q6で追加)
GET /skillCategories name String 任意 名称の部分一致(Q7で追加)
  • 検索条件は指定されたものだけをAND連結して判定し、1つも指定がなければ全件取得となる。
  • hasSkill は「未指定」と「false 指定」を区別するため、検索条件クラスでは Boolean で保持している。
  • 元の仕様どおり、年齢条件のみが指定されている場合は90歳以上で RuntimeException となる。2条件以上指定されている場合は上限チェックを行わない(例: ?age=90 は例外、?age=90&hasSkill=true は例外なし)。
  • sort は記述順がソートの優先順位となる(例: ?sort=age:desc&sort=name:asc)。キーは name / age、並び順は asc / desc(大文字小文字は区別せず、並び順の省略時は asc)。未指定の場合は元の順序を維持する。不正なキー・並び順・形式は RuntimeException となる。
  • /skillCategoriesname は未指定・null・空文字・空白のみの場合は全件取得、50文字を超える場合は RuntimeException となる。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages