참고 사이트에서 REST 서비스를 Spring을 이용해서 다뤄보자.
- JPA를 이용해서 mariaDB의 데이터 조작할 수 있는 컨트롤러 생성
- PostMan을 이용해서 http요청을 통해 CRUD 데이터 조작하기
참고 사이트
아래의 HTTP is the Platform을 사용해보자.
package payroll;
import java.util.List;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
class EmployeeController {
private final EmployeeRepository repository;
EmployeeController(EmployeeRepository repository) {
this.repository = repository;
}
// Aggregate root
// tag::get-aggregate-root[]
@GetMapping("/employees")
List<Employee> all() {
return repository.findAll();
}
// end::get-aggregate-root[]
@PostMapping("/employees")
Employee newEmployee(@RequestBody Employee newEmployee) {
return repository.save(newEmployee);
}
// Single item
@GetMapping("/employees/{id}")
Employee one(@PathVariable Long id) {
return repository.findById(id)
.orElseThrow(() -> new EmployeeNotFoundException(id));
}
@PutMapping("/employees/{id}")
Employee replaceEmployee(@RequestBody Employee newEmployee, @PathVariable Long id) {
return repository.findById(id)
.map(employee -> {
employee.setName(newEmployee.getName());
employee.setRole(newEmployee.getRole());
return repository.save(employee);
})
.orElseGet(() -> {
newEmployee.setId(id);
return repository.save(newEmployee);
});
}
@DeleteMapping("/employees/{id}")
void deleteEmployee(@PathVariable Long id) {
repository.deleteById(id);
}
}
Controller Package를 만들고 BoardApiController를 만들어주자.
만들어주고 localhost:8080/api/boards에 들어가주면 아래와 같이 나온다.
[{"id":1,"title":"제목","content":"내용"},{"id":2,"title":"헬로","content":"월드"}]
package com.example.myhome.controller;
import com.example.myhome.model.Board;
import com.example.myhome.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api")
class BoardApiController {
@Autowired
private BoardRepository repository;
@GetMapping("/boards")
List<Board> all() {
return repository.findAll();
}
// end::get-aggregate-root[]
@PostMapping("/boards")
Board newBoard(@RequestBody Board newBoard) {
return repository.save(newBoard);
}
// Single item
@GetMapping("/boards/{id}")
Board one(@PathVariable Long id) {
return repository.findById(id).orElse(null);
}
@PutMapping("/boards/{id}")
Board replaceBoard(@RequestBody Board newBoard, @PathVariable Long id) {
return repository.findById(id)
.map(Board -> {
Board.setTitle(newBoard.getTitle());
Board.setContent(newBoard.getContent());
return repository.save(Board);
})
.orElseGet(() -> {
newBoard.setId(id);
return repository.save(newBoard);
});
}
@DeleteMapping("/boards/{id}")
void deleteBoard(@PathVariable Long id) {
repository.deleteById(id);
}
}
제목으로 검색하는 api를 작성해보자.
package com.example.myhome.controller;
import com.example.myhome.model.Board;
import com.example.myhome.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api")
class BoardApiController {
@Autowired
private BoardRepository repository;
@GetMapping("/boards")
List<Board> all(@RequestParam(required = false) String title) {
if(StringUtils.isEmpty(title)) {
return repository.findAll();
} else {
return repository.findByTitle(title);
}
}
@PostMapping("/boards")
Board newBoard(@RequestBody Board newBoard) {
return repository.save(newBoard);
}
// Single item
@GetMapping("/boards/{id}")
Board one(@PathVariable Long id) {
return repository.findById(id).orElse(null);
}
@PutMapping("/boards/{id}")
Board replaceBoard(@RequestBody Board newBoard, @PathVariable Long id) {
return repository.findById(id)
.map(Board -> {
Board.setTitle(newBoard.getTitle());
Board.setContent(newBoard.getContent());
return repository.save(Board);
})
.orElseGet(() -> {
newBoard.setId(id);
return repository.save(newBoard);
});
}
@DeleteMapping("/boards/{id}")
void deleteBoard(@PathVariable Long id) {
repository.deleteById(id);
}
}
BoardRepository도 아래와 같이 작성해준다.
package com.example.myhome.repository;
import com.example.myhome.model.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface BoardRepository extends JpaRepository<Board, Long> {
List<Board> findByTitle(String title);
}
BoardApiController Class 에 추가
@Autowired
private BoardRepository repository;
@GetMapping("/boards")
List<Board> all(@RequestParam(required = false) String title,
@RequestParam(required = false, defaultValue = "") String content) {
if(StringUtils.isEmpty(title)) {
return repository.findAll();
} else {
return repository.findByTitle(title);
}
}
BoardRepository Interface에 추가.
package com.example.myhome.repository;
import com.example.myhome.model.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface BoardRepository extends JpaRepository<Board, Long> {
List<Board> findByTitle(String title);
List<Board> findByTitleOrContent(String title, String content);
}
BoardApiController에서 title이나 content에 해당하는 문자열을 or 조건으로 검색하는 코드를 작성해준다.
@GetMapping("/boards")
List<Board> all(@RequestParam(required = false, defaultValue = "") String title,
@RequestParam(required = false, defaultValue = "") String content) {
if(StringUtils.isEmpty(title) && StringUtils.isEmpty(content)) {
return repository.findAll();
} else {
return repository.findByTitleOrContent(title, content);
}
}
spring.io에서 spring data jpa를 확인해주자.
query annotation도 참고해주자.(Declaring Interfaces 검색)
Postman을 이용해보자.
post로도 작성을 해주자. Body 부분을 JSON으로 세팅을 해주면 아래와 같고 post로 날린 table이 DB에서도 확인이 잘 된다.
console에서도 확인을 해주면 아래와 같다.
put으로 값을 변경해주면 아래와 같이 나온다.
마지막으로 Delete로 삭제도 해주자.
<참고 :Spring Boot으로 웹 출시까지 #7. JPA 이용한 RESTful API 작성>
https://www.youtube.com/watch?v=XHT6S5JH_RU&list=PLPtc9qD1979DG675XufGs0-gBeb2mrona&index=8
'Spring > SpringBoot' 카테고리의 다른 글
Spring Boot으로 웹 출시까지 #9. Spring Security를 이용한 로그인 처리 (0) | 2022.06.03 |
---|---|
Spring Boot으로 웹 출시까지 #8. JPA를 이용한 페이지 처리 및 검색 (0) | 2022.06.02 |
Spring Boot으로 웹 출시 - thymeleaf에서 form 전송 (0) | 2022.06.02 |
Spring Boot으로 웹 출시까지 #5. jpa를 이용해 게시판 조회하기 (0) | 2022.05.31 |
Spring Boot으로 웹 출시까지 #4. thymeleaf를 이용해 레이아웃 만들기 (0) | 2022.05.31 |