SpringBoot 축구 팀 CRUD 초초초미니 프로젝트 - 팀 리스트 조회, 단일 팀 조회

2024. 3. 17. 19:21스프링/축구 팀 CRUD

스프링부트 프레임워크를 익히기 위해서 스프링 부트 CRUD 실습책을 완독을 하고나서 내가 직접 만들어보려고 한다. 물론 너무 다음 과정 아이디어가 떠오르지 않는다면 책을 참고 할 것이다.. 시작해보자

  • 스프링 초기 세팅

  • 압축을 풀고~ 인텔리 제이에서 디렉터리 오픈을 하면? 이런 구조가 나온다.
  • com.example.jinyongproject 패키지 아래의 api, entity, repository 패키지는 내가 따로 만들었다.

  • api 패키지 안에 SoccerTeamApiController 라는 자바 클래스 파일을 만들어준다.
@RestController
public class SoccerTeamApiController {

    }
}

  • 먼저 클래스에 @RestController 어노테이션을 달아준다 → 어노테이션 설명하기
  • 축구 팀 리스트를 가져 올 메서드를 만들어준다.
@RestController
public class SoccerTeamApiController {

    @GetMapping("/api/soccer-team")
    public List<Team> teamList (){
    }
}

  • @GetMapping 어노테이션으로 엔드포인트를 지정해준다.
  • 반환형을 List로 반환하는 teamList() 메서드 생성을 해준다!
  • 여기서 List<> 안에 있는 Team 부분이 빨간 글씨가 되어있는데 이 자리는 엔티티가 들어가야하므로 초기에 만들어 놓았던 entity 패키지 아래에 Team이라는 자바 클래스 파일을 만들어준다.
  • @RestController public class SoccerTeamApiController { @GetMapping("/api/soccer-team") public List<Team> teamList (){ } }
  • Team 엔티티 안에 이와 같이 id, teamname, league로 각각 어노테이션을 달아주어 프라이머리키 및 컬럼을 만들어주었다. Team 클래스 위에 entity 어노테이션을 달아주어 엔티티임을 선언해준다
@entity
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // 키
    @Column
    private String teamname; // 팀명
    @Column
    private String league; // 리그명

}
  • 축구 팀 컨트롤러로 돌아오면 빨간글씨가 뜨지 않게 된다.
  • 이제 이 엔티티 안의 데이터를 가져올 리파지토리를 생성해줘야한다.
@RestController
public class SoccerTeamApiController {

    @Autowired
    private SoccerteamRepository soccerteamRepository; //리파지토리

    @GetMapping("/api/soccer-team")
    public List<Team> teamList (){

    }
}
  • 이렇게 만들어주면 이거 또한 빨간 글씨가 뜨게 될 것이다. 리파지토리를 생성하지 않았기 때문이다.
  • repository 패키지 아래에 SoccerteamRepository를 인터페이스 파일로 만들어주고, CrudRepository를 상속받고<> 안에 내가 방금 만든 Team 엔티티와, Team엔티티의 ID의 타입을 적어준다.
public interface SoccerteamRepository extends CrudRepository<Team, Long> {
   
}
  • 다시 컨트롤러로 돌아가면 빨갛게 되었던것이 진정이 되었다. 그렇다면 이제 return을 해서 findAll()을 이용해서 Team엔티티에 있는 축구 팀들을 반환 한다.
@RestController
public class SoccerTeamApiController {

    @Autowired
    private SoccerteamRepository soccerteamRepository;

    @GetMapping("/api/soccer-team")
    public List<Team> teamList (){
        return soccerteamRepository.findAll();

    }
}
  • 어? 근데 이거도 잘못 되었다고 빨간줄이 떠버린다. 이것은 findAll()은 데이터들을 Iterator로 제공을 해주기 때문이다 근데 나는 어떻게든 리스트로 받아서 리스트로 반환을 할 것이기 때문에 여러 방법이 있지만

  • 이렇게 ArrayList<Team> findAll()로 @Override “치환” 해버린다.
