
스프링부트 프레임워크를 익히기 위해서 스프링 부트 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 연결을 해줘야한다.

- 바로 resource로 달려가 저 application.properties 나뭇잎으로 간다.

- 이 파일에 이 두 문장을 추가 해준다 이 문장은 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);
}
'스프링 > 축구 팀 CRUD' 카테고리의 다른 글
SpringBoot 축구 팀 CRUD 초초초미니 프로젝트 - 축구팀 삭제기능 구현 (0) | 2024.04.22 |
---|---|
SpringBoot 축구 팀 CRUD 초초초미니 프로젝트 - 축구팀 수정 구현 (1) | 2024.04.22 |
SpringBoot 축구 팀 CRUD 초초초미니 프로젝트 - 축구팀 생성 구현 (1) | 2024.04.22 |
SpringBoot 축구 팀 CRUD 초초초미니 프로젝트 - Service 추가 (0) | 2024.04.22 |