[Start Spring Boot] Repository로 DB 관리하기

·2024년 3월 14일
0

Start Spring Boot!

목록 보기
14/53
post-thumbnail

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;
    }
	
    // 나머지 getter, setter는 생략

    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에서 사용하기

  • TeamController.java

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

profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보