Repository
Repository란?
- DB의 테이블에 접근하여 CRUD를 위한 인터페이스
- 테이블에 접근하고 관리하는 메서드를 제공
Repository 생성하기
- ssb/src/main/java/com.chan.sbb/에 인터페이스를 생성하자
- TeamRepository.java
package com.chan.ssb;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TeamRepository extends JpaRepository<Team, Long> {
}
DTO 수정하기
- 지금 만든 Entity에는 setter가 없다.
- 사용하지 않는 것이 직관성등에서 좋다.
- record도 setter가 없기 때문에 JSON 값을 제대로 가져오지 못한다.
- TeamDTO.java
package com.chan.ssb;
public class TeamDTO {
private long id;
private String name;
private String city;
private int championships;
public TeamDTO() {
}
public TeamDTO (long id, String name, String city, int championships) {
this.id = id;
this.name = name;
this.city = city;
this.championships = championships;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public static TeamDTO fromEntity(Team team) {
if(team == null) return null;
return new TeamDTO(team.getId(), team.getName(), team.getCity(), team.getChampionships());
}
}
- public static TeamDTO fromEntity(Team team): Entity를 DTO로 전환하기 위해 생성한 함수이다.
Controller에서 사용하기
TeamRepository 선언하기
private final TeamRepository teamRepository;
public TeamController(TeamRepository teamRepository) {
this.teamRepository = teamRepository;
}
- 다음의 생성자주입 방식을 이용해서 만들었다.
- 스프링의 핵심 기능 중 하나인 의존성 주입(DI)로 다음에 다룰 예정이다.
GET(Read) 요청 처리하기
@GetMapping("/team")
public List<TeamDTO> getAllTeams() {
List<Team> teams = teamRepository.findAll();
List<TeamDTO> returnTeams = teams.stream().map(TeamDTO::fromEntity).toList();
return returnTeams;
}
@GetMapping("/team/{id}")
public TeamDTO getTeam(@PathVariable long id) {
TeamDTO team = TeamDTO.fromEntity(teamRepository.findById(id).orElse(null));
return team;
}
- findAll(): 모든 데이터를 가져와서 List로 반환한다.
- findById(id): id로 찾아서 Optional로 반환한다. orElse는 Oprional에서 사용 가능한 메소드
POST(Create), PUT(Update) 요청 처리하기
@PostMapping("/team")
public List<TeamDTO> createTeams(@RequestBody List<TeamDTO> teamDTOList) {
List<Team> newTeams = teamDTOList.stream().map(team -> new Team(team.getId(), team.getName(), team.getCity(), team.getChampionships())).toList();
return teamRepository.saveAll(newTeams).stream().map(TeamDTO::fromEntity).toList();
}
@PutMapping("/team/{id}")
public TeamDTO updateTeam(@PathVariable long id, TeamDTO team) {
Team updateTeam = new Team(id, team.getName(), team.getCity(), team.getChampionships());
return TeamDTO.fromEntity(teamRepository.save(updateTeam));
}
- @RequestBody List teamDTOList: 다음을 통해서 배열을 받을 수 있다. 이름을 꼭 규칙에 맞게 설정해야한다.
- 다음은 save()의 구현체이다.
@Transactional
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
if (this.entityInformation.isNew(entity)) {
this.entityManager.persist(entity);
return entity;
} else {
return this.entityManager.merge(entity);
}
}
- entity가 이미 있는지 없는지 확인해서 작업을 수행함
- save(): 저장과 업데이트을 위해서 사용한다.
- id가 주어진 경우 이미 존재하는 id의 경우 업데이트 작업을 수행하고,
없는 id의 경우 저장을 실행한다.
- id가 없는 경우 저장을 실행한다.
DELETE(Delete) 요청 처리하기
@DeleteMapping("/team/{id}")
public void deleteTeam(@PathVariable long id) {
teamRepository.deleteById(id);
}
- deleteById(): findById + delete를 한번에 수행
사용해보기
POST

GET