public interface SoccerteamRepository extends CrudRepository<Team, Long> {
    @Override
    ArrayList<Team> findAll();
}

  • 이렇게 되면 반환이 잘 되고 빨간 줄도 사라지게 될 것이다.
  • 실행을 시켜보면.. 아마 이런 오류가 뜰 것이다.. 왜냐하면 DB 연결을 해줘야한다.

  • 이 파일에 이 두 문장을 추가 해준다 이 문장은 h2-console DB를 사용할 수 있도록 해준다.
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true
  • 그리고나서 실행 시켜도 오류가 날 것이다 왜냐하면 데이터가 넣어져있지 않기 때문이다. 더미 데이터를 만들어주자.
  • resource 로 달려가서 data.sql 파일을 만들어주고 내가 만들었던 team엔티티의 각 컬럼 데이터 형식에 맞게 id를 제외하고 작성해준다.

 

  • 그러면 서버는 작동이 올바르게 되었고 이제 API 검색을 해주자.
  • 나는 Talend API Tester라는 구글 크롬 확장 프로그램을 이용해서 테스트 해보았는데 어떤것을 사용해도 좋다 POSTMAN 사용해도댐.
  • 엔드포인트 지정했던것처럼 주소 작성 해주고 메서드는 GET으로 해준다.

  • 실행을 해보는데 엥? 왜 빈 값이지? 이상하네 라고 생각할 수 있다 왜냐하면 엔티티에 게터를 만들어줘야한다.그래야 반환을 해준다. → 책보고 알아보고 설명하기

  • 바로 Team 엔티티로 달려가서 Getter 어노테이션을 달아준다.
package com.example.jinyongproject.entity;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import jakarta.persistence.*;
import lombok.Getter;

@Entity
@Getter // 추가!
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String teamname;
    
    @Column
    private String league;

}
  • 자 근데 @Getter 어노테이션을 사용하려고 해도 빨간줄이 뜨면서 안될 것이다! 왜냐하면 이 어노테이션은 롬복이라는것을 사용해줘야하기 때문이다.
  • 자 여기서 롬복(lombok)이란? 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다. Getter, Setter, ToString 과 같은 코드를 어노테이션을 달아줘 가독성 부분에서 향상을 시켜주는 것이다.
  • 바로 위에 @Getter 어노테이션을 달아주는 경우가 그런 경우이다. 원래라면
package com.example.jinyongproject.entity;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import jakarta.persistence.*;
import lombok.Getter;

@Entity
@Getter // 얘가 없었다면?
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String teamname;
    
    @Column
    private String league;
    
    // @Getter 없었으면 이렇게 해줘야 됨.
    public Long getId() {
        return id;
    }

    public String getTeamname() {
        return teamname;
    }

    public String getLeague() {
        return league;
    }

}
  • 바로 build.gradle로 달려가서 해당 코드를 입력하고
dependencies {
	compileOnly 'org.projectlombok:lombok'            // 추가
	annotationProcessor 'org.projectlombok:lombok'    // 추가
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-mustache'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
  • 오른쪽 위의 코끼리 새로고침을 터치해준다. 그러면 롬복이 적용이 될 것이다..

  • 그럼 엔티티에서 @Getter 어노테이션이 편안하게 적용이 될 것이고,
  • 다시 서버 재시작해서 검색해주면? 편안해진다…

  • 괜히 뿌듯하다.. 또 추가해주고 실행 해보면?
INSERT INTO team(teamname, league) VALUES ('Barca', 'SpainPremeraliga');
INSERT INTO team(teamname, league) VALUES ('Totenham', 'EnglendPremierleague');
INSERT INTO team(teamname, league) VALUES ('gwangju', 'K1');

뿌듯하다!

-----------2024/04/22 추가------------

단일 팀 조회 구현은 쉽다!

  • 이렇게 마지막에 파라미터 값을 받는 엔드 포인트 를 GET 메서드로 받고 파라미터 값을 이용해 검색을 해서 반환하면 된다!
  • 달라진 점이라고 한다면, findByAll()을 사용하는 것이 아니라 id 조회를 위해 findById()를 사용한다는 것이고, @PathVariable 어노테이션을 이용한다는 것이다 → @PathVariable란? 엔드포인트에서 받은 값을 받아내주는 어노테이션이다!
@GetMapping("/api/soccer-team/{id}")
    public Team soccerTeam(@PathVariable Long id){
        return soccerteamRepository.findById(id).orElse(null);
    }