■概要
「@Repository」は、データベース(DB)や外部ストレージにアクセスするクラスに付けるアノテーション。
Spring がこのクラスを データアクセス層の Bean として認識し、自動的に管理する。
| 機能 | 説明 |
|---|---|
| Bean登録 | Spring コンテナに自動登録され、DI(依存性注入)可能になる |
| 意味付け | 「ここはDBアクセス層ですよ」と明示的にする |
| 例外変換機能 | JDBCやJPAの例外をSpring独自のDataAccessExceptionに変換してくれる |
■実装するサンプル処理の概要
GETのリクエストに対して、以下の処理を実装する。
| メソッド | URL(※) | 処理概要 |
|---|---|---|
| GET | /users/info/all | 「user情報テーブル」のデータを全て取得する |
▼実行環境
実行環境は以下の通り
- Java:バージョン21
- Spring Boot:バージョン3.5.6
- DB:h2database
■クラス図
実装する処理のクラス図は以下の通り。

■DBスキーマとデータ
参照するDBスキーマとデータを以下に示す。
・schema.sql
-- user情報テーブル
CREATE TABLE M_USER_INFO (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(99),
mailAddress VARCHAR(999)
);・data.sql
INSERT INTO M_USER_INFO VALUES(1, 'hoge', 'hoge@example.com');
INSERT INTO M_USER_INFO VALUES(2, 'huga', 'huga@example.com');
INSERT INTO M_USER_INFO VALUES(3, 'piyo', 'piyo@example.com');■サンプルコード
・UserController.java
package com.practice.annotation.anotools_spring.controller;
import com.practice.annotation.anotools_spring.dto.UserDTO;
import com.practice.annotation.anotools_spring.service.UserInfoService;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// Webリクエストを受け取るクラス
@RestController
// メソッドの戻り値を「HTMLビュー」ではなく「JSON」などのレスポンスボディとして返す
@RequestMapping("/api")
@RequiredArgsConstructor
public class UserController {
@Autowired
private final UserInfoService userInfoService;
@GetMapping("/users/info/all")
public List<UserDTO> getAllUser() {
return userInfoService.selectAllUser();
}
}
・UserInfoService.java
package com.practice.annotation.anotools_spring.service;
import com.practice.annotation.anotools_spring.dto.UserDTO;
import java.util.List;
public interface UserInfoService {
public List<UserDTO> selectAllUser();
}
・UserInfoServiceImpl.java
package com.practice.annotation.anotools_spring.service;
import com.practice.annotation.anotools_spring.dto.UserDTO;
import com.practice.annotation.anotools_spring.repository.UserRepository;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserInfoServiceImpl implements UserInfoService {
private final UserRepository userRepository;
@Override
public List<UserDTO> selectAllUser() {
return userRepository.findAll()
.stream()
.map(entity -> new UserDTO(entity.getId(), entity.getName(), entity.getMailAddress()))
.collect(Collectors.toList());
}
}
・UserRepository.java
package com.practice.annotation.anotools_spring.repository;
import com.practice.annotation.anotools_spring.entity.UserEntity;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserRepository {
List<UserEntity> findAll();
}
・UserRepository.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="com.practice.annotation.anotools_spring.repository.UserRepository">
<select id="findAll" resultType="com.practice.annotation.anotools_spring.entity.UserEntity">
SELECT * FROM M_USER_INFO
</select>
</mapper>
・UserDTO.java
package com.practice.annotation.anotools_spring.dto;
import lombok.Value;
@Value
public class UserDTO {
int id;
String name;
String mailAddress;
}
・UserEntity.java
package com.practice.annotation.anotools_spring.entity;
import lombok.Value;
@Value
public class UserEntity {
int id;
String name;
String mailAddress;
}
■実行結果
request:http://localhost:8080/api/users/info/all
response:
[
{
"id": 1,
"name": "hoge",
"mailAddress": "hoge@example.com"
},
{
"id": 2,
"name": "huga",
"mailAddress": "huga@example.com"
},
{
"id": 3,
"name": "piyo",
"mailAddress": "piyo@example.com"
}
]

コメント